From 55198846ae8e75a73bded36bda1608b1e7c5eed5 Mon Sep 17 00:00:00 2001 From: hellcat Date: Mon, 27 Jul 2026 14:41:20 +0800 Subject: [PATCH] 1 --- .../Api/Nasa/V1/ArticleBaseController.php | 84 ++ .../Api/Nasa/V1/Base/ListController.php | 3 + .../Api/Nasa/V1/BladeBaseController.php | 74 + .../Api/Nasa/V1/OptionBaseController.php | 74 + .../Api/Nasa/V1/SitemapBaseController.php | 83 ++ .../Controllers/Api/Tg/HookController.php | 38 + app/Http/Controllers/CmdController.php | 4 +- .../Web/Nasa/V1/Base/ListController.php | 5 +- .../Nasa/V1/MasterArticleBaseController.php | 27 + .../Web/Nasa/V1/MasterBladeBaseController.php | 27 + .../Nasa/V1/MasterOptionBaseController.php | 27 + .../Nasa/V1/MasterSitemapBaseController.php | 27 + .../Nasa/V1/ResourceArticleBaseController.php | 27 + .../V1/ResourceUploadimagesBaseController.php | 50 + app/Models/ShadowRocketIds.php | 15 + app/Models/SiteMap.php | 5 + app/Services/Article/Schema.php | 26 + app/Services/CountrySpeedService.php | 9 +- app/Services/Cron.php | 6 + app/Services/Cron/FnSitePublish.php | 24 +- app/Services/Cron/ShadowRocketCrawl.php | 271 ++++ app/Services/Cron/ShadowRocketPublish.php | 95 ++ app/Services/Ship/ServiceShipHtml.php | 30 + composer.json | 2 + composer.lock | 88 +- config/path.php | 1 + .../{app-psC-g_pG.js => app-BD91q7Y3.js} | 2 +- public/build/manifest.json | 2 +- resources/js/nasa/page/list.js | 42 + .../views/nasa/_commons/detail.blade.php | 1 + resources/views/nasa/_commons/list.blade.php | 15 +- resources/views/nasa/v1/_lists/list.blade.php | 13 +- routes/api.php | 52 + routes/web.php | 12 + vendor/composer/autoload_classmap.php | 44 +- vendor/composer/autoload_psr4.php | 1 + vendor/composer/autoload_static.php | 49 +- vendor/composer/installed.json | 91 +- vendor/composer/installed.php | 19 +- vendor/composer/platform_check.php | 4 +- vendor/symfony/css-selector/CHANGELOG.md | 0 .../css-selector/CssSelectorConverter.php | 19 +- .../Exception/ExceptionInterface.php | 0 .../Exception/ExpressionErrorException.php | 0 .../Exception/InternalErrorException.php | 0 .../css-selector/Exception/ParseException.php | 0 .../Exception/SyntaxErrorException.php | 0 vendor/symfony/css-selector/LICENSE | 0 .../css-selector/Node/AbstractNode.php | 0 .../css-selector/Node/AttributeNode.php | 0 .../symfony/css-selector/Node/ClassNode.php | 0 .../Node/CombinedSelectorNode.php | 0 .../symfony/css-selector/Node/ElementNode.php | 0 .../css-selector/Node/FunctionNode.php | 2 +- vendor/symfony/css-selector/Node/HashNode.php | 0 .../css-selector/Node/MatchingNode.php | 4 +- .../css-selector/Node/NegationNode.php | 0 .../css-selector/Node/NodeInterface.php | 0 .../symfony/css-selector/Node/PseudoNode.php | 0 .../css-selector/Node/SelectorNode.php | 0 .../symfony/css-selector/Node/Specificity.php | 0 .../Node/SpecificityAdjustmentNode.php | 2 +- .../Parser/Handler/CommentHandler.php | 0 .../Parser/Handler/HandlerInterface.php | 0 .../Parser/Handler/HashHandler.php | 0 .../Parser/Handler/IdentifierHandler.php | 0 .../Parser/Handler/NumberHandler.php | 0 .../Parser/Handler/StringHandler.php | 2 +- .../Parser/Handler/WhitespaceHandler.php | 0 vendor/symfony/css-selector/Parser/Parser.php | 6 +- .../css-selector/Parser/ParserInterface.php | 0 vendor/symfony/css-selector/Parser/Reader.php | 0 .../Parser/Shortcut/ClassParser.php | 0 .../Parser/Shortcut/ElementParser.php | 0 .../Parser/Shortcut/EmptyStringParser.php | 0 .../Parser/Shortcut/HashParser.php | 0 vendor/symfony/css-selector/Parser/Token.php | 8 +- .../css-selector/Parser/TokenStream.php | 0 .../Parser/Tokenizer/Tokenizer.php | 0 .../Parser/Tokenizer/TokenizerEscaping.php | 2 +- .../Parser/Tokenizer/TokenizerPatterns.php | 0 .../XPath/Extension/AbstractExtension.php | 0 .../Extension/AttributeMatchingExtension.php | 0 .../XPath/Extension/CombinationExtension.php | 0 .../XPath/Extension/ExtensionInterface.php | 0 .../XPath/Extension/FunctionExtension.php | 0 .../XPath/Extension/HtmlExtension.php | 0 .../XPath/Extension/NodeExtension.php | 33 +- .../XPath/Extension/PseudoClassExtension.php | 0 .../symfony/css-selector/XPath/Translator.php | 1 - .../XPath/TranslatorInterface.php | 0 .../symfony/css-selector/XPath/XPathExpr.php | 0 vendor/symfony/css-selector/composer.json | 0 .../dom-crawler/AbstractUriElement.php | 111 ++ vendor/symfony/dom-crawler/CHANGELOG.md | 146 ++ vendor/symfony/dom-crawler/Crawler.php | 1217 +++++++++++++++++ .../dom-crawler/Field/ChoiceFormField.php | 307 +++++ .../dom-crawler/Field/FileFormField.php | 102 ++ .../symfony/dom-crawler/Field/FormField.php | 102 ++ .../dom-crawler/Field/InputFormField.php | 46 + .../dom-crawler/Field/TextareaFormField.php | 37 + vendor/symfony/dom-crawler/Form.php | 463 +++++++ .../symfony/dom-crawler/FormFieldRegistry.php | 175 +++ vendor/symfony/dom-crawler/Image.php | 37 + vendor/symfony/dom-crawler/LICENSE | 19 + vendor/symfony/dom-crawler/Link.php | 34 + .../CrawlerAnySelectorTextContains.php | 65 + .../Constraint/CrawlerAnySelectorTextSame.php | 54 + .../CrawlerSelectorAttributeValueSame.php | 51 + .../Test/Constraint/CrawlerSelectorCount.php | 45 + .../Test/Constraint/CrawlerSelectorExists.php | 44 + .../CrawlerSelectorTextContains.php | 62 + .../Constraint/CrawlerSelectorTextSame.php | 50 + vendor/symfony/dom-crawler/UriResolver.php | 136 ++ vendor/symfony/dom-crawler/composer.json | 33 + 115 files changed, 4804 insertions(+), 80 deletions(-) create mode 100755 app/Http/Controllers/Api/Nasa/V1/ArticleBaseController.php create mode 100755 app/Http/Controllers/Api/Nasa/V1/BladeBaseController.php create mode 100755 app/Http/Controllers/Api/Nasa/V1/OptionBaseController.php create mode 100755 app/Http/Controllers/Api/Nasa/V1/SitemapBaseController.php create mode 100644 app/Http/Controllers/Web/Nasa/V1/MasterArticleBaseController.php create mode 100644 app/Http/Controllers/Web/Nasa/V1/MasterBladeBaseController.php create mode 100644 app/Http/Controllers/Web/Nasa/V1/MasterOptionBaseController.php create mode 100644 app/Http/Controllers/Web/Nasa/V1/MasterSitemapBaseController.php create mode 100644 app/Http/Controllers/Web/Nasa/V1/ResourceArticleBaseController.php create mode 100644 app/Http/Controllers/Web/Nasa/V1/ResourceUploadimagesBaseController.php create mode 100755 app/Models/ShadowRocketIds.php create mode 100755 app/Services/Cron/ShadowRocketCrawl.php create mode 100755 app/Services/Cron/ShadowRocketPublish.php create mode 100755 app/Services/Ship/ServiceShipHtml.php rename public/build/assets/{app-psC-g_pG.js => app-BD91q7Y3.js} (95%) mode change 100755 => 100644 vendor/symfony/css-selector/CHANGELOG.md mode change 100755 => 100644 vendor/symfony/css-selector/CssSelectorConverter.php mode change 100755 => 100644 vendor/symfony/css-selector/Exception/ExceptionInterface.php mode change 100755 => 100644 vendor/symfony/css-selector/Exception/ExpressionErrorException.php mode change 100755 => 100644 vendor/symfony/css-selector/Exception/InternalErrorException.php mode change 100755 => 100644 vendor/symfony/css-selector/Exception/ParseException.php mode change 100755 => 100644 vendor/symfony/css-selector/Exception/SyntaxErrorException.php mode change 100755 => 100644 vendor/symfony/css-selector/LICENSE mode change 100755 => 100644 vendor/symfony/css-selector/Node/AbstractNode.php mode change 100755 => 100644 vendor/symfony/css-selector/Node/AttributeNode.php mode change 100755 => 100644 vendor/symfony/css-selector/Node/ClassNode.php mode change 100755 => 100644 vendor/symfony/css-selector/Node/CombinedSelectorNode.php mode change 100755 => 100644 vendor/symfony/css-selector/Node/ElementNode.php mode change 100755 => 100644 vendor/symfony/css-selector/Node/FunctionNode.php mode change 100755 => 100644 vendor/symfony/css-selector/Node/HashNode.php mode change 100755 => 100644 vendor/symfony/css-selector/Node/MatchingNode.php mode change 100755 => 100644 vendor/symfony/css-selector/Node/NegationNode.php mode change 100755 => 100644 vendor/symfony/css-selector/Node/NodeInterface.php mode change 100755 => 100644 vendor/symfony/css-selector/Node/PseudoNode.php mode change 100755 => 100644 vendor/symfony/css-selector/Node/SelectorNode.php mode change 100755 => 100644 vendor/symfony/css-selector/Node/Specificity.php mode change 100755 => 100644 vendor/symfony/css-selector/Node/SpecificityAdjustmentNode.php mode change 100755 => 100644 vendor/symfony/css-selector/Parser/Handler/CommentHandler.php mode change 100755 => 100644 vendor/symfony/css-selector/Parser/Handler/HandlerInterface.php mode change 100755 => 100644 vendor/symfony/css-selector/Parser/Handler/HashHandler.php mode change 100755 => 100644 vendor/symfony/css-selector/Parser/Handler/IdentifierHandler.php mode change 100755 => 100644 vendor/symfony/css-selector/Parser/Handler/NumberHandler.php mode change 100755 => 100644 vendor/symfony/css-selector/Parser/Handler/StringHandler.php mode change 100755 => 100644 vendor/symfony/css-selector/Parser/Handler/WhitespaceHandler.php mode change 100755 => 100644 vendor/symfony/css-selector/Parser/Parser.php mode change 100755 => 100644 vendor/symfony/css-selector/Parser/ParserInterface.php mode change 100755 => 100644 vendor/symfony/css-selector/Parser/Reader.php mode change 100755 => 100644 vendor/symfony/css-selector/Parser/Shortcut/ClassParser.php mode change 100755 => 100644 vendor/symfony/css-selector/Parser/Shortcut/ElementParser.php mode change 100755 => 100644 vendor/symfony/css-selector/Parser/Shortcut/EmptyStringParser.php mode change 100755 => 100644 vendor/symfony/css-selector/Parser/Shortcut/HashParser.php mode change 100755 => 100644 vendor/symfony/css-selector/Parser/Token.php mode change 100755 => 100644 vendor/symfony/css-selector/Parser/TokenStream.php mode change 100755 => 100644 vendor/symfony/css-selector/Parser/Tokenizer/Tokenizer.php mode change 100755 => 100644 vendor/symfony/css-selector/Parser/Tokenizer/TokenizerEscaping.php mode change 100755 => 100644 vendor/symfony/css-selector/Parser/Tokenizer/TokenizerPatterns.php mode change 100755 => 100644 vendor/symfony/css-selector/XPath/Extension/AbstractExtension.php mode change 100755 => 100644 vendor/symfony/css-selector/XPath/Extension/AttributeMatchingExtension.php mode change 100755 => 100644 vendor/symfony/css-selector/XPath/Extension/CombinationExtension.php mode change 100755 => 100644 vendor/symfony/css-selector/XPath/Extension/ExtensionInterface.php mode change 100755 => 100644 vendor/symfony/css-selector/XPath/Extension/FunctionExtension.php mode change 100755 => 100644 vendor/symfony/css-selector/XPath/Extension/HtmlExtension.php mode change 100755 => 100644 vendor/symfony/css-selector/XPath/Extension/NodeExtension.php mode change 100755 => 100644 vendor/symfony/css-selector/XPath/Extension/PseudoClassExtension.php mode change 100755 => 100644 vendor/symfony/css-selector/XPath/Translator.php mode change 100755 => 100644 vendor/symfony/css-selector/XPath/TranslatorInterface.php mode change 100755 => 100644 vendor/symfony/css-selector/XPath/XPathExpr.php mode change 100755 => 100644 vendor/symfony/css-selector/composer.json create mode 100644 vendor/symfony/dom-crawler/AbstractUriElement.php create mode 100644 vendor/symfony/dom-crawler/CHANGELOG.md create mode 100644 vendor/symfony/dom-crawler/Crawler.php create mode 100644 vendor/symfony/dom-crawler/Field/ChoiceFormField.php create mode 100644 vendor/symfony/dom-crawler/Field/FileFormField.php create mode 100644 vendor/symfony/dom-crawler/Field/FormField.php create mode 100644 vendor/symfony/dom-crawler/Field/InputFormField.php create mode 100644 vendor/symfony/dom-crawler/Field/TextareaFormField.php create mode 100644 vendor/symfony/dom-crawler/Form.php create mode 100644 vendor/symfony/dom-crawler/FormFieldRegistry.php create mode 100644 vendor/symfony/dom-crawler/Image.php create mode 100644 vendor/symfony/dom-crawler/LICENSE create mode 100644 vendor/symfony/dom-crawler/Link.php create mode 100644 vendor/symfony/dom-crawler/Test/Constraint/CrawlerAnySelectorTextContains.php create mode 100644 vendor/symfony/dom-crawler/Test/Constraint/CrawlerAnySelectorTextSame.php create mode 100644 vendor/symfony/dom-crawler/Test/Constraint/CrawlerSelectorAttributeValueSame.php create mode 100644 vendor/symfony/dom-crawler/Test/Constraint/CrawlerSelectorCount.php create mode 100644 vendor/symfony/dom-crawler/Test/Constraint/CrawlerSelectorExists.php create mode 100644 vendor/symfony/dom-crawler/Test/Constraint/CrawlerSelectorTextContains.php create mode 100644 vendor/symfony/dom-crawler/Test/Constraint/CrawlerSelectorTextSame.php create mode 100644 vendor/symfony/dom-crawler/UriResolver.php create mode 100644 vendor/symfony/dom-crawler/composer.json diff --git a/app/Http/Controllers/Api/Nasa/V1/ArticleBaseController.php b/app/Http/Controllers/Api/Nasa/V1/ArticleBaseController.php new file mode 100755 index 00000000..1ad95ac4 --- /dev/null +++ b/app/Http/Controllers/Api/Nasa/V1/ArticleBaseController.php @@ -0,0 +1,84 @@ + 'id', + 'code' => 'code', + 'name' => 'name', + 'schema' => 'schema', + 'schema_pro'=> 'schema_pro', + 'group_code'=> 'group_code', + 'cmd' => 'cmd', + 'cmd_log' => 'cmd_log', + 'opt' => 'opt', + 'enable_sync'=> 'enable_sync', + 'status' => 'status', + 'created_at'=> 'created_at', + 'updated_at'=> 'updated_at' + ]; + + protected array $aValueStyle = [ // 特定文字渲染样式 +// '关闭' => "关闭", +// '开启' => "开启" + ]; + + protected array $aFieldTypes = [ + 'schema' => 'text', + 'schema_pro' => 'text', + 'cmd' => 'text', + 'cmd_log' => 'text', + 'opt' => 'text' + ]; + + protected array $aOrderBy = [ + [ + "sField" => "id", + "sSort" => "desc", + ] + ]; + + protected array $aJsonFields = [ // json字段 +// 'schema' + ]; + + protected array $aDateFields = [ // date字段 +// 'dtUpdatedAt' + ]; + + protected array $aLenthFields = [ // 限制长度的字段 +// "xx" => 100, + ]; + + protected array $aSelectFields = [ // 作为默认select的字段 +// 'status', + ]; + + protected array $aValueFields = [ // 值映射 +// 'status' => [ +// '1' => '开启', +// '0' => '关闭', +// ] + ]; + + protected array $aCcExtFields = [ +// 'dtCreatedAt' => '创建时间' + ]; + +// protected array $aLimit = [3, 15, 40, 100]; // list长度,第一个为默认 + +} diff --git a/app/Http/Controllers/Api/Nasa/V1/Base/ListController.php b/app/Http/Controllers/Api/Nasa/V1/Base/ListController.php index e633cd1e..4d9b7973 100755 --- a/app/Http/Controllers/Api/Nasa/V1/Base/ListController.php +++ b/app/Http/Controllers/Api/Nasa/V1/Base/ListController.php @@ -240,6 +240,9 @@ abstract class ListController $sField = request('field'); $sHit = $this->oModel->find($iId)?->{$sField}; + if (is_array($sHit)) { + $sHit = json_encode($sHit, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); + } return response()->json([ 'iCode' => 200, diff --git a/app/Http/Controllers/Api/Nasa/V1/BladeBaseController.php b/app/Http/Controllers/Api/Nasa/V1/BladeBaseController.php new file mode 100755 index 00000000..c3243341 --- /dev/null +++ b/app/Http/Controllers/Api/Nasa/V1/BladeBaseController.php @@ -0,0 +1,74 @@ + 'id', + 'code' => 'code', + 'content' => 'content' + ]; + + protected array $aValueStyle = [ // 特定文字渲染样式 + '关闭' => "关闭", + '开启' => "开启" + ]; + + protected array $aFieldTypes = [ + 'content' => 'text', + ]; + + protected array $aOrderBy = [ +// [ +// "sField" => "status", +// "sSort" => "desc", +// ], + [ + "sField" => "id", + "sSort" => "desc", + ] + ]; + + protected array $aJsonFields = [ // json字段 + + ]; + + protected array $aDateFields = [ // date字段 +// 'dtUpdatedAt' + ]; + + protected array $aLenthFields = [ // 限制长度的字段 +// "xx" => 100, + ]; + + protected array $aSelectFields = [ // 作为默认select的字段 +// 'status', + ]; + + protected array $aValueFields = [ // 值映射 + 'status' => [ + '1' => '开启', + '0' => '关闭', + ] + ]; + + protected array $aCcExtFields = [ +// 'dtCreatedAt' => '创建时间' + ]; + +// protected array $aLimit = [3, 15, 40, 100]; // list长度,第一个为默认 + +} diff --git a/app/Http/Controllers/Api/Nasa/V1/OptionBaseController.php b/app/Http/Controllers/Api/Nasa/V1/OptionBaseController.php new file mode 100755 index 00000000..9358662c --- /dev/null +++ b/app/Http/Controllers/Api/Nasa/V1/OptionBaseController.php @@ -0,0 +1,74 @@ + 'id', + 'k' => 'k', + 'v' => 'v' + ]; + + protected array $aValueStyle = [ // 特定文字渲染样式 +// '关闭' => "关闭", +// '开启' => "开启" + ]; + + protected array $aFieldTypes = [ +// 'schema' => 'text', +// 'schema_pro' => 'text', +// 'cmd' => 'text', +// 'cmd_log' => 'text', +// 'opt' => 'text' + ]; + + protected array $aOrderBy = [ + [ + "sField" => "k", + "sSort" => "desc", + ] + ]; + + protected array $aJsonFields = [ // json字段 +// 'schema' + ]; + + protected array $aDateFields = [ // date字段 +// 'dtUpdatedAt' + ]; + + protected array $aLenthFields = [ // 限制长度的字段 +// "xx" => 100, + ]; + + protected array $aSelectFields = [ // 作为默认select的字段 +// 'status', + ]; + + protected array $aValueFields = [ // 值映射 +// 'status' => [ +// '1' => '开启', +// '0' => '关闭', +// ] + ]; + + protected array $aCcExtFields = [ +// 'dtCreatedAt' => '创建时间' + ]; + +// protected array $aLimit = [3, 15, 40, 100]; // list长度,第一个为默认 + +} diff --git a/app/Http/Controllers/Api/Nasa/V1/SitemapBaseController.php b/app/Http/Controllers/Api/Nasa/V1/SitemapBaseController.php new file mode 100755 index 00000000..edc69347 --- /dev/null +++ b/app/Http/Controllers/Api/Nasa/V1/SitemapBaseController.php @@ -0,0 +1,83 @@ + 'id', + 'code' => 'code', + 'code_short'=> 'code_short', + 'name' => 'name', + 'url' => 'url', + 'url_front' => 'url_front', + 'group_code'=> 'group_code', + 'memo' => 'memo', + 'config' => 'config', + 'api_path' => 'api_path', + 'status' => 'status' + ]; + + protected array $aValueStyle = [ // 特定文字渲染样式 +// '关闭' => "关闭", +// '开启' => "开启" + ]; + + protected array $aFieldTypes = [ +// 'schema' => 'text', +// 'schema_pro' => 'text', +// 'cmd' => 'text', +// 'cmd_log' => 'text', +// 'opt' => 'text' + 'sFileName' => 'image' + ]; + + protected array $aOrderBy = [ + [ + "sField" => "id", + "sSort" => "desc", + ] + ]; + + protected array $aJsonFields = [ // json字段 +// 'schema' + ]; + + protected array $aDateFields = [ // date字段 +// 'dtUpdatedAt' + ]; + + protected array $aLenthFields = [ // 限制长度的字段 +// "xx" => 100, + ]; + + protected array $aSelectFields = [ // 作为默认select的字段 +// 'status', + ]; + + protected array $aValueFields = [ // 值映射 +// 'status' => [ +// '1' => '开启', +// '0' => '关闭', +// ] + ]; + + protected array $aCcExtFields = [ +// 'dtCreatedAt' => '创建时间' + ]; + +// protected array $aLimit = [3, 15, 40, 100]; // list长度,第一个为默认 + +} diff --git a/app/Http/Controllers/Api/Tg/HookController.php b/app/Http/Controllers/Api/Tg/HookController.php index cc273a49..43b1bd42 100755 --- a/app/Http/Controllers/Api/Tg/HookController.php +++ b/app/Http/Controllers/Api/Tg/HookController.php @@ -11,6 +11,7 @@ use App\Models\Hook as ModelHook; use App\Services\TomTool\ThrowableHandler; //use App\Services\TomTool\TelegramVdb; use App\Services\TomTool\Telegram\Slave as TelegramSlave; +use App\Models\Option; final class HookController { @@ -45,6 +46,43 @@ final class HookController } } + public function cache_tg_new() + { + + $sCacheTgHook = Option::where("k", "cache_tg::hook")->first()?->v; // 做了一半 + + if (!$sCacheTgHook) { + echo "$sCacheTgHook 未设置"; + exit; + } + + try { + + $sUpdate = file_get_contents("php://input"); + $aUpdate = json_decode($sUpdate, true); + $sText = $aUpdate["message"]["text"] ?? "没有text"; + if (!str_starts_with($sText, '/')) { + $this->sCustomText = "/cacheTg#add__{$sCacheTgHook}"." ".$sUpdate; + } + + $this->cmd(); + + } catch (\Throwable $e) { + + $aDataTg = ThrowableHandler::make($e)->enableTrace()->fetch(); + TelegramSlave::fail()->enableSlaveQueue(false)->setMsgA([ + "msg" => $aDataTg, + "data" => $sUpdate, + ])->send(); + + $aDataCmd = $aDataTg; + $sDataCmd = json_encode($aDataCmd, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + $sDataCmd = str_replace("\\n", "
", $sDataCmd); + echo $sDataCmd; + exit; + } + } + public function cmd_ffq_article() { try { diff --git a/app/Http/Controllers/CmdController.php b/app/Http/Controllers/CmdController.php index 71e23d48..d81aa274 100755 --- a/app/Http/Controllers/CmdController.php +++ b/app/Http/Controllers/CmdController.php @@ -95,10 +95,10 @@ class CmdController return "没有这个dove"; } - $sUrl = "https://".$sUrl; - if ($sUrl == "dd.loc/api/tg/hook") { $sUrl = "http://".$sUrl; + } else { + $sUrl = "https://".$sUrl; } $aData = [ diff --git a/app/Http/Controllers/Web/Nasa/V1/Base/ListController.php b/app/Http/Controllers/Web/Nasa/V1/Base/ListController.php index 31057958..6eeacf13 100644 --- a/app/Http/Controllers/Web/Nasa/V1/Base/ListController.php +++ b/app/Http/Controllers/Web/Nasa/V1/Base/ListController.php @@ -57,6 +57,9 @@ class ListController $aResponse['sHeaderActionView'] = $this->sHeaderActionView; $aResponse['sListView'] = $this->sListView; $aResponse['cNasaBook'] = $this->getNasaBook(); + $aResponse['aCustom'] = $this->aCustom ?? []; +// tt($aResponse); +// tt($this->aCustom); return view($this->sView, $aResponse); } @@ -91,7 +94,7 @@ class ListController $sApiPath = Arr::pull($aParams, 'api_path'); $sSiteWww = Arr::pull($aParams, 'site_www'); - $oResponse = Http::nasa($sSiteWww)->delete($sApiPath.'/delete/save/' . $iId); + $oResponse = Http::nasa($sSiteWww)->delete($sApiPath.'/delete/' . $iId); return response()->json($oResponse->json(), 200); } diff --git a/app/Http/Controllers/Web/Nasa/V1/MasterArticleBaseController.php b/app/Http/Controllers/Web/Nasa/V1/MasterArticleBaseController.php new file mode 100644 index 00000000..143ece20 --- /dev/null +++ b/app/Http/Controllers/Web/Nasa/V1/MasterArticleBaseController.php @@ -0,0 +1,27 @@ +sSiteWww = config("path.url_master_base") ?? ''; + } + +} diff --git a/app/Http/Controllers/Web/Nasa/V1/MasterBladeBaseController.php b/app/Http/Controllers/Web/Nasa/V1/MasterBladeBaseController.php new file mode 100644 index 00000000..f38c7b85 --- /dev/null +++ b/app/Http/Controllers/Web/Nasa/V1/MasterBladeBaseController.php @@ -0,0 +1,27 @@ +sSiteWww = config("path.url_master_base") ?? ''; + } + +} diff --git a/app/Http/Controllers/Web/Nasa/V1/MasterOptionBaseController.php b/app/Http/Controllers/Web/Nasa/V1/MasterOptionBaseController.php new file mode 100644 index 00000000..2dfd95df --- /dev/null +++ b/app/Http/Controllers/Web/Nasa/V1/MasterOptionBaseController.php @@ -0,0 +1,27 @@ +sSiteWww = config("path.url_master_base") ?? ''; + } + +} diff --git a/app/Http/Controllers/Web/Nasa/V1/MasterSitemapBaseController.php b/app/Http/Controllers/Web/Nasa/V1/MasterSitemapBaseController.php new file mode 100644 index 00000000..ca3fbb86 --- /dev/null +++ b/app/Http/Controllers/Web/Nasa/V1/MasterSitemapBaseController.php @@ -0,0 +1,27 @@ +sSiteWww = config("path.url_master_base") ?? ''; + } + +} diff --git a/app/Http/Controllers/Web/Nasa/V1/ResourceArticleBaseController.php b/app/Http/Controllers/Web/Nasa/V1/ResourceArticleBaseController.php new file mode 100644 index 00000000..22ce29cb --- /dev/null +++ b/app/Http/Controllers/Web/Nasa/V1/ResourceArticleBaseController.php @@ -0,0 +1,27 @@ +sSiteWww = config("path.url_resource_base") ?? ''; + } + +} diff --git a/app/Http/Controllers/Web/Nasa/V1/ResourceUploadimagesBaseController.php b/app/Http/Controllers/Web/Nasa/V1/ResourceUploadimagesBaseController.php new file mode 100644 index 00000000..a8990a25 --- /dev/null +++ b/app/Http/Controllers/Web/Nasa/V1/ResourceUploadimagesBaseController.php @@ -0,0 +1,50 @@ + config("path.url_resource_base").'/public/images' +// ]; + + public function __construct() + { + $this->sSiteWww = config("path.url_resource_base") ?? ''; + + $this->aCustom = [ + "sImagePath" => "https://".config("path.url_resource_base").'/upload/images' + ]; + + } + +// public function hit(NasaQueryRequest $oRequest) +// { +// $iId = intval(request('id')); +// $sApiPath = $oRequest->input('api_path'); +// $sSiteWww = $oRequest->input('site_www'); +// +// $sField = request('field'); +// +// $oResponse = Http::nasa($sSiteWww)->get($sApiPath.'/hit/' . $iId . '/' . $sField); +// +// return response()->json($oResponse->json(), 200); +// } + +} diff --git a/app/Models/ShadowRocketIds.php b/app/Models/ShadowRocketIds.php new file mode 100755 index 00000000..ced52a6f --- /dev/null +++ b/app/Models/ShadowRocketIds.php @@ -0,0 +1,15 @@ +where("status", 1)->get(); + } } diff --git a/app/Services/Article/Schema.php b/app/Services/Article/Schema.php index edf3b9e6..838a3524 100755 --- a/app/Services/Article/Schema.php +++ b/app/Services/Article/Schema.php @@ -213,6 +213,32 @@ final class Schema $aSchemaPro[] = $aSchemaProRow; // 关键 $aDataSend[] = $aSchemaProRow; // 公约 } // is photo + } else if ($this->oArticle->group_code == "tg_image") { + if ($aSchemaProRow["type"] == "photo") { + + $iPhotoFullSizeKey = $aSchemaDataRow["photo_fullSizeKey"]; + $aPhotoFullSize = $aSchemaDataRow["photo"][$iPhotoFullSizeKey]; + + $oImageManager = new ImageManager(new Driver()); + $oImgMain = $oImageManager->read($aPhotoFullSize["file_path"]); + $sExtension = pathinfo($aPhotoFullSize["file_path"], PATHINFO_EXTENSION); + + $sUploadPath = 'upload/'; + $sUploadDir = config('system.dir_base') . "public/" . $sUploadPath; + $aSavedPath = []; // 弹药库:存放所有生成的路径 + + $sTmp = $this->oArticle->code . '-'.$iRowId.'-full.' . $sExtension; + $sFullSavePath = $sUploadDir . $sTmp; + $sFullSavePathUrl = $sUploadPath . $sTmp; + $oImgMain->save($sFullSavePath); + + $aSavedPath['full'] = $sFullSavePathUrl; + + $aSchemaProRow["data"] = $aSavedPath; + $aSchemaPro[] = $aSchemaProRow; // 关键 + $aDataSend[] = $aSchemaProRow; // 公约 + + } } // xiuren end } // cache_tg end diff --git a/app/Services/CountrySpeedService.php b/app/Services/CountrySpeedService.php index ca8140e3..adbb5ef4 100755 --- a/app/Services/CountrySpeedService.php +++ b/app/Services/CountrySpeedService.php @@ -3,6 +3,7 @@ declare(strict_types=1); namespace App\Services; +use App\Models\FreenodePool; final class CountrySpeedService { @@ -58,11 +59,15 @@ final class CountrySpeedService //// 速度 $iNodeSpeed = rand(config("freenode.speed_min"), config("freenode.speed_max")); - $iNodeCount = rand(config("freenode.count_min"), config("freenode.count_max")); + + $oFnp = FreenodePool::whereDate('date', date("Y-m-d"))->first(); + $aFnpContent = json_decode($oFnp->content, true); + $iNodeCount = count($aFnpContent["v2ray"]); +// $iNodeCount = rand(config("freenode.count_min"), config("freenode.count_max")); $sContent = "本次更新共".$iNodeCount."个可用节点,最高速度".$iNodeSpeed."M/S。 覆盖".$sNodeZone."等多个区域。 -复制下方的v2ray/Clash订阅链接,在客户端添加即可正常使用。"; +复制下方的v2ray/clash订阅链接,在客户端添加即可正常使用。"; return $sContent; } diff --git a/app/Services/Cron.php b/app/Services/Cron.php index 2512a0b3..d4f1a3cd 100755 --- a/app/Services/Cron.php +++ b/app/Services/Cron.php @@ -18,6 +18,8 @@ use App\Services\TomTool\Telegram\Slave as TeleSlave; use App\Services\CacheTg as ServiceCacheTg; use App\Services\Cron\FnSitePublish as CronFnSitePublish; use App\Services\Cron\NasaTestFnSubfile; +use App\Services\Cron\ShadowRocketCrawl; +use App\Services\Cron\ShadowRocketPublish; final class Cron { @@ -47,6 +49,10 @@ final class Cron } if ($h % 6 === 0 && $i === 3) { + ShadowRocketCrawl::run(); + ShadowRocketPublish::run(); +// exit; + CronFreenodeCrawl::run(); // 1.爬免费节点 CronFreenodePool::save(); // 2.格式化入库 CronFreenodeMerge::save(); // 3.加工成文件 diff --git a/app/Services/Cron/FnSitePublish.php b/app/Services/Cron/FnSitePublish.php index 53eebc6b..07f6ae31 100755 --- a/app/Services/Cron/FnSitePublish.php +++ b/app/Services/Cron/FnSitePublish.php @@ -12,6 +12,7 @@ use Illuminate\Support\Carbon; use App\Services\CountrySpeedService; use App\Models\Ship; use App\Services\FreenodeHelperService; +use App\Services\Ship\ServiceShipHtml; final class FnSitePublish { @@ -71,27 +72,14 @@ final class FnSitePublish ".$sFeedLink.""; $aDylj[$sSiteFnClient] = $str; } -// -// -// https://cfn.loc/sub/20260204-v2ray.txt -// -// + $sDylj = implode("\n\n", $aDylj); - $sJctj = ""; - foreach ($aShipCode as $sShipCode) { - $sJctj .= "

机场推荐:

\n\n"; - $oShip = Ship::where("code", $sShipCode)->first(); - $aShipGood = json_decode($oShip->good, true); - $sShipGood = implode("\n\n", $aShipGood); - $sJctj .= $sShipGood; - $sJctj .= "\n\n"; - $sJctj .= "点击进入机场官网:{$oShip->name}"; - } + $sJctj = ServiceShipHtml::byShipCode($aSiteConfig['ship_code']); $aFilter = [ - '$sShipWww' => $oShip->www, - '$sShipName' => $oShip->name, +// '$sShipWww' => $oShip->www, +// '$sShipName' => $oShip->name, '$sDateCN' => $sDateCN, '$sYear' => $sYear, '$sTitleSub' => $sCountrySpeed, @@ -99,6 +87,8 @@ final class FnSitePublish '$sCountrySpeed'=> $sCountrySpeed, '$sJctj' => $sJctj, '$sDylj' => $sDylj, + '$sGithubLink' => $aSiteConfig['github'], + '$sSiteUrl' => $oSite->url ]; $aResult["article"]["content"] = self::nl2p(str_replace(array_keys($aFilter), array_values($aFilter), $oArticleTemplate->content)); diff --git a/app/Services/Cron/ShadowRocketCrawl.php b/app/Services/Cron/ShadowRocketCrawl.php new file mode 100755 index 00000000..c603498b --- /dev/null +++ b/app/Services/Cron/ShadowRocketCrawl.php @@ -0,0 +1,271 @@ + array_map( + fn (string $sUrl) => $oPool->as($sUrl) + ->withHeaders([ + 'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', + 'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + 'Accept-Language' => 'zh-CN,zh;q=0.9,en;q=0.8', + ]) + ->withOptions([ + 'curl' => [ + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + ], + ]) + ->connectTimeout(10) + ->timeout(30) + ->retry(3, 1000) + ->get($sUrl), + self::ARRAY_TARGET_URLS + )); + } catch (\Throwable $oException) { + TeleSlave::warn("ShadowRocketCrawl:并发请求执行异常:" . $oException->getMessage()); + return []; + } + + $aAllAccountList = []; + + foreach (self::ARRAY_TARGET_URLS as $sUrl) { + $oResponse = $aResponses[$sUrl] ?? null; + + if ($oResponse instanceof \Throwable) { + TeleSlave::warn("ShadowRocketCrawl:请求网络异常:" . $sUrl . ",错误: " . $oResponse->getMessage()); + continue; + } + + if (!$oResponse || $oResponse->failed()) { + $iStatusCode = $oResponse ? $oResponse->status() : 0; + TeleSlave::warn("ShadowRocketCrawl:请求页面失败:" . $sUrl . ",状态码: " . $iStatusCode); + continue; + } + + $sPageContent = $oResponse->body(); + if (empty(trim($sPageContent))) { + TeleSlave::warn("ShadowRocketCrawl:请求页面内容为空:" . $sUrl); + continue; + } + + $aParsedAccounts = self::parseHtmlToAccounts($sPageContent); + $aAllAccountList = array_merge($aAllAccountList, $aParsedAccounts); + } + + $arr = self::deduplicateAccounts($aAllAccountList); + $json = json_encode($arr); + + $sTodayDate = date('Y-m-d'); + + $oShadowRocketRecord = ShadowRocketIds::whereDate('created_at', $sTodayDate)->first() + ?? new ShadowRocketIds(); + + $oShadowRocketRecord->arr = $json; + $oShadowRocketRecord->save(); + + echo "\n ok"; + } + + /** + * 按邮箱对爬取的账号进行去重 + * + * @param array $aAccountList + * @return array + */ + private static function deduplicateAccounts(array $aAccountList): array + { + $aUniqueAccounts = []; + foreach ($aAccountList as $aAccount) { + $sEmail = $aAccount['sEmail'] ?? ''; + if (!empty($sEmail) && !isset($aUniqueAccounts[$sEmail])) { + $aUniqueAccounts[$sEmail] = $aAccount; + } + } + + return array_values($aUniqueAccounts); + } + + /** + * 解析 HTML 并提取账号列表(包含地区与检测时间) + * + * @param string $sHtmlContent + * @return array + */ + private static function parseHtmlToAccounts(string $sHtmlContent): array + { + $aAccountList = []; + $oCrawler = new Crawler($sHtmlContent); + + $oCrawler->filter('.posts-item')->each(function (Crawler $oNode) use (&$aAccountList) { + $sEmail = self::extractEmailFromNode($oNode); + $sPassword = self::extractPasswordFromNode($oNode); + $sRegion = self::extractRegionFromNode($oNode); + $sCheckTime = self::extractCheckTimeFromNode($oNode); + + if (!empty($sEmail) && !empty($sPassword)) { + $aAccountList[] = [ + 'sEmail' => $sEmail, + 'sPassword' => $sPassword, + 'sRegion' => $sRegion, + 'sCheckTime' => $sCheckTime, + ]; + } + }); + + return $aAccountList; + } + + /** + * 从单个卡片节点中精准提取完整 Email + * + * @param Crawler $oNode + * @return string + */ + private static function extractEmailFromNode(Crawler $oNode): string + { + $oFullLinkNode = $oNode->filter('.item-tags a.external'); + if ($oFullLinkNode->count() > 0) { + $sHref = $oFullLinkNode->attr('href') ?? ''; + if (str_contains($sHref, '#')) { + $aParts = explode('#', $sHref); + $sDecoded = self::decodeCloudflareEmail($aParts[1] ?? ''); + if (self::isValidEmail($sDecoded)) { + return $sDecoded; + } + } + } + + $oTagEmailNode = $oNode->filter('.item-tags [data-cfemail]'); + if ($oTagEmailNode->count() > 0) { + $sHex = $oTagEmailNode->attr('data-cfemail') ?? ''; + $sDecoded = self::decodeCloudflareEmail($sHex); + if (self::isValidEmail($sDecoded)) { + return $sDecoded; + } + } + + $oAllCfNodes = $oNode->filter('[data-cfemail]'); + foreach ($oAllCfNodes as $oDomElement) { + $sHex = $oDomElement->getAttribute('data-cfemail'); + $sDecoded = self::decodeCloudflareEmail($sHex); + if (self::isValidEmail($sDecoded)) { + return $sDecoded; + } + } + + return ''; + } + + /** + * 从单个卡片节点中提取密码 + * + * @param Crawler $oNode + * @return string + */ + private static function extractPasswordFromNode(Crawler $oNode): string + { + $oBtnNodes = $oNode->filter('button[copy]'); + foreach ($oBtnNodes as $oDomElement) { + $sCopyVal = trim($oDomElement->getAttribute('copy')); + if (!empty($sCopyVal)) { + return $sCopyVal; + } + } + + return ''; + } + + /** + * 从单个卡片节点中提取账号地区(如:美区、日本、中国大陆) + * + * @param Crawler $oNode + * @return string + */ + private static function extractRegionFromNode(Crawler $oNode): string + { + $oSpans = $oNode->filter('h5 span'); + if ($oSpans->count() >= 2) { + $sRawText = trim($oSpans->eq(1)->text('')); + return trim(str_replace(['【', '】'], '', $sRawText)); + } + + return ''; + } + + /** + * 从单个卡片节点中提取检测时间 + * + * @param Crawler $oNode + * @return string + */ + private static function extractCheckTimeFromNode(Crawler $oNode): string + { + $oTimeNode = $oNode->filter('.text-muted'); + if ($oTimeNode->count() > 0) { + $sRawText = trim($oTimeNode->text('')); + return trim(str_replace('检测时间:', '', $sRawText)); + } + + return ''; + } + + /** + * 解密 Cloudflare XOR 加密邮箱 + * + * @param string $sEncodedHex + * @return string + */ + private static function decodeCloudflareEmail(string $sEncodedHex): string + { + if (empty($sEncodedHex) || strlen($sEncodedHex) < 4 || !ctype_xdigit($sEncodedHex)) { + return ''; + } + + $iKey = hexdec(substr($sEncodedHex, 0, 2)); + $sDecodedEmail = ''; + $iLength = strlen($sEncodedHex); + + for ($iIndex = 2; $iIndex < $iLength; $iIndex += 2) { + $sDecodedEmail .= chr(hexdec(substr($sEncodedHex, $iIndex, 2)) ^ $iKey); + } + + return trim($sDecodedEmail); + } + + /** + * 校验邮箱合法性 + * + * @param string $sEmail + * @return bool + */ + private static function isValidEmail(string $sEmail): bool + { + return !empty($sEmail) && filter_var($sEmail, FILTER_VALIDATE_EMAIL) !== false; + } +} diff --git a/app/Services/Cron/ShadowRocketPublish.php b/app/Services/Cron/ShadowRocketPublish.php new file mode 100755 index 00000000..27229081 --- /dev/null +++ b/app/Services/Cron/ShadowRocketPublish.php @@ -0,0 +1,95 @@ +first()?->content; + $sShadowRocketIds = ShadowRocketIds::whereDate('created_at', date("Y-m-d"))->first()?->arr; + $aShadowRocketIds = json_decode($sShadowRocketIds, true); + $iShadowRocketIdsCount = count($aShadowRocketIds); + + foreach ($cSiteFnb as $oSiteFnb) { + $sArticle = $sBlade; + $aSiteConfig = json_decode($oSiteFnb->config, true); + + $sShip = ServiceShipHtml::byShipCode($aSiteConfig['ship_code']); + + $aShadowRocketIdsHtml = []; + + foreach ($aShadowRocketIds as $a) { + $s = ""; + $s .= "

"; + $s .= '账号: '.$a['sEmail'].','; + + $s .= '密码: '.$a['sPassword'].','; + + $s .= "地区:".$a['sRegion'].",检测时间:".$a['sCheckTime']; + $s .= "

"; + + $aShadowRocketIdsHtml[] = $s; + } + + $sShadowRocketIdsHtml = implode("\n\n", $aShadowRocketIdsHtml); + + $aFilter = [ + '{$sContent}' => $sShadowRocketIdsHtml, + '{$sShip}' => $sShip, + '{$sTgHref}' => $aSiteConfig['telegram'], + '{$sGithubHref}' => $aSiteConfig['github'] + ]; + + $sArticle = self::nl2p(str_replace(array_keys($aFilter), array_values($aFilter), $sArticle)); + + $aResult = [ + "content" => $sArticle, + "title" => '「'.date("n月j日").'」'.date("Y").'年最新免费苹果账号(小火箭账号、shadowrocket id)', + "title_sub" => "本次更新共{$iShadowRocketIdsCount}个免费苹果账号,可用于使用小火箭(shadowrocket)。", + "tags" => ["ios", "shadowrocket", "小火箭", "小火箭账号", "shadowrocket id", "免费苹果账号"], + "7like" => 9 + ]; + + $aApiPath = json_decode($oSiteFnb->api_path, true); + $sArticleReceiveShadowrocketids = "https://".$oSiteFnb->url."/".$aApiPath["article_receive_shadowrocketids"]; + + $sFlow = HttpV2::make($sArticleReceiveShadowrocketids, "post")->setDataA($aResult)->send(); + $aFlow = json_decode($sFlow, true); + if (!isset($aFlow["isDone"]) || !$aFlow["isDone"]) { + echo $sFlow; + TeleSlave::warn()->send('ShadowRocketPublish::fn_b()的发送文章失败'); + continue; + } + + echo "\n ok"; + + } + + + } + + public static function nl2p($text) { + // 将文本按换行符拆分成数组 + $paragraphs = explode("\n", $text); + + // 将每一段用

标签包裹 + $paragraphs = array_map(function($paragraph) { + return '

' . trim($paragraph) . '

'; + }, $paragraphs); + + // 使用 implode 拼接成一个字符串 + return implode('', $paragraphs); + } + +} diff --git a/app/Services/Ship/ServiceShipHtml.php b/app/Services/Ship/ServiceShipHtml.php new file mode 100755 index 00000000..a470e227 --- /dev/null +++ b/app/Services/Ship/ServiceShipHtml.php @@ -0,0 +1,30 @@ +first(); + $sJctj .= "

机场推荐 - {$oShip->name}:

\n\n"; + $aShipGood = json_decode($oShip->good, true); + $sShipGood = implode("\n\n", $aShipGood); + $sJctj .= $sShipGood; + $sJctj .= "\n\n"; + $sJctj .= "👉 点击进入机场官网:{$oShip->name}。"; + } + + return $sJctj; + + } + +} diff --git a/composer.json b/composer.json index 97be8ae5..305aa401 100755 --- a/composer.json +++ b/composer.json @@ -14,6 +14,8 @@ "laravel/sanctum": "^4.0", "laravel/tinker": "^2.9", "league/commonmark": "^2.8", + "symfony/css-selector": "^7.4", + "symfony/dom-crawler": "^8.1", "symfony/yaml": "^7.4", "voku/anti-xss": "^4.1" }, diff --git a/composer.lock b/composer.lock index 9c8fa5c6..6cff86a5 100755 --- 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": "6d33a9af7883a91f1b6c86abbd6a7d5e", + "content-hash": "9165966b6edbbe9f8c56722c2ead2f8b", "packages": [ { "name": "brick/math", @@ -3817,16 +3817,16 @@ }, { "name": "symfony/css-selector", - "version": "v7.2.0", + "version": "v7.4.9", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2" + "reference": "b75663ed96cf4756e28e3105476f220f92886cc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/601a5ce9aaad7bf10797e3663faefce9e26c24e2", - "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/b75663ed96cf4756e28e3105476f220f92886cc4", + "reference": "b75663ed96cf4756e28e3105476f220f92886cc4", "shasum": "" }, "require": { @@ -3862,7 +3862,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.2.0" + "source": "https://github.com/symfony/css-selector/tree/v7.4.9" }, "funding": [ { @@ -3873,12 +3873,16 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2026-04-18T13:18:21+00:00" }, { "name": "symfony/deprecation-contracts", @@ -3947,6 +3951,76 @@ ], "time": "2024-09-25T14:20:29+00:00" }, + { + "name": "symfony/dom-crawler", + "version": "v8.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/dom-crawler.git", + "reference": "1dfadd25537c8fcb6752cce5775f24647d976bdc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/1dfadd25537c8fcb6752cce5775f24647d976bdc", + "reference": "1dfadd25537c8fcb6752cce5775f24647d976bdc", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.0" + }, + "require-dev": { + "symfony/css-selector": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\DomCrawler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases DOM navigation for HTML and XML documents", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dom-crawler/tree/v8.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-06-05T06:23:12+00:00" + }, { "name": "symfony/error-handler", "version": "v7.2.1", diff --git a/config/path.php b/config/path.php index 7e5438b1..77fe4ff3 100755 --- a/config/path.php +++ b/config/path.php @@ -4,4 +4,5 @@ return [ "url_nodehub_base" => env("url_nodehub_base"), "url_master_base" => env("url_master_base"), "url_ship_fu_base" => env("url_ship_fu_base"), + "url_resource_base" => env("url_resource_base"), ]; diff --git a/public/build/assets/app-psC-g_pG.js b/public/build/assets/app-BD91q7Y3.js similarity index 95% rename from public/build/assets/app-psC-g_pG.js rename to public/build/assets/app-BD91q7Y3.js index dcac398f..ced507e4 100644 --- a/public/build/assets/app-psC-g_pG.js +++ b/public/build/assets/app-BD91q7Y3.js @@ -18,7 +18,7 @@ var Eg=Object.defineProperty;var Mg=(n,e,t)=>e in n?Eg(n,e,{enumerable:!0,config */function x0(n,e){if(typeof n>"u"||!n.document)throw new Error("jQuery requires a window with a document");var t=[],r=Object.getPrototypeOf,i=t.slice,s=t.flat?function(l){return t.flat.call(l)}:function(l){return t.concat.apply([],l)},o=t.push,a=t.indexOf,c={},u=c.toString,d=c.hasOwnProperty,p=d.toString,y=p.call(Object),g={};function w(l){return l==null?l+"":typeof l=="object"?c[u.call(l)]||"object":typeof l}function T(l){return l!=null&&l===l.window}function S(l){var f=!!l&&l.length,h=w(l);return typeof l=="function"||T(l)?!1:h==="array"||f===0||typeof f=="number"&&f>0&&f-1 in l}var C=n.document,I={type:!0,src:!0,nonce:!0,noModule:!0};function _(l,f,h){h=h||C;var m,k=h.createElement("script");k.text=l;for(m in I)f&&f[m]&&(k[m]=f[m]);h.head.appendChild(k).parentNode&&k.parentNode.removeChild(k)}var B="4.0.0",z=/HTML$/i,b=function(l,f){return new b.fn.init(l,f)};b.fn=b.prototype={jquery:B,constructor:b,length:0,toArray:function(){return i.call(this)},get:function(l){return l==null?i.call(this):l<0?this[l+this.length]:this[l]},pushStack:function(l){var f=b.merge(this.constructor(),l);return f.prevObject=this,f},each:function(l){return b.each(this,l)},map:function(l){return this.pushStack(b.map(this,function(f,h){return l.call(f,h,f)}))},slice:function(){return this.pushStack(i.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(b.grep(this,function(l,f){return(f+1)%2}))},odd:function(){return this.pushStack(b.grep(this,function(l,f){return f%2}))},eq:function(l){var f=this.length,h=+l+(l<0?f:0);return this.pushStack(h>=0&&h+~]|"+H+")"+H+"*"),fe=new RegExp(H+"|>"),ze=/[+~]/,Nt=C.documentElement,Po=Nt.matches||Nt.msMatchesSelector;function xn(){var l=[];function f(h,m){return l.push(h+" ")>b.expr.cacheLength&&delete f[l.shift()],f[h+" "]=m}return f}function ct(l){return l&&typeof l.getElementsByTagName<"u"&&l}var qe="\\["+H+"*("+ue+")(?:"+H+"*([*^$|!~]?=)"+H+`*(?:'((?:\\\\.|[^\\\\'])*)'|"((?:\\\\.|[^\\\\"])*)"|(`+ue+"))|)"+H+"*\\]",Dt=":("+ue+`)(?:\\((('((?:\\\\.|[^\\\\'])*)'|"((?:\\\\.|[^\\\\"])*)")|((?:\\\\.|[^\\\\()[\\]]|`+qe+")*)|.*)\\)|)",Qn={ID:new RegExp("^#("+ue+")"),CLASS:new RegExp("^\\.("+ue+")"),TAG:new RegExp("^("+ue+"|[*])"),ATTR:new RegExp("^"+qe),PSEUDO:new RegExp("^"+Dt),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+H+"*(even|odd|(([+-]|)(\\d*)n|)"+H+"*(?:([+-]|)"+H+"*(\\d+)|))"+H+"*\\)|)","i")},he=new RegExp(Dt),kt=new RegExp("\\\\[\\da-fA-F]{1,6}"+H+"?|\\\\([^\\r\\n\\f])","g"),Io=function(l,f){var h="0x"+l.slice(1)-65536;return f||(h<0?String.fromCharCode(h+65536):String.fromCharCode(h>>10|55296,h&1023|56320))};function xt(l){return l.replace(kt,Io)}function $e(l){b.error("Syntax error, unrecognized expression: "+l)}var Dr=new RegExp("^"+H+"*,"+H+"*"),ut=xn();function Y(l,f){var h,m,k,x,v,M,E,A=ut[l+" "];if(A)return f?0:A.slice(0);for(v=l,M=[],E=b.expr.preFilter;v;){(!h||(m=Dr.exec(v)))&&(m&&(v=v.slice(m[0].length)||v),M.push(k=[])),h=!1,(m=se.exec(v))&&(h=m.shift(),k.push({value:h,type:m[0].replace(Se," ")}),v=v.slice(h.length));for(x in Qn)(m=b.expr.match[x].exec(v))&&(!E[x]||(m=E[x](m)))&&(h=m.shift(),k.push({value:h,type:x,matches:m}),v=v.slice(h.length));if(!h)break}return f?v.length:v?$e(l):ut(l,M).slice(0)}var ft={ATTR:function(l){return l[1]=xt(l[1]),l[3]=xt(l[3]||l[4]||l[5]||""),l[2]==="~="&&(l[3]=" "+l[3]+" "),l.slice(0,4)},CHILD:function(l){return l[1]=l[1].toLowerCase(),l[1].slice(0,3)==="nth"?(l[3]||$e(l[0]),l[4]=+(l[4]?l[5]+(l[6]||1):2*(l[3]==="even"||l[3]==="odd")),l[5]=+(l[7]+l[8]||l[3]==="odd")):l[3]&&$e(l[0]),l},PSEUDO:function(l){var f,h=!l[6]&&l[2];return Qn.CHILD.test(l[0])?null:(l[3]?l[2]=l[4]||l[5]||"":h&&he.test(h)&&(f=Y(h,!0))&&(f=h.indexOf(")",h.length-f)-h.length)&&(l[0]=l[0].slice(0,f),l[2]=h.slice(0,f)),l.slice(0,3))}};function wt(l){for(var f=0,h=l.length,m="";f1)},removeAttr:function(l){return this.each(function(){b.removeAttr(this,l)})}}),b.extend({attr:function(l,f,h){var m,k,x=l.nodeType;if(!(x===3||x===8||x===2)){if(typeof l.getAttribute>"u")return b.prop(l,f,h);if((x!==1||!b.isXMLDoc(l))&&(k=b.attrHooks[f.toLowerCase()]),h!==void 0){if(h===null||h===!1&&f.toLowerCase().indexOf("aria-")!==0){b.removeAttr(l,f);return}return k&&"set"in k&&(m=k.set(l,h,f))!==void 0?m:(l.setAttribute(f,h),h)}return k&&"get"in k&&(m=k.get(l,f))!==null?m:(m=l.getAttribute(f),m??void 0)}},attrHooks:{},removeAttr:function(l,f){var h,m=0,k=f&&f.match(it);if(k&&l.nodeType===1)for(;h=k[m++];)l.removeAttribute(h)}}),ee&&(b.attrHooks.type={set:function(l,f){if(f==="radio"&&$(l,"input")){var h=l.value;return l.setAttribute("type",f),h&&(l.value=h),f}}});var Lo=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;function wn(l,f){return f?l==="\0"?"�":l.slice(0,-1)+"\\"+l.charCodeAt(l.length-1).toString(16)+" ":"\\"+l}b.escapeSelector=function(l){return(l+"").replace(Lo,wn)};var km=t.sort,xm=t.splice,Bo;function wm(l,f){if(l===f)return Bo=!0,0;var h=!l.compareDocumentPosition-!f.compareDocumentPosition;return h||(h=(l.ownerDocument||l)==(f.ownerDocument||f)?l.compareDocumentPosition(f):1,h&1?l==C||l.ownerDocument==C&&b.contains(C,l)?-1:f==C||f.ownerDocument==C&&b.contains(C,f)?1:0:h&4?-1:1)}b.uniqueSort=function(l){var f,h=[],m=0,k=0;if(Bo=!1,km.call(l,wm),Bo){for(;f=l[k++];)f===l[k]&&(m=h.push(k));for(;m--;)xm.call(l,h[m],1)}return l},b.fn.uniqueSort=function(){return this.pushStack(b.uniqueSort(i.apply(this)))};var Yn,Ri,st,yc,Ft,Ht=0,Tm=0,bc=xn(),kc=xn(),Ni=xn(),Sm=new RegExp(H+"+","g"),vm=new RegExp("^"+ue+"$"),xc=b.extend({needsContext:new RegExp("^"+H+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+H+"*((?:-\\d)?\\d*)"+H+"*\\)|)(?=[^-]|$)","i")},Qn),Cm=/^(?:input|select|textarea|button)$/i,Em=/^h\d$/i,Mm=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Am=function(){Zn()},Om=Di(function(l){return l.disabled===!0&&$(l,"fieldset")},{dir:"parentNode",next:"legend"});function Tt(l,f,h,m){var k,x,v,M,E,A,N,L=f&&f.ownerDocument,O=f?f.nodeType:9;if(h=h||[],typeof l!="string"||!l||O!==1&&O!==9&&O!==11)return h;if(!m&&(Zn(f),f=f||st,Ft)){if(O!==11&&(E=Mm.exec(l)))if(k=E[1]){if(O===9)return(v=f.getElementById(k))&&o.call(h,v),h;if(L&&(v=L.getElementById(k))&&b.contains(f,v))return o.call(h,v),h}else{if(E[2])return o.apply(h,f.getElementsByTagName(l)),h;if((k=E[3])&&f.getElementsByClassName)return o.apply(h,f.getElementsByClassName(k)),h}if(!Ni[l+" "]&&(!ge||!ge.test(l))){if(N=l,L=f,O===1&&(fe.test(l)||se.test(l))){for(L=ze.test(l)&&ct(f.parentNode)||f,(L!=f||ee)&&((M=f.getAttribute("id"))?M=b.escapeSelector(M):f.setAttribute("id",M=b.expando)),A=Y(l),x=A.length;x--;)A[x]=(M?"#"+M:":scope")+" "+wt(A[x]);N=A.join(",")}try{return o.apply(h,L.querySelectorAll(N)),h}catch{Ni(l,!0)}finally{M===b.expando&&f.removeAttribute("id")}}}return Sc(l.replace(Se,"$1"),f,h,m)}function Pt(l){return l[b.expando]=!0,l}function Rm(l){return function(f){return $(f,"input")&&f.type===l}}function Nm(l){return function(f){return($(f,"input")||$(f,"button"))&&f.type===l}}function wc(l){return function(f){return"form"in f?f.parentNode&&f.disabled===!1?"label"in f?"label"in f.parentNode?f.parentNode.disabled===l:f.disabled===l:f.isDisabled===l||f.isDisabled!==!l&&Om(f)===l:f.disabled===l:"label"in f?f.disabled===l:!1}}function Tn(l){return Pt(function(f){return f=+f,Pt(function(h,m){for(var k,x=l([],h.length,f),v=x.length;v--;)h[k=x[v]]&&(h[k]=!(m[k]=h[k]))})})}function Zn(l){var f,h=l?l.ownerDocument||l:C;h==st||h.nodeType!==9||(st=h,yc=st.documentElement,Ft=!b.isXMLDoc(st),ee&&C!=st&&(f=st.defaultView)&&f.top!==f&&f.addEventListener("unload",Am))}Tt.matches=function(l,f){return Tt(l,null,null,f)},Tt.matchesSelector=function(l,f){if(Zn(l),Ft&&!Ni[f+" "]&&(!ge||!ge.test(f)))try{return Po.call(l,f)}catch{Ni(f,!0)}return Tt(f,st,null,[l]).length>0},b.expr={cacheLength:50,createPseudo:Pt,match:xc,find:{ID:function(l,f){if(typeof f.getElementById<"u"&&Ft){var h=f.getElementById(l);return h?[h]:[]}},TAG:function(l,f){return typeof f.getElementsByTagName<"u"?f.getElementsByTagName(l):f.querySelectorAll(l)},CLASS:function(l,f){if(typeof f.getElementsByClassName<"u"&&Ft)return f.getElementsByClassName(l)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:ft,filter:{ID:function(l){var f=xt(l);return function(h){return h.getAttribute("id")===f}},TAG:function(l){var f=xt(l).toLowerCase();return l==="*"?function(){return!0}:function(h){return $(h,f)}},CLASS:function(l){var f=bc[l+" "];return f||(f=new RegExp("(^|"+H+")"+l+"("+H+"|$)"))&&bc(l,function(h){return f.test(typeof h.className=="string"&&h.className||typeof h.getAttribute<"u"&&h.getAttribute("class")||"")})},ATTR:function(l,f,h){return function(m){var k=b.attr(m,l);return k==null?f==="!=":f?(k+="",f==="="?k===h:f==="!="?k!==h:f==="^="?h&&k.indexOf(h)===0:f==="*="?h&&k.indexOf(h)>-1:f==="$="?h&&k.slice(-h.length)===h:f==="~="?(" "+k.replace(Sm," ")+" ").indexOf(h)>-1:f==="|="?k===h||k.slice(0,h.length+1)===h+"-":!1):!0}},CHILD:function(l,f,h,m,k){var x=l.slice(0,3)!=="nth",v=l.slice(-4)!=="last",M=f==="of-type";return m===1&&k===0?function(E){return!!E.parentNode}:function(E,A,N){var L,O,P,U,Q,G=x!==v?"nextSibling":"previousSibling",ye=E.parentNode,pe=M&&E.nodeName.toLowerCase(),Ze=!N&&!M,je=!1;if(ye){if(x){for(;G;){for(P=E;P=P[G];)if(M?$(P,pe):P.nodeType===1)return!1;Q=G=l==="only"&&!Q&&"nextSibling"}return!0}if(Q=[v?ye.firstChild:ye.lastChild],v&&Ze){for(O=ye[b.expando]||(ye[b.expando]={}),L=O[l]||[],U=L[0]===Ht&&L[1],je=U&&L[2],P=U&&ye.childNodes[U];P=++U&&P&&P[G]||(je=U=0)||Q.pop();)if(P.nodeType===1&&++je&&P===E){O[l]=[Ht,U,je];break}}else if(Ze&&(O=E[b.expando]||(E[b.expando]={}),L=O[l]||[],U=L[0]===Ht&&L[1],je=U),je===!1)for(;(P=++U&&P&&P[G]||(je=U=0)||Q.pop())&&!((M?$(P,pe):P.nodeType===1)&&++je&&(Ze&&(O=P[b.expando]||(P[b.expando]={}),O[l]=[Ht,je]),P===E)););return je-=k,je===m||je%m===0&&je/m>=0}}},PSEUDO:function(l,f){var h=b.expr.pseudos[l]||b.expr.setFilters[l.toLowerCase()]||$e("unsupported pseudo: "+l);return h[b.expando]?h(f):h}},pseudos:{not:Pt(function(l){var f=[],h=[],m=jo(l.replace(Se,"$1"));return m[b.expando]?Pt(function(k,x,v,M){for(var E,A=m(k,null,M,[]),N=k.length;N--;)(E=A[N])&&(k[N]=!(x[N]=E))}):function(k,x,v){return f[0]=k,m(f,null,v,h),f[0]=null,!h.pop()}}),has:Pt(function(l){return function(f){return Tt(l,f).length>0}}),contains:Pt(function(l){return l=xt(l),function(f){return(f.textContent||b.text(f)).indexOf(l)>-1}}),lang:Pt(function(l){return vm.test(l||"")||$e("unsupported lang: "+l),l=xt(l).toLowerCase(),function(f){var h;do if(h=Ft?f.lang:f.getAttribute("xml:lang")||f.getAttribute("lang"))return h=h.toLowerCase(),h===l||h.indexOf(l+"-")===0;while((f=f.parentNode)&&f.nodeType===1);return!1}}),target:function(l){var f=n.location&&n.location.hash;return f&&f.slice(1)===l.id},root:function(l){return l===yc},focus:function(l){return l===st.activeElement&&st.hasFocus()&&!!(l.type||l.href||~l.tabIndex)},enabled:wc(!1),disabled:wc(!0),checked:function(l){return $(l,"input")&&!!l.checked||$(l,"option")&&!!l.selected},selected:function(l){return ee&&l.parentNode&&l.parentNode.selectedIndex,l.selected===!0},empty:function(l){for(l=l.firstChild;l;l=l.nextSibling)if(l.nodeType<6)return!1;return!0},parent:function(l){return!b.expr.pseudos.empty(l)},header:function(l){return Em.test(l.nodeName)},input:function(l){return Cm.test(l.nodeName)},button:function(l){return $(l,"input")&&l.type==="button"||$(l,"button")},text:function(l){return $(l,"input")&&l.type==="text"},first:Tn(function(){return[0]}),last:Tn(function(l,f){return[f-1]}),eq:Tn(function(l,f,h){return[h<0?h+f:h]}),even:Tn(function(l,f){for(var h=0;hf?m=f:m=h;--m>=0;)l.push(m);return l}),gt:Tn(function(l,f,h){for(var m=h<0?h+f:h;++m1?function(f,h,m){for(var k=l.length;k--;)if(!l[k](f,h,m))return!1;return!0}:l[0]}function Dm(l,f,h){for(var m=0,k=f.length;m-1&&(v[N]=!(M[N]=O))}}else P=Pi(P===M?P.splice(G,P.length):P),k?k(null,M,P,A):o.apply(M,P)})}function $o(l){for(var f,h,m,k=l.length,x=b.expr.relative[l[0].type],v=x||b.expr.relative[" "],M=x?1:0,E=Di(function(L){return L===f},v,!0),A=Di(function(L){return a.call(f,L)>-1},v,!0),N=[function(L,O,P){var U=!x&&(P||O!=Ri)||((f=O).nodeType?E(L,O,P):A(L,O,P));return f=null,U}];M1&&_o(N),M>1&&wt(l.slice(0,M-1).concat({value:l[M-2].type===" "?"*":""})).replace(Se,"$1"),h,M0,m=l.length>0,k=function(x,v,M,E,A){var N,L,O,P=0,U="0",Q=x&&[],G=[],ye=Ri,pe=x||m&&b.expr.find.TAG("*",A),Ze=Ht+=ye==null?1:Math.random()||.1;for(A&&(Ri=v==st||v||A);(N=pe[U])!=null;U++){if(m&&N){for(L=0,!v&&N.ownerDocument!=st&&(Zn(N),M=!Ft);O=l[L++];)if(O(N,v||st,M)){o.call(E,N);break}A&&(Ht=Ze)}h&&((N=!O&&N)&&P--,x&&Q.push(N))}if(P+=U,h&&U!==P){for(L=0;O=f[L++];)O(Q,G,v,M);if(x){if(P>0)for(;U--;)Q[U]||G[U]||(G[U]=q.call(E));G=Pi(G)}o.apply(E,G),A&&!x&&G.length>0&&P+f.length>1&&b.uniqueSort(E)}return A&&(Ht=Ze,Ri=ye),Q};return h?Pt(k):k}function jo(l,f){var h,m=[],k=[],x=kc[l+" "];if(!x){for(f||(f=Y(l)),h=f.length;h--;)x=$o(f[h]),x[b.expando]?m.push(x):k.push(x);x=kc(l,Pm(k,m)),x.selector=l}return x}function Sc(l,f,h,m){var k,x,v,M,E,A=typeof l=="function"&&l,N=!m&&Y(l=A.selector||l);if(h=h||[],N.length===1){if(x=N[0]=N[0].slice(0),x.length>2&&(v=x[0]).type==="ID"&&f.nodeType===9&&Ft&&b.expr.relative[x[1].type]){if(f=(b.expr.find.ID(xt(v.matches[0]),f)||[])[0],f)A&&(f=f.parentNode);else return h;l=l.slice(x.shift().value.length)}for(k=xc.needsContext.test(l)?0:x.length;k--&&(v=x[k],!b.expr.relative[M=v.type]);)if((E=b.expr.find[M])&&(m=E(xt(v.matches[0]),ze.test(x[0].type)&&ct(f.parentNode)||f))){if(x.splice(k,1),l=m.length&&wt(x),!l)return o.apply(h,m),h;break}}return(A||jo(l,N))(m,f,!Ft,h,!f||ze.test(l)&&ct(f.parentNode)||f),h}Zn(),b.find=Tt,Tt.compile=jo,Tt.select=Sc,Tt.setDocument=Zn,Tt.tokenize=Y;function er(l,f,h){for(var m=[],k=h!==void 0;(l=l[f])&&l.nodeType!==9;)if(l.nodeType===1){if(k&&b(l).is(h))break;m.push(l)}return m}function vc(l,f){for(var h=[];l;l=l.nextSibling)l.nodeType===1&&l!==f&&h.push(l);return h}var Cc=b.expr.match.needsContext,Ec=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function Mc(l){return l[0]==="<"&&l[l.length-1]===">"&&l.length>=3}function Fo(l,f,h){return typeof f=="function"?b.grep(l,function(m,k){return!!f.call(m,k,m)!==h}):f.nodeType?b.grep(l,function(m){return m===f!==h}):typeof f!="string"?b.grep(l,function(m){return a.call(f,m)>-1!==h}):b.filter(f,l,h)}b.filter=function(l,f,h){var m=f[0];return h&&(l=":not("+l+")"),f.length===1&&m.nodeType===1?b.find.matchesSelector(m,l)?[m]:[]:b.find.matches(l,b.grep(f,function(k){return k.nodeType===1}))},b.fn.extend({find:function(l){var f,h,m=this.length,k=this;if(typeof l!="string")return this.pushStack(b(l).filter(function(){for(f=0;f1?b.uniqueSort(h):h},filter:function(l){return this.pushStack(Fo(this,l||[],!1))},not:function(l){return this.pushStack(Fo(this,l||[],!0))},is:function(l){return!!Fo(this,typeof l=="string"&&Cc.test(l)?b(l):l||[],!1).length}});var Ii,Im=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,Lm=b.fn.init=function(l,f){var h,m;if(!l)return this;if(l.nodeType)return this[0]=l,this.length=1,this;if(typeof l=="function")return Ii.ready!==void 0?Ii.ready(l):l(b);if(h=l+"",Mc(h))h=[null,l,null];else if(typeof l=="string")h=Im.exec(l);else return b.makeArray(l,this);if(h&&(h[1]||!f))if(h[1]){if(f=f instanceof b?f[0]:f,b.merge(this,b.parseHTML(h[1],f&&f.nodeType?f.ownerDocument||f:C,!0)),Ec.test(h[1])&&b.isPlainObject(f))for(h in f)typeof this[h]=="function"?this[h](f[h]):this.attr(h,f[h]);return this}else return m=C.getElementById(h[2]),m&&(this[0]=m,this.length=1),this;else return!f||f.jquery?(f||Ii).find(l):this.constructor(f).find(l)};Lm.prototype=b.fn,Ii=b(C);var Bm=/^(?:parents|prev(?:Until|All))/,_m={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({has:function(l){var f=b(l,this),h=f.length;return this.filter(function(){for(var m=0;m-1:h.nodeType===1&&b.find.matchesSelector(h,l))){x.push(h);break}}return this.pushStack(x.length>1?b.uniqueSort(x):x)},index:function(l){return l?typeof l=="string"?a.call(b(l),this[0]):a.call(this,l.jquery?l[0]:l):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(l,f){return this.pushStack(b.uniqueSort(b.merge(this.get(),b(l,f))))},addBack:function(l){return this.add(l==null?this.prevObject:this.prevObject.filter(l))}});function Ac(l,f){for(;(l=l[f])&&l.nodeType!==1;);return l}b.each({parent:function(l){var f=l.parentNode;return f&&f.nodeType!==11?f:null},parents:function(l){return er(l,"parentNode")},parentsUntil:function(l,f,h){return er(l,"parentNode",h)},next:function(l){return Ac(l,"nextSibling")},prev:function(l){return Ac(l,"previousSibling")},nextAll:function(l){return er(l,"nextSibling")},prevAll:function(l){return er(l,"previousSibling")},nextUntil:function(l,f,h){return er(l,"nextSibling",h)},prevUntil:function(l,f,h){return er(l,"previousSibling",h)},siblings:function(l){return vc((l.parentNode||{}).firstChild,l)},children:function(l){return vc(l.firstChild)},contents:function(l){return l.contentDocument!=null&&r(l.contentDocument)?l.contentDocument:($(l,"template")&&(l=l.content||l),b.merge([],l.childNodes))}},function(l,f){b.fn[l]=function(h,m){var k=b.map(this,f,h);return l.slice(-5)!=="Until"&&(m=h),m&&typeof m=="string"&&(k=b.filter(m,k)),this.length>1&&(_m[l]||b.uniqueSort(k),Bm.test(l)&&k.reverse()),this.pushStack(k)}});function zm(l){var f={};return b.each(l.match(it)||[],function(h,m){f[m]=!0}),f}b.Callbacks=function(l){l=typeof l=="string"?zm(l):b.extend({},l);var f,h,m,k,x=[],v=[],M=-1,E=function(){for(k=k||l.once,m=f=!0;v.length;M=-1)for(h=v.shift();++M-1;)x.splice(O,1),O<=M&&M--}),this},has:function(N){return N?b.inArray(N,x)>-1:x.length>0},empty:function(){return x&&(x=[]),this},disable:function(){return k=v=[],x=h="",this},disabled:function(){return!x},lock:function(){return k=v=[],!h&&!f&&(x=h=""),this},locked:function(){return!!k},fireWith:function(N,L){return k||(L=L||[],L=[N,L.slice?L.slice():L],v.push(L),f||E()),this},fire:function(){return A.fireWith(this,arguments),this},fired:function(){return!!m}};return A};function tr(l){return l}function Li(l){throw l}function Oc(l,f,h,m){var k;try{l&&typeof(k=l.promise)=="function"?k.call(l).done(f).fail(h):l&&typeof(k=l.then)=="function"?k.call(l,f,h):f.apply(void 0,[l].slice(m))}catch(x){h(x)}}b.extend({Deferred:function(l){var f=[["notify","progress",b.Callbacks("memory"),b.Callbacks("memory"),2],["resolve","done",b.Callbacks("once memory"),b.Callbacks("once memory"),0,"resolved"],["reject","fail",b.Callbacks("once memory"),b.Callbacks("once memory"),1,"rejected"]],h="pending",m={state:function(){return h},always:function(){return k.done(arguments).fail(arguments),this},catch:function(x){return m.then(null,x)},pipe:function(){var x=arguments;return b.Deferred(function(v){b.each(f,function(M,E){var A=typeof x[E[4]]=="function"&&x[E[4]];k[E[1]](function(){var N=A&&A.apply(this,arguments);N&&typeof N.promise=="function"?N.promise().progress(v.notify).done(v.resolve).fail(v.reject):v[E[0]+"With"](this,A?[N]:arguments)})}),x=null}).promise()},then:function(x,v,M){var E=0;function A(N,L,O,P){return function(){var U=this,Q=arguments,G=function(){var pe,Ze;if(!(N=E&&(O!==Li&&(U=void 0,Q=[pe]),L.rejectWith(U,Q))}};N?ye():(b.Deferred.getErrorHook&&(ye.error=b.Deferred.getErrorHook()),n.setTimeout(ye))}}return b.Deferred(function(N){f[0][3].add(A(0,N,typeof M=="function"?M:tr,N.notifyWith)),f[1][3].add(A(0,N,typeof x=="function"?x:tr)),f[2][3].add(A(0,N,typeof v=="function"?v:Li))}).promise()},promise:function(x){return x!=null?b.extend(x,m):m}},k={};return b.each(f,function(x,v){var M=v[2],E=v[5];m[v[1]]=M.add,E&&M.add(function(){h=E},f[3-x][2].disable,f[3-x][3].disable,f[0][2].lock,f[0][3].lock),M.add(v[3].fire),k[v[0]]=function(){return k[v[0]+"With"](this===k?void 0:this,arguments),this},k[v[0]+"With"]=M.fireWith}),m.promise(k),l&&l.call(k,k),k},when:function(l){var f=arguments.length,h=f,m=Array(h),k=i.call(arguments),x=b.Deferred(),v=function(M){return function(E){m[M]=this,k[M]=arguments.length>1?i.call(arguments):E,--f||x.resolveWith(m,k)}};if(f<=1&&(Oc(l,x.done(v(h)).resolve,x.reject,!f),x.state()==="pending"||typeof(k[h]&&k[h].then)=="function"))return x.then();for(;h--;)Oc(k[h],v(h),x.reject);return x.promise()}});var $m=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;b.Deferred.exceptionHook=function(l,f){l&&$m.test(l.name)&&n.console.warn("jQuery.Deferred exception",l,f)},b.readyException=function(l){n.setTimeout(function(){throw l})};var Ho=b.Deferred();b.fn.ready=function(l){return Ho.then(l).catch(function(f){b.readyException(f)}),this},b.extend({isReady:!1,readyWait:1,ready:function(l){(l===!0?--b.readyWait:b.isReady)||(b.isReady=!0,!(l!==!0&&--b.readyWait>0)&&Ho.resolveWith(C,[b]))}}),b.ready.then=Ho.then;function Bi(){C.removeEventListener("DOMContentLoaded",Bi),n.removeEventListener("load",Bi),b.ready()}C.readyState!=="loading"?n.setTimeout(b.ready):(C.addEventListener("DOMContentLoaded",Bi),n.addEventListener("load",Bi));var jm=/-([a-z])/g;function Fm(l,f){return f.toUpperCase()}function Sn(l){return l.replace(jm,Fm)}function Pr(l){return l.nodeType===1||l.nodeType===9||!+l.nodeType}function Ir(){this.expando=b.expando+Ir.uid++}Ir.uid=1,Ir.prototype={cache:function(l){var f=l[this.expando];return f||(f=Object.create(null),Pr(l)&&(l.nodeType?l[this.expando]=f:Object.defineProperty(l,this.expando,{value:f,configurable:!0}))),f},set:function(l,f,h){var m,k=this.cache(l);if(typeof f=="string")k[Sn(f)]=h;else for(m in f)k[Sn(m)]=f[m];return h},get:function(l,f){return f===void 0?this.cache(l):l[this.expando]&&l[this.expando][Sn(f)]},access:function(l,f,h){return f===void 0||f&&typeof f=="string"&&h===void 0?this.get(l,f):(this.set(l,f,h),h!==void 0?h:f)},remove:function(l,f){var h,m=l[this.expando];if(m!==void 0){if(f!==void 0)for(Array.isArray(f)?f=f.map(Sn):(f=Sn(f),f=f in m?[f]:f.match(it)||[]),h=f.length;h--;)delete m[f[h]];(f===void 0||b.isEmptyObject(m))&&(l.nodeType?l[this.expando]=void 0:delete l[this.expando])}},hasData:function(l){var f=l[this.expando];return f!==void 0&&!b.isEmptyObject(f)}};var Z=new Ir,Qe=new Ir,Hm=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Vm=/[A-Z]/g;function qm(l){return l==="true"?!0:l==="false"?!1:l==="null"?null:l===+l+""?+l:Hm.test(l)?JSON.parse(l):l}function Rc(l,f,h){var m;if(h===void 0&&l.nodeType===1)if(m="data-"+f.replace(Vm,"-$&").toLowerCase(),h=l.getAttribute(m),typeof h=="string"){try{h=qm(h)}catch{}Qe.set(l,f,h)}else h=void 0;return h}b.extend({hasData:function(l){return Qe.hasData(l)||Z.hasData(l)},data:function(l,f,h){return Qe.access(l,f,h)},removeData:function(l,f){Qe.remove(l,f)},_data:function(l,f,h){return Z.access(l,f,h)},_removeData:function(l,f){Z.remove(l,f)}}),b.fn.extend({data:function(l,f){var h,m,k,x=this[0],v=x&&x.attributes;if(l===void 0){if(this.length&&(k=Qe.get(x),x.nodeType===1&&!Z.get(x,"hasDataAttrs"))){for(h=v.length;h--;)v[h]&&(m=v[h].name,m.indexOf("data-")===0&&(m=Sn(m.slice(5)),Rc(x,m,k[m])));Z.set(x,"hasDataAttrs",!0)}return k}return typeof l=="object"?this.each(function(){Qe.set(this,l)}):Xe(this,function(M){var E;if(x&&M===void 0)return E=Qe.get(x,l),E!==void 0||(E=Rc(x,l),E!==void 0)?E:void 0;this.each(function(){Qe.set(this,l,M)})},null,f,arguments.length>1,null,!0)},removeData:function(l){return this.each(function(){Qe.remove(this,l)})}}),b.extend({queue:function(l,f,h){var m;if(l)return f=(f||"fx")+"queue",m=Z.get(l,f),h&&(!m||Array.isArray(h)?m=Z.set(l,f,b.makeArray(h)):m.push(h)),m||[]},dequeue:function(l,f){f=f||"fx";var h=b.queue(l,f),m=h.length,k=h.shift(),x=b._queueHooks(l,f),v=function(){b.dequeue(l,f)};k==="inprogress"&&(k=h.shift(),m--),k&&(f==="fx"&&h.unshift("inprogress"),delete x.stop,k.call(l,v,x)),!m&&x&&x.empty.fire()},_queueHooks:function(l,f){var h=f+"queueHooks";return Z.get(l,h)||Z.set(l,h,{empty:b.Callbacks("once memory").add(function(){Z.remove(l,[f+"queue",h])})})}}),b.fn.extend({queue:function(l,f){var h=2;return typeof l!="string"&&(f=l,l="fx",h--),arguments.length\x20\t\r\n\f]*)/i,Vt={thead:["table"],col:["colgroup","table"],tr:["tbody","table"],td:["tr","tbody","table"]};Vt.tbody=Vt.tfoot=Vt.colgroup=Vt.caption=Vt.thead,Vt.th=Vt.td;function Ye(l,f){var h;return typeof l.getElementsByTagName<"u"?h=t.slice.call(l.getElementsByTagName(f||"*")):typeof l.querySelectorAll<"u"?h=l.querySelectorAll(f||"*"):h=[],f===void 0||f&&$(l,f)?b.merge([l],h):h}var Lc=/^$|^module$|\/(?:java|ecma)script/i;function qo(l,f){for(var h=0,m=l.length;h-1;)v=v.appendChild(f.createElement(E[N]));v.innerHTML=b.htmlPrefilter(x),b.merge(O,v.childNodes),v=L.firstChild,v.textContent=""}for(L.textContent="",P=0;x=O[P++];){if(m&&b.inArray(x,m)>-1){k&&k.push(x);continue}if(A=Br(x),v=Ye(L.appendChild(x),"script"),A&&qo(v),h)for(N=0;x=v[N++];)Lc.test(x.type||"")&&h.push(x)}return L}function Qm(l){return l.type=(l.getAttribute("type")!==null)+"/"+l.type,l}function Ym(l){return(l.type||"").slice(0,5)==="true/"?l.type=l.type.slice(5):l.removeAttribute("type"),l}function rr(l,f,h,m){f=s(f);var k,x,v,M,E,A,N=0,L=l.length,O=L-1,P=f[0],U=typeof P=="function";if(U)return l.each(function(Q){var G=l.eq(Q);f[0]=P.call(this,Q,G.html()),rr(G,f,h,m)});if(L&&(k=Bc(f,l[0].ownerDocument,!1,l,m),x=k.firstChild,k.childNodes.length===1&&(k=x),x||m)){for(v=b.map(Ye(k,"script"),Qm),M=v.length;N=1)){for(;A!==this;A=A.parentNode||this)if(A.nodeType===1&&!(l.type==="click"&&A.disabled===!0)){for(x=[],v={},h=0;h-1:b.find(k,this,null,[A]).length),v[k]&&x.push(m);x.length&&M.push({elem:A,handlers:x})}}return A=this,E0&&qo(v,!E&&Ye(l,"script")),M},cleanData:function(l){for(var f,h,m,k=b.event.special,x=0;(h=l[x])!==void 0;x++)if(Pr(h)){if(f=h[Z.expando]){if(f.events)for(m in f.events)k[m]?b.event.remove(h,m):b.removeEvent(h,m,f.handle);h[Z.expando]=void 0}h[Qe.expando]&&(h[Qe.expando]=void 0)}}}),b.fn.extend({detach:function(l){return jc(this,l,!0)},remove:function(l){return jc(this,l)},text:function(l){return Xe(this,function(f){return f===void 0?b.text(this):this.empty().each(function(){(this.nodeType===1||this.nodeType===11||this.nodeType===9)&&(this.textContent=f)})},null,l,arguments.length)},append:function(){return rr(this,arguments,function(l){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var f=zc(this,l);f.appendChild(l)}})},prepend:function(){return rr(this,arguments,function(l){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var f=zc(this,l);f.insertBefore(l,f.firstChild)}})},before:function(){return rr(this,arguments,function(l){this.parentNode&&this.parentNode.insertBefore(l,this)})},after:function(){return rr(this,arguments,function(l){this.parentNode&&this.parentNode.insertBefore(l,this.nextSibling)})},empty:function(){for(var l,f=0;(l=this[f])!=null;f++)l.nodeType===1&&(b.cleanData(Ye(l,!1)),l.textContent="");return this},clone:function(l,f){return l=l??!1,f=f??l,this.map(function(){return b.clone(this,l,f)})},html:function(l){return Xe(this,function(f){var h=this[0]||{},m=0,k=this.length;if(f===void 0&&h.nodeType===1)return h.innerHTML;if(typeof f=="string"&&!Zm.test(f)&&!Vt[(Ic.exec(f)||["",""])[1].toLowerCase()]){f=b.htmlPrefilter(f);try{for(;m=0&&(E+=Math.max(0,Math.ceil(l["offset"+f[0].toUpperCase()+f.slice(1)]-x-E-M-.5))||0),E+A}function Xc(l,f,h){var m=Fi(l),k=ee||h,x=k&&b.css(l,"boxSizing",!1,m)==="border-box",v=x,M=Fc(l,f,m),E="offset"+f[0].toUpperCase()+f.slice(1);if(eg.test(M)){if(!h)return M;M="auto"}return(M==="auto"||ee&&x||!g.reliableColDimensions()&&$(l,"col")||!g.reliableTrDimensions()&&$(l,"tr"))&&l.getClientRects().length&&(x=b.css(l,"boxSizing",!1,m)==="border-box",v=E in l,v&&(M=l[E])),M=parseFloat(M)||0,M+Gc(l,f,h||(x?"border":"content"),v,m,M)+"px"}b.extend({cssHooks:{},style:function(l,f,h,m){if(!(!l||l.nodeType===3||l.nodeType===8||!l.style)){var k,x,v,M=Vo(f),E=Wo.test(f),A=l.style;if(E||(f=Ko(M)),v=b.cssHooks[f]||b.cssHooks[M],h!==void 0){if(x=typeof h,x==="string"&&(k=Lr.exec(h))&&k[1]&&(h=Dc(l,f,k),x="number"),h==null||h!==h)return;x==="number"&&(h+=k&&k[3]||(zi(M)?"px":"")),ee&&h===""&&f.indexOf("background")===0&&(A[f]="inherit"),(!v||!("set"in v)||(h=v.set(l,h,m))!==void 0)&&(E?A.setProperty(f,h):A[f]=h)}else return v&&"get"in v&&(k=v.get(l,!1,m))!==void 0?k:A[f]}},css:function(l,f,h,m){var k,x,v,M=Vo(f),E=Wo.test(f);return E||(f=Ko(M)),v=b.cssHooks[f]||b.cssHooks[M],v&&"get"in v&&(k=v.get(l,!0,h)),k===void 0&&(k=Fc(l,f,m)),k==="normal"&&f in Kc&&(k=Kc[f]),h===""||h?(x=parseFloat(k),h===!0||isFinite(x)?x||0:k):k}}),b.each(["height","width"],function(l,f){b.cssHooks[f]={get:function(h,m,k){if(m)return b.css(h,"display")==="none"?tg(h,rg,function(){return Xc(h,f,k)}):Xc(h,f,k)},set:function(h,m,k){var x,v=Fi(h),M=k&&b.css(h,"boxSizing",!1,v)==="border-box",E=k?Gc(h,f,k,M,v):0;return E&&(x=Lr.exec(m))&&(x[3]||"px")!=="px"&&(h.style[f]=m,m=b.css(h,f)),Jc(h,m,E)}}}),b.each({margin:"",padding:"",border:"Width"},function(l,f){b.cssHooks[l+f]={expand:function(h){for(var m=0,k={},x=typeof h=="string"?h.split(" "):[h];m<4;m++)k[l+en[m]+f]=x[m]||x[m-2]||x[0];return k}},l!=="margin"&&(b.cssHooks[l+f].set=Jc)}),b.fn.extend({css:function(l,f){return Xe(this,function(h,m,k){var x,v,M={},E=0;if(Array.isArray(m)){for(x=Fi(h),v=m.length;E1)}});function dt(l,f,h,m,k){return new dt.prototype.init(l,f,h,m,k)}b.Tween=dt,dt.prototype={constructor:dt,init:function(l,f,h,m,k,x){this.elem=l,this.prop=h,this.easing=k||b.easing._default,this.options=f,this.start=this.now=this.cur(),this.end=m,this.unit=x||(zi(h)?"px":"")},cur:function(){var l=dt.propHooks[this.prop];return l&&l.get?l.get(this):dt.propHooks._default.get(this)},run:function(l){var f,h=dt.propHooks[this.prop];return this.options.duration?this.pos=f=b.easing[this.easing](l,this.options.duration*l,0,1,this.options.duration):this.pos=f=l,this.now=(this.end-this.start)*f+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),h&&h.set?h.set(this):dt.propHooks._default.set(this),this}},dt.prototype.init.prototype=dt.prototype,dt.propHooks={_default:{get:function(l){var f;return l.elem.nodeType!==1||l.elem[l.prop]!=null&&l.elem.style[l.prop]==null?l.elem[l.prop]:(f=b.css(l.elem,l.prop,""),!f||f==="auto"?0:f)},set:function(l){b.fx.step[l.prop]?b.fx.step[l.prop](l):l.elem.nodeType===1&&(b.cssHooks[l.prop]||l.elem.style[Ko(l.prop)]!=null)?b.style(l.elem,l.prop,l.now+l.unit):l.elem[l.prop]=l.now}}},b.easing={linear:function(l){return l},swing:function(l){return .5-Math.cos(l*Math.PI)/2},_default:"swing"},b.fx=dt.prototype.init,b.fx.step={};var or,Hi,ig=/^(?:toggle|show|hide)$/,sg=/queueHooks$/;function Jo(){Hi&&(C.hidden===!1&&n.requestAnimationFrame?n.requestAnimationFrame(Jo):n.setTimeout(Jo,13),b.fx.tick())}function Qc(){return n.setTimeout(function(){or=void 0}),or=Date.now()}function Vi(l,f){var h,m=0,k={height:l};for(f=f?1:0;m<4;m+=2-f)h=en[m],k["margin"+h]=k["padding"+h]=l;return f&&(k.opacity=k.width=l),k}function Yc(l,f,h){for(var m,k=(St.tweeners[f]||[]).concat(St.tweeners["*"]),x=0,v=k.length;x1)},removeProp:function(l){return this.each(function(){delete this[b.propFix[l]||l]})}}),b.extend({prop:function(l,f,h){var m,k,x=l.nodeType;if(!(x===3||x===8||x===2))return(x!==1||!b.isXMLDoc(l))&&(f=b.propFix[f]||f,k=b.propHooks[f]),h!==void 0?k&&"set"in k&&(m=k.set(l,h,f))!==void 0?m:l[f]=h:k&&"get"in k&&(m=k.get(l,f))!==null?m:l[f]},propHooks:{tabIndex:{get:function(l){var f=l.getAttribute("tabindex");return f?parseInt(f,10):lg.test(l.nodeName)||cg.test(l.nodeName)&&l.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),ee&&(b.propHooks.selected={get:function(l){var f=l.parentNode;return f&&f.parentNode&&f.parentNode.selectedIndex,null},set:function(l){var f=l.parentNode;f&&(f.selectedIndex,f.parentNode&&f.parentNode.selectedIndex)}}),b.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){b.propFix[this.toLowerCase()]=this});function vn(l){var f=l.match(it)||[];return f.join(" ")}function ar(l){return l.getAttribute&&l.getAttribute("class")||""}function Go(l){return Array.isArray(l)?l:typeof l=="string"?l.match(it)||[]:[]}b.fn.extend({addClass:function(l){var f,h,m,k,x,v;return typeof l=="function"?this.each(function(M){b(this).addClass(l.call(this,M,ar(this)))}):(f=Go(l),f.length?this.each(function(){if(m=ar(this),h=this.nodeType===1&&" "+vn(m)+" ",h){for(x=0;x-1;)h=h.replace(" "+k+" "," ");v=vn(h),m!==v&&this.setAttribute("class",v)}}):this):this.attr("class","")},toggleClass:function(l,f){var h,m,k,x;return typeof l=="function"?this.each(function(v){b(this).toggleClass(l.call(this,v,ar(this),f),f)}):typeof f=="boolean"?f?this.addClass(l):this.removeClass(l):(h=Go(l),h.length?this.each(function(){for(x=b(this),k=0;k-1)return!0;return!1}}),b.fn.extend({val:function(l){var f,h,m,k=this[0];return arguments.length?(m=typeof l=="function",this.each(function(x){var v;this.nodeType===1&&(m?v=l.call(this,x,b(this).val()):v=l,v==null?v="":typeof v=="number"?v+="":Array.isArray(v)&&(v=b.map(v,function(M){return M==null?"":M+""})),f=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],(!f||!("set"in f)||f.set(this,v,"value")===void 0)&&(this.value=v))})):k?(f=b.valHooks[k.type]||b.valHooks[k.nodeName.toLowerCase()],f&&"get"in f&&(h=f.get(k,"value"))!==void 0?h:(h=k.value,h??"")):void 0}}),b.extend({valHooks:{select:{get:function(l){var f,h,m,k=l.options,x=l.selectedIndex,v=l.type==="select-one",M=v?null:[],E=v?x+1:k.length;for(x<0?m=E:m=v?x:0;m-1)&&(h=!0);return h||(l.selectedIndex=-1),x}}}}),ee&&(b.valHooks.option={get:function(l){var f=l.getAttribute("value");return f??vn(b.text(l))}}),b.each(["radio","checkbox"],function(){b.valHooks[this]={set:function(l,f){if(Array.isArray(f))return l.checked=b.inArray(b(l).val(),f)>-1}}});var Zc=/^(?:focusinfocus|focusoutblur)$/,eu=function(l){l.stopPropagation()};b.extend(b.event,{trigger:function(l,f,h,m){var k,x,v,M,E,A,N,L,O=[h||C],P=d.call(l,"type")?l.type:l,U=d.call(l,"namespace")?l.namespace.split("."):[];if(x=L=v=h=h||C,!(h.nodeType===3||h.nodeType===8)&&!Zc.test(P+b.event.triggered)&&(P.indexOf(".")>-1&&(U=P.split("."),P=U.shift(),U.sort()),E=P.indexOf(":")<0&&"on"+P,l=l[b.expando]?l:new b.Event(P,typeof l=="object"&&l),l.isTrigger=m?2:3,l.namespace=U.join("."),l.rnamespace=l.namespace?new RegExp("(^|\\.)"+U.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,l.result=void 0,l.target||(l.target=h),f=f==null?[l]:b.makeArray(f,[l]),N=b.event.special[P]||{},!(!m&&N.trigger&&N.trigger.apply(h,f)===!1))){if(!m&&!N.noBubble&&!T(h)){for(M=N.delegateType||P,Zc.test(M+P)||(x=x.parentNode);x;x=x.parentNode)O.push(x),v=x;v===(h.ownerDocument||C)&&O.push(v.defaultView||v.parentWindow||n)}for(k=0;(x=O[k++])&&!l.isPropagationStopped();)L=x,l.type=k>1?M:N.bindType||P,A=(Z.get(x,"events")||Object.create(null))[l.type]&&Z.get(x,"handle"),A&&A.apply(x,f),A=E&&x[E],A&&A.apply&&Pr(x)&&(l.result=A.apply(x,f),l.result===!1&&l.preventDefault());return l.type=P,!m&&!l.isDefaultPrevented()&&(!N._default||N._default.apply(O.pop(),f)===!1)&&Pr(h)&&E&&typeof h[P]=="function"&&!T(h)&&(v=h[E],v&&(h[E]=null),b.event.triggered=P,l.isPropagationStopped()&&L.addEventListener(P,eu),h[P](),l.isPropagationStopped()&&L.removeEventListener(P,eu),b.event.triggered=void 0,v&&(h[E]=v)),l.result}},simulate:function(l,f,h){var m=b.extend(new b.Event,h,{type:l,isSimulated:!0});b.event.trigger(m,null,f)}}),b.fn.extend({trigger:function(l,f){return this.each(function(){b.event.trigger(l,f,this)})},triggerHandler:function(l,f){var h=this[0];if(h)return b.event.trigger(l,f,h,!0)}});var _r=n.location,tu={guid:Date.now()},Xo=/\?/;b.parseXML=function(l){var f,h;if(!l||typeof l!="string")return null;try{f=new n.DOMParser().parseFromString(l,"text/xml")}catch{}return h=f&&f.getElementsByTagName("parsererror")[0],(!f||h)&&b.error("Invalid XML: "+(h?b.map(h.childNodes,function(m){return m.textContent}).join(` `):l)),f};var ug=/\[\]$/,nu=/\r?\n/g,fg=/^(?:submit|button|image|reset|file)$/i,dg=/^(?:input|select|textarea|keygen)/i;function Qo(l,f,h,m){var k;if(Array.isArray(f))b.each(f,function(x,v){h||ug.test(l)?m(l,v):Qo(l+"["+(typeof v=="object"&&v!=null?x:"")+"]",v,h,m)});else if(!h&&w(f)==="object")for(k in f)Qo(l+"["+k+"]",f[k],h,m);else m(l,f)}b.param=function(l,f){var h,m=[],k=function(x,v){var M=typeof v=="function"?v():v;m[m.length]=encodeURIComponent(x)+"="+encodeURIComponent(M??"")};if(l==null)return"";if(Array.isArray(l)||l.jquery&&!b.isPlainObject(l))b.each(l,function(){k(this.name,this.value)});else for(h in l)Qo(h,l[h],f,k);return m.join("&")},b.fn.extend({serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var l=b.prop(this,"elements");return l?b.makeArray(l):this}).filter(function(){var l=this.type;return this.name&&!b(this).is(":disabled")&&dg.test(this.nodeName)&&!fg.test(l)&&(this.checked||!$i.test(l))}).map(function(l,f){var h=b(this).val();return h==null?null:Array.isArray(h)?b.map(h,function(m){return{name:f.name,value:m.replace(nu,`\r `)}}):{name:f.name,value:h.replace(nu,`\r -`)}}).get()}});var hg=/%20/g,pg=/#.*$/,mg=/([?&])_=[^&]*/,gg=/^(.*?):[ \t]*([^\r\n]*)$/mg,yg=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,bg=/^(?:GET|HEAD)$/,kg=/^\/\//,ru={},Yo={},iu="*/".concat("*"),Zo=C.createElement("a");Zo.href=_r.href;function su(l){return function(f,h){typeof f!="string"&&(h=f,f="*");var m,k=0,x=f.toLowerCase().match(it)||[];if(typeof h=="function")for(;m=x[k++];)m[0]==="+"?(m=m.slice(1)||"*",(l[m]=l[m]||[]).unshift(h)):(l[m]=l[m]||[]).push(h)}}function ou(l,f,h,m){var k={},x=l===Yo;function v(M){var E;return k[M]=!0,b.each(l[M]||[],function(A,N){var L=N(f,h,m);if(typeof L=="string"&&!x&&!k[L])return f.dataTypes.unshift(L),v(L),!1;if(x)return!(E=L)}),E}return v(f.dataTypes[0])||!k["*"]&&v("*")}function ea(l,f){var h,m,k=b.ajaxSettings.flatOptions||{};for(h in f)f[h]!==void 0&&((k[h]?l:m||(m={}))[h]=f[h]);return m&&b.extend(!0,l,m),l}function xg(l,f,h){for(var m,k,x,v,M=l.contents,E=l.dataTypes;E[0]==="*";)E.shift(),m===void 0&&(m=l.mimeType||f.getResponseHeader("Content-Type"));if(m){for(k in M)if(M[k]&&M[k].test(m)){E.unshift(k);break}}if(E[0]in h)x=E[0];else{for(k in h){if(!E[0]||l.converters[k+" "+E[0]]){x=k;break}v||(v=k)}x=x||v}if(x)return x!==E[0]&&E.unshift(x),h[x]}function wg(l,f,h,m){var k,x,v,M,E,A={},N=l.dataTypes.slice();if(N[1])for(v in l.converters)A[v.toLowerCase()]=l.converters[v];for(x=N.shift();x;)if(l.responseFields[x]&&(h[l.responseFields[x]]=f),!E&&m&&l.dataFilter&&(f=l.dataFilter(f,l.dataType)),E=x,x=N.shift(),x){if(x==="*")x=E;else if(E!=="*"&&E!==x){if(v=A[E+" "+x]||A["* "+x],!v){for(k in A)if(M=k.split(" "),M[1]===x&&(v=A[E+" "+M[0]]||A["* "+M[0]],v)){v===!0?v=A[k]:A[k]!==!0&&(x=M[0],N.unshift(M[1]));break}}if(v!==!0)if(v&&l.throws)f=v(f);else try{f=v(f)}catch(L){return{state:"parsererror",error:v?L:"No conversion from "+E+" to "+x}}}}return{state:"success",data:f}}b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:_r.href,type:"GET",isLocal:yg.test(_r.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":iu,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(l,f){return f?ea(ea(l,b.ajaxSettings),f):ea(b.ajaxSettings,l)},ajaxPrefilter:su(ru),ajaxTransport:su(Yo),ajax:function(l,f){typeof l=="object"&&(f=l,l=void 0),f=f||{};var h,m,k,x,v,M,E,A,N,L,O=b.ajaxSetup({},f),P=O.context||O,U=O.context&&(P.nodeType||P.jquery)?b(P):b.event,Q=b.Deferred(),G=b.Callbacks("once memory"),ye=O.statusCode||{},pe={},Ze={},je="canceled",ie={readyState:0,getResponseHeader:function(oe){var Ce;if(E){if(!x)for(x={};Ce=gg.exec(k);)x[Ce[1].toLowerCase()+" "]=(x[Ce[1].toLowerCase()+" "]||[]).concat(Ce[2]);Ce=x[oe.toLowerCase()+" "]}return Ce==null?null:Ce.join(", ")},getAllResponseHeaders:function(){return E?k:null},setRequestHeader:function(oe,Ce){return E==null&&(oe=Ze[oe.toLowerCase()]=Ze[oe.toLowerCase()]||oe,pe[oe]=Ce),this},overrideMimeType:function(oe){return E==null&&(O.mimeType=oe),this},statusCode:function(oe){var Ce;if(oe)if(E)ie.always(oe[ie.status]);else for(Ce in oe)ye[Ce]=[ye[Ce],oe[Ce]];return this},abort:function(oe){var Ce=oe||je;return h&&h.abort(Ce),qi(0,Ce),this}};if(Q.promise(ie),O.url=((l||O.url||_r.href)+"").replace(kg,_r.protocol+"//"),O.type=f.method||f.type||O.method||O.type,O.dataTypes=(O.dataType||"*").toLowerCase().match(it)||[""],O.crossDomain==null){M=C.createElement("a");try{M.href=O.url,M.href=M.href,O.crossDomain=Zo.protocol+"//"+Zo.host!=M.protocol+"//"+M.host}catch{O.crossDomain=!0}}if(ou(ru,O,f,ie),O.data&&O.processData&&typeof O.data!="string"&&(O.data=b.param(O.data,O.traditional)),E)return ie;A=b.event&&O.global,A&&b.active++===0&&b.event.trigger("ajaxStart"),O.type=O.type.toUpperCase(),O.hasContent=!bg.test(O.type),m=O.url.replace(pg,""),O.hasContent?O.data&&O.processData&&(O.contentType||"").indexOf("application/x-www-form-urlencoded")===0&&(O.data=O.data.replace(hg,"+")):(L=O.url.slice(m.length),O.data&&(O.processData||typeof O.data=="string")&&(m+=(Xo.test(m)?"&":"?")+O.data,delete O.data),O.cache===!1&&(m=m.replace(mg,"$1"),L=(Xo.test(m)?"&":"?")+"_="+tu.guid+++L),O.url=m+L),O.ifModified&&(b.lastModified[m]&&ie.setRequestHeader("If-Modified-Since",b.lastModified[m]),b.etag[m]&&ie.setRequestHeader("If-None-Match",b.etag[m])),(O.data&&O.hasContent&&O.contentType!==!1||f.contentType)&&ie.setRequestHeader("Content-Type",O.contentType),ie.setRequestHeader("Accept",O.dataTypes[0]&&O.accepts[O.dataTypes[0]]?O.accepts[O.dataTypes[0]]+(O.dataTypes[0]!=="*"?", "+iu+"; q=0.01":""):O.accepts["*"]);for(N in O.headers)ie.setRequestHeader(N,O.headers[N]);if(O.beforeSend&&(O.beforeSend.call(P,ie,O)===!1||E))return ie.abort();if(je="abort",G.add(O.complete),ie.done(O.success),ie.fail(O.error),h=ou(Yo,O,f,ie),!h)qi(-1,"No Transport");else{if(ie.readyState=1,A&&U.trigger("ajaxSend",[ie,O]),E)return ie;O.async&&O.timeout>0&&(v=n.setTimeout(function(){ie.abort("timeout")},O.timeout));try{E=!1,h.send(pe,qi)}catch(oe){if(E)throw oe;qi(-1,oe)}}function qi(oe,Ce,cu,Cg){var nn,na,zr,lr,cr,It=Ce;E||(E=!0,v&&n.clearTimeout(v),h=void 0,k=Cg||"",ie.readyState=oe>0?4:0,nn=oe>=200&&oe<300||oe===304,cu&&(lr=xg(O,ie,cu)),!nn&&b.inArray("script",O.dataTypes)>-1&&b.inArray("json",O.dataTypes)<0&&(O.converters["text script"]=function(){}),lr=wg(O,lr,ie,nn),nn?(O.ifModified&&(cr=ie.getResponseHeader("Last-Modified"),cr&&(b.lastModified[m]=cr),cr=ie.getResponseHeader("etag"),cr&&(b.etag[m]=cr)),oe===204||O.type==="HEAD"?It="nocontent":oe===304?It="notmodified":(It=lr.state,na=lr.data,zr=lr.error,nn=!zr)):(zr=It,(oe||!It)&&(It="error",oe<0&&(oe=0))),ie.status=oe,ie.statusText=(Ce||It)+"",nn?Q.resolveWith(P,[na,It,ie]):Q.rejectWith(P,[ie,It,zr]),ie.statusCode(ye),ye=void 0,A&&U.trigger(nn?"ajaxSuccess":"ajaxError",[ie,O,nn?na:zr]),G.fireWith(P,[ie,It]),A&&(U.trigger("ajaxComplete",[ie,O]),--b.active||b.event.trigger("ajaxStop")))}return ie},getJSON:function(l,f,h){return b.get(l,f,h,"json")},getScript:function(l,f){return b.get(l,void 0,f,"script")}}),b.each(["get","post"],function(l,f){b[f]=function(h,m,k,x){return(typeof m=="function"||m===null)&&(x=x||k,k=m,m=void 0),b.ajax(b.extend({url:h,type:f,dataType:x,data:m,success:k},b.isPlainObject(h)&&h))}}),b.ajaxPrefilter(function(l){var f;for(f in l.headers)f.toLowerCase()==="content-type"&&(l.contentType=l.headers[f]||"")}),b._evalUrl=function(l,f,h){return b.ajax({url:l,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,scriptAttrs:f.crossOrigin?{crossOrigin:f.crossOrigin}:void 0,converters:{"text script":function(){}},dataFilter:function(m){b.globalEval(m,f,h)}})},b.fn.extend({wrapAll:function(l){var f;return this[0]&&(typeof l=="function"&&(l=l.call(this[0])),f=b(l,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&f.insertBefore(this[0]),f.map(function(){for(var h=this;h.firstElementChild;)h=h.firstElementChild;return h}).append(this)),this},wrapInner:function(l){return typeof l=="function"?this.each(function(f){b(this).wrapInner(l.call(this,f))}):this.each(function(){var f=b(this),h=f.contents();h.length?h.wrapAll(l):f.append(l)})},wrap:function(l){var f=typeof l=="function";return this.each(function(h){b(this).wrapAll(f?l.call(this,h):l)})},unwrap:function(l){return this.parent(l).not("body").each(function(){b(this).replaceWith(this.childNodes)}),this}}),b.expr.pseudos.hidden=function(l){return!b.expr.pseudos.visible(l)},b.expr.pseudos.visible=function(l){return!!(l.offsetWidth||l.offsetHeight||l.getClientRects().length)},b.ajaxSettings.xhr=function(){return new n.XMLHttpRequest};var Tg={0:200};b.ajaxTransport(function(l){var f;return{send:function(h,m){var k,x=l.xhr();if(x.open(l.type,l.url,l.async,l.username,l.password),l.xhrFields)for(k in l.xhrFields)x[k]=l.xhrFields[k];l.mimeType&&x.overrideMimeType&&x.overrideMimeType(l.mimeType),!l.crossDomain&&!h["X-Requested-With"]&&(h["X-Requested-With"]="XMLHttpRequest");for(k in h)x.setRequestHeader(k,h[k]);f=function(v){return function(){f&&(f=x.onload=x.onerror=x.onabort=x.ontimeout=null,v==="abort"?x.abort():v==="error"?m(x.status,x.statusText):m(Tg[x.status]||x.status,x.statusText,(x.responseType||"text")==="text"?{text:x.responseText}:{binary:x.response},x.getAllResponseHeaders()))}},x.onload=f(),x.onabort=x.onerror=x.ontimeout=f("error"),f=f("abort");try{x.send(l.hasContent&&l.data||null)}catch(v){if(f)throw v}},abort:function(){f&&f()}}});function au(l){return l.scriptAttrs||!l.headers&&(l.crossDomain||l.async&&b.inArray("json",l.dataTypes)<0)}b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},converters:{"text script":function(l){return b.globalEval(l),l}}}),b.ajaxPrefilter("script",function(l){l.cache===void 0&&(l.cache=!1),au(l)&&(l.type="GET")}),b.ajaxTransport("script",function(l){if(au(l)){var f,h;return{send:function(m,k){f=b("