diff --git a/app/.env b/app/.env deleted file mode 100644 index 9b504a7..0000000 --- a/app/.env +++ /dev/null @@ -1,23 +0,0 @@ -base_url=http://47.110.241.161:15124 -workflow_id=7608812635877900322 -mysql_host=47.110.241.161 -mysql_user=aiimage - -proxy_url=https://api.jikip.com/ip-get?num=1&minute=3&format=json&area=all&protocol=1&mode=2&key=t24g6gi44ubufd8 -proxy_mode=2 - -zn_company=rongchuang123 -zn_username=%E8%87%AA%E5%8A%A8%E5%8C%96_Robot - -client_name=ShuFuAI - -# java_api_base=http://47.111.163.154:18080/ -java_api_base=http://api.aishufu.top:18080/ -# java_api_base=http://127.0.0.1:18080/ - -# 与 Java 后端共享的 JWT 签名密钥,必须与 backend-java 的 AIIMAGE_JWT_SECRET 完全一致 -AIIMAGE_JWT_SECRET=please-change-this-secret-please-rotate-at-least-32-bytes - - - - diff --git a/app/.env copy b/app/.env copy deleted file mode 100644 index a1d3266..0000000 --- a/app/.env copy +++ /dev/null @@ -1,15 +0,0 @@ -base_url=http://47.111.163.154:15124 -workflow_id=7608812635877900322 -mysql_host=47.111.163.154 -mysql_user=aiimage - -proxy_url=https://api.jikip.com/ip-get?num=1&minute=1&format=json&area=all&protocol=1&mode=2&key=t24g6gi44ubufd8 -proxy_mode=2 - -client_name=ShuFuAI - - -java_api_base=http://api.aishufu.top:18080/ -# java_api_base=http://api.aishufu.top:18080/ - - diff --git a/app/.env.example b/app/.env.example deleted file mode 100644 index 6be76ce..0000000 --- a/app/.env.example +++ /dev/null @@ -1,23 +0,0 @@ -workflow_id=7608812635877900322 -mysql_host=47.111.163.154 -mysql_user=aiimage - -proxy_url=https://api.jikip.com/ip-get?num=1&minute=1&format=json&area=all&protocol=1&mode=2&key=t24g6gi44ubufd8 -proxy_mode=2 - -zn_company=rongchuang123 -zn_username=%E8%87%AA%E5%8A%A8%E5%8C%96_Robot - -client_name=ShuFuAI - - -java_api_base=http://api.aishufu.top:18080/ -# java_api_base=http://api.aishufu.top:18080/ -# java_api_base=http://api.aishufu.top:18080/ - -# 与 Java 后端共享的 JWT 签名密钥,必须与 backend-java 的 AIIMAGE_JWT_SECRET 完全一致 -AIIMAGE_JWT_SECRET=please-change-this-secret-please-rotate-at-least-32-bytes -# JWT cookie 名称,默认 aiimage_token;改动需与 Java 端 aiimage.auth.cookie-name 保持一致 -# AIIMAGE_AUTH_COOKIE_NAME=aiimage_token - - diff --git a/app/ali_oss.py b/app/ali_oss.py deleted file mode 100644 index 35fbe08..0000000 --- a/app/ali_oss.py +++ /dev/null @@ -1,72 +0,0 @@ -import argparse -import base64 -import re -import time -import alibabacloud_oss_v2 as oss -import requests - -from config import region, endpoint, bucket, file_url_pre, bucket_path - - -def upload_file(file_content: bytes, key: str): - credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider() - cfg = oss.config.load_default() - cfg.credentials_provider = credentials_provider - cfg.region = region - cfg.endpoint = endpoint - client = oss.Client(cfg) - - result = client.put_object( - oss.PutObjectRequest( - bucket=bucket, # 存储空间名称 - key=key, # 对象名称 - body=file_content # 读取文件内容 - ) - ) - # print(result) - return file_url_pre + key - - -def upload_data_url(data_url: str, prefix: str = "history", key_hint: str = "") -> str: - """ - 将 base64 data URL 上传到 OSS,返回图片链接 - data_url: data:image/png;base64,xxxx 或 data:image/jpeg;base64,xxxx - prefix: OSS key 前缀 - key_hint: 可选后缀避免重名,如 "_0", "_1" - """ - match = re.match(r'data:image/(\w+);base64,(.+)', data_url) - if not match: - raise ValueError('无效的 data URL 格式') - ext = 'png' if match.group(1).lower() in ('png', 'webp') else 'jpg' - file_content = base64.b64decode(match.group(2)) - ts = int(time.time() * 1000) - key = f"{bucket_path}{prefix}/{ts}{key_hint}.{ext}" - return upload_file(file_content, key) - - -def upload_data_urls(data_urls: list, prefix: str = "history") -> list: - """批量上传 base64 图片到 OSS,返回图片链接列表""" - urls = [] - ts = int(time.time() * 1000) - for i, data_url in enumerate(data_urls or []): - if not data_url or not isinstance(data_url, str): - continue - if not data_url.startswith("http"): - match = re.match(r'data:image/(\w+);base64,(.+)', data_url) - if not match: - continue - ext = 'png' if match.group(1).lower() in ('png', 'webp') else 'jpg' - file_content = base64.b64decode(match.group(2)) - else: - file_content = requests.get(data_url).content - ext = "png" - key = f"{bucket_path}{prefix}/{ts}_{i}.{ext}" - urls.append(upload_file(file_content, key)) - return urls - - -# 脚本入口,当文件被直接运行时调用main函数 -if __name__ == "__main__": - with open("测试图片数据/IMG_2685.JPG", "rb") as f: - file_content = f.read() - upload_file(file_content,key=bucket_path+"test.png") \ No newline at end of file diff --git a/app/amazon/amazon_base.py b/app/amazon/amazon_base.py deleted file mode 100644 index 54b8fd1..0000000 --- a/app/amazon/amazon_base.py +++ /dev/null @@ -1,847 +0,0 @@ -import traceback -import winreg -import subprocess -import time -import uuid -import requests -import json -import os -import re -from datetime import datetime - -from DrissionPage import Chromium,ChromiumOptions -from DrissionPage.common import By -from DrissionPage._pages.chromium_tab import ChromiumTab -from typing import Literal,Dict,Any,TypeVar,Type - - -from amazon.tool import get_shop_info,show_notification -from config import runing_shop - -# 定义类型变量,用于泛型类型注解 -T = TypeVar('T', bound='AmamzonBase') - - -def kill_process(version: Literal["v5", "v6"]): - """杀紫鸟客户端进程(独立函数版本)""" - driver = ZiniaoDriver({}) - driver.kill_process(version) - - -class ZiniaoDriver: - """紫鸟浏览器自动化驱动类""" - - def __init__(self, user_info: dict, socket_port: int = 19890): - """ - 初始化紫鸟浏览器驱动 - - Args: - user_info: 用户信息字典,包含 company, username, password - socket_port: 客户端通信端口,默认 19890 - """ - self.user_info = user_info - self.socket_port = socket_port - self.client_path = None - self.browser = None - self.tab: ChromiumTab = None - self.store_id = None - - self.url = None #用于记录当前链接,实现断点续传 - - - - def get_zinaio_exe(self, protocol_name: str = "superbrowser"): - """ - 获取紫鸟安装目录 - - Args: - protocol_name: 协议名称,默认 "superbrowser" - - Returns: - exe_path: 紫鸟浏览器可执行文件路径 - """ - try: - key_path = rf"SOFTWARE\Classes\{protocol_name}\shell\open\command" - key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, key_path) - command, _ = winreg.QueryValueEx(key, "") - winreg.CloseKey(key) - if isinstance(command, str): - sub = "ziniao.exe" - exe_path = command[0: command.find(sub) + len(sub) + 1] - else: - exe_path = command[0] - return exe_path - except FileNotFoundError: - try: - key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, key_path) - command, _ = winreg.QueryValueEx(key, "") - winreg.CloseKey(key) - if isinstance(command, str): - sub = "ziniao.exe" - exe_path = command[0: command.find(sub) + len(sub) + 1] - else: - exe_path = command[0] - return exe_path - except FileNotFoundError: - return None - - def update_core(self): - """ - 下载所有内核,打开店铺前调用,需客户端版本5.285.7以上 - 因为http有超时时间,所以这个action适合循环调用,直到返回成功 - """ - data = { - "action": "updateCore", - "requestId": str(uuid.uuid4()), - } - data.update(self.user_info) - while True: - url = f'http://127.0.0.1:{self.socket_port}' - response = requests.post(url, json.dumps(data).encode('utf-8'), timeout=120) - result = response.json() - print(result) - if result is None: - print("等待客户端启动...") - time.sleep(2) - continue - if result.get("statusCode") is None or result.get("statusCode") == -10003: - print("当前版本不支持此接口,请升级客户端") - return - elif result.get("statusCode") == 0: - print("更新内核完成") - return - else: - print(f"等待更新内核: {json.dumps(result)}") - time.sleep(2) - - def kill_process(self, version: Literal["v5", "v6"]): - """ - 杀紫鸟客户端进程 - - Args: - version: 客户端版本 - """ - if version == "v5": - process_name = 'SuperBrowser.exe' - os.system('taskkill /f /t /im ' + "starter.exe") - else: - process_name = 'ziniao.exe' - os.system('taskkill /f /t /im ' + process_name) - time.sleep(3) - - def get_browser_list(self) -> list: - """ - 获取浏览器列表 - - Returns: - list: 浏览器列表 - """ - request_id = str(uuid.uuid4()) - data = { - "action": "getBrowserList", - "requestId": request_id - } - data.update(self.user_info) - - url = f'http://127.0.0.1:{self.socket_port}' - response = requests.post(url, json.dumps(data).encode('utf-8'), timeout=120) - r = response.json() - if str(r.get("statusCode")) == "0": - print(r) - return r.get("browserList") - elif str(r.get("statusCode")) == "-10003": - print(f"【get_browser_list】登录失败 {json.dumps(r, ensure_ascii=False)}") - # exit() - else: - print(f"【get_browser_list】失败 {json.dumps(r, ensure_ascii=False)} ") - # exit() - - def open_store(self, store_info, isWebDriverReadOnlyMode=0, isprivacy=0, - isHeadless=0, cookieTypeSave=0, jsInfo=""): - """ - 打开店铺 - - Args: - store_info: 店铺信息(browserId 或 browserOauth) - isWebDriverReadOnlyMode: 是否只读模式,默认 0 - isprivacy: 隐私模式,默认 0 - isHeadless: 无头模式,默认 0 - cookieTypeSave: cookie保存类型,默认 0 - jsInfo: 注入的JS信息,默认 "" - - Returns: - dict: 返回结果 - """ - request_id = str(uuid.uuid4()) - data = { - "action": "startBrowser", - "isWaitPluginUpdate": 0, - "isHeadless": isHeadless, - "requestId": request_id, - "isWebDriverReadOnlyMode": isWebDriverReadOnlyMode, - "cookieTypeLoad": 0, - "cookieTypeSave": cookieTypeSave, - "runMode": "1", - "isLoadUserPlugin": True, - "pluginIdType": 1, - "privacyMode": isprivacy - } - data.update(self.user_info) - - if store_info.isdigit(): - data["browserId"] = store_info - else: - data["browserOauth"] = store_info - - if len(str(jsInfo)) > 2: - data["injectJsInfo"] = json.dumps(jsInfo) - - url = f'http://127.0.0.1:{self.socket_port}' - response = requests.post(url, json.dumps(data).encode('utf-8'), timeout=120) - r = response.json() - if str(r.get("statusCode")) == "0": - return r - elif str(r.get("statusCode")) == "-10003": - raise RuntimeError(f"【open_store】登录失败 {json.dumps(r, ensure_ascii=False)}") - # exit() - else: - raise RuntimeError(f"【open_store】失败 {json.dumps(r, ensure_ascii=False)} ") - # exit() - - def get_browser(self, port) -> Chromium: - """ - 获取浏览器实例 - - Args: - port: 调试端口 - - Returns: - Chromium: DrissionPage浏览器实例 - """ - co = ChromiumOptions() - # 设置不加载图片、静音 - co.set_local_port(port) - co.no_imgs(True).mute(True) - browser = Chromium(co) - return browser - - def start_client(self): - """启动紫鸟客户端""" - - # 检查端口是否已经启动 - try: - url = f'http://127.0.0.1:{self.socket_port}' - response = requests.get(url, timeout=2) - print(f"端口 {self.socket_port} 已经启动,跳过启动客户端操作") - return - except (requests.exceptions.ConnectionError, requests.exceptions.Timeout): - # 端口未启动,继续执行启动操作 - print(f"端口 {self.socket_port} 未启动,开始启动客户端") - - self.kill_process('v6') - time.sleep(5) - self.client_path = self.get_zinaio_exe("superbrowserv6").strip('"') - print(self.client_path) - cmd = [self.client_path, '--run_type=web_driver', '--ipc_type=http', - '--port=' + str(self.socket_port)] - print(" ".join(cmd)) - - # 最大重试次数 - max_retries = 3 - - for retry_count in range(max_retries): - print(f"第 {retry_count + 1} 次尝试启动客户端...") - - # 启动进程 - subprocess.Popen(cmd) - - # 循环检测10秒,每0.5秒检测一次 - start_check_time = time.time() - client_started = False - - while time.time() - start_check_time < 10: - try: - response = requests.get(url, timeout=2) - print(f"客户端启动成功!(第 {retry_count + 1} 次尝试)") - client_started = True - break - except (requests.exceptions.ConnectionError, requests.exceptions.Timeout): - # 端口还未启动,继续等待 - time.sleep(0.5) - - if client_started: - time.sleep(5) # 等待客户端完全启动 - # 更新内核 - self.update_core() - return - else: - print(f"第 {retry_count + 1} 次尝试启动失败,10秒内未检测到客户端启动") - - # 超过最大重试次数,抛出异常 - raise RuntimeError(f"客户端启动失败:重试 {max_retries} 次后仍未成功启动") - - def open_shop(self, shop_name: str): - """ - 打开指定店铺 - - Args: - shop_name: 店铺名称 - - Returns: - Chromium or str: 成功返回浏览器实例,失败返回错误信息 - """ - print("=============打开指定店铺================") - # 启动客户端 - self.start_client() - - # 获取店铺列表 - shop_ls = self.get_browser_list() - self.store_id = None - print(shop_ls) - for shop in shop_ls: - if shop.get("browserName") == shop_name: - self.store_id = shop.get('browserOauth') - break - - if not self.store_id: - print("店铺不存在") - return "店铺不存在" - - # 打开店铺 - ret_json = self.open_store(self.store_id) - print(ret_json) - self.store_id = ret_json.get("browserOauth") - if self.store_id is None: - self.store_id = ret_json.get("browserId") - - # 获取drissionpage浏览器会话 - self.browser = self.get_browser(ret_json.get('debuggingPort')) - - ip_check_url = ret_json.get("ipDetectionPage") - if not ip_check_url: - print("ip检测页地址为空,请升级紫鸟浏览器到最新版") - print(f"=====关闭店铺:{shop_name}=====") - self.close_store(self.store_id) - # exit() - raise RuntimeError("没有IP检测地址,为了店铺安全不打开店铺") - ip_usable = self.open_ip_check(self.browser, ip_check_url) - if ip_usable: - print("ip检测通过,打开店铺平台主页") - self.open_launcher_page(ret_json.get("launcherPage"), self.browser) - else: - print("IP检测不通过") - raise RuntimeError("IP检测不通过,可能是因为网络环境变化导致的,为了店铺安全不打开店铺") - return self.browser - - def close_store(self, browser_oauth=None): - """ - 关闭店铺 - - Args: - browser_oauth: 店铺OAuth标识,如果不提供则使用当前打开的店铺 - - Returns: - dict: 返回结果 - """ - if browser_oauth is None: - browser_oauth = self.store_id - - request_id = str(uuid.uuid4()) - data = { - "action": "stopBrowser", - "requestId": request_id, - "duplicate": 0, - "browserOauth": browser_oauth - } - data.update(self.user_info) - - url = f'http://127.0.0.1:{self.socket_port}' - response = requests.post(url, json.dumps(data).encode('utf-8'), timeout=120) - r = response.json() - if str(r.get("statusCode")) == "0": - return r - elif str(r.get("statusCode")) == "-10003": - raise RuntimeError(f"【close_store】登录失败 {json.dumps(r, ensure_ascii=False)}") - # exit() - else: - raise RuntimeError(f"【close_store】失败: {json.dumps(r, ensure_ascii=False)} ") - # exit() - - def open_launcher_page(self, launcher_page: str, browser: Chromium = None): - """ - 打开启动页面 - - Args: - launcher_page: 要打开的页面URL - browser: 浏览器实例,如果不提供则使用当前浏览器实例 - """ - if browser is None: - browser = self.browser - - tab = browser.new_tab(url=launcher_page) - self.tab = tab - return tab - - def open_ip_check(self, browser: Chromium, ip_check_url: str): - """ - 打开ip检测页检测ip是否正常 - :param browser: drissionpage浏览器会话 - :param ip_check_url ip检测页地址 - :return 检测结果 - """ - try: - tab = browser.latest_tab - tab.get(ip_check_url) - success_button = tab.ele((By.XPATH, '//button[contains(@class, "styles_btn--success")]'), - timeout=60) # 等待查找元素60秒 - if success_button: - print("ip检测成功") - return True - else: - print("ip检测超时") - return False - except Exception as e: - print("ip检测异常:" + traceback.format_exc()) - return False - - -class AmamzonBase(ZiniaoDriver): - """亚马逊操作基类,包含一些通用方法""" - mark_name = "操作基类" - - def log(self, message: str, level: str = "INFO"): - """日志输出 - Args: - message: 日志消息 - level: 日志级别 - """ - try: - timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - # if level == "ERROR": - # show_notification(message, "error") - print(f"[{timestamp}] [{self.mark_name}] [{level}] {message}") - except Exception as e: - print(f"输出出错,{e}") - - - def SwitchingCountries(self, country_name: str): - """ - 切换国家 - 操作: - 1、//div[@class="dropdown-account-switcher-header-label"]/span[last()] 获取此元素文本,判断当前国家,如果与目标国家相同则不操作,否则执行下一步 - 2、点击 //div[@class="dropdown-account-switcher-header-label"] 打开下拉框 - 3、点击 //div[@class="dropdown-account-switcher-list-item"] 第一个展开国家列表 - 4、点击 //div[@class="dropdown-account-switcher-list-item dropdown-account-switcher-list-item-indented" and @title="国家名"] 切换到目标国家 - 5、等待页面加载完成,判断国家是否切换成功,成功则返回True,否则返回False - - Args: - country_name: 目标国家名称 - - Returns: - bool: 切换成功返回True,失败返回False - """ - try: - print("=============切换国家================") - if self.browser is None: - print("浏览器实例不存在,请先打开店铺") - return False - - # 获取当前标签页 - tab = self.tab - tab.wait.doc_loaded(timeout=120, raise_err=False) - - # 步骤1:获取当前国家名称 - self.log(f"正在检查当前国家...") - current_country_ele = tab.ele('xpath://div[@class="dropdown-account-switcher-header-label"]/span[last()]', - timeout=20) - if current_country_ele: - current_country = current_country_ele.text.strip() - self.log(f"当前国家:{current_country}") - - # 判断是否与目标国家相同 - if current_country == country_name: - self.log(f"当前已经是目标国家 {country_name},无需切换") - return True - else: - self.log("无法获取当前国家信息") - return False - - # 步骤2:点击打开下拉框 - self.log(f"正在打开国家切换下拉框...") - dropdown_header = tab.ele('xpath://div[@class="dropdown-account-switcher-header-label"]', timeout=10) - if not dropdown_header: - self.log("找不到国家切换下拉框") - return False - dropdown_header.click() - time.sleep(1) # 等待下拉框展开 - - # 步骤3:点击第一个展开国家列表 - self.log(f"正在展开国家列表...") - first_item = tab.ele('xpath://div[@class="dropdown-account-switcher-list-item"]', timeout=10) - if not first_item: - self.log("找不到国家列表项") - return False - first_item.click() - time.sleep(1) # 等待国家列表展开 - - # 步骤4:点击目标国家 - self.log(f"正在切换到国家:{country_name}") - target_country_xpath = f'//div[@class="dropdown-account-switcher-list-item dropdown-account-switcher-list-item-indented" and @title="{country_name}"]' - target_country = tab.ele(f'xpath:{target_country_xpath}', timeout=10) - if not target_country: - self.log(f"找不到目标国家:{country_name}") - return False - target_country.click() - - # 步骤5:等待页面加载完成并验证切换结果 - self.log(f"等待页面加载...") - # time.sleep(3) # 等待页面加载 - self.tab.wait.doc_loaded() - - # 再次检查当前国家 - new_country_ele = tab.ele('xpath://div[@class="dropdown-account-switcher-header-label"]/span[last()]', - timeout=10) - if new_country_ele: - new_country = new_country_ele.text.strip() - if new_country == country_name: - self.log(f"国家切换成功:{new_country}") - return True - else: - self.log(f"国家切换失败,当前国家:{new_country},目标国家:{country_name}") - return False - else: - self.log("无法验证切换结果") - return False - - except Exception as e: - self.log(f"切换国家时发生异常:{traceback.format_exc()}") - return False - - def need_login(self): - """ - 判断是否需要登录,部分国家可能需要登录后才能切换国家 - 处理流程: - - """ - time.sleep(3) # 等待页面可能的登录元素加载,避免跳转等等 - self.tab.wait.doc_loaded(timeout=30, raise_err=False) - need_login_ele = self.tab.eles('xpath://h1[@class="a-spacing-small"]|//span[contains(text(),"登录")]', timeout=5) - if len(need_login_ele) > 0: - self.log("检测到需要登录元素") - return True - return False - - def login(self, password, username=""): - try: - self.tab.wait.doc_loaded(timeout=30, raise_err=False) - for _ in range(4): - switch_account = self.tab.eles( - 'xpath://div[@data-test-id="switchableAccounts"]//div[@class="a-fixed-left-grid"]', timeout=5) - if len(switch_account) > 0: - switch_account[0].click() - time.sleep(1) - self.tab.wait.doc_loaded(timeout=30, raise_err=False) - - pwd_input = self.tab.eles('xpath://input[@type="password"]', timeout=5) - if len(pwd_input) > 0: - pwd_input[0].input(password, clear=True) - submit_btn = self.tab.eles('xpath://input[@id="signInSubmit"]', timeout=5) - if len(submit_btn) > 0: - submit_btn[0].click() - self.tab.wait.doc_loaded(timeout=30, raise_err=False) - - send_code = self.tab.eles('xpath://span[@id="auth-send-code" and contains(string(.),"发送一次性密码")]', - timeout=5) - self.log(f"发送一次性密码:{len(send_code)}") - if len(send_code) > 0: - self.log("检测到 发送一次性密码") - send_code[0].click() - time.sleep(1) - self.tab.wait.doc_loaded(timeout=30, raise_err=False) - else: - for j in range(5): - opt_code_input = self.tab.eles('xpath://input[@name="otpCode"]', timeout=30) - self.log(f"验证码输入框:{len(opt_code_input)}") - if len(opt_code_input) > 0: - opt_code_input[0].wait.displayed(timeout=10, raise_err=False) - for _ in range(30): - if opt_code_input[0].value is not None and opt_code_input[0].value.strip() != "": - print("检测到验证码输入完成") - submit_btn = self.tab.eles('xpath://input[@id="auth-signin-button"]', timeout=10) - if len(submit_btn) > 0: - submit_btn[0].click() - self.tab.wait.doc_loaded(timeout=20, raise_err=False) - # return True - error_mes = self.tab.eles('xpath://div[@id="auth-error-message-box"]', - timeout=10) - if len(error_mes) > 0: - self.log("验证码输入错误") - self.log(f"验证码输入错误提示:{error_mes[0].text}") - self.tab.refresh() - else: - self.log("登入成功") - return True - - time.sleep(1) - - else: - break - - submit_btn = self.tab.eles('xpath://input[@id="auth-signin-button"]', timeout=10) - if len(submit_btn) > 0: - submit_btn[0].click() - except Exception as e: - self.log(f"登录过程中发生异常:{traceback.format_exc()}") - return False - - def SwitchPage(self): - """ - 切换至 管理所有库存页面 - 1、等待 //navigation-favorites-bar[@class="hydrated"] 出现 - """ - navigation = self.tab.ele('xpath://navigation-favorites-bar[@class="hydrated"]') - navigation.wait.displayed(raise_err=False) - page_btn = navigation.sr('xpath://internal-fav-bar-links[@data-internal="navigation"]').sr( - 'xpath://a[@data-page-id="ezdpc-gui-inventory-mons"]') - page_btn.wait.displayed(raise_err=False) - page_btn.click(timeout=5) - - self.tab.wait.doc_loaded() - # 等待搜索框出现 - search_region = self.tab.ele('xpath://div[@id="searchBoxContainer"]//kat-input-group') - search_region.wait.displayed(raise_err=False, timeout=60) - - def search(self,filter_type="ApprovalRequired"): - sku_ls = [] - - load_ele = self.tab.eles("xpath://div[contains(@class,'Loader-module__loader')]",timeout=5) - if len(load_ele) > 0: - load_ele[0].wait.deleted(timeout=3, raise_err=False) - time.sleep(0.5) - - drop_down = self.tab.ele('xpath://div[contains(@class,"VolusListingStatusDropDown-module__verticalContainer")]//kat-dropdown') - drop_down.wait.displayed(raise_err=False) - drop_down.wait.enabled(raise_err=False) - time.sleep(0.6) - drop_down.click() - # //kat-option[@value="SearchSuppressed"] - xp = f'xpath://kat-option[@value="{filter_type}"]' - self.log(f"正在寻找筛选条件 {filter_type},xpath: {xp}") - approval_required = self.tab.eles(xp,timeout=5) - if len(approval_required) == 0: - self.log(f"没有需要{filter_type}选项】没有需要{filter_type}的商品了") - return sku_ls # "没有需要审批的商品了" - else: - approval_required = approval_required[0] - approval_required.wait.displayed(raise_err=False) - approval_required.click() - - approval_required_text = approval_required.text - self.log(f"已选择筛选条件: {approval_required_text}") - - count = re.findall(r'\d+', approval_required_text) - if count: - count = int(count[0]) - self.log(f"待审批的商品数量: {count}") - if count <= 0: - self.log(f"没有需要{filter_type}的商品了") - return sku_ls #"没有需要审批的商品了" - for _ in range(3): - # 等待加载完成 - load_ele = self.tab.eles("xpath://div[contains(@class,'Loader-module__loader')]") - if len(load_ele) > 0: - load_ele[0].wait.deleted(timeout=3, raise_err=False) - time.sleep(0.5) - - sku_ls = self.tab.eles("xpath://div[@data-sku]",timeout=3) - if len(sku_ls) > 0: - break - approval_required.click() - return sku_ls - - -class TaskBase: - task_name = "任务基类" - - country_info = { - "DE": "德国", - "FR": "法国", - "ES": "西班牙", - "IT": "意大利", - "UK": "英国" - } - - def __init__(self, user_info: dict = None): - """初始化审批任务处理器 - - Args: - user_info: 用户信息字典,包含 company, username, password - """ - self.user_info = user_info or {} - self.running = True - - - def log(self, message: str, level: str = "INFO"): - """日志输出 - Args: - message: 日志消息 - level: 日志级别 - """ - try: - timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - # if level == "ERROR": - # show_notification(message, "error") - print(f"[{timestamp}] [{self.task_name}] [{level}] {message}") - except Exception as e: - print(f"输出出错,{e}") - - def process_task(self, task_data: dict): - pass - - - def open_shop(self, cls: Type[T], max_retries: int, company_name: str, shop_name: str, iskill: bool = False) -> T: - error_info = "" - driver = None - for retry in range(max_retries): - try: - self.log(f"尝试打开店铺 {shop_name} (第 {retry + 1}/{max_retries} 次)") - - if iskill: - self.log("重试前先杀掉浏览器进程...") - kill_process("v6") - kill_process("v5") - time.sleep(2) - - # 组装用户信息并创建驱动 - user_info = { - **self.user_info, - "company": company_name - } - driver = cls(user_info) - browser = driver.open_shop(shop_name) - - if browser and browser != "店铺不存在": - self.log(f"成功打开店铺 {shop_name}") - else: - self.log(f"打开店铺失败: {browser}", "WARNING") - driver = None - continue - - # 判断是否需要登录 - need_login = driver.need_login() - print("【是否需要登录】:", need_login) - if need_login: - self.log(f"店铺 {shop_name} 需要登录,正在登录...") - # 获取店铺凭证 - response = get_shop_info(shop_name) - print("【获取店铺凭证返回】:", response.text) - shop_data = response.json() - if not shop_data: - mes = f"获取店铺凭证失败,响应数据: {shop_data.get('message', '未知错误')}" - self.log(mes, "ERROR") - # show_notification(mes, "ERROR") - continue - - password = shop_data["data"]["password"] - - login_success = driver.login(password) - if login_success: - self.log(f"店铺 {shop_name} 登录成功,正在重新打开店铺...") - browser = driver.open_shop(shop_name) - if browser and browser != "店铺不存在": - self.log(f"成功打开店铺 {shop_name} 登录后") - break - else: - self.log(f"登录后打开店铺失败: {browser}", "WARNING") - driver = None - else: - self.log(f"店铺 {shop_name} 登录失败", "WARNING") - driver = None - else: - break - - except Exception as e: - import traceback - self.log(f"打开店铺异常: {traceback.format_exc()}", "INFO") - driver = None - error_info = str(e) - time.sleep(10) - - # 如果还有重试机会,等待后继续 - if retry < max_retries - 1: - time.sleep(3) - - # 检查是否成功打开 - if not driver or not browser or browser == "店铺不存在": - error_msg = f"店铺 {shop_name} 打开失败,已重试 {max_retries} 次,跳过该店铺,{error_info}" - self.log(error_msg, "ERROR") - # 从执行列表中移除 - if shop_name in runing_shop: - del runing_shop[shop_name] - return driver - return driver - - - def process_shop(self, shop_data: Dict[str, Any], task_id: int): - pass - - def action_init(self, driver, country_name, shop_name, risk_listing_filter=None): - """切换到指定国际 -> 页面 -》 筛选好""" - max_retries = 5 - switch_success = False - switch_success_pg = False - search_success = False - sku_ls = [] - for retry in range(max_retries): - try: - self.log(f"尝试切换到国家 {country_name} (第 {retry + 1}/{max_retries} 次)") - if retry > 2: - # 刷新不行就重新打开店铺 - self.log("重试前重新打开店铺...") - try: - driver.close_store() - time.sleep(3) - driver.open_shop(shop_name) - except Exception as e: - self.log(f"关闭重新打开店铺: {str(e)}", "WARNING") - # 如果不是第一次尝试,先刷新页面 - if retry > 0: - self.log("重试前刷新页面...") - try: - driver.tab.refresh() - time.sleep(3) - except Exception as e: - self.log(f"刷新页面失败: {str(e)}", "WARNING") - - switch_success = driver.SwitchingCountries(country_name) - if switch_success: - self.log(f"成功切换到国家 {country_name}") - - # 切换到库存管理页面 - driver.SwitchPage() - self.log(f"已切换到库存管理页面") - time.sleep(3) - switch_success_pg = True - - if risk_listing_filter is None: - self.log(f"risk_listing_filter 为空,不筛选, {risk_listing_filter}") - search_success = True - break - - sku_ls = driver.search(filter_type=risk_listing_filter) - search_success = True - self.log(f"国家 {country_name} 搜索出 {len(sku_ls)} 商品,开始处理...") - break - else: - self.log(f"切换到国家 {country_name} 失败", "WARNING") - - except Exception as e: - import traceback - self.log(f"切换国家 {country_name} 异常: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - - # 如果还有重试机会,等待后继续 - if retry < max_retries - 1: - time.sleep(2) - - return switch_success, switch_success_pg, search_success, sku_ls diff --git a/app/amazon/approve - 副本.py b/app/amazon/approve - 副本.py deleted file mode 100644 index f2518be..0000000 --- a/app/amazon/approve - 副本.py +++ /dev/null @@ -1,999 +0,0 @@ -import time -import re -import traceback -from DrissionPage._pages.chromium_tab import ChromiumTab - -from config import runing_task, runing_shop -from datetime import datetime -from amazon.del_brand import AmamzonBase, kill_process - -# 导入 webview 用于前端通知 -try: - import webview -except ImportError: - webview = None - -class AmzoneApprove(AmamzonBase): - - def SwitchPage(self): - """ - 切换至 管理所有库存页面 - 1、等待 //navigation-favorites-bar[@class="hydrated"] 出现 - """ - navigation = self.tab.ele('xpath://navigation-favorites-bar[@class="hydrated"]') - navigation.wait.displayed(raise_err=False) - page_btn = navigation.sr('xpath://internal-fav-bar-links[@data-internal="navigation"]').sr( - 'xpath://a[@data-page-id="ezdpc-gui-inventory-mons"]') - page_btn.wait.displayed(raise_err=False) - page_btn.click(timeout=5) - - self.tab.wait.doc_loaded() - # 等待搜索框出现 - search_region = self.tab.ele('xpath://div[@id="searchBoxContainer"]//kat-input-group') - search_region.wait.displayed(raise_err=False) - - - def search(self,filter_type="ApprovalRequired"): - sku_ls = [] - - load_ele = self.tab.eles("xpath://div[contains(@class,'Loader-module__loader')]",timeout=5) - if len(load_ele) > 0: - load_ele[0].wait.deleted(timeout=3, raise_err=False) - time.sleep(0.5) - - drop_down = self.tab.ele('xpath://div[contains(@class,"VolusListingStatusDropDown-module__verticalContainer")]//kat-dropdown') - drop_down.wait.displayed(raise_err=False) - drop_down.wait.enabled(raise_err=False) - time.sleep(0.6) - drop_down.click() - # //kat-option[@value="SearchSuppressed"] - xp = f'xpath://kat-option[@value="{filter_type}"]' - print(f"正在寻找筛选条件 {filter_type},xpath: {xp}") - approval_required = self.tab.eles(xp,timeout=5) - if len(approval_required) == 0: - print(f"【没有需要{filter_type}选项】没有需要{filter_type}的商品了") - return sku_ls # "没有需要审批的商品了" - else: - approval_required = approval_required[0] - approval_required.wait.displayed(raise_err=False) - approval_required.click() - - approval_required_text = approval_required.text - print(f"已选择筛选条件: {approval_required_text}") - - count = re.findall(r'\d+', approval_required_text) - if count: - count = int(count[0]) - print(f"待审批的商品数量: {count}") - if count <= 0: - print(f"没有需要{filter_type}的商品了") - return sku_ls #"没有需要审批的商品了" - asin = "B0C7KT6ZZN" - search_input = self.tab.ele("xpath://kat-input[contains(@class,'SearchBox-module__searchInput')]").sr( - 'xpath://span[@class="container"]//input[@part="input"]') - search_input.input(asin, clear=True) - search_btn = self.tab.ele("xpath://kat-icon[@name='search']") - search_btn.click() - - for _ in range(3): - # 等待加载完成 - load_ele = self.tab.ele("xpath://div[contains(@class,'Loader-module__loader')]") - load_ele.wait.deleted(timeout=3, raise_err=False) - time.sleep(0.5) - search_input = self.tab.ele("xpath://kat-input[contains(@class,'SearchBox-module__searchInput')]").sr( - 'xpath://span[@class="container"]//input[@part="input"]') - search_input.input(asin, clear=True) - search_btn = self.tab.ele("xpath://kat-icon[@name='search']") - search_btn.click() - - load_ele = self.tab.ele("xpath://div[contains(@class,'Loader-module__loader')]") - load_ele.wait.deleted(timeout=3, raise_err=False) - time.sleep(0.5) - - sku_ls = self.tab.eles("xpath://div[@data-sku]",timeout=3) - if len(sku_ls) > 0: - break - approval_required.click() - - return sku_ls - - def wait_loaded(self): - # 等待加载完成 - try: - load_ele = self.tab.ele( - 'xpath://kat-panel[@data-testid="kat-panel-ActionPanelContent"]//div[contains(@class,"Loader-module__loader")]|//kat-panel[@data-testid="kat-panel-ActionPanelContent"]/div[@data-f1-component]//div[contains(@class,"==")]/div[contains(@class,"==")]/span', - timeout=3) - load_ele.wait.deleted(timeout=5, raise_err=False) - except Exception as e: - print("等待加载中消失出错", e) - - def clear_tab(self): - all_tab = self.browser.get_tabs(title="亚马逊") - close_tab = [] - for tab in all_tab: - tab_id = tab if isinstance(tab,str) else tab.tab_id - if self.tab.tab_id == tab: - continue - close_tab.append(tab) - print("需要关闭的标签页",close_tab) - print("当前操作的tab_id",self.tab.tab_id) - self.browser.close_tabs(close_tab) - - def handle_repair_product(self,tab:ChromiumTab): - def wait_loaded(): - # 等待加载完成 - try: - load_ele = tab.ele( - 'xpath://div[@class="contentWrapper"]//div[contains(@class,"==")]/span[not(node())]', - timeout=3) - load_ele.wait.deleted(timeout=5, raise_err=False) - except Exception as e: - print("等待加载中消失出错", e) - - tab.wait.doc_loaded(timeout=30) - submit_btn_ls = tab.eles('xpath://div[@id="ahd-product-policies-table"]/div//div[@data-testid="nextStepsMetricWrapper"]//kat-button[@label="提交"]',timeout=10) - if len(submit_btn_ls) == 0: - print("未找到提交按钮,可能页面未加载完成或者页面结构发生变化") - return - # todo 遍历 - for index in range(len(submit_btn_ls)): - if index > len(submit_btn_ls)-1: - print("提交按钮数量发生变化,停止处理") - break - - submit_btn = submit_btn_ls[index] - - # 关闭按钮 - close_x_btn = tab.eles('xpath://div[@class="flyoutPanelContent"]/span',timeout=5) - if len(close_x_btn) > 0: - close_x_btn[0].wait.displayed(timeout=5, raise_err=False) - close_x_btn[0].click() - - submit_btn.wait.enabled(timeout=5, raise_err=False) - submit_btn.click() - time.sleep(0.5) - self.wait_loaded() - - wait_loaded() - - need_input = tab.eles('xpath://div[@class="contentWrapper"]//kat-input[@data-testid="kat-input-dew:ump_epr_resgitration_number_title"]',timeout=5) - if len(need_input) > 0: - print("需要输入注册号,不符合操作要求,跳过...") - continue - - target_title = tab.eles('xpath://div[@class="contentWrapper"]//section//h4[text()="警告和安全信息"]') - if len(target_title) > 0: - not_start = tab.eles('xpath://div[@class="contentWrapper"]//div[@aria-label="安全证明"]//kat-label[@text="未开始"]') - if len(not_start) == 0: - print("安全证明-不是未开始状态,不需要操作") - continue - - not_start.wait.displayed(timeout=5, raise_err=False) - not_start.click() - - wait_loaded() - - check = tab.ele('xpath://div[@class="contentWrapper"]//kat-checkbox[@name="value"]') - check.wait.displayed(timeout=5, raise_err=False) - check.click() - - save_btn = tab.ele('xpath://div[@class="contentWrapper"]//kat-button[@variant="primary"]') - save_btn.wait.enabled(timeout=5, raise_err=False) - save_btn.click() - - wait_loaded() - - close_btn = tab.ele('xpath://div[@class="contentWrapper"]//kat-button[@label="关闭"]',timeout=10) - close_btn.wait.displayed(timeout=5, raise_err=False) - close_btn.click() - - save_btn_ls = tab.eles('xpath://div[@class="contentWrapper"]//kat-button[@variant="primary"]',timeout=5) - if len(save_btn_ls) > 0: - option_selection_ls = tab.eles('xpath://div[@class="contentWrapper"]//div[@role="option"]',timeout=5) - for option in option_selection_ls: - option.click() - time.sleep(0.5) - - save_btn_ls[0].wait.enabled(timeout=5, raise_err=False) - save_btn_ls[0].click() - - wait_loaded() - - close_btn = tab.ele('xpath://div[@class="contentWrapper"]//kat-button[@label="关闭"]',timeout=10) - close_btn.wait.displayed(timeout=5, raise_err=False) - close_btn.wait.enabled(timeout=5, raise_err=False) - close_btn.click() - - submit_btn_ls = tab.eles('xpath://div[@id="ahd-product-policies-table"]/div//div[@data-testid="nextStepsMetricWrapper"]//kat-button[@label="提交"]',timeout=10) - - print("修复商品信息处理完成!") - tab.close() - - def run_page_action(self): - print("开始执行") - num = 0 - retry_num = 0 - already_asin = set() - - while retry_num < 3: # 最多重试3次 - # if num > 3: #测试 - # return - # 等待加载完成 - try: - load_ele = self.tab.eles("xpath://div[contains(@class,'Loader-module__loader')]",timeout=5) - if len(load_ele) > 0: - load_ele[0].wait.deleted(timeout=3, raise_err=False) - time.sleep(0.5) - - # 获取当前页码 - try: - page_pamel = self.tab.eles('xpath://kat-pagination',timeout=5) - if len(page_pamel) > 0: - current_page = page_pamel[0].sr('xpath:.//ul[@class="pages"]//li[@aria-current="true"]').text - - # 总页数 - total_page = page_pamel[0].sr.eles('xpath:.//ul[@class="pages"]//span[@class="page__inner"][last()]') - if len(total_page) > 0: - total_page = total_page[-1].text - else: - total_page = 0 - print(f"当前页码: {current_page} / 总页数: {total_page}") - except Exception as e: - print("获取页码失败", e) - - - sku_ls = self.tab.eles("xpath://div[@data-sku]",timeout=10) - print(f"获取到 {len(sku_ls)}") - # for sku_ele in sku_ls[0:2]: - for sku_ele in sku_ls: - # solve_problem = sku_ele.eles('xpath:.//kat-link[@label="解决商品信息问题"]') - - asin = sku_ele.ele('xpath:.//div[contains(@class,"JanusSplitBox-module__container")]//div[contains(@class,"JanusSplitBox-module__panel--") and contains(string(.),"ASIN")]/..//div[last()]').text - print(f"ASIN {asin} 存在问题,正在点击解决...") - if asin in already_asin: - print(f"{asin} 已经处理过了,跳过") - continue - solve_problem = sku_ele.eles('xpath:.//kat-link[@label="解决商品信息问题"]|.//kat-link[@label="修复被禁止显示的商品"]|.//kat-link[@label="解决商品移除风险"]') - if len(solve_problem) == 0: - print(f"{asin},没有处理入口,不处理") - yield (asin,"没有处理入口,不处理") - already_asin.add(asin) - continue - - solve_problem[0].click() - - action_panel = self.tab.ele('xpath://kat-panel-wrapper[@data-testid="kat-panel-wrapper-ActionPanelContent"]') - action_panel.wait.displayed(timeout=5, raise_err=False) - - self.wait_loaded() - - try: - # 如果存在“请求批准”按钮,则直接返回跳过 - request_approval_btn = self.tab.eles('xpath://kat-panel-wrapper[@data-testid="kat-panel-wrapper-ActionPanelContent"]//div[@data-testid="section-header" and contains(string(.),"移除")]',timeout=5) - if len(request_approval_btn) > 0: - print(f"ASIN {asin} 存在请求批准按钮,不需要处理,跳过...") - panel_close_btn = self.tab.ele('xpath://kat-panel[@data-testid="kat-panel-ActionPanelContent"]', - timeout=5).sr('xpath:.//button[@class="close"]') - panel_close_btn.click() - - action_panel.wait.deleted(timeout=3, raise_err=False) - yield (asin,"请求批准") - - # 无需采取任何操作 - not_operate = self.tab.eles('xpath://kat-alert[contains(@description,"如果您之前已提交更改,则这些更改当前正在处理中") and not(@dismissed)]',timeout=3) - if len(not_operate) > 0: - print(f"ASIN {asin} 无需采取任何操作,跳过...") - yield (asin,"无需操作") - already_asin.add(asin) - continue - - # 解决商品信息违规问题 按钮 - kat_box_ls = action_panel.eles('xpath:.//kat-box[@variant="white"]',timeout=5) - # if len(kat_box_ls) == 0: - # print(f"ASIN {asin} 的操作面板中未找到选项,跳过...") - # continue - print(f"ASIN {asin}需要处理的有:{len(kat_box_ls)}个问题.") - # 解决商品信息违规问题 按钮,有多少个都要处理 - for i in range(len(kat_box_ls)): - print(f"开始处理第{i}个问题") - if len(kat_box_ls) <= i: - print(f"ASIN {asin} 的操作面板中选项数量发生变化,停止处理...") - break - kat_box_ls[i].click() - time.sleep(0.5) - self.wait_loaded() - - # TODO 增加 “出现警告和安全信息时候下滑” 的情况 - safe_handle_ls = self.tab.eles('xpath://kat-panel[@data-testid="kat-panel-ActionPanelContent"]//div[@aria-label="安全证明"]//kat-label[@text="未开始"]', - timeout=5) - if len(safe_handle_ls) > 0: - print("存在安全证明,正在处理...") - safe_handle_ls[0].click() - time.sleep(0.5) - self.wait_loaded() - check_box = self.tab.ele('xpath://kat-panel[@data-testid="kat-panel-ActionPanelContent"]//kat-checkbox') - check_box.click() - else: - problem_selection_ls = self.tab.eles( - 'xpath://kat-panel-wrapper[@data-testid="kat-panel-wrapper-ActionPanelContent"]//div[@data-testid="registry-list"]//div[@data-testid="registry"]', - timeout=10) - print("待选择数量",len(problem_selection_ls)) - for problem_selection in problem_selection_ls: - problem_selection.click() - print("点击选择完成") - time.sleep(0.5) - - # 点击保存 - confirm_btn = self.tab.ele('xpath://kat-panel-wrapper[@data-testid="kat-panel-wrapper-ActionPanelContent"]//kat-button[@variant="primary"]') - confirm_btn.wait.displayed(timeout=3, raise_err=False) - confirm_btn.click() - - self.wait_loaded() - - # 等待关闭按钮出现 - try: - close_btn = self.tab.ele('xpath://kat-panel[@data-testid="kat-panel-ActionPanelContent"]//kat-button[@label="关闭"]', - timeout=10) - close_btn.click() - except Exception as e: - print("点击关闭按钮失败",e) - - kat_box_ls = action_panel.eles('xpath:.//kat-box[@variant="white"]', timeout=5) - - # 修复商品信息 - repair_product = action_panel.eles('xpath:.//kat-button[@class="action-button"]',timeout=5) - if len(repair_product) > 0: - print(f"ASIN {asin} 存在修复商品信息按钮,正在点击...") - self.clear_tab() - repair_product[0].click() - time.sleep(1) - # 获取最新的tab - new_tab = self.browser.latest_tab - if isinstance(new_tab, str): - new_tab = self.browser.get_tab(id_or_num=new_tab) - - self.handle_repair_product(new_tab) - except Exception as e: - print("【asin】:",asin,"处理失败",traceback.format_exc()) - yield (asin,"处理失败") - already_asin.add(asin) - continue - - yield (asin,"处理完成") - already_asin.add(asin) - - try: - # 全部操作完成,关闭 - panel_close_btn= self.tab.ele('xpath://kat-panel[@data-testid="kat-panel-ActionPanelContent"]', - timeout=5).sr('xpath:.//button[@class="close"]') - panel_close_btn.click() - - action_panel.wait.deleted(timeout=3, raise_err=False) - - except Exception as e: - print("关闭操作面板失败", e) - - # 判断是否存在需要翻页的情况 - page_pamel = self.tab.eles('xpath://kat-pagination',timeout=5) - if len(page_pamel) == 0: - break - next_page_btn = page_pamel[0].sr('xpath:.//span[@part="pagination-nav-right"]') - class_str = next_page_btn.attr('class') - if "end" in class_str: - break - next_page_btn.click() - num += 1 - print(f"【程序计算】正在翻页,已翻 {num} 页...") - - already_asin = set() - - except Exception as e: - print("处理审批操作异常", e) - traceback.print_exc() - retry_num += 1 - self.tab.refresh() - self.tab.wait.doc_loaded(raise_err=False,timeout=120) - - - - -class ApproveTask: - """审批任务处理类:负责处理产品风险审批任务""" - - country_info = { - "DE": "德国", - "FR": "法国", - "ES": "西班牙", - "IT": "意大利", - "UK": "英国" - } - - @staticmethod - def show_notification(message: str, message_type: str = "error"): - """显示 pywebview 顶层通知(5秒后自动消失) - - Args: - message: 通知消息 - message_type: 消息类型 (success/warning/error/info) - """ - if webview and webview.windows: - try: - # 转义单引号,防止 JavaScript 语法错误 - safe_message = message.replace("'", "\\'").replace('"', '\\"').replace('\n', '\\n') - - # 设置通知样式颜色 - color_map = { - 'success': '#67C23A', - 'warning': '#E6A23C', - 'error': '#F56C6C', - 'info': '#909399' - } - bg_color = color_map.get(message_type, '#F56C6C') - - # 构建前端通知的 JavaScript 代码 - 创建原生 HTML 通知 - js_code = f""" - (function() {{ - // 移除已存在的通知 - var existingNotif = document.getElementById('pywebview-notification'); - if (existingNotif) {{ - existingNotif.remove(); - }} - - // 创建通知容器 - var notif = document.createElement('div'); - notif.id = 'pywebview-notification'; - notif.style.cssText = 'position: fixed; top: 20px; left: 50%; transform: translateX(-50%); ' + - 'background: {bg_color}; color: white; padding: 12px 20px; border-radius: 4px; ' + - 'box-shadow: 0 2px 12px rgba(0,0,0,0.3); z-index: 99999; font-size: 14px; ' + - 'max-width: 600px; word-wrap: break-word; display: flex; align-items: center; gap: 10px;'; - - // 添加消息内容 - var msgSpan = document.createElement('span'); - msgSpan.textContent = '{safe_message}'; - notif.appendChild(msgSpan); - - // 添加关闭按钮 - var closeBtn = document.createElement('span'); - closeBtn.innerHTML = '×'; - closeBtn.style.cssText = 'cursor: pointer; font-size: 18px; font-weight: bold; margin-left: 10px;'; - closeBtn.onclick = function() {{ notif.remove(); }}; - notif.appendChild(closeBtn); - - // 添加到页面 - document.body.appendChild(notif); - - // 5秒后自动消失 - setTimeout(function() {{ - if (notif && notif.parentNode) {{ - notif.style.transition = 'opacity 0.3s'; - notif.style.opacity = '0'; - setTimeout(function() {{ notif.remove(); }}, 300); - }} - }}, 5000); - }})(); - """ - # 在第一个窗口中执行 JavaScript - webview.windows[0].evaluate_js(js_code) - except Exception as e: - print(f"显示通知失败: {str(e)}") - - """ - 处理流程: - 1、解析任务json,提取对应的companyName 组组装user_info实例化 AmzoneApprove - 2、打开对应的店铺、遍历所有的国家站点处理 - 3、切换至指定国家,切换至 管理所有库存页面 - 4、调用search方法,查询出是否存在需要审批的商品,如果没有则结束;如果有则进入处理流程 - 5、进入处理流程后,调用run_page_action方法(注意是通过yield 返回数据的) - - 任务json示例: - { - "type": "product-risk-resolve-run", - "ts": 1775395996876, - "data": { - "taskId": 925, - "items": [ - { - "matched": true, - "platform": "亚马逊", - "shopName": "魏振峰", - "shopId": "27543917795757", - "companyName": "rongchuang123", - "openStoreUrl": null, - "matchedUserId": 17543915345493, - "matchStatus": "MATCHED", - "matchMessage": null - } - ], - "country_codes": [ - "UK", - "DE", - "FR", - "ES" - ] - } - } - """ - - def __init__(self, user_info: dict = None): - """初始化审批任务处理器 - - Args: - user_info: 用户信息字典,包含 company, username, password - """ - self.user_info = user_info or {} - self.running = True - - def log(self, message: str, level: str = "INFO"): - """日志输出 - - Args: - message: 日志消息 - level: 日志级别 - """ - from datetime import datetime - timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - if level == "ERROR": - self.show_notification(message, "error") - print(f"[{timestamp}] [ApproveTask] [{level}] {message}") - - def process_task(self, task_data: dict): - """处理审批任务主入口 - - Args: - task_data: 任务数据 - """ - try: - data = task_data.get("data", {}) - task_id = data.get("taskId") - items = data.get("items", []) - country_codes = data.get("country_codes", []) - risk_listing_filter = data.get("risk_listing_filter", "") - - if not task_id: - self.log("任务ID为空,跳过", "WARNING") - return - - if not items: - self.log("店铺列表为空,跳过", "WARNING") - return - - if not country_codes: - self.log("国家列表为空,跳过", "WARNING") - return - - self.log(f"开始处理审批任务 {task_id},共 {len(items)} 个店铺,{len(country_codes)} 个国家") - - from config import runing_task - runing_task[task_id] = { - "status": "running", - "start_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), - "total_shops": len(items), - "processed_shops": 0, - "total_countries": len(country_codes) * len(items), - "processed_countries": 0, - "total_asins": 0, - "processed_asins": 0, - "success_count": 0, - "failed_count": 0, - "stop_requested": False - } - - # 遍历处理每个店铺 - for idx, shop_item in enumerate(items, 1): - # 检查是否收到暂停请求 - if task_id in runing_task and runing_task[task_id].get("stop_requested", False): - self.log(f"检测到任务 {task_id} 的暂停请求,停止处理", "WARNING") - runing_task[task_id]["status"] = "stopped" - return - - shop_name = shop_item.get("shopName", "未知店铺") - self.log(f"[{idx}/{len(items)}] 开始处理店铺: {shop_name}") - self.show_notification(f"开始处理店铺: {shop_name}", "info") - - try: - self.process_shop(shop_item, country_codes, task_id,risk_listing_filter) - # 更新已处理店铺数 - if task_id in runing_task: - runing_task[task_id]["processed_shops"] += 1 - except Exception as e: - import traceback - self.log(f"处理店铺 {shop_name} 失败: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - - # 更新任务状态 - if task_id in runing_task: - if runing_task[task_id].get("stop_requested", False): - runing_task[task_id]["status"] = "stopped" - self.log(f"任务 {task_id} 已被暂停!") - else: - runing_task[task_id]["status"] = "completed" - self.log(f"任务 {task_id} 处理完成!") - - except Exception as e: - import traceback - self.log(f"任务处理失败: {traceback.format_exc()}", "ERROR") - if task_id: - from config import runing_task - if task_id in runing_task: - runing_task[task_id]["status"] = "failed" - runing_task[task_id]["error"] = str(e) - - def process_shop(self, shop_item: dict, country_codes: list, task_id: int, risk_listing_filter: str): - """处理单个店铺 - - Args: - shop_item: 店铺信息 - country_codes: 国家代码列表 - task_id: 任务ID - risk_listing_filter: 风险商品筛选条件 - """ - shop_name = shop_item.get("shopName", "未知店铺") - company_name = shop_item.get("companyName", "") - - if not company_name: - self.log(f"店铺 {shop_name} 的公司名称为空,跳过", "WARNING") - return - - - if task_id in runing_task: - runing_task[task_id]["current_shop"] = shop_name - - # 将店铺添加到正在执行中的店铺列表 - start_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - runing_shop[shop_name] = start_time - self.log(f"店铺 {shop_name} 已添加到执行列表,账号: {company_name},开始时间: {start_time}") - - # 店铺打开重试最多3次 - driver = None - max_retries = 3 - - error_info = "" - for retry in range(max_retries): - try: - self.log(f"尝试打开店铺 {shop_name} (第 {retry + 1}/{max_retries} 次)") - - # 如果不是第一次尝试,先杀进程 - # if retry > 0: - # self.log("重试前先杀掉浏览器进程...") - # kill_process("v6") - # kill_process("v5") - # time.sleep(2) - - # 组装用户信息并创建驱动 - user_info = { - **self.user_info, - "company": company_name - } - driver = AmzoneApprove(user_info) - browser = driver.open_shop(shop_name) - - if browser and browser != "店铺不存在": - self.log(f"成功打开店铺 {shop_name}") - break - else: - self.log(f"打开店铺失败: {browser}", "WARNING") - driver = None - - # 判断是否需要登录 - need_login = driver.need_login() - if need_login: - self.log(f"店铺 {shop_name} 需要登录,正在登录...") - password = "" - - login_success = driver.login(password) - if login_success: - self.log(f"店铺 {shop_name} 登录成功,正在重新打开店铺...") - browser = driver.open_shop(shop_name) - if browser and browser != "店铺不存在": - self.log(f"成功打开店铺 {shop_name} 登录后") - break - else: - self.log(f"登录后打开店铺失败: {browser}", "WARNING") - driver = None - else: - self.log(f"店铺 {shop_name} 登录失败", "WARNING") - driver = None - - except Exception as e: - import traceback - self.log(f"打开店铺异常: {traceback.format_exc()}", "INFO") - driver = None - error_info = str(e) - time.sleep(10) - - # 如果还有重试机会,等待后继续 - if retry < max_retries - 1: - time.sleep(3) - - # 检查是否成功打开 - if not driver or not browser or browser == "店铺不存在": - error_msg = f"店铺 {shop_name} 打开失败,已重试 {max_retries} 次,跳过该店铺,{error_info}" - self.log(error_msg, "ERROR") - # 从执行列表中移除 - if shop_name in runing_shop: - del runing_shop[shop_name] - return - - try: - # 处理每个国家 - for country_code in country_codes: - # 检查是否收到暂停请求 - if task_id in runing_task and runing_task[task_id].get("stop_requested", False): - self.log(f"检测到任务 {task_id} 的暂停请求,停止处理国家", "WARNING") - break - - try: - self.process_country(driver, country_code, task_id, shop_name,risk_listing_filter) - except Exception as e: - import traceback - self.log(f"处理国家 {country_code} 失败: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - # 最后回传,标记完成 - try: - self.post_result(task_id, shop_name, country_code, "", "", is_done=True) - except Exception as e: - self.log(f"回传结果失败: {str(e)}", "ERROR") - finally: - # 关闭店铺 - try: - if driver: - self.log(f"关闭店铺 {shop_name}") - driver.close_store() - time.sleep(2) - except Exception as e: - self.log(f"关闭店铺失败: {str(e)}", "WARNING") - - # 从正在执行中的店铺列表中移除 - if shop_name in runing_shop: - del runing_shop[shop_name] - self.log(f"店铺 {shop_name} 已从执行列表中移除") - - def process_country(self, driver: AmzoneApprove, country_code: str, task_id: int, shop_name: str, risk_listing_filter: str): - """处理单个国家的审批任务 - - Args: - driver: AmzoneApprove驱动实例 - country_code: 国家代码(如 UK, DE, FR 等) - task_id: 任务ID - shop_name: 店铺名称 - risk_listing_filter: 风险商品筛选条件 - """ - from config import runing_task - - # 转换国家代码为中文名称 - country_name = self.country_info.get(country_code, country_code) - info_mes = f"开始处理国家: {country_name} ({country_code})" - self.log(info_mes) - self.show_notification(info_mes, "info") - - # 更新当前处理的国家 - if task_id in runing_task: - runing_task[task_id]["current_country"] = country_name - - # 切换国家,最多重试3次 - max_retries = 3 - switch_success = False - - for retry in range(max_retries): - try: - self.log(f"尝试切换到国家 {country_name} (第 {retry + 1}/{max_retries} 次)") - - # 如果不是第一次尝试,先刷新页面 - if retry > 0: - self.log("重试前刷新页面...") - try: - driver.tab.refresh() - time.sleep(3) - except Exception as e: - self.log(f"刷新页面失败: {str(e)}", "WARNING") - - switch_success = driver.SwitchingCountries(country_name) - if switch_success: - self.log(f"成功切换到国家 {country_name}") - break - else: - self.log(f"切换到国家 {country_name} 失败", "WARNING") - - except Exception as e: - import traceback - self.log(f"切换国家 {country_name} 异常: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - - # 如果还有重试机会,等待后继续 - if retry < max_retries - 1: - time.sleep(2) - - # 如果切换失败,直接返回 - if not switch_success: - error_message = f"切换到国家 {country_name} 失败,已重试 {max_retries} 次,跳过该国家" - self.log(error_message, "ERROR") - if task_id in runing_task: - runing_task[task_id]["processed_countries"] += 1 - return - - # 切换到库存管理页面 - try: - driver.SwitchPage() - self.log(f"已切换到库存管理页面") - except Exception as e: - import traceback - self.log(f"切换页面失败: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - if task_id in runing_task: - runing_task[task_id]["processed_countries"] += 1 - return - - # 搜索需要审批的商品,最多重试3次 - sku_ls = [] - for retry in range(max_retries): - try: - self.log(f"尝试搜索需要审批的商品 (第 {retry + 1}/{max_retries} 次)") - sku_ls = driver.search(filter_type=risk_listing_filter) - break - except Exception as e: - self.log(f"搜索商品异常: {str(e)}", "ERROR") - if retry < max_retries - 1: - try: - driver.tab.refresh() - time.sleep(3) - except Exception as refresh_error: - self.log(f"刷新页面失败: {str(refresh_error)}", "WARNING") - - # 如果没有需要审批的商品,直接返回 - if len(sku_ls) == 0: - self.log(f"国家 {country_name} 没有需要审批的商品") - if task_id in runing_task: - runing_task[task_id]["processed_countries"] += 1 - return - - self.log(f"国家 {country_name} 有 {len(sku_ls)} 个需要审批的商品,开始处理...") - - # 处理所有需要审批的商品(通过yield获取结果) - try: - for asin, status in driver.run_page_action(): - # 检查是否收到暂停请求 - if task_id in runing_task and runing_task[task_id].get("stop_requested", False): - self.log(f"检测到任务 {task_id} 的暂停请求,停止处理ASIN", "WARNING") - break - - self.log(f"ASIN {asin} 处理结果: {status}") - - # 更新任务状态 - if task_id in runing_task: - runing_task[task_id]["current_asin"] = asin - runing_task[task_id]["processed_asins"] += 1 - - if status == "处理完成": - runing_task[task_id]["success_count"] += 1 - elif status == "请求批准": - # 请求批准的商品也算作成功(因为不需要处理) - runing_task[task_id]["success_count"] += 1 - else: - runing_task[task_id]["failed_count"] += 1 - - # 回传结果到API - try: - self.post_result(task_id, shop_name, country_code, asin, status) - except Exception as e: - self.log(f"回传结果失败: {str(e)}", "ERROR") - - except Exception as e: - import traceback - self.log(f"处理审批商品异常: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - - # 更新已处理国家数 - if task_id in runing_task: - runing_task[task_id]["processed_countries"] += 1 - - self.log(f"国家 {country_name} 处理完成") - - def post_result(self, task_id: int, shop_name: str, country_code: str, asin: str, status: str,is_done: bool = False): - """回传处理结果到API - - Args: - task_id: 任务ID - shop_name: 店铺名称 - country_code: 国家代码 - asin: ASIN - status: 处理状态 - """ - import requests - from config import DELETE_BRAND_API_BASE - - url = f"{DELETE_BRAND_API_BASE}/api/product-risk-resolve/tasks/{task_id}/result" - if status == "请求批准": - country_data = { - "status": "", - "shopName": shop_name, - "productAsinSku": "", - "done": is_done, - "removeAsin": asin, - "removeStatus": status - } - else: - country_data = { - "status": status, - "shopName": shop_name, - "productAsinSku": asin, - "done": is_done, - "removeAsin": "", - "removeStatus": "" - } - - payload = { - "shops": [ - { - "error": "", - "countries": { - country_code : [ country_data ] - }, - "shopName": shop_name - } - ] - } - - max_retries = 3 - for retry in range(max_retries): - try: - print("=====================================") - self.log(f"尝试回传结果 (第 {retry + 1}/{max_retries} 次)") - self.log(f"回传URL: {url}") - self.log(f"回传数据: {payload}") - response = requests.post( - url, - json=payload, - headers={"Content-Type": "application/json"}, - timeout=30, - verify=False - ) - self.log(f"回传结果: {response.text}") - - if response.status_code == 200: - self.log(f"结果回传成功: {asin} - {status}") - return - else: - self.log(f"结果回传失败,状态码: {response.status_code}", "WARNING") - print("=====================================") - - except Exception as e: - self.log(f"调用API异常: {str(e)}", "ERROR") - print("=====================================") - - # 如果还有重试机会,等待后继续 - if retry < max_retries - 1: - time.sleep(2) - - self.log(f"已达到最大重试次数,结果回传最终失败", "ERROR") - - - -if __name__ == '__main__': - user_info = { - "company": "rongchuang123", - "username": "自动化_Robot", - "password": "#20zsg25" - } - shop_name = "魏振峰" - country = "西班牙" - kill_process('v6') - driver = AmzoneApprove(user_info) - browser = driver.open_shop(shop_name) - sw_suc = driver.SwitchingCountries(country) - driver.SwitchPage() - risk_listing_filter = "Active" - for _ in range(3): - try: - sku_ls = driver.search(filter_type=risk_listing_filter) - break - except Exception as e: - print(e) - driver.tab.refresh() - if len(sku_ls) > 0: - print("有数据,开始操作") - for asin, status in driver.run_page_action(): - print(f"ASIN {asin} 的处理结果: {status}") - print("已完成操作") - - # for i in range(0): - # print(i) \ No newline at end of file diff --git a/app/amazon/approve.py b/app/amazon/approve.py deleted file mode 100644 index f851de5..0000000 --- a/app/amazon/approve.py +++ /dev/null @@ -1,957 +0,0 @@ -import time -import re -import traceback -import requests - -from DrissionPage._pages.chromium_tab import ChromiumTab - -from config import runing_task, runing_shop,DELETE_BRAND_API_BASE - -from datetime import datetime - -from amazon.amazon_base import AmamzonBase,kill_process,TaskBase -from amazon.tool import show_notification - -class AmzoneApprove(AmamzonBase): - mark_name = "产品风险审批" - - def __init__(self, user_info: dict, socket_port: int = 19890): - super().__init__(user_info,socket_port) - self.already_asin = set() - - def reset_already_asin(self): - self.already_asin = set() - self.log("already_asin 已重置") - - def wait_loaded(self): - # 等待加载完成 - try: - load_ele = self.tab.eles( - 'xpath://kat-panel[@data-testid="kat-panel-ActionPanelContent"]//div[contains(@class,"Loader-module__loader")]|//kat-panel[@data-testid="kat-panel-ActionPanelContent"]/div[@data-f1-component]//div[contains(@class,"==")]/div[contains(@class,"==")]/span', - timeout=3) - if len(load_ele) > 0: - load_ele[0].wait.deleted(timeout=5, raise_err=False) - except Exception as e: - print("等待加载中消失出错", e) - - def clear_tab(self): - for i in ["亚马逊","您的账户是否符合条件?"]: - all_tab = self.browser.get_tabs(title=i) - close_tab = [] - for tab in all_tab: - tab_id = tab if isinstance(tab,str) else tab.tab_id - if self.tab.tab_id == tab_id: - continue - close_tab.append(tab) - print("需要关闭的标签页",close_tab) - print("当前操作的tab_id",self.tab.tab_id) - self.browser.close_tabs(close_tab) - - def handle_repair_product(self,tab:ChromiumTab,headle_type=""): - def wait_loaded(wait_type="contentWrapper"): - # 等待加载完成 - print("------------【修复商品信息】等待加载完成-----------------") - for _ in range(3): - try: - load_ele = tab.eles( - 'xpath://div[@class="contentWrapper"]//div[contains(@class,"==")]/span[not(node())]|//kat-spinner[@id="ahd-app-page-spinner"]', - timeout=10) - if len(load_ele) > 0: - load_ele[0].wait.deleted(timeout=20, raise_err=False) - if wait_type == "contentWrapper": - contentWrapper = tab.eles('xpath://div[@class="contentWrapper"]//h4',timeout=20) - if len(contentWrapper) > 0: - contentWrapper[0].wait.displayed(timeout=20, raise_err=True) - break - else: - time.sleep(2) - break - if wait_type == "content": - contentWrapper = tab.eles('xpath://div[@class="contentWrapper"]',timeout=20) - if len(contentWrapper) > 0: - contentWrapper[0].wait.displayed(timeout=20, raise_err=True) - break - else: - time.sleep(2) - break - if wait_type == "section": - section = tab.eles('xpath://section[@class="ahd-product-policy__section"]',timeout=20) - if len(section) > 0: - section[0].wait.displayed(timeout=20, raise_err=True) - break - except Exception as e: - print("等待加载中消失出错", e) - print("-----------------------------") - - def close_contentWrapper(): - # 关闭按钮 - close_x_btn = tab.eles('xpath://div[@class="flyoutPanelContent"]/span',timeout=5) - contentWrapper = tab.eles('xpath://div[@class="flyoutPanelContent"]/div[@class="contentWrapper"]',timeout=5) - if len(close_x_btn) > 0 and len(contentWrapper)>0 : - if len(contentWrapper[0].children()) > 0: - close_x_btn[0].wait.displayed(timeout=5, raise_err=False) - close_x_btn[0].click() - - tab.wait.doc_loaded(timeout=60,raise_err=False) - - wait_loaded(wait_type="section") - # product_policy = tab.eles('xpath://div[@data-testid="ahd-desktop-product-policy"]') - product_policy = tab.eles('xpath://div[@data-testid="ahd-desktop-product-policy" and @class="ahd-product-policy-table-row-wrapper"]|//div[@class="ahd-product-policy-table-row-wrapper-nested" and @data-testid="ahd-desktop-product-policy"]') - if len(product_policy) == 0: - print("未找到提交处理区域,可能页面未加载完成或者页面结构发生变化") - time.sleep(5) - # product_policy = tab.eles('xpath://div[@data-testid="ahd-desktop-product-policy"]') - product_policy = tab.eles('xpath://div[@data-testid="ahd-desktop-product-policy" and @class="ahd-product-policy-table-row-wrapper"]|//div[@class="ahd-product-policy-table-row-wrapper-nested" and @data-testid="ahd-desktop-product-policy"]') - - print("等待5秒后再次查找提交处理区域:",len(product_policy)) - - # submit_btn_ls = tab.eles('xpath://div[@id="ahd-product-policies-table"]/div//div[@data-testid="nextStepsMetricWrapper"]//kat-button[@label="提交"]',timeout=10) - # if len(submit_btn_ls) == 0: - # return - now_index = 0 - submit_index = 0 - for _ in range(3): - try: - # 先全部点开 - chevron_right_ls = tab.eles('xpath://kat-icon[@name="chevron-right"]',timeout=10) - for ele in chevron_right_ls: - ele.click() - time.sleep(0.5) - except Exception as e: - print("【修复商品信息】全部点开失败",e) - try: - # todo 遍历 - print("【商品修复产品卡片】数量",len(product_policy)) - print("【商品修复产品卡片】列表",product_policy) - for index in range(now_index,len(product_policy)): - product_policy = tab.eles('xpath://div[@data-testid="ahd-desktop-product-policy" and @class="ahd-product-policy-table-row-wrapper"]|//div[@class="ahd-product-policy-table-row-wrapper-nested" and @data-testid="ahd-desktop-product-policy"]') - now_index = index - if index > len(product_policy)-1: - print("提交按钮区域发生变化,停止处理") - break - message_link = product_policy[index].eles('xpath:.//a[@data-testid="ahd-reason-message-link"]') - message = message_link[0].text - - if headle_type in ['查看冻结原因']: - need_heanle = any(i in message for i in ["制造商详细联系信息","警告和安全信息","负责人详细联系信息"]) - else: - need_heanle = True - - if not need_heanle: - print(f"【{headle_type}】【{message}】不需要处理,跳过") - continue - - spread_btn = product_policy[index].eles('xpath:.//kat-icon[@name="chevron-right"]',timeout=5) - print(f"{index},是否存在展开按钮",len(spread_btn)) - if len(spread_btn) > 0: - spread_btn[0].click() - time.sleep(0.5) - - submit_btn_ls = product_policy[index].eles('xpath:.//kat-button[@label="提交"]',timeout=5) - # try: - # submit_btn = product_policy[index].ele('xpath:.//kat-button[@label="提交"]',timeout=5) - # except Exception as e: - # print(datetime.now().strftime("%Y-%m-%d %H:%M:%S") ,"没有查找到提交按钮,跳过!") - # close_contentWrapper() - # continue - # print("提交按钮数量:",len(submit_btn)) - print("提交按钮列表:",submit_btn_ls) - if len(submit_btn_ls) > 0: - print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"),"查找到提交按钮") - # submit_btn = submit_btn[0] - submit_btn = tab.eles('xpath://kat-button[@label="提交"]',timeout=10)[submit_index] - submit_index += 1 - else: - print(datetime.now().strftime("%Y-%m-%d %H:%M:%S") ,"没有查找到提交按钮,跳过!") - close_contentWrapper() - continue - # time.sleep(10) - # 关闭按钮 - close_x_btn = tab.eles('xpath://div[@class="flyoutPanelContent"]/span',timeout=5) - contentWrapper = tab.eles('xpath://div[@class="flyoutPanelContent"]/div[@class="contentWrapper"]',timeout=5) - if len(close_x_btn) > 0 and len(contentWrapper)>0 : - if len(contentWrapper[0].children()) > 0: - close_x_btn[0].wait.displayed(timeout=5, raise_err=False) - close_x_btn[0].click() - - print("开始操作",submit_btn) - print("操作的ID 为:",submit_btn.attr('id')) - submit_btn.wait.enabled(timeout=5, raise_err=False) - submit_btn.click() - - # 先直接等待contentWrapper出现,不要进行复杂的元素查找 - try: - # 使用简单的等待,避免触发页面事件 - for check_count in range(10): - contentWrapper_exists = tab.eles('xpath://div[@class="contentWrapper"]', timeout=2) - if len(contentWrapper_exists) > 0: - print(f"【弹窗已出现】第{check_count+1}次检查") - time.sleep(2) # 再等待2秒让内容完全加载 - break - time.sleep(1) - except Exception as e: - print(f"等待弹窗出现异常: {e}") - - # wait_loaded(wait_type="content") - - for j in range(4): - if j == 0: - timeout = 5 - else: - timeout = 10 - contentWrapper = tab.eles('xpath://div[@class="contentWrapper"]//h4',timeout=timeout) - print("标题的数量",len(contentWrapper)) - if len(contentWrapper) > 0: - contentWrapper[0].wait.displayed(timeout=20, raise_err=True) - break - else: - # 关闭按钮 - close_contentWrapper() - time.sleep(2) - submit_btn.click() - - - need_input = tab.eles('xpath://div[@class="contentWrapper"]//kat-input[@data-testid="kat-input-dew:ump_epr_resgitration_number_title"]',timeout=5) - if len(need_input) > 0: - print("需要输入注册号,不符合操作要求,跳过...") - close_contentWrapper() - continue - - target_title = tab.eles('xpath://div[@class="contentWrapper"]//section//h4[text()="警告和安全信息"]',timeout=10) - print(f"序号{index}【警告和安全信息】数量 ->",len(target_title)) - if len(target_title) > 0: - is_Continue = False - for j in range(10): - not_start = tab.eles('xpath://div[@class="contentWrapper"]//div[@aria-label="安全证明"]//kat-label',timeout=2) - if len(not_start) > 0: - status_lebel = not_start[0].attr("text") - print(f"序号{index}【警告和安全信息】状态 ->",status_lebel) - if status_lebel and str(status_lebel).strip() != "" and status_lebel != "未开始": - print("安全证明-不是未开始状态,不需要操作") - close_contentWrapper() - continue - if status_lebel == "未开始": - is_Continue = True - break - else: - time.sleep(1) - # not_start = tab.eles('xpath://div[@class="contentWrapper"]//div[@aria-label="安全证明"]//kat-label[@text="未开始"]',timeout=10) - # if len(not_start) == 0: - # print("安全证明-不是未开始状态,不需要操作") - # close_contentWrapper() - # continue - print(f"序号{index}【警告和安全信息】是否需要继续 ->",is_Continue) - if not is_Continue: - continue - not_start = not_start[0] - not_start.wait.displayed(timeout=5, raise_err=False) - not_start.click() - - wait_loaded() - - check = tab.ele('xpath://div[@class="contentWrapper"]//kat-checkbox[@name="value"]',timeout=10) - check.wait.displayed(timeout=5, raise_err=False) - check.click() - - save_btn = tab.ele('xpath://div[@class="contentWrapper"]//kat-button[@variant="primary"]',timeout=10) - save_btn.wait.enabled(timeout=5, raise_err=False) - save_btn.click() - - wait_loaded() - - close_btn = tab.ele('xpath://div[@class="contentWrapper"]//kat-button[@label="关闭"]',timeout=10) - close_btn.wait.displayed(timeout=5, raise_err=False) - close_btn.click() - print(f"序号{index}【警告和安全信息】操作完成") - continue - - save_btn_ls = tab.eles('xpath://div[@class="contentWrapper"]//kat-button[@variant="primary"]',timeout=10) - print(f"序号{index}【选择保存】是否存在->",len(save_btn_ls)) - if len(save_btn_ls) > 0: - option_selection_ls = tab.eles('xpath://div[@class="contentWrapper"]//div[@role="option"]',timeout=5) - for option in option_selection_ls: - option.click() - time.sleep(0.5) - - save_btn_ls[0].wait.enabled(timeout=5, raise_err=False) - save_btn_ls[0].click() - - wait_loaded() - close_contentWrapper() - print(f"序号{index}【选择保存】操作完成") - continue - - - submit_btn_ls = tab.eles('xpath://div[@id="ahd-product-policies-table"]/div//div[@data-testid="nextStepsMetricWrapper"]//kat-button[@label="提交"]',timeout=10) - if len(submit_btn_ls) > 0: - submit_btn_ls[0].click() - submit_btn_ls[0].wait.deleted(timeout=5, raise_err=False) - wait_loaded() - - close_contentWrapper() - break - except Exception as e: - print(f"【handle_repair_product】处理修复商品信息异常", traceback.format_exc()) - tab.refresh() - tab.wait.doc_loaded(timeout=60,raise_err=False) - time.sleep(2) - wait_loaded(wait_type="section") - # product_policy = tab.eles('xpath://div[@data-testid="ahd-desktop-product-policy"]') - product_policy = tab.eles('xpath://div[@data-testid="ahd-desktop-product-policy" and @class="ahd-product-policy-table-row-wrapper"]|//div[@class="ahd-product-policy-table-row-wrapper-nested" and @data-testid="ahd-desktop-product-policy"]') - - - print("修复商品信息处理完成!") - tab.close() - - def run_page_action(self): - self.log(f"==================={self.mark_name}=======================") - self.log("开始执行...") - num = 0 - retry_num = 0 - max_retry_num = 5 - total_page = 0 - current_page = 0 - while retry_num < max_retry_num: # 最多重试3次 - # if num > 3: #测试 - # return - # 等待加载完成 - try: - load_ele = self.tab.eles("xpath://div[contains(@class,'Loader-module__loader')]",timeout=5) - if len(load_ele) > 0: - load_ele[0].wait.deleted(timeout=3, raise_err=False) - - time.sleep(0.5) - # 获取当前页码 - try: - page_pamel = self.tab.eles('xpath://kat-pagination',timeout=5) - if len(page_pamel) > 0: - current_page = page_pamel[0].sr('xpath:.//ul[@class="pages"]//li[@aria-current="true"]').text - current_page = int(current_page.strip()) - - # 总页数 - total_page = page_pamel[0].sr.eles('xpath:.//ul[@class="pages"]//span[@class="page__inner"][last()]') - if len(total_page) > 0: - total_page = int(total_page[-1].text.strip()) - - self.log(f"当前页码: {current_page} / 总页数: {total_page}") - except Exception as e: - self.log(f"获取页码失败:{e}") - - # 保存当前URL,用于失败重试时访问 - try: - self.url = self.tab.url - self.log(f"获取当前的链接:{self.url}") - except Exception as e: - self.url = None - self.log(f"获取当前的链接失败:{e}") - - sku_ls = self.tab.eles("xpath://div[@data-sku]",timeout=10) - self.log(f"获取到 {len(sku_ls)}") - - if len(sku_ls) == 0: - retry_num += 1 - print(f"没有获取到 ASIN 商品,重试{retry_num}/{max_retry_num}") - self.tab.refresh() - self.tab.wait.doc_loaded(raise_err=False, timeout=120) - if retry_num == max_retry_num: - raise RuntimeError(f"与页面的连接已断开,没有获取到 ASIN 商品,重试{retry_num}/{max_retry_num}") - continue - # for sku_ele in sku_ls[0:2]: - for sku_ele in sku_ls: - # solve_problem = sku_ele.eles('xpath:.//kat-link[@label="解决商品信息问题"]') - asin = sku_ele.ele('xpath:.//div[contains(@class,"JanusSplitBox-module__container")]//div[contains(@class,"JanusSplitBox-module__panel--") and contains(string(.),"ASIN")]/..//div[last()]').text - self.log(f"*************** {asin} *****************") - self.log(f"ASIN {asin} 存在问题,正在点击解决...") - try: - if asin in self.already_asin: - self.log(f"{asin} 已经处理过了,跳过") - continue - xp_ls = [f'.//kat-link[@label="{i}"]' for i in ["解决商品信息问题","修复被禁止显示的商品","解决商品移除风险","查看冻结原因"]] - xp = "|".join(xp_ls) - # solve_problem = sku_ele.eles('xpath:.//kat-link[@label="解决商品信息问题"]|.//kat-link[@label="修复被禁止显示的商品"]|.//kat-link[@label="解决商品移除风险"]') - solve_problem = sku_ele.eles(f'xpath:{xp}') - if len(solve_problem) == 0: - # //a[text0=”添加缺失的商品详情”] - lack_info = sku_ele.eles('xpath:.//a[text()="添加缺失的商品详情"]') - if len(lack_info) > 0: - self.log(f"{asin} 需要添加缺失的商品详情,跳过...") - yield (asin,"添加缺失的商品详情") - continue - - self.log(f"{asin},没有处理入口,不处理") - yield (asin,"没有处理入口,不处理") - self.already_asin.add(asin) - continue - - solve_problem[0].click() - - label = solve_problem[0].attr('label') - self.log(f"【当前类别】{label}") - - action_panel = self.tab.ele('xpath://kat-panel-wrapper[@data-testid="kat-panel-wrapper-ActionPanelContent"]') - action_panel.wait.displayed(timeout=5, raise_err=False) - - self.wait_loaded() - time.sleep(1) - - # 如果存在“请求批准”按钮,则直接返回跳过 - request_approval_btn = self.tab.eles('xpath://kat-panel-wrapper[@data-testid="kat-panel-wrapper-ActionPanelContent"]//div[@data-testid="section-header" and contains(string(.),"移除")]',timeout=5) - if len(request_approval_btn) > 0: - # 新增"查看冻结原因" 的情况下,需要点击修复商品详情 - if "查看冻结原因" in label: - repair_produ_btn_xp = '//kat-panel-wrapper[@data-testid="kat-panel-wrapper-ActionPanelContent"]//kat-button[@variant="secondary" and @class="action-button" and contains(string(.),"修复商品信息")]' - repair_produ_btn = self.tab.eles(f'xpath:{repair_produ_btn_xp}',timeout=5) - self.log(f"{asin}【查看冻结原因】修复商品信息数量,{len(repair_produ_btn)}") - if len(repair_produ_btn) > 0: - self.log(f"{asin}【查看冻结原因】修复商品信息数量,开始操作") - self.clear_tab() - repair_produ_btn[0].click() - time.sleep(3) - # 获取最新的tab - new_tab = self.browser.latest_tab - if isinstance(new_tab, str): - new_tab = self.browser.get_tab(id_or_num=new_tab) - - self.handle_repair_product(new_tab,headle_type="查看冻结原因") - else: - self.log(f"{i}【查看冻结原因】修复商品信息没有,不需要操作") - else: - self.log(f"ASIN {asin} 存在请求批准按钮,不需要处理,跳过...") - panel_close_btn = self.tab.ele('xpath://kat-panel[@data-testid="kat-panel-ActionPanelContent"]', - timeout=5).sr('xpath:.//button[@class="close"]') - panel_close_btn.click() - - action_panel.wait.deleted(timeout=3, raise_err=False) - yield (asin,"请求批准") - self.already_asin.add(asin) - continue - - # 无需采取任何操作 - not_operate = self.tab.eles('xpath://kat-alert[contains(@description,"如果您之前已提交更改,则这些更改当前正在处理中") and not(@dismissed)]',timeout=3) - if len(not_operate) > 0: - self.log(f"ASIN {asin} 无需采取任何操作,跳过...") - yield (asin,"无需操作") - self.already_asin.add(asin) - continue - - # 解决商品信息违规问题 按钮 - kat_box_ls = action_panel.eles('xpath:.//kat-box[@variant="white"]',timeout=5) - # if len(kat_box_ls) == 0: - # print(f"ASIN {asin} 的操作面板中未找到选项,跳过...") - # continue - self.log(f"ASIN {asin}需要处理的有:{len(kat_box_ls)}个问题.") - # 解决商品信息违规问题 按钮,有多少个都要处理 - for i in range(len(kat_box_ls)): - self.log(f"开始处理第{i}个问题") - if len(kat_box_ls) <= i: - self.log(f"ASIN {asin} 的操作面板中选项数量发生变化,停止处理...") - break - kat_box_ls[i].click() - time.sleep(0.5) - self.wait_loaded() - - # TODO 增加 “出现警告和安全信息时候下滑” 的情况 - safe_handle_ls = self.tab.eles('xpath://kat-panel[@data-testid="kat-panel-ActionPanelContent"]//div[@aria-label="安全证明"]//kat-label[@text="未开始"]', - timeout=15) - if len(safe_handle_ls) > 0: - self.log("存在安全证明,正在处理...") - safe_handle_ls[0].click() - time.sleep(0.5) - self.wait_loaded() - check_box = self.tab.ele('xpath://kat-panel[@data-testid="kat-panel-ActionPanelContent"]//kat-checkbox') - check_box.click() - else: - problem_selection_ls = self.tab.eles( - 'xpath://kat-panel-wrapper[@data-testid="kat-panel-wrapper-ActionPanelContent"]//div[@data-testid="registry-list"]//div[@data-testid="registry"]', - timeout=10) - self.log(f"待选择数量,{len(problem_selection_ls)}") - for problem_selection in problem_selection_ls: - problem_selection.click() - print("点击选择完成") - time.sleep(0.5) - - # 点击保存 - confirm_btn = self.tab.eles('xpath://kat-panel-wrapper[@data-testid="kat-panel-wrapper-ActionPanelContent"]//kat-button[@variant="primary"]') - if len(confirm_btn) > 0: - confirm_btn[0].wait.displayed(timeout=3, raise_err=False) - confirm_btn[0].click() - - self.wait_loaded() - - # 等待关闭按钮出现 - try: - close_btn = self.tab.eles('xpath://kat-panel[@data-testid="kat-panel-ActionPanelContent"]//kat-button[@label="关闭"]', - timeout=10) - if len(close_btn)>0: - close_btn[0].click() - except Exception as e: - self.log(f"点击关闭按钮失败,{e}") - - kat_box_ls = action_panel.eles('xpath:.//kat-box[@variant="white"]', timeout=5) - - # 修复商品信息 - repair_product = action_panel.eles('xpath:.//kat-button[@class="action-button" and not(@variant="secondary")]',timeout=5) - if len(repair_product) > 0: - self.log(f"ASIN {asin} 存在修复商品信息按钮,正在点击...") - self.clear_tab() - repair_product[0].click() - time.sleep(3) - # 获取最新的tab - new_tab = self.browser.latest_tab - if isinstance(new_tab, str): - new_tab = self.browser.get_tab(id_or_num=new_tab) - - self.handle_repair_product(new_tab) - - yield (asin,"处理完成") - self.already_asin.add(asin) - self.log(f"*********************{asin} 处理完成*************************") - - try: - # 全部操作完成,关闭 - panel_close_btn= self.tab.ele('xpath://kat-panel[@data-testid="kat-panel-ActionPanelContent"]', - timeout=5).sr('xpath:.//button[@class="close"]') - panel_close_btn.click() - action_panel.wait.deleted(timeout=3, raise_err=False) - self.clear_tab() - except Exception as e: - self.log(f"关闭操作面板失败,{e}") - - except Exception as e: - yield (asin, "处理失败") - self.already_asin.add(asin) - - self.log(f"{asin} 操作出错:{traceback.format_exc()}") - - # 判断是否存在需要翻页的情况 - page_pamel = self.tab.eles('xpath://kat-pagination',timeout=5) - if len(page_pamel) == 0: - break - next_page_btn = page_pamel[0].sr('xpath:.//span[@part="pagination-nav-right"]') - class_str = next_page_btn.attr('class') - if "end" in class_str: - break - next_page_btn.click() - num += 1 - self.log(f"【程序计算】正在翻页,已翻 {num} 页...") - - # already_asin = set() - - except Exception as e: - self.log(f"处理审批操作异常,{e}") - traceback.print_exc() - retry_num += 1 - self.tab.refresh() - self.tab.wait.doc_loaded(raise_err=False,timeout=120) - - #检查页数是否相等,不相等则继续 - self.log(f"开始检查页数,当前页数 {current_page} / {total_page}") - if total_page != 0 and current_page!= 0 and current_page < total_page: - self.log(f"检查到页数还未完成,重启浏览器继续") - raise RuntimeError(f"与页面的连接已断开,检查到页数还未完成,重启浏览器继续") - - - -class ApproveTask(TaskBase): - """审批任务处理类:负责处理产品风险审批任务""" - task_name = "产品风险审批-TASK" - - def process_task(self, task_data: dict): - """处理审批任务主入口 - - Args: - task_data: 任务数据 - """ - try: - data = task_data.get("data", {}) - task_id = data.get("taskId") - items = data.get("items", []) - country_codes = data.get("country_codes", []) - risk_listing_filter = data.get("risk_listing_filter", "") - # 测试 - # risk_listing_filter = "DetailPageRemoved" #data.get("risk_listing_filter", "") - - if not task_id: - self.log("任务ID为空,跳过", "WARNING") - return - if not items: - self.log("店铺列表为空,跳过", "WARNING") - return - if not country_codes: - self.log("国家列表为空,跳过", "WARNING") - return - - self.log(f"开始处理审批任务 {task_id},共 {len(items)} 个店铺,{len(country_codes)} 个国家") - - runing_task[task_id] = { - "status": "running", - "start_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), - "total_shops": len(items), - "processed_shops": 0, - "total_countries": len(country_codes) * len(items), - "processed_countries": 0, - "total_asins": 0, - "processed_asins": 0, - "success_count": 0, - "failed_count": 0, - "stop_requested": False - } - - # 遍历处理每个店铺 - for idx, shop_item in enumerate(items, 1): - # 检查是否收到暂停请求 - if task_id in runing_task and runing_task[task_id].get("stop_requested", False): - self.log(f"检测到任务 {task_id} 的暂停请求,停止处理", "WARNING") - runing_task[task_id]["status"] = "stopped" - return - - shop_name = shop_item.get("shopName", "未知店铺") - self.log(f"[{idx}/{len(items)}] 开始处理店铺: {shop_name}") - show_notification(f"开始处理店铺: {shop_name}", "info") - - try: - self.process_shop(shop_item, country_codes, task_id,risk_listing_filter) - # 更新已处理店铺数 - if task_id in runing_task: - runing_task[task_id]["processed_shops"] += 1 - except Exception as e: - self.log(f"处理店铺 {shop_name} 失败: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - - # 更新任务状态 - if task_id in runing_task: - if runing_task[task_id].get("stop_requested", False): - runing_task[task_id]["status"] = "stopped" - self.log(f"任务 {task_id} 已被暂停!") - else: - runing_task[task_id]["status"] = "completed" - self.log(f"任务 {task_id} 处理完成!") - - except Exception as e: - self.log(f"任务处理失败: {traceback.format_exc()}", "ERROR") - if task_id: - if task_id in runing_task: - runing_task[task_id]["status"] = "failed" - runing_task[task_id]["error"] = str(e) - - def process_shop(self, shop_item: dict, country_codes: list, task_id: int, risk_listing_filter: str): - """处理单个店铺 - - Args: - shop_item: 店铺信息 - country_codes: 国家代码列表 - task_id: 任务ID - risk_listing_filter: 风险商品筛选条件 - """ - shop_name = shop_item.get("shopName", "未知店铺") - company_name = shop_item.get("companyName", "") - - if not company_name: - self.log(f"店铺 {shop_name} 的公司名称为空,跳过", "WARNING") - return - - - if task_id in runing_task: - runing_task[task_id]["current_shop"] = shop_name - - # 将店铺添加到正在执行中的店铺列表 - start_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - runing_shop[shop_name] = start_time - self.log(f"店铺 {shop_name} 已添加到执行列表,账号: {company_name},开始时间: {start_time}") - - # 店铺打开重试最多3次 - driver = None - max_retries = 3 - iskill = False - - # 处理每个国家 - for country_code in country_codes: - # 检查是否收到暂停请求 - if task_id in runing_task and runing_task[task_id].get("stop_requested", False): - self.log(f"检测到任务 {task_id} 的暂停请求,停止处理国家", "ERROR") - driver.close_store() - break - - # 打开店铺 - driver = self.open_shop(cls=AmzoneApprove,max_retries=max_retries, company_name=company_name, - shop_name=shop_name, iskill=iskill) - - if driver is None: - self.log(f"任务 {task_id} 启动店铺失败,结束任务", "ERROR") - for country_code in country_codes: - self.post_result(task_id, shop_name, country_code, "", "", is_done=True) - return - - current_url = None - max_retries = 200 #只要没有完成,一直重试 - for _ in range(max_retries): - try: - self.process_country(driver, country_code, task_id, shop_name,risk_listing_filter,target_url=current_url) - driver.reset_already_asin() - driver.close_store() - break - except Exception as e: - self.log(f"处理国家 {country_code} 失败: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - if "与页面的连接已断开" in str(e): - iskill = True - current_url = driver.url - - # 更新已处理国家数 - if task_id in runing_task: - runing_task[task_id]["processed_countries"] += 1 - - self.log(f"{task_id}任务处理完成") - # 最后回传,标记完成 - try: - self.post_result(task_id, shop_name, country_code, "", "", is_done=True) - driver.close_store() #完成退出店铺 - except Exception as e: - self.log(f"回传结果失败: {str(e)}", "ERROR") - - # 从正在执行中的店铺列表中移除 - if shop_name in runing_shop: - del runing_shop[shop_name] - self.log(f"店铺 {shop_name} 已从执行列表中移除") - - def process_country(self, driver: AmzoneApprove, country_code: str, task_id: int, - shop_name: str, risk_listing_filter: str,target_url:str=None): - """ - 处理单个国家的审批任务 - """ - - # 转换国家代码为中文名称 - country_name = self.country_info.get(country_code, country_code) - info_mes = f"开始处理国家: {country_name} ({country_code})" - self.log(info_mes) - show_notification(info_mes, "info") - - # 更新当前处理的国家 - if task_id in runing_task: - runing_task[task_id]["current_country"] = country_name - - # 切换国家,最多重试3次 - max_retries = 5 - switch_success, switch_success_pg, search_success,sku_ls = self.action_init(driver, country_name, shop_name, - risk_listing_filter) - # 如果切换失败,直接返回 - if not switch_success or not switch_success_pg or not search_success: - error_message = f"切换到国家({switch_success})/库存页面({switch_success_pg})/搜索筛选到指定选项({search_success}) {country_name} 失败,已重试 {max_retries} 次,跳过该国家" - self.log(error_message, "ERROR") - if task_id in runing_task: - runing_task[task_id]["processed_countries"] += 1 - return - - # # 如果没有需要审批的商品,直接返回 - if len(sku_ls) == 0: - self.log(f"国家 {country_name} 没有需要审批的商品") - if task_id in runing_task: - runing_task[task_id]["processed_countries"] += 1 - return - - self.log(f"国家 {country_name} 有 {len(sku_ls)} 个需要审批的商品,开始处理...") - - if target_url is not None: #从失败的链接继续 - self.log(f"开始访问:{target_url}") - driver.tab.get(url=target_url) - driver.tab.wait.doc_loaded(timeout=60,raise_err=False) - - result = [] - # 处理所有需要审批的商品(通过yield获取结果) - for asin, status in driver.run_page_action(): - # 检查是否收到暂停请求 - if task_id in runing_task and runing_task[task_id].get("stop_requested", False): - self.log(f"检测到任务 {task_id} 的暂停请求,停止处理ASIN", "WARNING") - break - - self.log(f"ASIN {asin} 处理结果: {status}") - - if status in ["请求批准", "添加缺失的商品详情"]: - country_data = { - "status": "", - "shopName": shop_name, - "productAsinSku": "", - "done": False, - "removeAsin": asin, - "removeStatus": status - } - else: - country_data = { - "status": status, - "shopName": shop_name, - "productAsinSku": asin, - "done": False, - "removeAsin": "", - "removeStatus": "" - } - result.append(country_data) - - if len(result) > 10: - self.post_result_batch(task_id, shop_name, country_code, result) - result = [] - - if len(result) > 0: - self.post_result_batch(task_id, shop_name, country_code, result) - - self.log(f"国家 {country_name} 处理完成") - - def post_result(self, task_id: int, shop_name: str, country_code: str, asin: str, status: str,is_done: bool = False): - """回传处理结果到API - - Args: - task_id: 任务ID - shop_name: 店铺名称 - country_code: 国家代码 - asin: ASIN - status: 处理状态 - """ - - url = f"{DELETE_BRAND_API_BASE}/api/product-risk-resolve/tasks/{task_id}/result" - if status in ["请求批准","添加缺失的商品详情"]: - country_data = { - "status": "", - "shopName": shop_name, - "productAsinSku": "", - "done": is_done, - "removeAsin": asin, - "removeStatus": status - } - else: - country_data = { - "status": status, - "shopName": shop_name, - "productAsinSku": asin, - "done": is_done, - "removeAsin": "", - "removeStatus": "" - } - - payload = { - "shops": [ - { - "error": "", - "countries": { - country_code : [ country_data ] - }, - "shopName": shop_name - } - ] - } - - max_retries = 3 - for retry in range(max_retries): - try: - self.log("=====================================") - self.log(f"尝试回传结果 (第 {retry + 1}/{max_retries} 次)") - self.log(f"回传URL: {url}") - self.log(f"回传数据: {payload}") - response = requests.post( - url, - json=payload, - headers={"Content-Type": "application/json"}, - timeout=30, - verify=False - ) - self.log(f"回传结果: {response.text}") - - if response.status_code == 200: - self.log(f"结果回传成功: {asin} - {status}") - return - else: - self.log(f"结果回传失败,状态码: {response.status_code}", "WARNING") - print("=====================================") - - except Exception as e: - self.log(f"调用API异常: {str(e)}", "ERROR") - print("=====================================") - - # 如果还有重试机会,等待后继续 - if retry < max_retries - 1: - time.sleep(2) - - self.log(f"已达到最大重试次数,结果回传最终失败", "ERROR") - - def post_result_batch(self, task_id: int, shop_name: str, country_code: str, country_data_ls:list): - """ - 批量回传处理结果到API - """ - - url = f"{DELETE_BRAND_API_BASE}/api/product-risk-resolve/tasks/{task_id}/result" - - - payload = { - "shops": [ - { - "error": "", - "countries": { - country_code: country_data_ls - }, - "shopName": shop_name - } - ] - } - - max_retries = 3 - for retry in range(max_retries): - try: - self.log("=====================================") - self.log(f"尝试回传结果 (第 {retry + 1}/{max_retries} 次)") - self.log(f"回传URL: {url}") - self.log(f"回传数据: {payload}") - response = requests.post( - url, - json=payload, - headers={"Content-Type": "application/json"}, - timeout=30, - verify=False - ) - self.log(f"回传结果: {response.text}") - - if response.status_code == 200: - self.log(f"结果回传成功") - return - else: - self.log(f"结果回传失败,状态码: {response.status_code}", "WARNING") - print("=====================================") - - except Exception as e: - self.log(f"调用API异常: {str(e)}", "ERROR") - print("=====================================") - - # 如果还有重试机会,等待后继续 - if retry < max_retries - 1: - time.sleep(2) - - self.log(f"已达到最大重试次数,结果回传最终失败", "ERROR") - - - -if __name__ == '__main__': - user_info = { - "company": "rongchuang123", - "username": "自动化_Robot", - "password": "#20zsg25" - } - shop_name = "郭亚芳" - country = "德国" - kill_process('v6') - driver = AmzoneApprove(user_info) - browser = driver.open_shop(shop_name) - sw_suc = driver.SwitchingCountries(country) - driver.SwitchPage() - risk_listing_filter = "DetailPageRemoved" - for _ in range(3): - try: - sku_ls = driver.search(filter_type=risk_listing_filter) - break - except Exception as e: - print(e) - driver.tab.refresh() - if len(sku_ls) > 0: - print("有数据,开始操作") - for asin, status in driver.run_page_action(): - print(f"ASIN {asin} 的处理结果: {status}") - print("已完成操作") - - # for i in range(0): - # print(i) \ No newline at end of file diff --git a/app/amazon/asin_status.py b/app/amazon/asin_status.py deleted file mode 100644 index fee9d83..0000000 --- a/app/amazon/asin_status.py +++ /dev/null @@ -1,562 +0,0 @@ -import time -import traceback -from datetime import datetime -import requests - -from amazon.amazon_base import AmamzonBase, kill_process,TaskBase -from amazon.tool import show_notification - -from config import runing_task, runing_shop, DELETE_BRAND_API_BASE - - -class AmzonePStatus(AmamzonBase): - mark_name = "状态查询" - - def search_asin(self, asin): - search_region = self.tab.ele('xpath://div[@id="searchBoxContainer"]//kat-input-group') - search_region.wait.displayed(raise_err=False) - time.sleep(0.6) - search_input = self.tab.ele("xpath://kat-input[contains(@class,'SearchBox-module__searchInput')]").sr( - 'xpath://span[@class="container"]//input[@part="input"]') - search_input.input(asin, clear=True) - sku_ls = [] - for _ in range(3): - search_btn = self.tab.ele("xpath://kat-icon[@name='search']") - search_btn.click() - - load_ele = self.tab.ele("xpath://div[contains(@class,'Loader-module__loader')]") - # load_ele.wait.hidden(timeout=3, raise_err=False) - load_ele.wait.deleted(timeout=3, raise_err=False) - time.sleep(0.5) - - sku_ls = self.tab.eles("xpath://div[@data-sku]", timeout=3) - if len(sku_ls) > 0: - break - return sku_ls - - def search_asin_action(self, asin: str): - load_ele = self.tab.eles("xpath://div[contains(@class,'Loader-module__loader')]", timeout=5) - if len(load_ele) > 0: - load_ele[0].wait.deleted(timeout=3, raise_err=False) - time.sleep(0.5) - - sku_ls = self.search_asin(asin=asin) - print(f"【{self.mark_name}】{asin} 搜索到 {len(sku_ls)} 个SKU") - - def clear_tab(self): - all_tab = self.browser.get_tabs() - close_tab = [] - for tab in all_tab: - tab_id = tab if isinstance(tab, str) else tab.tab_id - if self.tab.tab_id == tab_id: - continue - close_tab.append(tab) - print("需要关闭的标签页", close_tab) - print("当前操作的tab_id", self.tab.tab_id) - self.browser.close_tabs(close_tab) - - def run_page_action(self, appoint_asin: str = None): - self.log(f"==================={self.mark_name}=======================") - self.log("开始执行...") - num = 0 - retry_num = 0 - already_asin = set() - get_page_faild = 0 - - while retry_num < 3: # 最多重试3次 - try: - print(self.mark_name, "指定asin操作", appoint_asin) - self.search_asin_action(asin=appoint_asin) - - load_ele = self.tab.eles("xpath://div[contains(@class,'Loader-module__loader')]", timeout=5) - if len(load_ele) > 0: - load_ele[0].wait.deleted(timeout=3, raise_err=False) - time.sleep(0.5) - - # 获取当前页码 - try: - page_pamel = self.tab.eles('xpath://kat-pagination', timeout=5) - if len(page_pamel) > 0: - current_page = page_pamel[0].sr('xpath:.//ul[@class="pages"]//li[@aria-current="true"]').text - - # 总页数 - total_page = page_pamel[0].sr.eles( - 'xpath:.//ul[@class="pages"]//span[@class="page__inner"][last()]') - if len(total_page) > 0: - total_page = total_page[-1].text - else: - total_page = 0 - print(f"【{self.mark_name}】当前页码: {current_page} / 总页数: {total_page}") - get_page_faild = 0 - except Exception as e: - print("【{self.mark_name}】", "获取页码失败", e) - get_page_faild += 1 - if get_page_faild > 2: - show_notification(f"【{self.mark_name}】获取页码失败超3次停止任务!") - break - - sku_ls = self.tab.eles("xpath://div[@data-sku]", timeout=10) - print(f"【{self.mark_name}】获取到 {len(sku_ls)}") - # for sku_ele in sku_ls[0:2]: - if len(sku_ls) == 0: - yield (appoint_asin,"查询不到") - break - - for sku_ele in sku_ls: - asin = sku_ele.ele( - 'xpath:.//div[contains(@class,"JanusSplitBox-module__container")]//div[contains(@class,"JanusSplitBox-module__panel--") and contains(string(.),"ASIN")]/..//div[last()]', - timeout=3).text - print(f"【{self.mark_name}】ASIN {asin} 找到....") - if asin in already_asin: - print(f"【{self.mark_name}】{asin} 已经处理过了,跳过") - continue - - # 状态 - status_ele = sku_ele.eles('xpath:.//div[contains(@class,"Status-module__container")]//kat-label') - if len(status_ele) > 0: - statu = status_ele[0].attr("emphasis") - else: - statu = "未获取到状态" - - already_asin.add(asin) - yield (asin,statu) - print(f"【{self.mark_name}】",(asin,statu)) - - # 判断是否存在需要翻页的情况 - page_pamel = self.tab.eles('xpath://kat-pagination', timeout=5) - if len(page_pamel) == 0: - break - next_page_btn = page_pamel[0].sr('xpath:.//span[@part="pagination-nav-right"]') - class_str = next_page_btn.attr('class') - if "end" in class_str: - break - next_page_btn.click() - num += 1 - print(f"【{self.mark_name}】【程序计算】正在翻页,已翻 {num} 页...") - already_asin = set() - - except Exception as e: - print(f"【{self.mark_name}】处理跟价操作异常", e) - traceback.print_exc() - retry_num += 1 - self.tab.refresh() - self.tab.wait.doc_loaded(raise_err=False, timeout=120) - - -class StatusTask(TaskBase): - task_name = "状态查询-TASK" - - def process_task(self, task_data: dict): - """处理审批任务主入口 - - Args: - task_data: 任务数据 - """ - try: - data = task_data.get("data", {}) - task_id = data.get("taskId") - items = data.get("items", [])[0] - shop_name = items.get("shop_name") - queryAsins = items.get("queryAsins", []) - - user_id = data.get("user_id") - stage_index = data.get("stage_index") - final_stage = bool(data.get("final_stage", True)) - - # 用于测试 - limit = data.get("limit", None) - - if not task_id or not queryAsins: - self.log("任务ID / queryAsins列表 为空,跳过", "WARNING") - return - - self.log(f"开始处理审批任务 {task_id},共 1 个店铺,{len(queryAsins)} 个国家") - - runing_task[task_id] = { - "status": "running", - "start_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), - "total_shops": 1, - "processed_shops": 0, - "total_countries": len(queryAsins), - "processed_countries": 0, - "total_asins": 0, - "processed_asins": 0, - "success_count": 0, - "failed_count": 0, - "stop_requested": False - } - - # 检查是否收到暂停请求 - if task_id in runing_task and runing_task[task_id].get("stop_requested", False): - self.log(f"检测到任务 {task_id} 的暂停请求,停止处理", "WARNING") - runing_task[task_id]["status"] = "stopped" - return - - self.log(f"开始处理店铺: {shop_name}") - show_notification(f"开始处理店铺: {shop_name}", "info") - - try: - self.process_shop(items, queryAsins, task_id, user_id, stage_index, - final_stage, limit=limit) - - # self.process_shop(shop_item, country_codes, task_id,risk_listing_filter) - # 更新已处理店铺数 - if task_id in runing_task: - runing_task[task_id]["processed_shops"] += 1 - except Exception as e: - self.log(f"处理店铺 {shop_name} 失败: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - - # 更新任务状态 - if task_id in runing_task: - if runing_task[task_id].get("stop_requested", False): - runing_task[task_id]["status"] = "stopped" - self.log(f"任务 {task_id} 已被暂停!") - else: - runing_task[task_id]["status"] = "completed" - self.log(f"任务 {task_id} 处理完成!") - - except Exception as e: - self.log(f"任务处理失败: {traceback.format_exc()}", "ERROR") - if task_id: - if task_id in runing_task: - runing_task[task_id]["status"] = "failed" - runing_task[task_id]["error"] = str(e) - - def process_shop(self, shop_item: dict, country_codes: list, task_id: int, - user_id=None, stage_index=None, final_stage: bool = True, limit: str = None): - """处理单个店铺 - - Args: - shop_item: 店铺信息 - country_codes: 国家代码列表 - task_id: 任务ID - risk_listing_filter: 风险商品筛选条件 - """ - shop_name = shop_item.get("shopName", "未知店铺") - company_name = shop_item.get("companyName", "") - - if not company_name: - self.log(f"店铺 {shop_name} 的公司名称为空,跳过", "WARNING") - return - - if task_id in runing_task: - runing_task[task_id]["current_shop"] = shop_name - - # 将店铺添加到正在执行中的店铺列表 - start_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - runing_shop[shop_name] = start_time - self.log(f"店铺 {shop_name} 已添加到执行列表,账号: {company_name},开始时间: {start_time}") - - # 店铺打开重试最多3次 - max_retries = 3 - iskill = False - # 处理每个国家 - for value in country_codes: - country_code = value.get("country") - all_asin = value.get("asins") - # 打开店铺 - driver = self.open_shop(cls=AmzonePStatus,max_retries=max_retries, company_name=company_name, - shop_name=shop_name, iskill=iskill) - if driver is None: - self.log(f"任务 {task_id} 启动店铺失败,结束任务", "ERROR") - for country_code in country_codes: - self.post_result(task_id, shop_name, country_code, "", "", is_done=True) - return - - # 检查是否收到暂停请求 - if task_id in runing_task and runing_task[task_id].get("stop_requested", False): - self.log(f"检测到任务 {task_id} 的暂停请求,停止处理国家", "ERROR") - driver.close_store() - break - try: - self.process_country(driver, country_code, task_id, shop_name,all_asin=all_asin ) - except Exception as e: - self.log(f"处理国家 {country_code} 失败: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - if "与页面的连接已断开" in str(e): - iskill = True - - # 更新已处理国家数 - if task_id in runing_task: - runing_task[task_id]["processed_countries"] += 1 - - # 关闭店铺 - driver.close_store() - - self.log(f"{task_id}任务处理完成") - - # 最后回传,标记完成 - try: - # self.post_result(task_id, shop_name, country_code, "", "", is_done=True) - if final_stage: - self.post_result(task_id, shop_name, country_code, "", "", is_done=True) - else: - self.post_stage_finished(task_id, user_id, stage_index) - except Exception as e: - self.log(f"回传结果失败: {str(e)}", "ERROR") - - # 从正在执行中的店铺列表中移除 - if shop_name in runing_shop: - del runing_shop[shop_name] - self.log(f"店铺 {shop_name} 已从执行列表中移除") - - def process_country(self, driver: AmzonePStatus, country_code: str, task_id: int, shop_name: str, - all_asin:list,limit: str = None): - """处理单个国家的审批任务 - - Args: - driver: AmzoneApprove驱动实例 - country_code: 国家代码(如 UK, DE, FR 等) - task_id: 任务ID - shop_name: 店铺名称 - risk_listing_filter: 风险商品筛选条件 - """ - - # 转换国家代码为中文名称 - country_name = self.country_info.get(country_code, country_code) - info_mes = f"开始处理国家: {country_name} ({country_code})" - self.log(info_mes) - show_notification(info_mes, "info") - - # 更新当前处理的国家 - if task_id in runing_task: - runing_task[task_id]["current_country"] = country_name - - # 切换国家,最多重试3次 - max_retries = 3 - switch_success = False - - for retry in range(max_retries): - try: - self.log(f"尝试切换到国家 {country_name} (第 {retry + 1}/{max_retries} 次)") - if retry > 1: - # 刷新不行就重新打开店铺 - self.log("重试前重新打开店铺...") - try: - driver.close_store() - time.sleep(3) - driver.open_shop(shop_name) - except Exception as e: - self.log(f"关闭重新打开店铺: {str(e)}", "WARNING") - # 如果不是第一次尝试,先刷新页面 - if retry > 0: - self.log("重试前刷新页面...") - try: - driver.tab.refresh() - time.sleep(3) - except Exception as e: - self.log(f"刷新页面失败: {str(e)}", "WARNING") - - switch_success = driver.SwitchingCountries(country_name) - if switch_success: - self.log(f"成功切换到国家 {country_name}") - break - else: - self.log(f"切换到国家 {country_name} 失败", "WARNING") - - except Exception as e: - self.log(f"切换国家 {country_name} 异常: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - - # 如果还有重试机会,等待后继续 - if retry < max_retries - 1: - time.sleep(2) - - # 如果切换失败,直接返回 - if not switch_success: - error_message = f"切换到国家 {country_name} 失败,已重试 {max_retries} 次,跳过该国家" - self.log(error_message, "ERROR") - if task_id in runing_task: - runing_task[task_id]["processed_countries"] += 1 - return - - # 切换到库存管理页面 - for retry in range(max_retries): - try: - driver.SwitchPage() - self.log(f"已切换到库存管理页面") - except Exception as e: - self.log(f"切换页面失败: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - - if retry >= max_retries - 1: - if task_id in runing_task: - runing_task[task_id]["processed_countries"] += 1 - self.log(f"切换页面失败重试退出", "ERROR") - return - - # 处理所有需要审批的商品(通过yield获取结果) - - # 指定 asin - for ap_asin in all_asin: - print(f"【{driver.mark_name}】开始处理 ->",ap_asin) - for asin, status in driver.run_page_action( - appoint_asin=ap_asin - ): - # 检查是否收到暂停请求 - if task_id in runing_task and runing_task[task_id].get("stop_requested", False): - self.log(f"检测到任务 {task_id} 的暂停请求,停止处理ASIN", "WARNING") - break - - self.log(f"ASIN {asin} 处理结果: {status}") - - # 更新任务状态 - if task_id in runing_task: - runing_task[task_id]["current_asin"] = asin - runing_task[task_id]["processed_asins"] += 1 - - runing_task[task_id]["failed_count"] += 1 - - # 回传结果到API - try: - self.post_result(task_id, shop_name, country_code, asin, status) - except Exception as e: - self.log(f"回传结果失败: {str(e)}", "ERROR") - - self.log(f"国家 {country_name} 处理完成") - - def post_stage_finished(self, task_id: int, user_id, stage_index): - # import requests - # from config import DELETE_BRAND_API_BASE - - if user_id in (None, "", 0): - raise ValueError("user_id is required for stage completion callback") - if stage_index is None: - raise ValueError("stage_index is required for stage completion callback") - - url = f"{DELETE_BRAND_API_BASE}/api/shop-match/tasks/{task_id}/stage-finished" - payload = {"stage_index": stage_index} - params = {"user_id": user_id} - - max_retries = 3 - for retry in range(max_retries): - try: - self.log(f"Attempting stage completion callback ({retry + 1}/{max_retries})") - response = requests.post( - url, - params=params, - json=payload, - headers={"Content-Type": "application/json"}, - timeout=30, - verify=False, - ) - self.log(f"Stage completion callback response: {response.text}") - data = response.json() if response.text else {} - if response.status_code == 200 and isinstance(data, dict) and data.get("success"): - self.log(f"Stage completion callback succeeded: task={task_id}, stage={stage_index}") - return - self.log(f"Stage completion callback failed, status={response.status_code}", "WARNING") - except Exception as e: - self.log(f"Stage completion callback exception: {str(e)}", "ERROR") - if retry < max_retries - 1: - time.sleep(2) - - raise RuntimeError(f"Stage completion callback failed after retries: task={task_id}, stage={stage_index}") - - def post_result(self, task_id: int, shop_name: str, country_code: str, asin: str, status: dict, - is_done: bool = False): - """回传处理结果到API - - Args: - task_id: 任务ID - shop_name: 店铺名称 - country_code: 国家代码 - asin: ASIN - status: 处理状态 - """ - - url = f"{DELETE_BRAND_API_BASE}/api/query-asin/tasks/{task_id}/result" - - payload = { - "shops": [ - { - "shopName": shop_name, - "countryResults": [ - { - "country": country_code, - "items": [ - { - "asin": asin, - "status": status - } - ] - } - ], - "shopDone": is_done, - "submissionId": f"{int(time.time())}" - } - ] - } - if is_done: - payload["shops"][0]["success"] = is_done - - max_retries = 3 - for retry in range(max_retries): - try: - print("================【跟价】=====================") - self.log(f"尝试回传结果 (第 {retry + 1}/{max_retries} 次)") - self.log(f"回传URL: {url}") - self.log(f"回传数据: {payload}") - response = requests.post( - url, - json=payload, - headers={"Content-Type": "application/json"}, - timeout=30, - verify=False - ) - self.log(f"回传结果: {response.text}") - data = response.json() if response.text else {} - if response.status_code == 200 and isinstance(data, dict) and data.get("success"): - self.log(f"结果回传成功: {asin} - {status}") - return - else: - self.log(f"结果回传失败,状态码: {response.status_code}", "WARNING") - print("=====================================") - - except Exception as e: - self.log(f"调用API异常: {str(e)}", "ERROR") - print("=====================================") - - # 如果还有重试机会,等待后继续 - if retry < max_retries - 1: - time.sleep(2) - - self.log(f"已达到最大重试次数,结果回传最终失败", "ERROR") - raise RuntimeError("已达到最大重试次数,结果回传最终失败") - - - -if __name__ == '__main__': - # 使用示例 - user_info = { - "company": "rongchuang123", - "username": "自动化_Robot", - "password": "#20zsg25" - } - shop_name = "魏振峰" - country = "德国" - kill_process('v6') - driver = AmzonePStatus(user_info) - browser = driver.open_shop(shop_name) - sw_suc = driver.SwitchingCountries(country) - driver.SwitchPage() - risk_listing_filter = "Active" - _shopMallName = "WEIZHENFENG168" - ap_asin = "B0F1N18XFW" - skip_asin = [] - for _ in range(3): - try: - sku_ls = driver.search(filter_type=risk_listing_filter) - break - except Exception as e: - print(e) - driver.tab.refresh() - if len(sku_ls) > 0: - print("有数据,开始操作") - for asin, status in driver.run_page_action( - current_shop_name=_shopMallName, - appoint_asin=ap_asin, skip_asin=skip_asin - ): - print(f"ASIN {asin} 的处理结果: {status}") - print("已完成操作") diff --git a/app/amazon/backend_api.py b/app/amazon/backend_api.py deleted file mode 100644 index e69de29..0000000 diff --git a/app/amazon/base.py b/app/amazon/base.py deleted file mode 100644 index ce6a7c6..0000000 --- a/app/amazon/base.py +++ /dev/null @@ -1,808 +0,0 @@ -import json -import os -import re -import subprocess -import time -import uuid -from typing import Any, Dict, List, Literal, Optional, TypedDict - -from loguru import logger -import requests -from DrissionPage import Chromium -from DrissionPage._pages.chromium_tab import ChromiumTab -from DrissionPage.common import By - -try: - import winreg -except ImportError: - winreg = None - - -STATUS_OK = "0" -STATUS_LOGIN_FAILED = "-10003" - -DEFAULT_SOCKET_PORT = 20000 -CLIENT_API_TIMEOUT = 120 -PORT_CHECK_TIMEOUT = 2 -UPDATE_CORE_RETRY_DELAY = 2 -CLIENT_RESTART_DELAY = 5 -CLIENT_START_RETRIES = 3 -CLIENT_READY_TIMEOUT = 10 -CLIENT_READY_INTERVAL = 0.5 -CLIENT_POST_START_DELAY = 5 -PROCESS_KILL_DELAY = 3 -ZINIAO_WEBDRIVER_LOG_TAIL_LINES = 80 - -DOC_LOAD_TIMEOUT = 30 -COUNTRY_INITIAL_LOAD_TIMEOUT = 120 -COUNTRY_LOOKUP_TIMEOUT = 20 -COUNTRY_CLICK_TIMEOUT = 10 -COUNTRY_DROPDOWN_DELAY = 1 -COUNTRY_DROPDOWN_READY_TIMEOUT = 20 -COUNTRY_DROPDOWN_RETRY_INTERVAL = 0.5 -IP_CHECK_TIMEOUT = 60 - -LOGIN_ATTEMPTS = 4 -PASSWORD_INPUT_TIMEOUT = 5 -PASSWORD_SUBMIT_TIMEOUT = 5 -OTP_SEND_TIMEOUT = 5 -OTP_INPUT_LOOKUP_ATTEMPTS = 5 -OTP_INPUT_TIMEOUT = 30 -OTP_INPUT_DISPLAY_TIMEOUT = 10 -OTP_CODE_WAIT_SECONDS = 30 -OTP_SUBMIT_TIMEOUT = 10 -OTP_RESULT_LOAD_TIMEOUT = 20 -OTP_ERROR_TIMEOUT = 10 -OTP_SEND_DELAY = 1 -LOGIN_FINAL_SUBMIT_TIMEOUT = 10 -NEED_LOGIN_DELAY = 3 -NEED_LOGIN_TIMEOUT = 5 - -COUNTRY_LABEL_XPATH = 'xpath://div[@class="dropdown-account-switcher-header-label"]/span[last()]' -COUNTRY_DROPDOWN_XPATH = 'xpath://div[@class="dropdown-account-switcher-header-label"]' -COUNTRY_LIST_ITEM_XPATH = 'xpath://div[@class="dropdown-account-switcher-list-item"]' -NEED_LOGIN_XPATH = 'xpath://h1[@class="a-spacing-small"]|//span[contains(text(),"登录")]' -PASSWORD_INPUT_XPATH = 'xpath://input[@type="password"]' -PASSWORD_SUBMIT_XPATH = 'xpath://input[@id="signInSubmit"]' -OTP_SEND_XPATH = 'xpath://span[@id="auth-send-code" and contains(string(.),"发送一次性密码")]' -OTP_INPUT_XPATH = 'xpath://input[@name="otpCode"]' -OTP_SUBMIT_XPATH = 'xpath://input[@id="auth-signin-button"]' -OTP_ERROR_XPATH = 'xpath://div[@id="auth-error-message-box"]' - - -class UserInfo(TypedDict): - username: str - password: str - company: str - - -def kill_process(version: Literal["v5", "v6"]): - """结束指定版本的紫鸟客户端进程.""" - logger.info("准备杀紫鸟客户端进程,version={}", version) - driver = ZiniaoDriver({}) - driver.kill_process(version) - - -class ZiniaoDriver: - """封装紫鸟客户端启动,店铺浏览器生命周期和客户端 API 调用.""" - - def __init__(self, user_info: UserInfo, socket_port: int = DEFAULT_SOCKET_PORT): - """初始化紫鸟浏览器驱动. - - Args: - user_info: 紫鸟账号信息,包含 company, username, password. - socket_port: 客户端 HTTP 通信端口. - """ - self.user_info = user_info - self.socket_port = socket_port - self.client_path = None - self.browser = None - self.tab: Optional[ChromiumTab] = None - self.store_id = None - - @property - def client_url(self) -> str: - return f"http://127.0.0.1:{self.socket_port}" - - def _build_payload(self, action: str, extra: Optional[Dict[str, Any]] = None) -> Dict[str, Any]: - payload = { - "action": action, - "requestId": str(uuid.uuid4()), - } - if extra: - payload.update(extra) - payload.update(self.user_info) - return payload - - def _post_client(self, payload: Dict[str, Any]) -> Dict[str, Any]: - response = requests.post( - self.client_url, - json.dumps(payload).encode("utf-8"), - timeout=CLIENT_API_TIMEOUT, - ) - return response.json() - - @staticmethod - def _status_code(result: Optional[Dict[str, Any]]) -> Optional[str]: - if result is None: - return None - return str(result.get("statusCode")) - - @staticmethod - def _result_text(result: Dict[str, Any]) -> str: - return json.dumps(result, ensure_ascii=False) - - @staticmethod - def _find_store_oauth(shop_list: Optional[List[Dict[str, Any]]], shop_name: str): - for shop in shop_list or []: - if shop.get("browserName") == shop_name: - return shop.get("browserOauth") - return None - - def _is_client_ready(self) -> bool: - try: - requests.get(self.client_url, timeout=PORT_CHECK_TIMEOUT) - return True - except (requests.exceptions.ConnectionError, requests.exceptions.Timeout): - return False - - def _wait_until_client_ready(self, timeout: float) -> bool: - start_check_time = time.time() - while time.time() - start_check_time < timeout: - if self._is_client_ready(): - return True - time.sleep(CLIENT_READY_INTERVAL) - return False - - @staticmethod - def _redact_ziniao_log_line(line: str) -> str: - return re.sub(r'("password"\s*:\s*)"[^"]*"', r'\1"***"', line) - - @staticmethod - def _ziniao_webdriver_log_path() -> Optional[str]: - appdata = os.getenv("APPDATA") - if not appdata: - return None - filename = f"webdriver.{time.strftime('%Y%m%d')}.log" - return os.path.join( - appdata, - "ziniaobrowser", - "instances", - "userdata1", - "logs", - "client", - filename, - ) - - def _log_ziniao_webdriver_tail(self) -> None: - log_path = self._ziniao_webdriver_log_path() - if not log_path: - logger.warning("无法读取紫鸟 webdriver 日志: APPDATA 环境变量为空") - return - if not os.path.exists(log_path): - logger.warning("紫鸟 webdriver 日志不存在:{}", log_path) - return - - try: - with open(log_path, "r", encoding="utf-8", errors="replace") as log_file: - lines = log_file.readlines() - except OSError as exc: - logger.warning("读取紫鸟 webdriver 日志失败:{} | {}", log_path, exc) - return - - tail_lines = lines[-ZINIAO_WEBDRIVER_LOG_TAIL_LINES:] - tail_text = "".join(self._redact_ziniao_log_line(line) for line in tail_lines).strip() - if tail_text: - logger.error("紫鸟 webdriver 日志尾部({}):\n{}", log_path, tail_text) - else: - logger.warning("紫鸟 webdriver 日志为空:{}", log_path) - - def get_zinaio_exe(self, protocol_name: str = "superbrowser"): - """从 Windows 注册表读取紫鸟客户端可执行文件路径. - - Args: - protocol_name: 注册表协议名称. - - Returns: - 紫鸟浏览器可执行文件路径. 未找到时返回 None. - """ - if winreg is None: - logger.error("当前系统不支持 winreg,无法从注册表获取紫鸟客户端路径") - return None - - key_path = rf"SOFTWARE\Classes\{protocol_name}\shell\open\command" - for root_key, root_name in ( - (winreg.HKEY_CURRENT_USER, "HKEY_CURRENT_USER"), - (winreg.HKEY_LOCAL_MACHINE, "HKEY_LOCAL_MACHINE"), - ): - try: - logger.info("正在从注册表读取紫鸟客户端路径:{}\\{}", root_name, key_path) - key = winreg.OpenKey(root_key, key_path) - command, _ = winreg.QueryValueEx(key, "") - winreg.CloseKey(key) - if isinstance(command, str): - sub = "ziniao.exe" - exe_path = command[0 : command.find(sub) + len(sub) + 1] - else: - exe_path = command[0] - logger.info("已获取紫鸟客户端路径:{}", exe_path) - return exe_path - except FileNotFoundError: - logger.warning("注册表中未找到紫鸟客户端路径:{}\\{}", root_name, key_path) - - logger.error("未能获取紫鸟客户端路径,protocol_name={}", protocol_name) - return None - - def update_core(self): - """更新紫鸟浏览器内核. - - 打开店铺前调用,要求客户端版本 5.285.7 以上. 接口可能因 HTTP 超时 - 返回未完成状态,因此会循环调用直到成功或判定客户端不支持. - """ - payload = self._build_payload("updateCore") - - logger.info("开始更新紫鸟浏览器内核") - while True: - result = self._post_client(payload) - logger.info("更新内核返回:{}", result) - if self._handle_update_core_result(result): - return - if result is None: - continue - - logger.info("等待更新内核完成:{}", self._result_text(result)) - time.sleep(UPDATE_CORE_RETRY_DELAY) - - def _handle_update_core_result(self, result: Optional[Dict[str, Any]]) -> bool: - if result is None: - logger.info("等待客户端启动后继续更新内核") - time.sleep(UPDATE_CORE_RETRY_DELAY) - return False - - status_code = self._status_code(result) - if status_code is None or status_code == STATUS_LOGIN_FAILED: - logger.error("当前紫鸟客户端版本不支持更新内核接口,请升级客户端") - return True - if status_code == STATUS_OK: - logger.info("紫鸟浏览器内核更新完成") - return True - return False - - def kill_process(self, version: Literal["v5", "v6"]): - """结束指定版本的紫鸟客户端进程. - - Args: - version: 客户端主版本. - """ - if version == "v5": - process_name = "SuperBrowser.exe" - logger.info("准备结束紫鸟 v5 starter.exe") - self._kill_process_by_name("starter.exe") - else: - process_name = "ziniao.exe" - - logger.info("准备结束紫鸟客户端进程:{}", process_name) - self._kill_process_by_name(process_name) - time.sleep(PROCESS_KILL_DELAY) - - def _kill_process_by_name(self, process_name: str) -> None: - result = subprocess.run( - ["taskkill", "/f", "/t", "/im", process_name], - capture_output=True, - text=True, - encoding="utf-8", - errors="ignore", - check=False, - ) - output = (result.stdout or result.stderr or "").strip() - if result.returncode == 0: - if output: - logger.info("结束进程返回:{}", output) - return - - if "没有找到进程" in output or "not found" in output.lower(): - logger.info("进程未运行,跳过结束:{}", process_name) - return - - logger.warning("结束进程失败:{} | {}", process_name, output or f"returncode={result.returncode}") - - def get_browser_list(self) -> Optional[list[Dict[str, Any]]]: - """获取紫鸟浏览器店铺列表. - - Returns: - 浏览器店铺列表.登录失败或请求失败时返回 None. - """ - payload = self._build_payload("getBrowserList") - request_id = payload["requestId"] - - logger.info("开始获取紫鸟浏览器列表,requestId={}", request_id) - result = self._post_client(payload) - status_code = self._status_code(result) - if status_code == STATUS_OK: - browser_list = result.get("browserList") - logger.info("获取紫鸟浏览器列表成功,数量={}", len(browser_list or [])) - return browser_list - if status_code == STATUS_LOGIN_FAILED: - logger.error("获取紫鸟浏览器列表登录失败:{}", self._result_text(result)) - return None - - logger.error("获取紫鸟浏览器列表失败:{}", self._result_text(result)) - return None - - def open_store( - self, - store_info, - isWebDriverReadOnlyMode=0, - isprivacy=0, - isHeadless=0, - cookieTypeSave=0, - jsInfo="", - ): - """启动紫鸟店铺浏览器. - - Args: - store_info: 店铺 browserId 或 browserOauth. - isWebDriverReadOnlyMode: WebDriver 只读模式开关. - isprivacy: 隐私模式开关. - isHeadless: 无头模式开关. - cookieTypeSave: Cookie 保存类型. - jsInfo: 注入的 JS 信息. - - Returns: - 紫鸟客户端返回的启动结果. - """ - payload = self._build_start_browser_payload( - store_info=store_info, - is_web_driver_read_only_mode=isWebDriverReadOnlyMode, - is_privacy=isprivacy, - is_headless=isHeadless, - cookie_type_save=cookieTypeSave, - js_info=jsInfo, - ) - request_id = payload["requestId"] - - logger.info("开始打开紫鸟店铺,store_info={},requestId={}", store_info, request_id) - result = self._post_client(payload) - status_code = self._status_code(result) - if status_code == STATUS_OK: - logger.info("紫鸟店铺打开成功,debuggingPort={}", result.get("debuggingPort")) - return result - if status_code == STATUS_LOGIN_FAILED: - logger.error("打开紫鸟店铺登录失败:{}", self._result_text(result)) - raise RuntimeError(f"[open_store]登录失败 {self._result_text(result)}") - - logger.error("打开紫鸟店铺失败:{}", self._result_text(result)) - raise RuntimeError(f"[open_store]失败 {self._result_text(result)} ") - - def _build_start_browser_payload( - self, - *, - store_info, - is_web_driver_read_only_mode=0, - is_privacy=0, - is_headless=0, - cookie_type_save=0, - js_info="", - ) -> Dict[str, Any]: - payload = self._build_payload( - "startBrowser", - { - "isWaitPluginUpdate": 0, - "isHeadless": is_headless, - "isWebDriverReadOnlyMode": is_web_driver_read_only_mode, - "cookieTypeLoad": 0, - "cookieTypeSave": cookie_type_save, - "runMode": "1", - "isLoadUserPlugin": True, - "pluginIdType": 1, - "privacyMode": is_privacy, - }, - ) - - if store_info.isdigit(): - payload["browserId"] = store_info - else: - payload["browserOauth"] = store_info - - if len(str(js_info)) > 2: - payload["injectJsInfo"] = json.dumps(js_info) - - return payload - - def get_browser(self, port) -> Chromium: - """连接 DrissionPage 浏览器实例. - - Args: - port: Chromium 调试端口. - - Returns: - DrissionPage Chromium 实例. - """ - logger.info("开始连接 DrissionPage 浏览器,port={}", port) - browser = Chromium(port) - logger.info("DrissionPage 浏览器连接完成,port={}", port) - return browser - - def start_client(self): - """启动紫鸟客户端并更新浏览器内核.""" - if self._is_client_ready(): - logger.info("端口 {} 已启动,跳过启动紫鸟客户端", self.socket_port) - return - - logger.info("端口 {} 未启动,开始启动紫鸟客户端", self.socket_port) - self.kill_process("v6") - time.sleep(CLIENT_RESTART_DELAY) - client_path = self.get_zinaio_exe("superbrowserv6") - if not client_path: - raise RuntimeError("未找到紫鸟客户端路径,无法启动客户端") - - self.client_path = client_path.strip('"') - cmd = [ - self.client_path, - "--run_type=web_driver", - "--ipc_type=http", - "--port=" + str(self.socket_port), - ] - logger.info("紫鸟客户端启动命令:{}", " ".join(cmd)) - - for retry_count in range(CLIENT_START_RETRIES): - logger.info("第 {}/{} 次尝试启动紫鸟客户端", retry_count + 1, CLIENT_START_RETRIES) - process = subprocess.Popen(cmd) - - if self._wait_until_client_ready(CLIENT_READY_TIMEOUT): - logger.info("紫鸟客户端启动成功,第 {} 次尝试", retry_count + 1) - time.sleep(CLIENT_POST_START_DELAY) - self.update_core() - return - - logger.warning("第 {} 次尝试启动失败,10秒内未检测到客户端启动", retry_count + 1) - if process.poll() is not None: - logger.warning("紫鸟客户端进程已退出,returncode={}", process.returncode) - self._log_ziniao_webdriver_tail() - - logger.error("紫鸟客户端启动失败,已重试 {} 次", CLIENT_START_RETRIES) - raise RuntimeError(f"客户端启动失败:重试 {CLIENT_START_RETRIES} 次后仍未成功启动") - - def open_shop(self, shop_name: str): - """打开指定店铺并完成 IP 检测. - - Args: - shop_name: 店铺名称. - - Returns: - 成功时返回浏览器实例.店铺不存在时返回错误信息. - """ - logger.info("开始打开店铺:{}", shop_name) - self.start_client() - - self.store_id = self._find_store_oauth(self.get_browser_list(), shop_name) - if not self.store_id: - logger.warning("店铺不存在:{}", shop_name) - return "店铺不存在" - - ret_json = self.open_store(self.store_id) - self.store_id = ret_json.get("browserOauth") - if self.store_id is None: - self.store_id = ret_json.get("browserId") - - self.browser = self.get_browser(ret_json.get("debuggingPort")) - ip_check_url = ret_json.get("ipDetectionPage") - if not ip_check_url: - logger.error("ip检测页地址为空,准备关闭店铺:{}", shop_name) - self.close_store(self.store_id) - raise RuntimeError("没有IP检测地址,为了店铺安全不打开店铺") - - if self.open_ip_check(self.browser, ip_check_url): - logger.info("IP检测通过,打开店铺平台主页:{}", shop_name) - self.open_launcher_page(ret_json.get("launcherPage"), self.browser) - return self.browser - - logger.error("IP检测不通过,停止打开店铺:{}", shop_name) - raise RuntimeError("IP检测不通过,可能是因为网络环境变化导致的,为了店铺安全不打开店铺") - - def close_store(self, browser_oauth=None): - """关闭紫鸟店铺浏览器. - - Args: - browser_oauth: 店铺 OAuth 标识. 未提供时使用当前打开的店铺. - - Returns: - 紫鸟客户端返回的关闭结果. - """ - if browser_oauth is None: - browser_oauth = self.store_id - - payload = self._build_payload( - "stopBrowser", - { - "duplicate": 0, - "browserOauth": browser_oauth, - }, - ) - request_id = payload["requestId"] - - logger.info("开始关闭紫鸟店铺,browserOauth={},requestId={}", browser_oauth, request_id) - result = self._post_client(payload) - status_code = self._status_code(result) - if status_code == STATUS_OK: - logger.info("紫鸟店铺关闭成功,browserOauth={}", browser_oauth) - return result - if status_code == STATUS_LOGIN_FAILED: - logger.error("关闭紫鸟店铺登录失败:{}", self._result_text(result)) - raise RuntimeError(f"【close_store】登录失败 {self._result_text(result)}") - - logger.error("关闭紫鸟店铺失败:{}", self._result_text(result)) - raise RuntimeError(f"[close_store]失败: {self._result_text(result)} ") - - def open_launcher_page(self, launcher_page: str, browser: Chromium = None): - """打开店铺平台启动页. - - Args: - launcher_page: 要打开的启动页 URL. - browser: 浏览器实例. 未提供时使用当前浏览器实例. - """ - if browser is None: - browser = self.browser - - logger.info("打开店铺平台启动页:{}", launcher_page) - tab = browser.new_tab(url=launcher_page) - self.tab = tab - return tab - - def open_ip_check(self, browser: Chromium, ip_check_url: str): - """打开 IP 检测页并判断网络环境是否通过. - - Args: - browser: DrissionPage 浏览器会话. - ip_check_url: IP 检测页地址. - - Returns: - IP 检测通过时返回 True,否则返回 False. - """ - try: - logger.info("开始打开IP检测页:{}", ip_check_url) - tab = browser.latest_tab - tab.get(ip_check_url) - success_button = tab.ele( - (By.XPATH, '//button[contains(@class, "styles_btn--success")]'), - timeout=IP_CHECK_TIMEOUT, - ) - if success_button: - logger.info("IP检测成功") - return True - - logger.warning("IP检测超时或未找到成功按钮") - return False - except Exception: - logger.exception("IP检测异常") - return False - - -class AmamzonBase(ZiniaoDriver): - """亚马逊页面操作基类.""" - - def switch_to_country(self, country_name: str): - """切换亚马逊账号国家并验证结果. - - 流程包括读取当前国家,打开国家下拉框,选择目标国家并等待页面加载. - - Args: - country_name: 目标国家名称. - - Returns: - 切换成功返回 True,否则返回 False. - """ - try: - if self.browser is None: - logger.warning("浏览器实例不存在,请先打开店铺") - return False - - self.tab.wait.doc_loaded(timeout=COUNTRY_INITIAL_LOAD_TIMEOUT, raise_err=False) - current_country = self._get_current_country(timeout=COUNTRY_LOOKUP_TIMEOUT) - if current_country is None: - logger.warning("无法获取当前国家信息") - return False - if current_country == country_name: - logger.info("当前已经是目标国家 {},无需切换", country_name) - return True - - if not self._open_country_dropdown(): - return False - if not self._select_country(country_name): - return False - - logger.info("等待国家切换后页面加载") - self.tab.wait.doc_loaded() - return self._verify_country(country_name) - - except Exception: - logger.exception("切换国家时发生异常") - return False - - def _get_current_country(self, *, timeout: int) -> Optional[str]: - logger.info("正在检查当前国家") - current_country_ele = self.tab.ele(COUNTRY_LABEL_XPATH, timeout=timeout) - if not current_country_ele: - return None - - current_country = current_country_ele.text.strip() - logger.info("当前国家:{}", current_country) - return current_country - - def _open_country_dropdown(self) -> bool: - logger.info("正在打开国家切换下拉框") - dropdown_header = self.tab.ele(COUNTRY_DROPDOWN_XPATH, timeout=COUNTRY_CLICK_TIMEOUT) - if not dropdown_header: - logger.warning("找不到国家切换下拉框") - return False - - logger.info("正在展开国家列表") - first_item = self._wait_country_list_item(dropdown_header) - if first_item is None: - logger.warning("找不到国家列表项") - return False - - first_item.click() - time.sleep(COUNTRY_DROPDOWN_DELAY) - return True - - def _wait_country_list_item(self, dropdown_header): - deadline = time.time() + COUNTRY_DROPDOWN_READY_TIMEOUT - attempt = 0 - while time.time() < deadline: - attempt += 1 - try: - dropdown_header.click() - except Exception as exc: - logger.info("点击国家切换下拉框失败, attempt={}, error={}", attempt, exc) - - time.sleep(COUNTRY_DROPDOWN_DELAY) - first_item = self.tab.ele(COUNTRY_LIST_ITEM_XPATH, timeout=COUNTRY_DROPDOWN_RETRY_INTERVAL) - if first_item: - return first_item - - self.tab.wait.doc_loaded(timeout=COUNTRY_CLICK_TIMEOUT, raise_err=False) - time.sleep(COUNTRY_DROPDOWN_RETRY_INTERVAL) - return None - - def _select_country(self, country_name: str) -> bool: - logger.info("正在切换到国家:{}", country_name) - target_country = self.tab.ele(self._country_option_xpath(country_name), timeout=COUNTRY_CLICK_TIMEOUT) - if not target_country: - logger.warning("找不到目标国家:{}", country_name) - return False - target_country.click() - return True - - @staticmethod - def _country_option_xpath(country_name: str) -> str: - return ( - "xpath://div[@class=" - '"dropdown-account-switcher-list-item dropdown-account-switcher-list-item-indented" ' - f'and @title="{country_name}"]' - ) - - def _verify_country(self, country_name: str) -> bool: - new_country = self._get_current_country(timeout=COUNTRY_CLICK_TIMEOUT) - if new_country is None: - logger.warning("无法验证国家切换结果") - return False - if new_country == country_name: - logger.info("国家切换成功:{}", new_country) - return True - - logger.warning("国家切换失败,当前国家:{},目标国家:{}", new_country, country_name) - return False - - def need_login(self): - """判断当前页面是否需要登录.""" - time.sleep(NEED_LOGIN_DELAY) - self.tab.wait.doc_loaded(timeout=DOC_LOAD_TIMEOUT, raise_err=False) - need_login_ele = self.tab.eles(NEED_LOGIN_XPATH, timeout=NEED_LOGIN_TIMEOUT) - if len(need_login_ele) > 0: - logger.info("检测到需要登录元素") - return True - logger.info("未检测到登录元素") - return False - - def login(self, password, username=""): - """登录当前页面,必要时等待并提交一次性验证码. - - Args: - password: 登录密码. - username: 兼容保留参数,当前未使用. - - Returns: - 登录成功返回 True,失败返回 False. - """ - try: - self.tab.wait.doc_loaded(timeout=DOC_LOAD_TIMEOUT, raise_err=False) - for _ in range(LOGIN_ATTEMPTS): - self._submit_password_if_present(password) - self.tab.wait.doc_loaded(timeout=DOC_LOAD_TIMEOUT, raise_err=False) - - if self._send_otp_if_present(): - continue - if self._submit_ready_otp(): - return True - - self._click_final_login_submit_if_present() - except Exception: - logger.exception("登录过程中发生异常") - return False - - def _submit_password_if_present(self, password) -> None: - pwd_input = self.tab.eles(PASSWORD_INPUT_XPATH, timeout=PASSWORD_INPUT_TIMEOUT) - if len(pwd_input) > 0: - logger.info("检测到密码输入框,准备输入密码") - pwd_input[0].input(password, clear=True) - - submit_btn = self.tab.eles(PASSWORD_SUBMIT_XPATH, timeout=PASSWORD_SUBMIT_TIMEOUT) - if len(submit_btn) > 0: - logger.info("点击登录提交按钮") - submit_btn[0].click() - - def _send_otp_if_present(self) -> bool: - send_code = self.tab.eles(OTP_SEND_XPATH, timeout=OTP_SEND_TIMEOUT) - logger.info("发送一次性密码元素数量:{}", len(send_code)) - if len(send_code) == 0: - return False - - logger.info("检测到发送一次性密码按钮,准备点击") - send_code[0].click() - time.sleep(OTP_SEND_DELAY) - self.tab.wait.doc_loaded(timeout=DOC_LOAD_TIMEOUT, raise_err=False) - return True - - def _submit_ready_otp(self) -> bool: - for _ in range(OTP_INPUT_LOOKUP_ATTEMPTS): - otp_input = self._find_otp_input() - if otp_input is None: - return False - if self._wait_for_otp_value(otp_input) and self._submit_otp_if_ready(): - return True - return False - - def _find_otp_input(self): - otp_code_input = self.tab.eles(OTP_INPUT_XPATH, timeout=OTP_INPUT_TIMEOUT) - logger.info("验证码输入框数量:{}", len(otp_code_input)) - if len(otp_code_input) == 0: - return None - - otp_code_input[0].wait.displayed(timeout=OTP_INPUT_DISPLAY_TIMEOUT, raise_err=False) - return otp_code_input[0] - - @staticmethod - def _has_otp_value(otp_input) -> bool: - return otp_input.value is not None and otp_input.value.strip() != "" - - def _wait_for_otp_value(self, otp_input) -> bool: - for _ in range(OTP_CODE_WAIT_SECONDS): - if self._has_otp_value(otp_input): - logger.info("检测到验证码输入完成") - return True - time.sleep(1) - return False - - def _submit_otp_if_ready(self) -> bool: - submit_btn = self.tab.eles(OTP_SUBMIT_XPATH, timeout=OTP_SUBMIT_TIMEOUT) - if len(submit_btn) == 0: - return False - - submit_btn[0].click() - self.tab.wait.doc_loaded(timeout=OTP_RESULT_LOAD_TIMEOUT, raise_err=False) - error_mes = self.tab.eles(OTP_ERROR_XPATH, timeout=OTP_ERROR_TIMEOUT) - if len(error_mes) > 0: - logger.warning("验证码输入错误:{}", error_mes[0].text) - self.tab.refresh() - return False - - logger.info("登录成功") - return True - - def _click_final_login_submit_if_present(self) -> None: - submit_btn = self.tab.eles(OTP_SUBMIT_XPATH, timeout=LOGIN_FINAL_SUBMIT_TIMEOUT) - if len(submit_btn) > 0: - logger.info("点击二次登录提交按钮") - submit_btn[0].click() - diff --git a/app/amazon/chrome_base.py b/app/amazon/chrome_base.py deleted file mode 100644 index 84b39f8..0000000 --- a/app/amazon/chrome_base.py +++ /dev/null @@ -1,206 +0,0 @@ -import json -import sys -import os -import io - -import time -import traceback -from datetime import datetime -from DrissionPage import Chromium, ChromiumOptions -from collections import defaultdict - -from config import base_dir,debug -from amazon.tool import get_shop_info,show_notification - - - -class ChromeAmzoneBase: - mark_name = "谷歌浏览器基类" - - country_info = { - "英国": { - "url": "https://www.amazon.co.uk/dp/B0CJ8SNXXV", - "zip_code": "SW1A 1AA", - "mark": "SW1A 1" - }, - "德国": { - "url": "https://www.amazon.de/dp/B0CC8CW9G2?th=1", - "zip_code": "10115" - }, - "法国": { - "url": "https://www.amazon.fr/dp/B0FRG1MJ8H?th=1", - "zip_code": "75001" - }, - "西班牙": { - "url": "https://www.amazon.es/dp/B08ZXVNYNN", - "zip_code": "28001" - }, - "意大利": { - "url": "https://www.amazon.it/dp/B0D1P17T2Q", - "zip_code": "20121" - } - } - - def __init__(self): - """ - 杀死当前谷歌浏览器进程,并使用 drissionpage 启动谷歌浏览器,使用系统安装的浏览器默认用户文件夹 - """ - print("正在关闭现有的chromium浏览器进程...") - if not debug: - os.system('taskkill /f /t /im chrome.exe') - time.sleep(2) - - print("正在启动chromium浏览器...") - # 配置浏览器选项 - co = ChromiumOptions() - co.no_imgs(True) - user_data_path = os.path.join(base_dir, "user_data", "chrome_data") - if not os.path.exists(user_data_path): - os.makedirs(user_data_path, exist_ok=True) - co.set_user_data_path(user_data_path) - co.set_local_port(port=19897) - self.browser = Chromium(co) - self.tab = self.browser.latest_tab - print("Chrome浏览器启动成功") - - def log(self, message: str, level: str = "INFO"): - """日志输出 - Args: - message: 日志消息 - level: 日志级别 - """ - try: - timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - # if level == "ERROR": - # show_notification(message, "error") - print(f"[{timestamp}] [{self.mark_name}] [{level}] {message}") - except Exception as e: - print(f"输出出错,{e}") - - def close_init_popup(self): - """ - 关闭所有的初始化弹窗 - """ - self.tab.wait.doc_loaded(timeout=60, raise_err=True) - continue_shipping = self.tab.eles('xpath://button[@alt="Continue shopping"]',timeout=3) - if len(continue_shipping) > 0: - continue_shipping[0].click() - time.sleep(0.5) - self.tab.wait.doc_loaded(timeout=60, raise_err=True) - footbar = self.tab.eles('xpath://footer[@class="el-dialog__footer"]', timeout=5) - if len(footbar) > 0: - do_not_remind = footbar[0].eles('xpath:.//input[@class="el-checkbox__original"]') - if len(do_not_remind) > 0: - do_not_remind[0].check() - resume_immediately = footbar[0].eles('xpath:.//button') - if len(resume_immediately) > 0: - resume_immediately[0].click() - - self.tab.wait.doc_loaded(timeout=60, raise_err=True) - accept_btn = self.tab.eles('xpath://input[@id="sp-cc-accept"]', timeout=5) - if len(accept_btn) > 0: - accept_btn[0].click() - - def _set_zip_code(self, zip_code, mark=None): - """ - 设置邮编 - - Args: - zip_code: 目标邮编 - """ - try: - # 检查当前邮编 - zip_display = self.tab.ele('xpath://div[@id="glow-ingress-block"]', timeout=10) - - if zip_display: - current_text = zip_display.text - # print(f"当前地址信息: {current_text}") - # 先检查标识 - if mark is not None and mark in current_text: - self.log(f"邮编检测到标识: {mark},无需修改") - return True - # 检查是否已经包含目标邮编 - if zip_code in current_text: - self.log(f"邮编已经设置为: {zip_code},无需修改") - return True - - # 需要设置邮编 - self.log(f"正在设置邮编为: {zip_code}") - - # 点击地址选择按钮 - location_link = self.tab.ele('xpath://a[@id="nav-global-location-popover-link"]', timeout=10) - if not location_link: - self.log("找不到地址设置按钮") - return False - - location_link.click() - time.sleep(1) - - # 等待邮编输入框出现 - zip_input = self.tab.ele('xpath://input[@id="GLUXZipUpdateInput"]', timeout=10) - if not zip_input: - print("找不到邮编输入框") - return False - - # 输入邮编 - zip_input.input(zip_code, clear=True) - time.sleep(0.5) - - # 点击提交按钮 - submit_btn = self.tab.ele('xpath://input[@aria-labelledby="GLUXZipUpdate-announce"]', timeout=10) - if not submit_btn: - print("找不到提交按钮") - return False - - submit_btn.click() - - continue_btn = self.tab.eles('xpath://div[@class="a-popover-footer"]//input[@id="GLUXConfirmClose"]', - timeout=10) - if len(continue_btn) > 0: - continue_btn[0].click() - - # 等待提交按钮消失(表示请求已发送) - print("等待邮编更新...") - time.sleep(2) - - # 等待页面加载完成 - self.tab.wait.doc_loaded(timeout=30, raise_err=False) - time.sleep(2) - - # 验证邮编是否设置成功 - zip_display_after = self.tab.ele('xpath://div[@id="glow-ingress-block"]', timeout=10) - if zip_display_after: - updated_text = zip_display_after.text - # print(f"更新后的地址信息: {updated_text}") - - if zip_code in updated_text: - print(f"邮编设置成功: {zip_code}") - return True - else: - # print(f"邮编设置可能失败,当前显示: {updated_text}") - return False - - return True - - except Exception as e: - print(f"设置邮编时出错: {traceback.format_exc()}") - return False - - def close(self): - """关闭浏览器""" - try: - if self.browser: - self.browser.quit() - print("浏览器已关闭") - except Exception as e: - print(f"关闭浏览器时出错: {str(e)}") - - - - - - - - - - diff --git a/app/amazon/del_brand.py b/app/amazon/del_brand.py deleted file mode 100644 index 628c19a..0000000 --- a/app/amazon/del_brand.py +++ /dev/null @@ -1,551 +0,0 @@ -import traceback -import winreg -import subprocess -import time -import uuid -import requests -import json -import os -from datetime import datetime - -from amazon.amazon_base import AmamzonBase,kill_process,TaskBase -from amazon.tool import show_notification,get_shop_info - - -from config import runing_task,runing_shop,DELETE_BRAND_API_BASE - - -class AmazoneDriver(AmamzonBase): - """亚马逊专用驱动类,继承自ZiniaoDriver""" - mark_name = "删除品牌" - - def SwitchPage(self): - """ - 切换至 管理所有库存页面 - 1、等待 //navigation-favorites-bar[@class="hydrated"] 出现 - """ - navigation = self.tab.ele('xpath://navigation-favorites-bar[@class="hydrated"]') - navigation.wait.displayed(raise_err=False) - page_btn = navigation.sr('xpath://internal-fav-bar-links[@data-internal="navigation"]').sr( - 'xpath://a[@data-page-id="ezdpc-gui-inventory-mons"]') - page_btn.wait.displayed(raise_err=False) - page_btn.click(timeout=5) - - self.tab.wait.doc_loaded() - # 等待搜索框出现 - search_region = self.tab.ele('xpath://div[@id="searchBoxContainer"]//kat-input-group') - search_region.wait.displayed(raise_err=False) - - def search(self, asin): - search_region = self.tab.ele('xpath://div[@id="searchBoxContainer"]//kat-input-group') - search_region.wait.displayed(raise_err=False) - time.sleep(0.6) - search_input = self.tab.ele("xpath://kat-input[contains(@class,'SearchBox-module__searchInput')]").sr( - 'xpath://span[@class="container"]//input[@part="input"]') - search_input.input(asin,clear=True) - sku_ls = [] - for _ in range(3): - search_btn = self.tab.ele("xpath://kat-icon[@name='search']") - search_btn.click() - - load_ele = self.tab.ele("xpath://div[contains(@class,'Loader-module__loader')]") - # load_ele.wait.hidden(timeout=3, raise_err=False) - load_ele.wait.deleted(timeout=3, raise_err=False) - time.sleep(0.5) - - sku_ls = self.tab.eles("xpath://div[@data-sku]",timeout=3) - if len(sku_ls) > 0: - break - return sku_ls - - def del_action(self, sku_ele): - dropdown = sku_ele.ele('xpath:.//kat-dropdown-button[@variant="secondary"]') - dropdown.click() - time.sleep(1) - - del_btn = dropdown.sr("xpath:.//button[@role='menuitem' and @data-action='DeleteListing']") - del_btn.wait.displayed(raise_err=False) - del_btn.click() - - confirm_btn = self.tab.ele('xpath://kat-modal[@data-testid="action-modal"]//kat-button[@variant="primary"]') - confirm_btn.wait.displayed(raise_err=False) - confirm_btn.wait.enabled() - confirm_btn.click() - - suc_alert = self.tab.ele("xpath://kat-alert[@variant='success']") - suc = suc_alert.wait.displayed(raise_err=False, timeout=5) - return suc - - -class DelbramdTask(TaskBase): - task_name = "删除品牌-TASK" - - def update_task_status(self, task_id: int, **kwargs): - """更新任务状态 - - Args: - task_id: 任务ID - **kwargs: 要更新的字段 - """ - if task_id not in runing_task: - runing_task[task_id] = {} - runing_task[task_id].update(kwargs) - - def process_task(self,task_data): - try: - data = task_data.get("data", {}) - task_id = data.get("taskId") - items = data.get("items", []) - - if not task_id: - self.log("任务ID为空,跳过", "WARNING") - return - - # 初始化任务状态 - self.update_task_status( - task_id, - status="running", - start_time=datetime.now().strftime("%Y-%m-%d %H:%M:%S"), - total_shops=len(items), - processed_shops=0, - total_asins=sum(shop.get("totalRows", 0) for shop in items), - processed_asins=0, - success_count=0, - failed_count=0, - stop_requested=False # 暂停请求标志 - ) - - self.log(f"开始处理任务 {task_id},共 {len(items)} 个店铺") - - # 遍历处理每个店铺 - for idx, shop_data in enumerate(items, 1): - shop_name = shop_data.get("shopName", "未知店铺") - self.log(f"[{idx}/{len(items)}] 开始处理店铺: {shop_name}") - - try: - self.process_shop(shop_data, task_id) - # 更新已处理店铺数 - if task_id in runing_task: - runing_task[task_id]["processed_shops"] += 1 - except Exception as e: - self.log(f"处理店铺 {shop_name} 失败: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - - # 检查任务最终状态 - if task_id in runing_task and runing_task[task_id].get("stop_requested", False): - self.update_task_status(task_id, status="stopped") - self.log(f"任务 {task_id} 已被暂停!") - else: - self.update_task_status(task_id, status="completed") - self.log(f"任务 {task_id} 处理完成!") - - except Exception as e: - self.log(f"任务处理失败: {traceback.format_exc()}", "ERROR") - if task_id: - self.update_task_status(task_id, status="failed", error=str(e)) - - def process_shop(self, shop_data, task_id): - """处理单个店铺(包含重试逻辑) - Args: - shop_data: 店铺数据 - task_id: 任务ID - """ - shop_name = shop_data.get("shopName", "未知店铺") - result_id = shop_data.get("resultId") - countries = shop_data.get("countries", []) - company_name = shop_data.get("companyName", "未知公司") - - if not countries: - self.log(f"店铺 {shop_name} 没有国家数据,跳过", "WARNING") - return - - # 更新当前处理的店铺 - self.update_task_status(task_id, current_shop=shop_name) - - # 将店铺添加到正在执行中的店铺列表 - start_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - runing_shop[shop_name] = start_time - self.log(f"账号:{company_name},店铺 {shop_name} 已添加到执行列表,开始时间: {start_time}") - - # 店铺打开重试最多3次 - max_retries = 5 - iskill = False - - - # 处理每个国家 - chunk_index = 1 - for country_data in countries: - self.log(f"开始处理国家:{country_data}") - # 检查是否收到暂停请求 - if task_id in runing_task and runing_task[task_id].get("stop_requested", False): - self.log(f"检测到任务 {task_id} 的暂停请求,停止处理国家", "WARNING") - break # 跳出循环,进入finally关闭店铺 - - # 打开店铺 - driver = self.open_shop(AmazoneDriver,max_retries=max_retries, company_name=company_name, - shop_name=shop_name, iskill=iskill) - - # 检查是否成功打开 - if not driver: - self.log(f"店铺 {shop_name} 打开失败,已重试 {max_retries} 次,跳过该店铺", "ERROR") - return - - try: - chunk_index = self.process_country(driver, country_data, task_id, result_id, shop_data, chunk_index) - except Exception as e: - country_name = country_data.get("country", "未知") - self.log(f"处理国家 {country_name} 失败: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - self.log(traceback.format_exc(), "ERROR") - if "与页面的连接已断开" in str(e): - iskill = True - - try: - driver.close_store() - except Exception as e: - iskill = True - self.log(f"关闭国家失败,{e}") - - # 从正在执行中的店铺列表中移除 - if shop_name in runing_shop: - del runing_shop[shop_name] - self.log(f"店铺 {shop_name} 已从执行列表中移除") - - def process_country(self, driver: AmazoneDriver, country_data, task_id: int, - result_id: int, shop_data, chunk_index: int): - """处理单个国家的所有ASIN - - Args: - driver: 亚马逊驱动实例 - country_data: 国家数据 - task_id: 任务ID - result_id: 结果ID - shop_data: 店铺数据 - """ - country = country_data.get("country", "未知") - items = country_data.get("items", []) - shop_name = shop_data.get("shopName", "未知店铺") - - - self.log(f"开始处理国家: {country},共 {len(items)} 个ASIN") - self.update_task_status(task_id, current_country=country) - - max_retries = 5 - switch_success, switch_success_pg, search_success, sku_ls = self.action_init(driver, country, shop_name, - None) - # 如果切换失败,直接返回 - if not switch_success or not switch_success_pg or not search_success: - error_message = f"切换到国家({switch_success})/库存页面({switch_success_pg})/搜索筛选到指定选项({search_success}) {country} 失败,已重试 {max_retries} 次,跳过该国家" - self.log(error_message, "ERROR") - if task_id in runing_task: - runing_task[task_id]["processed_countries"] += 1 - return chunk_index - - # 处理每个ASIN - file_key = shop_data.get("fileKey", "") - source_filename = shop_data.get("sourceFilename", "") - total_rows = shop_data.get("totalRows", 0) - - for idx, asin_item in enumerate(items, 1): - # 检查是否收到暂停请求 - if task_id in runing_task and runing_task[task_id].get("stop_requested", False): - self.log(f"检测到任务 {task_id} 的暂停请求,停止处理", "WARNING") - return # 返回到上层,会触发店铺关闭 - - try: - self.log(f"[{idx}/{len(items)}] 处理ASIN: {asin_item.get('asin', '')}") - self.process_asin(driver, asin_item, country, task_id, result_id, - file_key, source_filename, total_rows, chunk_index) - except Exception as e: - asin = asin_item.get("asin", "未知") - self.log(f"处理ASIN {asin} 失败: {str(e)}", "ERROR") - # 继续处理下一个ASIN - chunk_index += 1 - - return chunk_index - - def process_asin(self, driver: AmazoneDriver, asin_item, - country: str, task_id: int, result_id: int, file_key: str, - source_filename: str, total_rows: int, chunk_index: int): - """处理单个ASIN并回传结果 - - Args: - driver: 亚马逊驱动实例 - asin_item: ASIN数据项 - country: 国家名称 - task_id: 任务ID - result_id: 结果ID - file_key: 文件KEY - source_filename: 源文件名 - total_rows: 总行数 - chunk_index: 当前处理索引 - """ - asin = asin_item.get("asin", "") - row_index = asin_item.get("rowIndex", 0) - - # 更新当前处理的ASIN - self.update_task_status(task_id, current_asin=asin) - - status = "失败" - max_retries = 3 # 最多重试3次 - - for retry in range(max_retries): - try: - self.log(f"处理ASIN {asin} (第 {retry + 1}/{max_retries} 次)") - - # 如果不是第一次尝试,先刷新页面 - if retry > 0: - self.log("重试前刷新页面...") - try: - driver.tab.refresh() - time.sleep(3) - except Exception as e: - self.log(f"刷新页面失败: {str(e)}", "WARNING") - - # 搜索ASIN - sku_ls = driver.search(asin=asin) - self.log(f"搜索到 {len(sku_ls)} 个SKU") - - if len(sku_ls) == 0: - status = "查询不到" - self.log(f"ASIN {asin} 未找到商品", "WARNING") - break # 查询不到商品,无需重试 - else: - # 删除所有找到的SKU,如果任何一个失败则重新开始整个流程 - success_count = 0 - all_success = True # 标记是否所有SKU都删除成功 - total_sku_count = len(sku_ls) - - for sku in sku_ls: - try: - suc = driver.del_action(sku) - if suc: - success_count += 1 - self.log(f"SKU 删除成功 ({success_count}/{total_sku_count})") - else: - self.log(f"SKU 删除失败", "WARNING") - all_success = False - break # 任何一个失败,退出循环,准备重试整个流程 - except Exception as e: - self.log(f"删除SKU异常: {str(e)}", "ERROR") - all_success = False - break # 发生异常,退出循环,准备重试整个流程 - - # 判断删除结果 - if all_success and success_count == total_sku_count: - status = "成功" - self.log(f"ASIN {asin} 所有SKU删除成功 ({success_count}/{total_sku_count})") - # 更新成功计数 - if task_id in runing_task: - runing_task[task_id]["success_count"] += 1 - break # 全部成功,跳出重试循环 - - else: - # 有失败的SKU - if retry < max_retries - 1: - self.log(f"有SKU删除失败,准备重试整个流程... ({retry + 1}/{max_retries})") - time.sleep(2) - continue # 继续下一次重试 - else: - # 所有重试都用完了 - if success_count > 0: - status = "部分成功" - self.log(f"ASIN {asin} 部分SKU删除成功 ({success_count}/{total_sku_count})", "WARNING") - if task_id in runing_task: - runing_task[task_id]["success_count"] += 1 - else: - status = "失败" - self.log(f"ASIN {asin} 所有SKU删除失败", "ERROR") - if task_id in runing_task: - runing_task[task_id]["failed_count"] += 1 - - except Exception as e: - status = "删除异常" - self.log(f"处理ASIN {asin} 异常: {str(e)}", "ERROR") - - # 如果还有重试机会,继续重试 - if retry < max_retries - 1: - self.log(f"发生异常,准备重试... ({retry + 1}/{max_retries})") - time.sleep(2) - else: - # 所有重试都失败了,更新失败计数 - if task_id in runing_task: - runing_task[task_id]["failed_count"] += 1 - - # 更新已处理ASIN计数 - if task_id in runing_task: - runing_task[task_id]["processed_asins"] += 1 - - # 回传结果到API - try: - payload = { - "submissionId": "", - "files": [{ - "fileKey": file_key, - "sourceFilename": source_filename, - "chunkIndex": chunk_index, - "chunkTotal": total_rows, - "processedRows": chunk_index, - "totalRows": total_rows, - "currentCountry": country, - "currentAsin": asin, - "countries": [{ - "country": country, - "items": [{ - "asin": asin, - "status": status - }] - }] - }] - } - - self.post_result(task_id, payload) - self.log(f"ASIN {asin} 结果已回传,状态: {status}") - - except Exception as e: - self.log(f"回传结果失败: {str(e)}", "ERROR") - - def _report_all_asins_failed(self, country: str, items, task_id, shop_data, chunk_index): - """将国家下所有ASIN标记为失败并回传 - - Args: - country: 国家名称 - items: ASIN列表 - task_id: 任务ID - shop_data: 店铺数据 - """ - self.log(f"开始回传国家 {country} 下的 {len(items)} 个ASIN失败状态") - - file_key = shop_data.get("fileKey", "") - source_filename = shop_data.get("sourceFilename", "") - total_rows = shop_data.get("totalRows", 0) - - for asin_item in items: - asin = asin_item.get("asin", "") - - try: - # 更新失败计数 - if task_id in runing_task: - runing_task[task_id]["failed_count"] += 1 - runing_task[task_id]["processed_asins"] += 1 - - # 回传失败状态 - payload = { - "submissionId": "", - "files": [{ - "fileKey": file_key, - "sourceFilename": source_filename, - "chunkIndex": chunk_index, - "chunkTotal": total_rows, - "processedRows": chunk_index, - "totalRows": total_rows, - "currentCountry": country, - "currentAsin": asin, - "countries": [{ - "country": country, - "items": [{ - "asin": asin, - "status": "失败" - }] - }] - }] - } - - self.post_result(task_id, payload) - chunk_index += 1 - self.log(f"ASIN {asin} 失败状态已回传") - - except Exception as e: - self.log(f"回传ASIN {asin} 失败状态时出错: {str(e)}", "ERROR") - - return chunk_index - - def post_result(self, task_id: int, payload): - """回传结果到API(带重试机制) - - Args: - task_id: 任务ID - payload: 结果数据 - """ - url = f"{DELETE_BRAND_API_BASE}/api/delete-brand/tasks/{task_id}/result" - max_retries = 3 # 最多重试3次 - - for retry in range(max_retries): - try: - self.log(f"尝试回传结果 (第 {retry + 1}/{max_retries} 次)") - - response = requests.post( - url, - json=payload, - headers={"Content-Type": "application/json"}, - timeout=30, - verify=False # 忽略SSL证书验证 - ) - print("【结果提交】:", payload) - print("【结果提交返回】:", response.text) - - if response.status_code == 200: - self.log(f"结果回传成功: {url}") - return # 成功后直接返回,不再重试 - else: - self.log(f"结果回传失败,状态码: {response.status_code}", "WARNING") - # 如果还有重试机会,继续重试 - if retry < max_retries - 1: - self.log(f"准备重试... ({retry + 1}/{max_retries})") - time.sleep(2) # 等待2秒后重试 - else: - self.log(f"已达到最大重试次数,结果回传最终失败", "ERROR") - - except Exception as e: - self.log(f"调用API异常: {str(e)}", "ERROR") - # 如果还有重试机会,继续重试 - if retry < max_retries - 1: - self.log(f"发生异常,准备重试... ({retry + 1}/{max_retries})") - time.sleep(2) # 等待2秒后重试 - else: - self.log(f"已达到最大重试次数,结果回传最终失败", "ERROR") - - def update_task_status(self, task_id: int, **kwargs): - """更新任务状态 - - Args: - task_id: 任务ID - **kwargs: 要更新的字段 - """ - if task_id not in runing_task: - runing_task[task_id] = {} - - runing_task[task_id].update(kwargs) - - - -if __name__ == '__main__': - # 使用示例 - user_info = { - "company": "rongchuang123", - "username": "自动化_Robot", - "password": "#20zsg25" - } - shop_name = "郭亚芳" - kill_process("v6") - - # 创建驱动实例 - driver = AmazoneDriver(user_info) - - # 打开店铺并获取浏览器实例 - browser = driver.open_shop(shop_name) - - country = "西班牙" - asin = "Voanos" - - sw_suc = driver.SwitchingCountries(country) - driver.SwitchPage() - sku_ls = driver.search(asin=asin) - print("查询结果有:", len(sku_ls)) - - for sku in sku_ls: - suc = driver.del_action(sku) - print(sku, "删除结果", suc) - - - diff --git a/app/amazon/detail_spider.py b/app/amazon/detail_spider.py deleted file mode 100644 index 6afa92e..0000000 --- a/app/amazon/detail_spider.py +++ /dev/null @@ -1,8271 +0,0 @@ -import json -import os - -import time -import traceback -from datetime import datetime -from DrissionPage import Chromium, ChromiumOptions -from collections import defaultdict -import requests - -from amazon.tool import show_notification,get_shop_info,remove_special_characters,split_currency_values -from amazon.amazon_base import TaskBase -from amazon.chrome_base import ChromeAmzoneBase - - -from config import runing_task,runing_shop,base_dir,DELETE_BRAND_API_BASE - - -class ChromeAmzone(ChromeAmzoneBase): - mark_name = "亚马逊详情采集" - - def run(self, country, asin): - """ - 运行亚马逊详情采集任务 - - Args: - country: 国家名称(如:英国、德国、法国、西班牙、意大利) - asin: 亚马逊商品ASIN码 - - Returns: - dict: 包含采集到的数据 - """ - try: - # 验证国家是否支持 - if country not in self.country_info: - error_msg = f"不支持的国家: {country},支持的国家有: {list(self.country_info.keys())}" - self.log(error_msg) - show_notification(error_msg, "error") - return None - - # 获取国家配置 - country_config = self.country_info[country] - zip_code = country_config["zip_code"] - mark = country_config.get("mark") - - # 1. 根据国家和ASIN拼接链接 - base_url = country_config["url"] - # 提取域名部分 - domain = base_url.split("/dp/")[0] - # 拼接新的URL - product_url = f"{domain}/dp/{asin}" - self.log(f"正在访问: {product_url}") - - # 打开链接 - self.tab.get(product_url) - time.sleep(3) # 等待页面初步加载 - self.tab.wait.doc_loaded(timeout=30, raise_err=False) - - self.close_init_popup() - # 2. 切换国家/设置邮编 - self.log(f"正在检查并设置邮编: {zip_code},标识: {mark}") - self._set_zip_code(zip_code, mark) - - # self.tab.wait.doc_loaded(timeout=5, raise_err=False) - - # 3. 抓取数据 - self.log("正在抓取商品数据...") - data = self._scrape_data() - - # 添加基本信息 - data['country'] = country - data['asin'] = asin - data['url'] = product_url - data['timestamp'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') - - self.log(f"数据抓取完成: {json.dumps(data)}") - return data - - except Exception as e: - error_msg = f"运行出错: {traceback.format_exc()}" - self.log(error_msg) - # show_notification(f"采集失败: {str(e)}", "error") - raise RuntimeError(error_msg) - return {} - - def _scrape_data(self): - """ - 抓取商品数据 - - Returns: - dict: 抓取到的数据 - """ - data = { - 'image_url': "", - 'title': "", - "sku" : "" - } - - try: - # 等待页面加载 - # time.sleep(3) - title_ele = self.tab.ele('xpath://h1[@id="title"]',timeout=30) - title = title_ele.text - data["title"] = title - sku_ele_ls = self.tab.eles('xpath://ul[@class="a-unordered-list a-vertical a-spacing-mini"]', timeout=20) - if len(sku_ele_ls) > 0: - data["sku"] = sku_ele_ls[0].text - imge_ele = self.tab.ele('xpath://div[@id="imgTagWrapperId"]//img',timeout=20) - - image_url = "" - min_image_url = "" - data_a_dynamic_image = imge_ele.attr("data-a-dynamic-image") - if data_a_dynamic_image: - dynamic_image_json = json.loads(data_a_dynamic_image) - self.log(f"图片信息:{dynamic_image_json}") - max_area = 0 - min_area = 0 - - for url, (width, height) in dynamic_image_json.items(): - area = width * height - if area > max_area: - max_area = area - image_url = url - if min_area == 0: - min_area = area - min_image_url = url - if area < min_area: - min_area = area - min_image_url = url - - if not image_url: - image_url = imge_ele.attr("src") - - if not min_image_url: - min_image_url = imge_ele.attr("src") - - data["image_url"] = image_url - data["min_image_url"] = min_image_url - - return data - - except Exception as e: - self.log(f"抓取数据时出错: {traceback.format_exc()}") - return data - - - -class SpiderTask(TaskBase): - task_name = "亚马逊采集" - - @staticmethod - def group_by_id_prefix(data): - """ - 根据每条数据的 id 字段进行分组: - - 如果 id 为 "2_1",则取 "_" 前面的 "2" 作为分组 key - - 如果 id 为 "1",则分组 key 就是 "1" - - 相同 key 的数据归为同一组 - - :param data: 原始列表数据 - :return: 二维列表,按 id 前缀分组 - """ - grouped = defaultdict(list) - - for item in data: - item_id = str(item.get("id", "")) - group_key = item_id.split("_")[0] - grouped[group_key].append(item) - - return list(grouped.values()) - - @staticmethod - def normalize_groups(data): - groups = data.get("groups") - if isinstance(groups, list) and len(groups) > 0: - return groups - - rows = data.get("rows") or data.get("items") or [] - if not isinstance(rows, list) or len(rows) == 0: - return [] - - normalized = [] - for items in SpiderTask.group_by_id_prefix(rows): - first = items[0] if items else {} - item_id = str(first.get("id") or first.get("displayId") or "") - base_id = item_id.split("_")[0] if item_id else "" - normalized.append({ - "sourceFileKey": first.get("sourceFileKey", ""), - "sourceFilename": first.get("sourceFilename", ""), - "groupKey": first.get("groupKey") or base_id, - "baseId": first.get("baseId") or base_id, - "displayId": first.get("displayId") or item_id, - "items": items, - }) - return normalized - - def process_task(self, task_data: dict): - """处理审批任务主入口 - - Args: - task_data: 任务数据 - """ - try: - data = task_data.get("data", {}) - task_id = data.get("taskId") - groups = self.normalize_groups(data) - - # 用于测试 - limit = data.get("limit", None) - - if not task_id: - self.log("任务ID为空,跳过", "WARNING") - return - - - self.log(f"开始处理爬取任务 {task_id},{len(groups)} 个任务") - - if not groups: - self.log("appearance-patent groups/rows is empty, skip", "WARNING") - return - - runing_task[task_id] = { - "status": "running", - "start_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), - "total_shops": 1, - "processed_shops": 0, - "total_countries": len(groups) , - "processed_countries": 0, - "total_asins": 0, - "processed_asins": 0, - "success_count": 0, - "failed_count": 0, - "stop_requested": False - } - - # 检查是否收到暂停请求 - if task_id in runing_task and runing_task[task_id].get("stop_requested", False): - self.log(f"检测到任务 {task_id} 的暂停请求,停止处理", "WARNING") - runing_task[task_id]["status"] = "stopped" - return - max_retry = 3 - show_notification(f"开始爬取数据", "info") - chrome = ChromeAmzone() - try: - # 数据整理 - # new_items = self.group_by_id_prefix(items) - result = [] - for gp_index,gp in enumerate(groups): - items = gp.get("items", []) - return_data = {} - - for index,value in enumerate(items): - - return_data = { - 'image_url': "", - 'title': "" - } - asin = value.get("asin") - country = value.get("country") - for _ in range(max_retry): - try: - return_data = chrome.run(country, asin) or {} - self.log(f"抓取结果->{return_data}") - break - except Exception as e: - if "与页面的连接已断开" in str(e): - chrome = ChromeAmzone() - if not isinstance(return_data, dict): - return_data = {} - if return_data.get("image_url"): - break - - group_item = [ - { - "sourceFileKey": i.get("sourceFileKey"), - "sourceFilename": i.get("sourceFilename"), - "rowToken": i.get("rowToken"), - "groupKey": i.get("groupKey"), - "id": i.get("id"), - "asin": i.get("asin"), - "country": i.get("country"), - "url": return_data.get("image_url"), - "title": return_data.get("title"), - "sku": return_data.get("sku") - } - for i in items - ] - # task_id: int, chunkIndex:int,chunkTotal: int, country_code: str, asin: str, status: dict,error:str="", - # item_data:dict={}, - res = { - "sourceFileKey": gp.get("sourceFileKey"), - "sourceFilename": gp.get("sourceFilename"), - "groupKey": gp.get("groupKey"), - "baseId": gp.get("baseId"), - "displayId": gp.get("displayId"), - "items": group_item - } - print("================") - result.append(res) - print("================") - is_done = gp_index == len(groups)-1 - if len(result) > 10 or is_done: - self.post_result(task_id=task_id,chunkIndex=gp_index+1,chunkTotal=len(groups), - asin=asin,item_data=result,is_done=is_done) - result = [] - - - if len(result) > 0: - is_done = True - self.post_result(task_id=task_id, chunkIndex=len(groups), chunkTotal=len(groups), - asin=asin, item_data=result, is_done=is_done) - # 更新已处理店铺数 - if task_id in runing_task: - runing_task[task_id]["processed_shops"] += 1 - except Exception as e: - self.log(f"处理店铺 {task_id} 失败: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - try: - chrome.close() - except Exception as e: - print("退出浏览器出错", e) - # 更新任务状态 - if task_id in runing_task: - if runing_task[task_id].get("stop_requested", False): - runing_task[task_id]["status"] = "stopped" - self.log(f"任务 {task_id} 已被暂停!") - else: - runing_task[task_id]["status"] = "completed" - self.log(f"任务 {task_id} 处理完成!") - - except Exception as e: - self.log(f"任务处理失败: {traceback.format_exc()}", "ERROR") - if task_id: - if task_id in runing_task: - runing_task[task_id]["status"] = "failed" - runing_task[task_id]["error"] = str(e) - - def post_result(self, task_id: int, chunkIndex:int,chunkTotal: int, asin: str, error:str="", - item_data:dict={}, - is_done: bool = False): - """回传处理结果到API - """ - - url = f"{DELETE_BRAND_API_BASE}/api/appearance-patent/tasks/{task_id}/result" - - payload ={ - "submissionId": f"{task_id}", - "chunkIndex": chunkIndex, - "chunkTotal": chunkTotal, - "error": error, - "groups": item_data, - "done": is_done - } - - max_retries = 3 - for retry in range(max_retries): - try: - request_timeout = 300 if is_done else 30 - print("================【详情采集】=====================") - self.log(f"尝试回传结果 (第 {retry + 1}/{max_retries} 次)") - self.log(f"回传URL: {url}") - self.log(f"回传数据: {payload}") - response = requests.post( - url, - json=payload, - headers={"Content-Type": "application/json"}, - timeout=request_timeout, - verify=False - ) - self.log(f"回传结果: {response.text}") - data = response.json() if response.text else {} - if response.status_code == 200 and isinstance(data, dict) and data.get("success"): - self.log(f"结果回传成功: {asin} - {item_data}") - return - else: - self.log(f"结果回传失败,状态码: {response.status_code}", "WARNING") - print("=====================================") - - except Exception as e: - self.log(f"调用API异常: {str(e)}", "ERROR") - print("=====================================") - - # 如果还有重试机会,等待后继续 - if retry < max_retries - 1: - time.sleep(2) - - self.log(f"已达到最大重试次数,结果回传最终失败", "ERROR") - # raise RuntimeError("已达到最大重试次数,结果回传最终失败") - -if __name__ == '__main__': - # spide = SpiderTask() - task_data = [ - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1", - "asin": "B0D792ND9V", - "country": "英国", - "url": "", - "title": "低" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2_1", - "asin": "B0D14L34S7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3_1", - "asin": "B0CWQFZMGY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B0CX87XXWJ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5_1", - "asin": "B0CR3PMR8L", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B0DK3L6FD4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8", - "asin": "B0D9QNV6FT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10_1", - "asin": "B0DBZG716J", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11_1", - "asin": "B0CX8K4F8Z", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12_1", - "asin": "B0C4KXJWW1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13", - "asin": "B0D62LNNKQ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14", - "asin": "B0DK3K3GF5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15_1", - "asin": "B0C1HN8GY6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16_1", - "asin": "B0B71WMDDF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18_1", - "asin": "B0DSZNF73N", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19", - "asin": "B0897Y5QDC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22_1", - "asin": "B0FNCLNS68", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23_1", - "asin": "B009U2SCMW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24", - "asin": "B0FBLY2ZRD", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B08LP7DW3M", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28_1", - "asin": "B0FPBZLD6R", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B09LV1TNHK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1_1", - "asin": "B0DSKS214Y", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2_1", - "asin": "B0BZBW8KL5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B0CR3LS3R7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4", - "asin": "B097TS2MNQ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B09LV4WGTR", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6_1", - "asin": "B0916ZQP1V", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B0C9WHZ67N", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9", - "asin": "B0F8QKVS1D", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B0D49974HV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0F2DXMKVF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12_1", - "asin": "B08YX48NZ2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14", - "asin": "B0BGM3HF9C", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15", - "asin": "B0CJJM9KZV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16_1", - "asin": "B09HDSTGT4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17", - "asin": "B0CX9HK5NL", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18", - "asin": "B0C2BV83D3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19_1", - "asin": "B0D5WDK7GW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20", - "asin": "B09NR1PZYD", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21", - "asin": "B0DC45N1Y8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23", - "asin": "B01AVHJQY2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0F3VSJ9Q2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27", - "asin": "B0CLXCXW6W", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28", - "asin": "B07PSPN1XH", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29_1", - "asin": "B09PHQYR6Z", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B0CT2H94WV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1", - "asin": "B0FRRK9V73", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3_1", - "asin": "B0B3RNHXV8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4", - "asin": "B09FF115TW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B0CYGXDWBT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B0F9FT3ZPY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7", - "asin": "B0F295JTQZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8", - "asin": "B0FPJZ1N51", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9_1", - "asin": "B08B8SP7XT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12_1", - "asin": "B002P7HGEO", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13_1", - "asin": "B09X268FXC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14_1", - "asin": "B0170OT3X8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15_1", - "asin": "B0859793H1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17", - "asin": "B0FP8KHCPX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18_1", - "asin": "B09H6KR87N", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19_1", - "asin": "B0D9778Q65", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B0CPJCBZR8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21", - "asin": "B0CZ63NGNQ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22", - "asin": "B0CR4795W6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23", - "asin": "B0CR45ZB5Y", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24_1", - "asin": "B0CYB255ST", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25", - "asin": "B0BMYWFKTF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26", - "asin": "B0BMYTPRD6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B0DK1MGDZM", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28", - "asin": "B006FUXS30", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B00BLPUXCI", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1", - "asin": "B09N79DR4C", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2", - "asin": "B006O74WTI", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B006O75DIC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4", - "asin": "B09323MXYP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B00K2NTEPC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B09C19Y6B3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7", - "asin": "B00L2HK0S2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8", - "asin": "B00666DQBW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9", - "asin": "B00666FLII", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B00666GVM8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11_1", - "asin": "B07KWJCVVN", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13_1", - "asin": "B00F0KAGKO", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14_1", - "asin": "B0C695NBMR", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15_1", - "asin": "B0F2FXYCG4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16", - "asin": "B0FPGC8Z84", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17_1", - "asin": "B0D8HXBGGB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18_1", - "asin": "B0DDG8GJP9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19", - "asin": "B0FLCZVDDH", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B07WZZW6V9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21", - "asin": "B0GT3SJ6J1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22", - "asin": "B077R1GRW1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23", - "asin": "B0D2TMYX23", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24_1", - "asin": "B00AXTKYCM", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0D45CB5SS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B0852JR7RD", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27", - "asin": "B0GR9F93JL", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28_1", - "asin": "B0CCJ3NY78", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29_1", - "asin": "B0D1V26VBG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1", - "asin": "B0CN5VVWB2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2", - "asin": "B0DLNJTKFB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B0CSD7S964", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B0GLP8L4TT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B0FGJB6LLV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B0DZ67MYZN", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7", - "asin": "B0G3XP9VYB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8", - "asin": "B0FNWMRMSZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9", - "asin": "B0FNWP3K72", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10_1", - "asin": "B0DQTMRNLC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0DZ62KT5N", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13", - "asin": "B0DZ65VCDC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16", - "asin": "B0DZ67P85P", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17_1", - "asin": "B0F6LRCZXW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18", - "asin": "B0DPYVJMLK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19", - "asin": "B0FDKZJTY5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20", - "asin": "B0D9VFN9QW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21_1", - "asin": "B0BW46XZ2G", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22", - "asin": "B0FLCBQ92M", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23_1", - "asin": "B0F6JW61SR", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24", - "asin": "B0CNZ27HCF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B001DKRB8A", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B00NH5DWIW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28", - "asin": "B01IOKEOGS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29", - "asin": "B08YJVVPBK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B0FG29NPDK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1", - "asin": "B0FRFHFXXZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B0FMQ5G18V", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B0DPDKD5PB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6_1", - "asin": "B0FS6JDGNW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8", - "asin": "B0DZBM5VRX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11_1", - "asin": "B0D4Q2KB8X", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12_1", - "asin": "B098B3XKRS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13_1", - "asin": "B09F9JM8F9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14", - "asin": "B08H5M3ZQ7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15", - "asin": "B0DG3NXCCF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16_1", - "asin": "B0FJX2FSM1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17", - "asin": "B089KHDH15", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18_1", - "asin": "B0CPWP6W5M", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19_1", - "asin": "B0D4LXTCSZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B0CK682F4T", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21_1", - "asin": "B0B9CGJDBV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23", - "asin": "B0DV55H9DD", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25", - "asin": "B0FJ8B8RJS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B0D426K41D", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27", - "asin": "B0CTD4BF7S", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29_1", - "asin": "B0CGXGQ43L", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30_1", - "asin": "B0BDM3B6LY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1", - "asin": "B0FS1SJGJ5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2", - "asin": "B0FJ1RH4JV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B0B9MBTX28", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4", - "asin": "B0FV2VLSX1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5_1", - "asin": "B0BRYKW1GD", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7_1", - "asin": "B0CT5G9YWM", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B0D927DZ6B", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9", - "asin": "B0DSDY3G29", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10_1", - "asin": "B0CWRRSV9H", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0DNDTT9Z4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13", - "asin": "B0CP5VD5SG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14_1", - "asin": "B0BV2Q24YK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15_1", - "asin": "B0F3JD29KW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16", - "asin": "B0C818XVYT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17", - "asin": "B0FJRYQ3QV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18", - "asin": "B0CP3NYG8J", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19", - "asin": "B0F6C7XH75", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B0FXX9N5VH", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22_1", - "asin": "B0CFJPCSDP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24_1", - "asin": "B0FQJHS1MZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0D5VJN99L", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26", - "asin": "B07MCDWVJG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B0CKYJCJGD", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28_1", - "asin": "B0CQXPR4H4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29", - "asin": "B08S2913J7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30_1", - "asin": "B0CXPL3GSW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1", - "asin": "B0D7JVZWZF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2", - "asin": "B0FKMXP3ZR", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B0FGP7YJC8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B0F9PDZTCJ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5_1", - "asin": "B0CTLXM3C6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6_1", - "asin": "B0CSYB8BPK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7_1", - "asin": "B01I1CEEXW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8", - "asin": "B0G2Y49LCY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9_1", - "asin": "B0F3HK55L6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B0GWJ69JK1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11_1", - "asin": "B09Z877C17", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12", - "asin": "B0GLDX9NB1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13_1", - "asin": "B0FPC1Y19B", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14", - "asin": "B0C65438CP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17", - "asin": "B0F6MNZB6F", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18", - "asin": "B0BVPLLLRP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B0FK2B5FK2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21_1", - "asin": "B0BPNFMKQV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22", - "asin": "B0G4BLRDW6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23", - "asin": "B0F93QCQF1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24", - "asin": "B0FHHPYP9K", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28", - "asin": "B0F1K9KDX6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29", - "asin": "B0F52ZXD55", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30_1", - "asin": "B07GDGSKK6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1_1", - "asin": "B08BPHJ34D", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2", - "asin": "B07ZFWRH75", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B0G5PVP3Y3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4", - "asin": "B0FXXLPC1T", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B0GQB1K38X", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B0C1TCDZ5N", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8", - "asin": "B0FHD3QCLW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9_1", - "asin": "B0F1THT9XW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0DYJ8743N", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12_1", - "asin": "B0FD3Q2RGP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13_1", - "asin": "B0BV66T3PQ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14_1", - "asin": "B0CDVYLTB4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16", - "asin": "B0CNKGFWKR", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17", - "asin": "B0D4VQF22F", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18_1", - "asin": "B0C5TBR8LB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19", - "asin": "B0DDH3G9PG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B0D8VRMWP2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22_1", - "asin": "B0BFWXWNTC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23_1", - "asin": "B096ZCL4JX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24_1", - "asin": "B0CFDXR5FC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25", - "asin": "B0G6DN5QC7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B0CNRL9R1F", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B0BJK6D2D4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28_1", - "asin": "B0DPFDTL7W", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29_1", - "asin": "B0G5N9KGXC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30_1", - "asin": "B0F73X9X8D", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1", - "asin": "B0CJTJB8PV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2", - "asin": "B0FBGD3QJ2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B0F98TGSQ1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B0F329ZXH5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B0G191SX5F", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B0F7XT5TNY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7", - "asin": "B0FVS7K78Q", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B0FYFZBQLT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B0FG2LHWB3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0F9WX88T1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12", - "asin": "B0F7XNDBNN", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14", - "asin": "B0DT7GV9NS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15_1", - "asin": "B0DKF26TYN", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18_1", - "asin": "B0D1FP339J", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20", - "asin": "B0CNCBQCMG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21_1", - "asin": "B0CHRR45X7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23", - "asin": "B0C1RPB8BQ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24", - "asin": "B0BVPPBH7D", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25", - "asin": "B0BHQKQMG8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26", - "asin": "B0C7QQPNC9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27", - "asin": "B0FHKT5CBC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29", - "asin": "B0DR5XVMN7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B08HPS68Q4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1", - "asin": "B0C4KLQPDZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2", - "asin": "B0F6TT21VN", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B08MFB5W4Q", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B07C9Z5CG5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B07589LNBP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B08HRLZVX2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7", - "asin": "B08K7B3T6P", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8", - "asin": "B09T9YYYTS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9", - "asin": "B081ZVNH98", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B0F6T4XMXY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11_1", - "asin": "B07QH4X4Y5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12_1", - "asin": "B096S27HMH", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13_1", - "asin": "B0FB9DWYXF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14_1", - "asin": "B08R58FBXZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15_1", - "asin": "B0CRK8YNNY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16_1", - "asin": "B09C8F7J2H", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17", - "asin": "B0F6TK2KP3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18_1", - "asin": "B0BYJHNBWM", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B0DJBZXCDP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21_1", - "asin": "B0FMRGW63W", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22_1", - "asin": "B0D175WMJC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23_1", - "asin": "B07FLD65NM", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24", - "asin": "B0DRFWYNNV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0DZX3JWQP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B0F5X5G34F", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28_1", - "asin": "B0BJDL1D9W", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29_1", - "asin": "B0BYJMMMLX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30_1", - "asin": "B092M4RJVV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1_1", - "asin": "B092M49F1Q", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2_1", - "asin": "B0FMRFHRZR", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3_1", - "asin": "B0DZWVVM6F", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B0BCNZZ32X", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6_1", - "asin": "B0BRC8PXMW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7_1", - "asin": "B07RL77RM9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B0FMRBN7H4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9_1", - "asin": "B0FMRGHCPK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B0G4BWPCK7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11_1", - "asin": "B0CJJ4Y8SB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13_1", - "asin": "B0DYY436WG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14", - "asin": "B0G64PMQ94", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16_1", - "asin": "B0CST698J6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17_1", - "asin": "B00U7LUWR8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18", - "asin": "B0DHRJX1VS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20", - "asin": "B0CY9NB8VS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21_1", - "asin": "B08ML38H24", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22_1", - "asin": "B0BXVBVJ6G", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23_1", - "asin": "B08HS69FQG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25", - "asin": "B0F281WHDB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B0007RN382", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B0F2JDR3Y5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28", - "asin": "B0FX9L2JJ4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29_1", - "asin": "B0FD9NVNFT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B0B72HD5B9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2_1", - "asin": "B0F53FQ9Y4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3_1", - "asin": "B0GHDHPQ7J", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5_1", - "asin": "B07B9ZP8TK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B0DPWW9P2V", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7_1", - "asin": "B0CR43DTKJ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8", - "asin": "B0G8K4C3D6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10_1", - "asin": "B0F52TLKVM", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0BGH6Y6KB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12_1", - "asin": "B0D28VG1C3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13_1", - "asin": "B0D3LLKF7C", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14", - "asin": "B09KT2VBJL", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15_1", - "asin": "B07F6P6C3F", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18_1", - "asin": "B0GCZH5V2P", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19_1", - "asin": "B0FH5RNFZQ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B0CSFMDTSR", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21", - "asin": "B0GR9TS4N8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22", - "asin": "B0D9GWVPGJ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23_1", - "asin": "B0GF2BKHJK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24_1", - "asin": "B0GQZ8SPZZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0D3LQF6P5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B0GF2ML2NY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B0C28BCVH6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28_1", - "asin": "B0C1CRZPMS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29_1", - "asin": "B0F8HKX897", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30_1", - "asin": "B0GSKSC1KR", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2_1", - "asin": "B0GSQGF76K", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3_1", - "asin": "B0F9WTNVXP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B0F47S987P", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5_1", - "asin": "B0F4Y4F5TC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6_1", - "asin": "B0DYNW29NB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7_1", - "asin": "B0GF29HX77", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B0GM2WBVXF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9", - "asin": "B0GGWW658M", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B0F32R7JTF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0DZ67TBHQ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12_1", - "asin": "B0CLC6KSZH", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13_1", - "asin": "B0F8QW1FS1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14_1", - "asin": "B0F6LHFVJ3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16", - "asin": "B0DZH72GF6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17_1", - "asin": "B099N1FB4K", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18", - "asin": "B0BS678GBK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19_1", - "asin": "B0F5Y4KSQJ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B0D584KC9W", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21_1", - "asin": "B0GK1D75ZF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22_1", - "asin": "B0DPWXNWV5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23_1", - "asin": "B0G64ZCGTV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24_1", - "asin": "B07VHK16YV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0GS3QV5F2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B0DC7TR9B5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B0FH634932", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28_1", - "asin": "B0CY2XN6JF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29_1", - "asin": "B0GKR5WMXK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B0GH4KYZH5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1_1", - "asin": "B0FD76KJ9P", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B0836NDGM2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4", - "asin": "B0DYJWTS4N", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B089X4VCPY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B0CQZR1LZX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7_1", - "asin": "B0GSVTDQBX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B0D9TK3VMD", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9_1", - "asin": "B0GDZWHF6D", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10_1", - "asin": "B0C8N1LZT9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12", - "asin": "B0GWHQHKJS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13", - "asin": "B0BTTJKZDC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14", - "asin": "B0DZPDJ7Q4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15_1", - "asin": "B0D5W9F2DS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16_1", - "asin": "B0CGCPLWV1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17_1", - "asin": "B09VT58BM4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19_1", - "asin": "B07XZT797H", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20", - "asin": "B0GW9TR89X", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23_1", - "asin": "B09ZKT7QW6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0CJYRW7RL", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B0DSZ4V9PJ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B09TKN8F9W", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28_1", - "asin": "B09SW82GSP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2_1", - "asin": "B001F4OSJY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B091BK7ZF3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B07HSL53DY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B07HSDTYC8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6_1", - "asin": "B0FKN7JZ6B", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7_1", - "asin": "B071XJDSBK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B006UITUJ8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10_1", - "asin": "B0CBPWL6NZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0G3Q9B48L", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12", - "asin": "B0BYJV8P98", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13_1", - "asin": "B0G8DTQP1F", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14_1", - "asin": "B0CYP192B6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15_1", - "asin": "B0CCN8TJCD", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16_1", - "asin": "B0FWKJVMNK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19", - "asin": "B0GD11NDH2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B0BC2NFJBP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21_1", - "asin": "B0D9RRCC93", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23_1", - "asin": "B0DLSZFMM2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24_1", - "asin": "B0GFBG4HSR", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B07TBCFGPT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27", - "asin": "B0GSZRFZGZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29_1", - "asin": "B008OB1AZ6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30_1", - "asin": "B09XLVPYPR", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1_1", - "asin": "B0FZK5NCWK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2_1", - "asin": "B0DYJTRT6K", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3_1", - "asin": "B0CL664TZX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B0DN6XQ5W4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5_1", - "asin": "B002HNNWLM", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6_1", - "asin": "B0F5HHHR65", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7_1", - "asin": "B0G5739C1J", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B0G11TTQPT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9_1", - "asin": "B0G579K29G", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B0G57DKM85", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0DGFW14PB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12_1", - "asin": "B0DK3YXKS5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13_1", - "asin": "B0FGTHRS1R", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14_1", - "asin": "B0FP2FDZPZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15", - "asin": "B002HO7QQ8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16_1", - "asin": "B002HNS1TU", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17_1", - "asin": "B004KL50HS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18_1", - "asin": "B07QK3B4Q5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19", - "asin": "B08DVGHKLL", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20", - "asin": "B08K3ZYRGC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21", - "asin": "B0DZWVCVK1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23_1", - "asin": "B0CT29V1D5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24_1", - "asin": "B01N7G9ALO", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25", - "asin": "B0CQLN3T6N", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B0FJKTYHSV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28", - "asin": "B0FRFNVTKX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1", - "asin": "B0DJQWP543", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B0D7M543CT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B0F21QQQL1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B0CMZR1JJD", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B0F66NTL6T", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7", - "asin": "B0D976JCLF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B0FP2DMFMG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9_1", - "asin": "B0CTDM36PB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B0DY76XFLY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0CQ4PS256", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12_1", - "asin": "B0C15RDVDK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13", - "asin": "B0F5Y8Y58T", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14", - "asin": "B0B5CBKC17", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16_1", - "asin": "B0FMXVRQM2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18", - "asin": "B0DC2WX8Q2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19_1", - "asin": "B0FVR6L7NP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B0DFQMCBS7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21", - "asin": "B07TSMHP3T", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23_1", - "asin": "B09DY2KCLB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0GRTXKMGZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26", - "asin": "B0BG4TTWWW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B0FC2QBR9T", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29_1", - "asin": "B09Y2H27PS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30_1", - "asin": "B0CTGLQFCD", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2_1", - "asin": "B01MCVO50E", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B0FJXM3T1S", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B0C8MG6NF7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5_1", - "asin": "B0C7NK648Y", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B0DYFDXD8N", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7", - "asin": "B0GGMLRZWF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B0D45VVD1Y", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9_1", - "asin": "B0CC6KP279", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12", - "asin": "B0FRZYQYGT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13", - "asin": "B0DK447HBK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14", - "asin": "B0788GRQT1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15", - "asin": "B0F93QPPVD", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16_1", - "asin": "B0BRQG6CKG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17", - "asin": "B09DCW6XN1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18", - "asin": "B0FSQDHC9V", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19_1", - "asin": "B0D25DHV1T", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B0DJF4Z91G", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21_1", - "asin": "B0F3J3B1R2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24_1", - "asin": "B0F3J6WJZJ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B0FQTWP8GM", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28", - "asin": "B0FPQL1ZW9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29_1", - "asin": "B0B77PQ12W", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B0FXWTDY16", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1_1", - "asin": "B0D6ZV5F22", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2", - "asin": "B0BF13CW1W", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B0F52CM3X1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B0043RJSSG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5_1", - "asin": "B07V2G46J7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6_1", - "asin": "B07X4V22PW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7_1", - "asin": "B0GQXDVW6C", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8", - "asin": "B0BK888623", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9_1", - "asin": "B0BFWC5SZQ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10_1", - "asin": "B0F1C9ZQKD", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B09F5VV8DW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12", - "asin": "B0BWMT9LFC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14_1", - "asin": "B0FJLQLRNT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15", - "asin": "B08ZCNVYTK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16", - "asin": "B0CMZLKY9T", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17", - "asin": "B0GJZXZ2F9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18", - "asin": "B07BMFCKCR", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19_1", - "asin": "B0DK46T977", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20", - "asin": "B08HCPX1MB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21_1", - "asin": "B0D8L6WRCM", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23_1", - "asin": "B09NDN8NV1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24", - "asin": "B0GT2527XG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0FNRCLHNS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B0DQS8GKLG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B003NGLFYI", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28", - "asin": "B0CR4FTMGG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29", - "asin": "B0DK9ZBBKS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B0D1XX28FN", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1_1", - "asin": "B003KHEEY8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2_1", - "asin": "B0F9WRKC84", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B08BHKGYJ7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4", - "asin": "B0FT1562DX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B0F8QRJ9JB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6_1", - "asin": "B0070OARSO", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7", - "asin": "B07XJ4W6SW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B0C1V86KMX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9_1", - "asin": "B0CGM1Z2VG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10_1", - "asin": "B004699SWM", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0GT281VQK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13_1", - "asin": "B09BCSR7NQ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24_1", - "asin": "B003YCKTIE", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29_1", - "asin": "B092CGQN2K", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30_1", - "asin": "B001WSDMBI", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B079C2CDLD", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B077WX43MH", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6_1", - "asin": "B0FQ2YC11V", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7_1", - "asin": "B0DRFQJ6CX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B0BX65MF93", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9", - "asin": "B0CT5ZR247", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B0BFXLLR2F", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11_1", - "asin": "B0FDQT4X7W", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13_1", - "asin": "B0FQ2XD95Z", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15", - "asin": "B094RDMZ3Z", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16_1", - "asin": "B0DMZHTJY2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18", - "asin": "B0CS2TQGM5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19", - "asin": "B0DG2XK945", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21", - "asin": "B0G2LNGQPK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22", - "asin": "B0G4R1RHYH", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24_1", - "asin": "B0GSRZM4XB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25", - "asin": "B0D926NJN9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26", - "asin": "B01LZBHEKJ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27", - "asin": "B09LQL4S9Q", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29_1", - "asin": "B0CQTPF6BJ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B0DZVY2F7M", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1", - "asin": "B0GMYGQ2G6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3_1", - "asin": "B0C5WQ6DFB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B0DJVK3SC4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5_1", - "asin": "B000N324DU", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B074F6YQZW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7_1", - "asin": "B09MD5W6Z5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8", - "asin": "B0F94GJX9D", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9", - "asin": "B0DP298J3J", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B010W3V6Z2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11_1", - "asin": "B0F24BSV4V", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12", - "asin": "B0B9MKBPH9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13", - "asin": "B0BHHKC5JQ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14", - "asin": "B0B4RFNK72", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15", - "asin": "B01LXD3KE6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17", - "asin": "B010W3V1W0", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18", - "asin": "B095JNPP53", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B0D7DSBNNH", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21", - "asin": "B0B935PV25", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22", - "asin": "B0B67XDHPQ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24", - "asin": "B072Z1PQM2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0CT1J5HWX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26", - "asin": "B097G2DXSQ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27", - "asin": "B010W3VLE8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28", - "asin": "B00R39MP4A", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29", - "asin": "B095JMYSQ9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B0F8F5H3MG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1", - "asin": "B0DNM4R43P", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2", - "asin": "B0FCFB3X78", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B0CN4KXVWF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4", - "asin": "B0D455HLWT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B0B1HYLLYT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6_1", - "asin": "B0F1TKQG14", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7", - "asin": "B0F32CLT9F", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8", - "asin": "B0DJXYDPFC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9", - "asin": "B0B3RRLNCT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B0F2DR94NT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0BL7HRF5R", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12", - "asin": "B0B6PT6D7Q", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13", - "asin": "B0FF4FLHM4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14", - "asin": "B07L2476DB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15", - "asin": "B0CK4379VH", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16", - "asin": "B0BRFW6XF4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17", - "asin": "B07BZT7699", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18_1", - "asin": "B0D8W4JRTY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19", - "asin": "B0F9NQMWGC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20", - "asin": "B07CF8KD48", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21", - "asin": "B0F9NWBVD8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22", - "asin": "B0DSZK41Z9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23", - "asin": "B0DHP1TPQL", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24_1", - "asin": "B0DPHSPQRP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0BVZ3VKNX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26", - "asin": "B0FPX7363M", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B0F9KCHB7F", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28_1", - "asin": "B07L3H5DDW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B003K5S4NW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1_1", - "asin": "B0BNVHXLDN", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2", - "asin": "B0FC2R299V", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B0BNVJPSDT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B0CCRNRHYW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6_1", - "asin": "B0FP2NQM67", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7", - "asin": "B0DRSD66T3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B0DM6CS4KG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9_1", - "asin": "B0GQ2YGFTR", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B0F1LNXRSH", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0GJ59NQTT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12", - "asin": "B0GKY1T54N", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13", - "asin": "B0FZNMHLDY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14_1", - "asin": "B0DHWYL3JP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16_1", - "asin": "B0CW5DD6SC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17_1", - "asin": "B0CRH7T5WG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19_1", - "asin": "B0CRR6F9JX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20", - "asin": "B09D3XG1PT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22", - "asin": "B00AFGCL42", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24_1", - "asin": "B0CXP3619X", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0CW5GFQX3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B0CZDK561H", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B0FKLRMG14", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28_1", - "asin": "B0DFQWC297", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1_1", - "asin": "B0DGPV9QY8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2_1", - "asin": "B0GV3W42MJ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3_1", - "asin": "B0DK4JV5YY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B0CV4K3HSW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9", - "asin": "B0FN5YD344", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B01HY4XZE2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13", - "asin": "B0D485JG3T", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15", - "asin": "B0GC584NTL", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16", - "asin": "B0FDQLKJL3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18_1", - "asin": "B0D6RBQR4Q", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19_1", - "asin": "B0CSLMZ4XS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B0FC64KYP9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21_1", - "asin": "B0FH234TL6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22_1", - "asin": "B0F6D4Z3WB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23_1", - "asin": "B0F8RCZ91V", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24_1", - "asin": "B0FP5Q7B7X", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0FM88JBRX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B0CKMT72MX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27", - "asin": "B0C4JT7PHB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28", - "asin": "B0C1RMVGTZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29", - "asin": "B07BFQJ3G5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B074VGHYF8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1", - "asin": "B015AK9JXI", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2_1", - "asin": "B084WSGN9C", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3_1", - "asin": "B0FHWJ42Q8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B0CZDTGFSQ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5_1", - "asin": "B0F7XKNY9L", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B0DWLFKPNW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7_1", - "asin": "B0CWDPSJG4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B0G488Z8JG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9_1", - "asin": "B0BYRQ5TBY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B0CWH1MRCV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0FSCXLBHZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12", - "asin": "B0GH6YJX2L", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13_1", - "asin": "B0GMQ29YQ9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14_1", - "asin": "B0BQLX4QP3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15", - "asin": "B0FXVHQNQ4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16", - "asin": "B072DVNZYH", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17_1", - "asin": "B0G198MZH3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18", - "asin": "B0F7HGQHLP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19", - "asin": "B0B9M83MZV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20", - "asin": "B074P9YRGW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21_1", - "asin": "B0G3YJ32Q4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22", - "asin": "B0D8RXPCH6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24", - "asin": "B0CBPKKT98", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0DGG82L25", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26", - "asin": "B0FXVNDFHC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27", - "asin": "B0CYY2YJ2S", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28", - "asin": "B0FC34Z9P6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29", - "asin": "B0018MQIVO", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B018OQ66AE", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1", - "asin": "B0FNMK6R7Z", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B0CTJ8WRWZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4", - "asin": "B0CTJ9522Y", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B0CTJ88CKR", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B07DL3PBL7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7_1", - "asin": "B0C96V7HFN", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8", - "asin": "B079HQKBP3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9", - "asin": "B0BZHW8VQ6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10_1", - "asin": "B019RKRGWS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0DCLSFGQS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12", - "asin": "B07FL8Y4BP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14", - "asin": "B01NBVCL86", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15_1", - "asin": "B0C8J5Z7VN", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16", - "asin": "B0CP73M8ST", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18", - "asin": "B0G2XVTF2R", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19_1", - "asin": "B08GCVHM9S", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B0B5X3YGMP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22", - "asin": "B07VM7QS8C", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23", - "asin": "B0F93G7KFF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24", - "asin": "B098B8QTM1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0F4WSK73F", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B0DC5M4XT7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27", - "asin": "B07SD5DWFT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28", - "asin": "B082ZNZG3X", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29", - "asin": "B084M4ZGC3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B0FXH7SVWV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B07RM4MB3H", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4", - "asin": "B0154H395G", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B08CHFDRJT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B09YQ3D7CW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7_1", - "asin": "B087YTMRK8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8", - "asin": "B08WKDDV96", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9", - "asin": "B0GFMG4SFT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B07KWY3XLW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B07RQTKPSK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12", - "asin": "B0CRHC42M2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14", - "asin": "B07RGG2TCV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15", - "asin": "B0CTJNQ5MH", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16", - "asin": "B0GGZSVY7G", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17", - "asin": "B0G3WTPGMG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18", - "asin": "B0GH136M59", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19", - "asin": "B0G3WJP9HJ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20", - "asin": "B0814RZNHY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21", - "asin": "B09ZXZH432", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22_1", - "asin": "B0BWY99XXS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23", - "asin": "B0849Y6VYJ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24", - "asin": "B0FKBBNN2G", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25", - "asin": "B07SBWB2X9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B0DK4JNBM3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B0FFZ3636F", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29", - "asin": "B0BRGZKXN7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2", - "asin": "B0GSTM85H3", - "country": "英国", - "url": "", - "title": "" - } -] - # spide.process_task(task_data) - res = SpiderTask.group_by_id_prefix(task_data) - print(res) diff --git a/app/amazon/detail_spider_备份.py b/app/amazon/detail_spider_备份.py deleted file mode 100644 index 39ad845..0000000 --- a/app/amazon/detail_spider_备份.py +++ /dev/null @@ -1,8384 +0,0 @@ -import json -import sys -import os -import io -# sys.stdout.reconfigure(encoding='utf-8') - -import time -import re -import traceback -from datetime import datetime -from DrissionPage import Chromium, ChromiumOptions -from collections import defaultdict -import requests - -from amazon.del_brand import AmamzonBase, kill_process -from amazon.tool import show_notification,get_shop_info,remove_special_characters,split_currency_values - -from config import runing_task, runing_shop,base_dir,DELETE_BRAND_API_BASE - - -class ChromeAmzone: - mark_name = "亚马逊详情采集" - country_info = { - "英国": { - "url": "https://www.amazon.co.uk/dp/B0CJ8SNXXV", - "zip_code": "SW1A 1AA", - "mark": "SW1A 1" - }, - "德国": { - "url": "https://www.amazon.de/dp/B0CC8CW9G2?th=1", - "zip_code": "10115" - }, - "法国": { - "url": "https://www.amazon.fr/dp/B0FRG1MJ8H?th=1", - "zip_code": "75001" - }, - "西班牙": { - "url": "https://www.amazon.es/dp/B08ZXVNYNN", - "zip_code": "28001" - }, - "意大利": { - "url": "https://www.amazon.it/dp/B0D1P17T2Q", - "zip_code": "20121" - } - } - - def __init__(self): - """ - 杀死当前谷歌浏览器进程,并使用 drissionpage 启动谷歌浏览器,使用系统安装的浏览器默认用户文件夹 - """ - # 杀死现有的Chrome进程 - print("正在关闭现有的chromium浏览器进程...") - os.system('taskkill /f /t /im chrome.exe') - time.sleep(2) - - print("正在启动chromium浏览器...") - # 配置浏览器选项 - co = ChromiumOptions() - user_data_path = os.path.join(base_dir, "user_data", "chrome_data") - if not os.path.exists(user_data_path): - os.makedirs(user_data_path, exist_ok=True) - co.set_user_data_path(user_data_path) - co.set_local_port(port=19897) - self.browser = Chromium(co) - self.tab = self.browser.latest_tab - print("Chrome浏览器启动成功") - - def close_init_popup(self): - """ - 关闭所有的初始化弹窗 - """ - self.tab.wait.doc_loaded(timeout=60, raise_err=True) - footbar = self.tab.eles('xpath://footer[@class="el-dialog__footer"]', timeout=5) - if len(footbar) > 0: - do_not_remind = footbar[0].eles('xpath:.//input[@class="el-checkbox__original"]') - if len(do_not_remind) > 0: - do_not_remind[0].check() - resume_immediately = footbar[0].eles('xpath:.//button') - if len(resume_immediately) > 0: - resume_immediately[0].click() - - self.tab.wait.doc_loaded(timeout=60, raise_err=True) - accept_btn = self.tab.eles('xpath://input[@id="sp-cc-accept"]', timeout=5) - if len(accept_btn) > 0: - accept_btn[0].click() - - def run(self, country, asin): - """ - 运行亚马逊详情采集任务 - - Args: - country: 国家名称(如:英国、德国、法国、西班牙、意大利) - asin: 亚马逊商品ASIN码 - - Returns: - dict: 包含采集到的数据 - """ - try: - # 验证国家是否支持 - if country not in self.country_info: - error_msg = f"不支持的国家: {country},支持的国家有: {list(self.country_info.keys())}" - print(error_msg) - show_notification(error_msg, "error") - return None - - # 获取国家配置 - country_config = self.country_info[country] - zip_code = country_config["zip_code"] - mark = country_config.get("mark") - - # 1. 根据国家和ASIN拼接链接 - base_url = country_config["url"] - # 提取域名部分 - domain = base_url.split("/dp/")[0] - # 拼接新的URL - product_url = f"{domain}/dp/{asin}" - print(f"正在访问: {product_url}") - - # 打开链接 - self.tab.get(product_url) - time.sleep(3) # 等待页面初步加载 - self.tab.wait.doc_loaded(timeout=30, raise_err=False) - - self.close_init_popup() - # 2. 切换国家/设置邮编 - print(f"正在检查并设置邮编: {zip_code},标识: {mark}") - self._set_zip_code(zip_code, mark) - - # self.tab.wait.doc_loaded(timeout=5, raise_err=False) - - # 3. 抓取数据 - print("正在抓取商品数据...") - data = self._scrape_data() - - # 添加基本信息 - data['country'] = country - data['asin'] = asin - data['url'] = product_url - data['timestamp'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') - - print(f"数据抓取完成: {json.dumps(data)}") - return data - - except Exception as e: - error_msg = f"运行出错: {traceback.format_exc()}" - print(error_msg) - show_notification(f"采集失败: {str(e)}", "error") - return {} - - def _set_zip_code(self, zip_code, mark=None): - """ - 设置邮编 - - Args: - zip_code: 目标邮编 - """ - try: - # 检查当前邮编 - zip_display = self.tab.ele('xpath://div[@id="glow-ingress-block"]', timeout=10) - - if zip_display: - current_text = zip_display.text - # print(f"当前地址信息: {current_text}") - # 先检查标识 - if mark is not None and mark in current_text: - print(f"邮编检测到标识: {mark},无需修改") - return True - # 检查是否已经包含目标邮编 - if zip_code in current_text: - print(f"邮编已经设置为: {zip_code},无需修改") - return True - - # 需要设置邮编 - print(f"正在设置邮编为: {zip_code}") - - # 点击地址选择按钮 - location_link = self.tab.ele('xpath://a[@id="nav-global-location-popover-link"]', timeout=10) - if not location_link: - print("找不到地址设置按钮") - return False - - location_link.click() - time.sleep(1) - - # 等待邮编输入框出现 - zip_input = self.tab.ele('xpath://input[@id="GLUXZipUpdateInput"]', timeout=10) - if not zip_input: - print("找不到邮编输入框") - return False - - # 输入邮编 - zip_input.input(zip_code, clear=True) - time.sleep(0.5) - - # 点击提交按钮 - submit_btn = self.tab.ele('xpath://input[@aria-labelledby="GLUXZipUpdate-announce"]', timeout=10) - if not submit_btn: - print("找不到提交按钮") - return False - - submit_btn.click() - - continue_btn = self.tab.eles('xpath://div[@class="a-popover-footer"]//input[@id="GLUXConfirmClose"]', - timeout=10) - if len(continue_btn) > 0: - continue_btn[0].click() - - # 等待提交按钮消失(表示请求已发送) - print("等待邮编更新...") - time.sleep(2) - - # 等待页面加载完成 - self.tab.wait.doc_loaded(timeout=30, raise_err=False) - time.sleep(2) - - # 验证邮编是否设置成功 - zip_display_after = self.tab.ele('xpath://div[@id="glow-ingress-block"]', timeout=10) - if zip_display_after: - updated_text = zip_display_after.text - # print(f"更新后的地址信息: {updated_text}") - - if zip_code in updated_text: - print(f"邮编设置成功: {zip_code}") - return True - else: - # print(f"邮编设置可能失败,当前显示: {updated_text}") - return False - - return True - - except Exception as e: - print(f"设置邮编时出错: {traceback.format_exc()}") - return False - - def _scrape_data(self): - """ - 抓取商品数据 - - Returns: - dict: 抓取到的数据 - """ - data = { - 'image_url': "", - 'title': "" - } - - try: - # 等待页面加载 - # time.sleep(3) - title_ele = self.tab.ele('xpath://h1[@id="title"]',timeout=30) - title = title_ele.text - data["title"] = title - imge_ele = self.tab.ele('xpath://div[@id="imgTagWrapperId"]//img',timeout=20) - image_url = imge_ele.attr("src") - data["image_url"] = image_url - return data - - except Exception as e: - print(f"抓取数据时出错: {traceback.format_exc()}") - return data - - def close(self): - """关闭浏览器""" - try: - if self.browser: - self.browser.quit() - print("浏览器已关闭") - except Exception as e: - print(f"关闭浏览器时出错: {str(e)}") - - -class SpiderTask: - mark_name = "亚马逊采集" - - def __init__(self, user_info: dict = None): - """初始化审批任务处理器 - - Args: - user_info: 用户信息字典,包含 company, username, password - """ - self.user_info = user_info or {} - self.running = True - - def log(self, message: str, level: str = "INFO"): - timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - if level == "ERROR": - show_notification(message, "error") - print(f"[{timestamp}] [PriceTask] [{level}] {message}") - - @staticmethod - def group_by_id_prefix(data): - """ - 根据每条数据的 id 字段进行分组: - - 如果 id 为 "2_1",则取 "_" 前面的 "2" 作为分组 key - - 如果 id 为 "1",则分组 key 就是 "1" - - 相同 key 的数据归为同一组 - - :param data: 原始列表数据 - :return: 二维列表,按 id 前缀分组 - """ - grouped = defaultdict(list) - - for item in data: - item_id = str(item.get("id", "")) - group_key = item_id.split("_")[0] - grouped[group_key].append(item) - - return list(grouped.values()) - - def process_task(self, task_data: dict): - """处理审批任务主入口 - - Args: - task_data: 任务数据 - """ - try: - data = task_data.get("data", {}) - task_id = data.get("taskId") - groups = data.get("groups") - - # 用于测试 - limit = data.get("limit", None) - - if not task_id: - self.log("任务ID为空,跳过", "WARNING") - return - - - self.log(f"开始处理爬取任务 {task_id},{len(groups)} 个任务") - - from config import runing_task - runing_task[task_id] = { - "status": "running", - "start_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), - "total_shops": 1, - "processed_shops": 0, - "total_countries": len(groups) , - "processed_countries": 0, - "total_asins": 0, - "processed_asins": 0, - "success_count": 0, - "failed_count": 0, - "stop_requested": False - } - - # 检查是否收到暂停请求 - if task_id in runing_task and runing_task[task_id].get("stop_requested", False): - self.log(f"检测到任务 {task_id} 的暂停请求,停止处理", "WARNING") - runing_task[task_id]["status"] = "stopped" - return - max_retry = 3 - show_notification(f"开始爬取数据", "info") - chrome = ChromeAmzone() - try: - # 数据整理 - # new_items = self.group_by_id_prefix(items) - result = [] - for gp_index,gp in enumerate(groups): - items = gp.get("items", []) - - for index,value in enumerate(items): - - return_data = { - 'image_url': "", - 'title': "" - } - asin = value.get("asin") - country = value.get("country") - # return_data = None - for _ in range(max_retry): - try: - return_data = chrome.run(country, asin) - self.log(f"抓取结果->{return_data}") - break - except Exception as e: - if "与页面的连接已断开" in str(e): - chrome = ChromeAmzone() - if return_data.get("image_url"): - break - - group_item = [ - { - "sourceFileKey": i.get("sourceFileKey"), - "sourceFilename": i.get("sourceFilename"), - "rowToken": i.get("rowToken"), - "groupKey": i.get("groupKey"), - "id": i.get("id"), - "asin": i.get("asin"), - "country": i.get("country"), - "url": return_data.get("image_url"), - "title": return_data.get("title"), - } - for i in items - ] - # task_id: int, chunkIndex:int,chunkTotal: int, country_code: str, asin: str, status: dict,error:str="", - # item_data:dict={}, - res = { - "sourceFileKey": gp.get("sourceFileKey"), - "sourceFilename": gp.get("sourceFilename"), - "groupKey": gp.get("groupKey"), - "baseId": gp.get("baseId"), - "displayId": gp.get("displayId"), - "items": group_item - } - print("================") - result.append(res) - print("================") - is_done = gp_index == len(groups)-1 - if len(result) > 20 or is_done: - self.post_result(task_id=task_id,chunkIndex=gp_index+1,chunkTotal=len(groups), - asin=asin,item_data=result,is_done=is_done) - result = [] - - - if len(result) > 0: - is_done = True - self.post_result(task_id=task_id, chunkIndex=len(groups), chunkTotal=len(groups), - asin=asin, item_data=result, is_done=is_done) - - try: - chrome.close() - except Exception as e: - print("退出浏览器出错",e) - # 更新已处理店铺数 - if task_id in runing_task: - runing_task[task_id]["processed_shops"] += 1 - except Exception as e: - import traceback - self.log(f"处理店铺 {task_id} 失败: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - - # 更新任务状态 - if task_id in runing_task: - if runing_task[task_id].get("stop_requested", False): - runing_task[task_id]["status"] = "stopped" - self.log(f"任务 {task_id} 已被暂停!") - else: - runing_task[task_id]["status"] = "completed" - self.log(f"任务 {task_id} 处理完成!") - - except Exception as e: - import traceback - self.log(f"任务处理失败: {traceback.format_exc()}", "ERROR") - if task_id: - from config import runing_task - if task_id in runing_task: - runing_task[task_id]["status"] = "failed" - runing_task[task_id]["error"] = str(e) - - def post_result(self, task_id: int, chunkIndex:int,chunkTotal: int, asin: str, error:str="", - item_data:dict={}, - is_done: bool = False): - """回传处理结果到API - """ - - url = f"{DELETE_BRAND_API_BASE}/api/appearance-patent/tasks/{task_id}/result" - - payload ={ - "submissionId": f"{int(time.time())}", - "chunkIndex": chunkIndex, - "chunkTotal": chunkTotal, - "error": error, - "groups": item_data, - "done": is_done - } - - max_retries = 3 - for retry in range(max_retries): - try: - request_timeout = 300 if is_done else 30 - print("================【详情采集】=====================") - self.log(f"尝试回传结果 (第 {retry + 1}/{max_retries} 次)") - self.log(f"回传URL: {url}") - self.log(f"回传数据: {payload}") - response = requests.post( - url, - json=payload, - headers={"Content-Type": "application/json"}, - timeout=request_timeout, - verify=False - ) - self.log(f"回传结果: {response.text}") - data = response.json() if response.text else {} - if response.status_code == 200 and isinstance(data, dict) and data.get("success"): - self.log(f"结果回传成功: {asin} - {item_data}") - return - else: - self.log(f"结果回传失败,状态码: {response.status_code}", "WARNING") - print("=====================================") - - except Exception as e: - self.log(f"调用API异常: {str(e)}", "ERROR") - print("=====================================") - - # 如果还有重试机会,等待后继续 - if retry < max_retries - 1: - time.sleep(2) - - self.log(f"已达到最大重试次数,结果回传最终失败", "ERROR") - raise RuntimeError("已达到最大重试次数,结果回传最终失败") - -if __name__ == '__main__': - # spide = SpiderTask() - task_data = [ - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1", - "asin": "B0D792ND9V", - "country": "英国", - "url": "", - "title": "低" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2_1", - "asin": "B0D14L34S7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3_1", - "asin": "B0CWQFZMGY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B0CX87XXWJ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5_1", - "asin": "B0CR3PMR8L", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B0DK3L6FD4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8", - "asin": "B0D9QNV6FT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10_1", - "asin": "B0DBZG716J", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11_1", - "asin": "B0CX8K4F8Z", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12_1", - "asin": "B0C4KXJWW1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13", - "asin": "B0D62LNNKQ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14", - "asin": "B0DK3K3GF5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15_1", - "asin": "B0C1HN8GY6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16_1", - "asin": "B0B71WMDDF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18_1", - "asin": "B0DSZNF73N", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19", - "asin": "B0897Y5QDC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22_1", - "asin": "B0FNCLNS68", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23_1", - "asin": "B009U2SCMW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24", - "asin": "B0FBLY2ZRD", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B08LP7DW3M", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28_1", - "asin": "B0FPBZLD6R", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B09LV1TNHK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1_1", - "asin": "B0DSKS214Y", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2_1", - "asin": "B0BZBW8KL5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B0CR3LS3R7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4", - "asin": "B097TS2MNQ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B09LV4WGTR", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6_1", - "asin": "B0916ZQP1V", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B0C9WHZ67N", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9", - "asin": "B0F8QKVS1D", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B0D49974HV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0F2DXMKVF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12_1", - "asin": "B08YX48NZ2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14", - "asin": "B0BGM3HF9C", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15", - "asin": "B0CJJM9KZV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16_1", - "asin": "B09HDSTGT4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17", - "asin": "B0CX9HK5NL", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18", - "asin": "B0C2BV83D3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19_1", - "asin": "B0D5WDK7GW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20", - "asin": "B09NR1PZYD", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21", - "asin": "B0DC45N1Y8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23", - "asin": "B01AVHJQY2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0F3VSJ9Q2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27", - "asin": "B0CLXCXW6W", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28", - "asin": "B07PSPN1XH", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29_1", - "asin": "B09PHQYR6Z", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B0CT2H94WV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1", - "asin": "B0FRRK9V73", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3_1", - "asin": "B0B3RNHXV8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4", - "asin": "B09FF115TW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B0CYGXDWBT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B0F9FT3ZPY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7", - "asin": "B0F295JTQZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8", - "asin": "B0FPJZ1N51", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9_1", - "asin": "B08B8SP7XT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12_1", - "asin": "B002P7HGEO", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13_1", - "asin": "B09X268FXC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14_1", - "asin": "B0170OT3X8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15_1", - "asin": "B0859793H1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17", - "asin": "B0FP8KHCPX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18_1", - "asin": "B09H6KR87N", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19_1", - "asin": "B0D9778Q65", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B0CPJCBZR8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21", - "asin": "B0CZ63NGNQ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22", - "asin": "B0CR4795W6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23", - "asin": "B0CR45ZB5Y", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24_1", - "asin": "B0CYB255ST", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25", - "asin": "B0BMYWFKTF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26", - "asin": "B0BMYTPRD6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B0DK1MGDZM", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28", - "asin": "B006FUXS30", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B00BLPUXCI", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1", - "asin": "B09N79DR4C", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2", - "asin": "B006O74WTI", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B006O75DIC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4", - "asin": "B09323MXYP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B00K2NTEPC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B09C19Y6B3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7", - "asin": "B00L2HK0S2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8", - "asin": "B00666DQBW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9", - "asin": "B00666FLII", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B00666GVM8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11_1", - "asin": "B07KWJCVVN", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13_1", - "asin": "B00F0KAGKO", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14_1", - "asin": "B0C695NBMR", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15_1", - "asin": "B0F2FXYCG4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16", - "asin": "B0FPGC8Z84", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17_1", - "asin": "B0D8HXBGGB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18_1", - "asin": "B0DDG8GJP9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19", - "asin": "B0FLCZVDDH", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B07WZZW6V9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21", - "asin": "B0GT3SJ6J1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22", - "asin": "B077R1GRW1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23", - "asin": "B0D2TMYX23", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24_1", - "asin": "B00AXTKYCM", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0D45CB5SS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B0852JR7RD", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27", - "asin": "B0GR9F93JL", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28_1", - "asin": "B0CCJ3NY78", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29_1", - "asin": "B0D1V26VBG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1", - "asin": "B0CN5VVWB2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2", - "asin": "B0DLNJTKFB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B0CSD7S964", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B0GLP8L4TT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B0FGJB6LLV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B0DZ67MYZN", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7", - "asin": "B0G3XP9VYB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8", - "asin": "B0FNWMRMSZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9", - "asin": "B0FNWP3K72", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10_1", - "asin": "B0DQTMRNLC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0DZ62KT5N", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13", - "asin": "B0DZ65VCDC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16", - "asin": "B0DZ67P85P", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17_1", - "asin": "B0F6LRCZXW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18", - "asin": "B0DPYVJMLK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19", - "asin": "B0FDKZJTY5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20", - "asin": "B0D9VFN9QW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21_1", - "asin": "B0BW46XZ2G", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22", - "asin": "B0FLCBQ92M", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23_1", - "asin": "B0F6JW61SR", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24", - "asin": "B0CNZ27HCF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B001DKRB8A", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B00NH5DWIW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28", - "asin": "B01IOKEOGS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29", - "asin": "B08YJVVPBK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B0FG29NPDK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1", - "asin": "B0FRFHFXXZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B0FMQ5G18V", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B0DPDKD5PB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6_1", - "asin": "B0FS6JDGNW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8", - "asin": "B0DZBM5VRX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11_1", - "asin": "B0D4Q2KB8X", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12_1", - "asin": "B098B3XKRS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13_1", - "asin": "B09F9JM8F9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14", - "asin": "B08H5M3ZQ7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15", - "asin": "B0DG3NXCCF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16_1", - "asin": "B0FJX2FSM1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17", - "asin": "B089KHDH15", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18_1", - "asin": "B0CPWP6W5M", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19_1", - "asin": "B0D4LXTCSZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B0CK682F4T", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21_1", - "asin": "B0B9CGJDBV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23", - "asin": "B0DV55H9DD", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25", - "asin": "B0FJ8B8RJS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B0D426K41D", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27", - "asin": "B0CTD4BF7S", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29_1", - "asin": "B0CGXGQ43L", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30_1", - "asin": "B0BDM3B6LY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1", - "asin": "B0FS1SJGJ5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2", - "asin": "B0FJ1RH4JV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B0B9MBTX28", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4", - "asin": "B0FV2VLSX1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5_1", - "asin": "B0BRYKW1GD", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7_1", - "asin": "B0CT5G9YWM", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B0D927DZ6B", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9", - "asin": "B0DSDY3G29", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10_1", - "asin": "B0CWRRSV9H", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0DNDTT9Z4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13", - "asin": "B0CP5VD5SG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14_1", - "asin": "B0BV2Q24YK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15_1", - "asin": "B0F3JD29KW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16", - "asin": "B0C818XVYT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17", - "asin": "B0FJRYQ3QV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18", - "asin": "B0CP3NYG8J", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19", - "asin": "B0F6C7XH75", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B0FXX9N5VH", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22_1", - "asin": "B0CFJPCSDP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24_1", - "asin": "B0FQJHS1MZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0D5VJN99L", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26", - "asin": "B07MCDWVJG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B0CKYJCJGD", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28_1", - "asin": "B0CQXPR4H4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29", - "asin": "B08S2913J7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30_1", - "asin": "B0CXPL3GSW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1", - "asin": "B0D7JVZWZF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2", - "asin": "B0FKMXP3ZR", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B0FGP7YJC8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B0F9PDZTCJ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5_1", - "asin": "B0CTLXM3C6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6_1", - "asin": "B0CSYB8BPK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7_1", - "asin": "B01I1CEEXW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8", - "asin": "B0G2Y49LCY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9_1", - "asin": "B0F3HK55L6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B0GWJ69JK1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11_1", - "asin": "B09Z877C17", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12", - "asin": "B0GLDX9NB1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13_1", - "asin": "B0FPC1Y19B", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14", - "asin": "B0C65438CP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17", - "asin": "B0F6MNZB6F", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18", - "asin": "B0BVPLLLRP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B0FK2B5FK2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21_1", - "asin": "B0BPNFMKQV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22", - "asin": "B0G4BLRDW6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23", - "asin": "B0F93QCQF1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24", - "asin": "B0FHHPYP9K", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28", - "asin": "B0F1K9KDX6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29", - "asin": "B0F52ZXD55", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30_1", - "asin": "B07GDGSKK6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1_1", - "asin": "B08BPHJ34D", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2", - "asin": "B07ZFWRH75", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B0G5PVP3Y3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4", - "asin": "B0FXXLPC1T", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B0GQB1K38X", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B0C1TCDZ5N", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8", - "asin": "B0FHD3QCLW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9_1", - "asin": "B0F1THT9XW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0DYJ8743N", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12_1", - "asin": "B0FD3Q2RGP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13_1", - "asin": "B0BV66T3PQ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14_1", - "asin": "B0CDVYLTB4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16", - "asin": "B0CNKGFWKR", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17", - "asin": "B0D4VQF22F", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18_1", - "asin": "B0C5TBR8LB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19", - "asin": "B0DDH3G9PG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B0D8VRMWP2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22_1", - "asin": "B0BFWXWNTC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23_1", - "asin": "B096ZCL4JX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24_1", - "asin": "B0CFDXR5FC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25", - "asin": "B0G6DN5QC7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B0CNRL9R1F", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B0BJK6D2D4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28_1", - "asin": "B0DPFDTL7W", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29_1", - "asin": "B0G5N9KGXC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30_1", - "asin": "B0F73X9X8D", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1", - "asin": "B0CJTJB8PV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2", - "asin": "B0FBGD3QJ2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B0F98TGSQ1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B0F329ZXH5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B0G191SX5F", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B0F7XT5TNY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7", - "asin": "B0FVS7K78Q", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B0FYFZBQLT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B0FG2LHWB3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0F9WX88T1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12", - "asin": "B0F7XNDBNN", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14", - "asin": "B0DT7GV9NS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15_1", - "asin": "B0DKF26TYN", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18_1", - "asin": "B0D1FP339J", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20", - "asin": "B0CNCBQCMG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21_1", - "asin": "B0CHRR45X7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23", - "asin": "B0C1RPB8BQ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24", - "asin": "B0BVPPBH7D", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25", - "asin": "B0BHQKQMG8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26", - "asin": "B0C7QQPNC9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27", - "asin": "B0FHKT5CBC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29", - "asin": "B0DR5XVMN7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B08HPS68Q4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1", - "asin": "B0C4KLQPDZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2", - "asin": "B0F6TT21VN", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B08MFB5W4Q", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B07C9Z5CG5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B07589LNBP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B08HRLZVX2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7", - "asin": "B08K7B3T6P", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8", - "asin": "B09T9YYYTS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9", - "asin": "B081ZVNH98", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B0F6T4XMXY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11_1", - "asin": "B07QH4X4Y5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12_1", - "asin": "B096S27HMH", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13_1", - "asin": "B0FB9DWYXF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14_1", - "asin": "B08R58FBXZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15_1", - "asin": "B0CRK8YNNY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16_1", - "asin": "B09C8F7J2H", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17", - "asin": "B0F6TK2KP3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18_1", - "asin": "B0BYJHNBWM", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B0DJBZXCDP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21_1", - "asin": "B0FMRGW63W", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22_1", - "asin": "B0D175WMJC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23_1", - "asin": "B07FLD65NM", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24", - "asin": "B0DRFWYNNV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0DZX3JWQP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B0F5X5G34F", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28_1", - "asin": "B0BJDL1D9W", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29_1", - "asin": "B0BYJMMMLX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30_1", - "asin": "B092M4RJVV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1_1", - "asin": "B092M49F1Q", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2_1", - "asin": "B0FMRFHRZR", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3_1", - "asin": "B0DZWVVM6F", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B0BCNZZ32X", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6_1", - "asin": "B0BRC8PXMW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7_1", - "asin": "B07RL77RM9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B0FMRBN7H4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9_1", - "asin": "B0FMRGHCPK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B0G4BWPCK7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11_1", - "asin": "B0CJJ4Y8SB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13_1", - "asin": "B0DYY436WG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14", - "asin": "B0G64PMQ94", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16_1", - "asin": "B0CST698J6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17_1", - "asin": "B00U7LUWR8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18", - "asin": "B0DHRJX1VS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20", - "asin": "B0CY9NB8VS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21_1", - "asin": "B08ML38H24", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22_1", - "asin": "B0BXVBVJ6G", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23_1", - "asin": "B08HS69FQG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25", - "asin": "B0F281WHDB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B0007RN382", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B0F2JDR3Y5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28", - "asin": "B0FX9L2JJ4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29_1", - "asin": "B0FD9NVNFT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B0B72HD5B9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2_1", - "asin": "B0F53FQ9Y4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3_1", - "asin": "B0GHDHPQ7J", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5_1", - "asin": "B07B9ZP8TK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B0DPWW9P2V", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7_1", - "asin": "B0CR43DTKJ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8", - "asin": "B0G8K4C3D6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10_1", - "asin": "B0F52TLKVM", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0BGH6Y6KB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12_1", - "asin": "B0D28VG1C3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13_1", - "asin": "B0D3LLKF7C", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14", - "asin": "B09KT2VBJL", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15_1", - "asin": "B07F6P6C3F", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18_1", - "asin": "B0GCZH5V2P", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19_1", - "asin": "B0FH5RNFZQ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B0CSFMDTSR", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21", - "asin": "B0GR9TS4N8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22", - "asin": "B0D9GWVPGJ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23_1", - "asin": "B0GF2BKHJK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24_1", - "asin": "B0GQZ8SPZZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0D3LQF6P5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B0GF2ML2NY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B0C28BCVH6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28_1", - "asin": "B0C1CRZPMS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29_1", - "asin": "B0F8HKX897", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30_1", - "asin": "B0GSKSC1KR", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2_1", - "asin": "B0GSQGF76K", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3_1", - "asin": "B0F9WTNVXP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B0F47S987P", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5_1", - "asin": "B0F4Y4F5TC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6_1", - "asin": "B0DYNW29NB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7_1", - "asin": "B0GF29HX77", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B0GM2WBVXF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9", - "asin": "B0GGWW658M", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B0F32R7JTF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0DZ67TBHQ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12_1", - "asin": "B0CLC6KSZH", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13_1", - "asin": "B0F8QW1FS1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14_1", - "asin": "B0F6LHFVJ3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16", - "asin": "B0DZH72GF6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17_1", - "asin": "B099N1FB4K", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18", - "asin": "B0BS678GBK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19_1", - "asin": "B0F5Y4KSQJ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B0D584KC9W", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21_1", - "asin": "B0GK1D75ZF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22_1", - "asin": "B0DPWXNWV5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23_1", - "asin": "B0G64ZCGTV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24_1", - "asin": "B07VHK16YV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0GS3QV5F2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B0DC7TR9B5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B0FH634932", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28_1", - "asin": "B0CY2XN6JF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29_1", - "asin": "B0GKR5WMXK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B0GH4KYZH5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1_1", - "asin": "B0FD76KJ9P", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B0836NDGM2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4", - "asin": "B0DYJWTS4N", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B089X4VCPY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B0CQZR1LZX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7_1", - "asin": "B0GSVTDQBX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B0D9TK3VMD", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9_1", - "asin": "B0GDZWHF6D", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10_1", - "asin": "B0C8N1LZT9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12", - "asin": "B0GWHQHKJS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13", - "asin": "B0BTTJKZDC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14", - "asin": "B0DZPDJ7Q4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15_1", - "asin": "B0D5W9F2DS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16_1", - "asin": "B0CGCPLWV1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17_1", - "asin": "B09VT58BM4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19_1", - "asin": "B07XZT797H", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20", - "asin": "B0GW9TR89X", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23_1", - "asin": "B09ZKT7QW6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0CJYRW7RL", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B0DSZ4V9PJ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B09TKN8F9W", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28_1", - "asin": "B09SW82GSP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2_1", - "asin": "B001F4OSJY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B091BK7ZF3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B07HSL53DY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B07HSDTYC8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6_1", - "asin": "B0FKN7JZ6B", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7_1", - "asin": "B071XJDSBK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B006UITUJ8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10_1", - "asin": "B0CBPWL6NZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0G3Q9B48L", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12", - "asin": "B0BYJV8P98", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13_1", - "asin": "B0G8DTQP1F", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14_1", - "asin": "B0CYP192B6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15_1", - "asin": "B0CCN8TJCD", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16_1", - "asin": "B0FWKJVMNK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19", - "asin": "B0GD11NDH2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B0BC2NFJBP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21_1", - "asin": "B0D9RRCC93", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23_1", - "asin": "B0DLSZFMM2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24_1", - "asin": "B0GFBG4HSR", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B07TBCFGPT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27", - "asin": "B0GSZRFZGZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29_1", - "asin": "B008OB1AZ6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30_1", - "asin": "B09XLVPYPR", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1_1", - "asin": "B0FZK5NCWK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2_1", - "asin": "B0DYJTRT6K", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3_1", - "asin": "B0CL664TZX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B0DN6XQ5W4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5_1", - "asin": "B002HNNWLM", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6_1", - "asin": "B0F5HHHR65", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7_1", - "asin": "B0G5739C1J", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B0G11TTQPT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9_1", - "asin": "B0G579K29G", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B0G57DKM85", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0DGFW14PB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12_1", - "asin": "B0DK3YXKS5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13_1", - "asin": "B0FGTHRS1R", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14_1", - "asin": "B0FP2FDZPZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15", - "asin": "B002HO7QQ8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16_1", - "asin": "B002HNS1TU", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17_1", - "asin": "B004KL50HS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18_1", - "asin": "B07QK3B4Q5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19", - "asin": "B08DVGHKLL", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20", - "asin": "B08K3ZYRGC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21", - "asin": "B0DZWVCVK1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23_1", - "asin": "B0CT29V1D5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24_1", - "asin": "B01N7G9ALO", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25", - "asin": "B0CQLN3T6N", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B0FJKTYHSV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28", - "asin": "B0FRFNVTKX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1", - "asin": "B0DJQWP543", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B0D7M543CT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B0F21QQQL1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B0CMZR1JJD", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B0F66NTL6T", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7", - "asin": "B0D976JCLF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B0FP2DMFMG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9_1", - "asin": "B0CTDM36PB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B0DY76XFLY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0CQ4PS256", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12_1", - "asin": "B0C15RDVDK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13", - "asin": "B0F5Y8Y58T", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14", - "asin": "B0B5CBKC17", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16_1", - "asin": "B0FMXVRQM2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18", - "asin": "B0DC2WX8Q2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19_1", - "asin": "B0FVR6L7NP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B0DFQMCBS7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21", - "asin": "B07TSMHP3T", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23_1", - "asin": "B09DY2KCLB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0GRTXKMGZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26", - "asin": "B0BG4TTWWW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B0FC2QBR9T", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29_1", - "asin": "B09Y2H27PS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30_1", - "asin": "B0CTGLQFCD", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2_1", - "asin": "B01MCVO50E", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B0FJXM3T1S", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B0C8MG6NF7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5_1", - "asin": "B0C7NK648Y", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B0DYFDXD8N", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7", - "asin": "B0GGMLRZWF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B0D45VVD1Y", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9_1", - "asin": "B0CC6KP279", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12", - "asin": "B0FRZYQYGT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13", - "asin": "B0DK447HBK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14", - "asin": "B0788GRQT1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15", - "asin": "B0F93QPPVD", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16_1", - "asin": "B0BRQG6CKG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17", - "asin": "B09DCW6XN1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18", - "asin": "B0FSQDHC9V", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19_1", - "asin": "B0D25DHV1T", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B0DJF4Z91G", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21_1", - "asin": "B0F3J3B1R2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24_1", - "asin": "B0F3J6WJZJ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B0FQTWP8GM", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28", - "asin": "B0FPQL1ZW9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29_1", - "asin": "B0B77PQ12W", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B0FXWTDY16", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1_1", - "asin": "B0D6ZV5F22", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2", - "asin": "B0BF13CW1W", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B0F52CM3X1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B0043RJSSG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5_1", - "asin": "B07V2G46J7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6_1", - "asin": "B07X4V22PW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7_1", - "asin": "B0GQXDVW6C", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8", - "asin": "B0BK888623", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9_1", - "asin": "B0BFWC5SZQ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10_1", - "asin": "B0F1C9ZQKD", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B09F5VV8DW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12", - "asin": "B0BWMT9LFC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14_1", - "asin": "B0FJLQLRNT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15", - "asin": "B08ZCNVYTK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16", - "asin": "B0CMZLKY9T", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17", - "asin": "B0GJZXZ2F9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18", - "asin": "B07BMFCKCR", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19_1", - "asin": "B0DK46T977", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20", - "asin": "B08HCPX1MB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21_1", - "asin": "B0D8L6WRCM", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23_1", - "asin": "B09NDN8NV1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24", - "asin": "B0GT2527XG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0FNRCLHNS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B0DQS8GKLG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B003NGLFYI", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28", - "asin": "B0CR4FTMGG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29", - "asin": "B0DK9ZBBKS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B0D1XX28FN", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1_1", - "asin": "B003KHEEY8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2_1", - "asin": "B0F9WRKC84", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B08BHKGYJ7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4", - "asin": "B0FT1562DX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B0F8QRJ9JB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6_1", - "asin": "B0070OARSO", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7", - "asin": "B07XJ4W6SW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B0C1V86KMX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9_1", - "asin": "B0CGM1Z2VG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10_1", - "asin": "B004699SWM", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0GT281VQK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13_1", - "asin": "B09BCSR7NQ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24_1", - "asin": "B003YCKTIE", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29_1", - "asin": "B092CGQN2K", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30_1", - "asin": "B001WSDMBI", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B079C2CDLD", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B077WX43MH", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6_1", - "asin": "B0FQ2YC11V", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7_1", - "asin": "B0DRFQJ6CX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B0BX65MF93", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9", - "asin": "B0CT5ZR247", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B0BFXLLR2F", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11_1", - "asin": "B0FDQT4X7W", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13_1", - "asin": "B0FQ2XD95Z", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15", - "asin": "B094RDMZ3Z", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16_1", - "asin": "B0DMZHTJY2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18", - "asin": "B0CS2TQGM5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19", - "asin": "B0DG2XK945", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21", - "asin": "B0G2LNGQPK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22", - "asin": "B0G4R1RHYH", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24_1", - "asin": "B0GSRZM4XB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25", - "asin": "B0D926NJN9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26", - "asin": "B01LZBHEKJ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27", - "asin": "B09LQL4S9Q", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29_1", - "asin": "B0CQTPF6BJ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B0DZVY2F7M", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1", - "asin": "B0GMYGQ2G6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3_1", - "asin": "B0C5WQ6DFB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B0DJVK3SC4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5_1", - "asin": "B000N324DU", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B074F6YQZW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7_1", - "asin": "B09MD5W6Z5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8", - "asin": "B0F94GJX9D", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9", - "asin": "B0DP298J3J", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B010W3V6Z2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11_1", - "asin": "B0F24BSV4V", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12", - "asin": "B0B9MKBPH9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13", - "asin": "B0BHHKC5JQ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14", - "asin": "B0B4RFNK72", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15", - "asin": "B01LXD3KE6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17", - "asin": "B010W3V1W0", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18", - "asin": "B095JNPP53", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B0D7DSBNNH", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21", - "asin": "B0B935PV25", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22", - "asin": "B0B67XDHPQ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24", - "asin": "B072Z1PQM2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0CT1J5HWX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26", - "asin": "B097G2DXSQ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27", - "asin": "B010W3VLE8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28", - "asin": "B00R39MP4A", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29", - "asin": "B095JMYSQ9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B0F8F5H3MG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1", - "asin": "B0DNM4R43P", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2", - "asin": "B0FCFB3X78", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B0CN4KXVWF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4", - "asin": "B0D455HLWT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B0B1HYLLYT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6_1", - "asin": "B0F1TKQG14", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7", - "asin": "B0F32CLT9F", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8", - "asin": "B0DJXYDPFC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9", - "asin": "B0B3RRLNCT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B0F2DR94NT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0BL7HRF5R", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12", - "asin": "B0B6PT6D7Q", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13", - "asin": "B0FF4FLHM4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14", - "asin": "B07L2476DB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15", - "asin": "B0CK4379VH", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16", - "asin": "B0BRFW6XF4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17", - "asin": "B07BZT7699", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18_1", - "asin": "B0D8W4JRTY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19", - "asin": "B0F9NQMWGC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20", - "asin": "B07CF8KD48", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21", - "asin": "B0F9NWBVD8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22", - "asin": "B0DSZK41Z9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23", - "asin": "B0DHP1TPQL", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24_1", - "asin": "B0DPHSPQRP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0BVZ3VKNX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26", - "asin": "B0FPX7363M", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B0F9KCHB7F", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28_1", - "asin": "B07L3H5DDW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B003K5S4NW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1_1", - "asin": "B0BNVHXLDN", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2", - "asin": "B0FC2R299V", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B0BNVJPSDT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B0CCRNRHYW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6_1", - "asin": "B0FP2NQM67", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7", - "asin": "B0DRSD66T3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B0DM6CS4KG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9_1", - "asin": "B0GQ2YGFTR", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B0F1LNXRSH", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0GJ59NQTT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12", - "asin": "B0GKY1T54N", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13", - "asin": "B0FZNMHLDY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14_1", - "asin": "B0DHWYL3JP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16_1", - "asin": "B0CW5DD6SC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17_1", - "asin": "B0CRH7T5WG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19_1", - "asin": "B0CRR6F9JX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20", - "asin": "B09D3XG1PT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22", - "asin": "B00AFGCL42", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24_1", - "asin": "B0CXP3619X", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0CW5GFQX3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B0CZDK561H", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B0FKLRMG14", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28_1", - "asin": "B0DFQWC297", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1_1", - "asin": "B0DGPV9QY8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2_1", - "asin": "B0GV3W42MJ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3_1", - "asin": "B0DK4JV5YY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B0CV4K3HSW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9", - "asin": "B0FN5YD344", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B01HY4XZE2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13", - "asin": "B0D485JG3T", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15", - "asin": "B0GC584NTL", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16", - "asin": "B0FDQLKJL3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18_1", - "asin": "B0D6RBQR4Q", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19_1", - "asin": "B0CSLMZ4XS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B0FC64KYP9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21_1", - "asin": "B0FH234TL6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22_1", - "asin": "B0F6D4Z3WB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23_1", - "asin": "B0F8RCZ91V", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24_1", - "asin": "B0FP5Q7B7X", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0FM88JBRX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B0CKMT72MX", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27", - "asin": "B0C4JT7PHB", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28", - "asin": "B0C1RMVGTZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29", - "asin": "B07BFQJ3G5", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B074VGHYF8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1", - "asin": "B015AK9JXI", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2_1", - "asin": "B084WSGN9C", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3_1", - "asin": "B0FHWJ42Q8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4_1", - "asin": "B0CZDTGFSQ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5_1", - "asin": "B0F7XKNY9L", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B0DWLFKPNW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7_1", - "asin": "B0CWDPSJG4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8_1", - "asin": "B0G488Z8JG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9_1", - "asin": "B0BYRQ5TBY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B0CWH1MRCV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0FSCXLBHZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12", - "asin": "B0GH6YJX2L", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "13_1", - "asin": "B0GMQ29YQ9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14_1", - "asin": "B0BQLX4QP3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15", - "asin": "B0FXVHQNQ4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16", - "asin": "B072DVNZYH", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17_1", - "asin": "B0G198MZH3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18", - "asin": "B0F7HGQHLP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19", - "asin": "B0B9M83MZV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20", - "asin": "B074P9YRGW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21_1", - "asin": "B0G3YJ32Q4", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22", - "asin": "B0D8RXPCH6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24", - "asin": "B0CBPKKT98", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0DGG82L25", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26", - "asin": "B0FXVNDFHC", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27", - "asin": "B0CYY2YJ2S", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28", - "asin": "B0FC34Z9P6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29", - "asin": "B0018MQIVO", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B018OQ66AE", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "1", - "asin": "B0FNMK6R7Z", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B0CTJ8WRWZ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4", - "asin": "B0CTJ9522Y", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B0CTJ88CKR", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B07DL3PBL7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7_1", - "asin": "B0C96V7HFN", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8", - "asin": "B079HQKBP3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9", - "asin": "B0BZHW8VQ6", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10_1", - "asin": "B019RKRGWS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B0DCLSFGQS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12", - "asin": "B07FL8Y4BP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14", - "asin": "B01NBVCL86", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15_1", - "asin": "B0C8J5Z7VN", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16", - "asin": "B0CP73M8ST", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18", - "asin": "B0G2XVTF2R", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19_1", - "asin": "B08GCVHM9S", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20_1", - "asin": "B0B5X3YGMP", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22", - "asin": "B07VM7QS8C", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23", - "asin": "B0F93G7KFF", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24", - "asin": "B098B8QTM1", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25_1", - "asin": "B0F4WSK73F", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B0DC5M4XT7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27", - "asin": "B07SD5DWFT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "28", - "asin": "B082ZNZG3X", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29", - "asin": "B084M4ZGC3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "30", - "asin": "B0FXH7SVWV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "3", - "asin": "B07RM4MB3H", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "4", - "asin": "B0154H395G", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "5", - "asin": "B08CHFDRJT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "6", - "asin": "B09YQ3D7CW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "7_1", - "asin": "B087YTMRK8", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "8", - "asin": "B08WKDDV96", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "9", - "asin": "B0GFMG4SFT", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "10", - "asin": "B07KWY3XLW", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "11", - "asin": "B07RQTKPSK", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "12", - "asin": "B0CRHC42M2", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "14", - "asin": "B07RGG2TCV", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "15", - "asin": "B0CTJNQ5MH", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "16", - "asin": "B0GGZSVY7G", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "17", - "asin": "B0G3WTPGMG", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "18", - "asin": "B0GH136M59", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "19", - "asin": "B0G3WJP9HJ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "20", - "asin": "B0814RZNHY", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "21", - "asin": "B09ZXZH432", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "22_1", - "asin": "B0BWY99XXS", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "23", - "asin": "B0849Y6VYJ", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "24", - "asin": "B0FKBBNN2G", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "25", - "asin": "B07SBWB2X9", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "26_1", - "asin": "B0DK4JNBM3", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "27_1", - "asin": "B0FFZ3636F", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "29", - "asin": "B0BRGZKXN7", - "country": "英国", - "url": "", - "title": "" - }, - { - "sourceFileKey": "", - "sourceFilename": "", - "rowToken": "", - "groupKey": "", - "id": "2", - "asin": "B0GSTM85H3", - "country": "英国", - "url": "", - "title": "" - } -] - # spide.process_task(task_data) - res = SpiderTask.group_by_id_prefix(task_data) - print(res) \ No newline at end of file diff --git a/app/amazon/main.py b/app/amazon/main.py deleted file mode 100644 index af4ac75..0000000 --- a/app/amazon/main.py +++ /dev/null @@ -1,175 +0,0 @@ -import traceback -import requests -import threading -from datetime import datetime -from typing import Dict, Any, List -from concurrent.futures import ThreadPoolExecutor, as_completed -from config import JSON_TASK_QUEUE, runing_task, runing_shop, DELETE_BRAND_API_BASE, ZN_COMPANY, ZN_USERNAME, ZN_PASSWORD -from amazon.del_brand import AmazoneDriver, DelbramdTask -from amazon.approve import ApproveTask -from amazon.match_action import MatchTak -from amazon.price_match import PriceTask -from amazon.asin_status import StatusTask -from amazon.patrol_delete import PatrolDeleteTask -from amazon.detail_spider import SpiderTask -from amazon.similar_asin import SimilarAsinTask -from amazon.amazon_base import kill_process - - -class TaskMonitor: - """任务监控器:负责监控队列并执行品牌删除任务""" - - def __init__(self): - """初始化任务监控器""" - self.running = True - self.user_info = { - "company": ZN_COMPANY, - "username": ZN_USERNAME, - "password": ZN_PASSWORD - } - - self.chunk_index = 1 # 当前处理的分块索引 - self.max_workers = 5 # 线程池最大线程数 - self.executor = None # 线程池执行器 - self.serial_task_locks = { - "product-risk-resolve-run": threading.Lock(), - } - - # 在提交新任务前杀掉旧进程(确保环境干净) - kill_process("v6") - kill_process("v5") - - def log(self, message: str, level: str = "INFO"): - """日志输出 - - Args: - message: 日志消息 - level: 日志级别 - """ - timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - print(f"[{timestamp}] [{level}] {message}") - - def start(self): - """启动任务监控(使用线程池处理任务)""" - self.log(f"任务监控器启动,开始监听队列... (线程池大小: {self.max_workers})") - - # 创建线程池 - self.executor = ThreadPoolExecutor(max_workers=self.max_workers) - futures = [] # 保存所有提交的任务Future对象 - - task_type_info = { - "delete-brand-run" : "删除品牌", - "product-risk-resolve-run" : "产品风险审批", - "shop-match-run" : "匹配价格", - "price-track-run" : "跟价", - "query-asin-run" : "状态查询", - "patrol-delete-run" : "巡店删除", - "appearance-patent-run" : "亚马逊采集", - "similar-asin-run" : "相似ASIN" - } - try: - while self.running: - try: - # 超时后继续循环检查self.running状态,避免卡死 - task_data = JSON_TASK_QUEUE.get(block=True, timeout=30) - - # 检查任务类型 - task_type = task_data.get("type", "") - - if task_type in task_type_info: - # 提交产品风险审批任务到线程池 - self.log(f"接收到任务,提交到线程池处理...") - future = self.executor.submit(self._process_approve_task_wrapper, task_data, task_type_info[task_type]) - futures.append(future) - - else: - self.log(f"未知任务类型: {task_type},跳过", "WARNING") - continue - - # 清理已完成的future对象,避免内存累积 - futures = [f for f in futures if not f.done()] - - except Exception as e: - # 静默处理队列为空的超时,只记录真正的异常 - if str(e) and "Empty" not in str(e): - self.log(f"任务监控异常: {str(e)}", "ERROR") - # 队列为空时不需要额外等待,直接继续循环 - - finally: - # 关闭监控时,等待所有任务完成 - self.log("正在关闭任务监控器,等待所有任务完成...") - if self.executor: - self.executor.shutdown(wait=True) - self.log("所有任务已完成,监控器已关闭") - - def _process_task_wrapper(self, task_data: Dict[str, Any]): - """任务处理包装器(用于线程池调用) - - Args: - task_data: 任务数据 - """ - try: - self.log(f"线程 {id(task_data)} 开始处理任务...") - self.process_task(task_data) - self.log(f"线程 {id(task_data)} 任务处理完成") - except Exception as e: - self.log(f"线程 {id(task_data)} 删除品牌任务处理异常: {traceback.format_exc()}", "ERROR") - - def _process_approve_task_wrapper(self, task_data: Dict[str, Any],TASK_TYPE:str): - task_type = task_data.get("type", "") - task_lock = self.serial_task_locks.get(task_type) - if task_lock is not None: - self.log(f"线程 {id(task_data)} 等待 {task_type} 串行锁...") - with task_lock: - self.log(f"线程 {id(task_data)} 获取 {task_type} 串行锁,开始处理...") - return self._process_approve_task_unlocked(task_data, TASK_TYPE) - return self._process_approve_task_unlocked(task_data, TASK_TYPE) - - def _process_approve_task_unlocked(self, task_data: Dict[str, Any],TASK_TYPE:str): - """审批任务处理包装器(用于线程池调用) - - Args: - task_data: 任务数据 - """ - try: - TASK_INFO = { - "删除品牌": DelbramdTask , - "产品风险审批" : ApproveTask, - "匹配价格" : MatchTak, - "跟价" : PriceTask, - "状态查询" : StatusTask, - "巡店删除" : PatrolDeleteTask, - "亚马逊采集" : SpiderTask, - "相似ASIN" : SimilarAsinTask - } - self.log(f"线程 {id(task_data)} 开始处理产品风险审批任务...") - # 创建ApproveTask实例并处理任务 - TASK_CLS = TASK_INFO[TASK_TYPE] # 根据任务类型选择处理类,默认为ApproveTask - approve_task = TASK_CLS(user_info=self.user_info) - approve_task.process_task(task_data) - self.log(f"线程 {id(task_data)} {TASK_TYPE} 任务处理完成") - except Exception as e: - self.log(f"线程 {id(task_data)} {TASK_TYPE} 任务处理异常: {traceback.format_exc()}", "ERROR") - - def stop(self): - """停止监控""" - self.running = False - self.log("任务监控器已停止") - - -def main(): - """主函数:启动任务监控""" - # 创建并启动任务监控器 - monitor = TaskMonitor() - - try: - monitor.start() - except KeyboardInterrupt: - monitor.log("接收到中断信号,正在停止...") - monitor.stop() - except Exception: - monitor.log(f"监控器异常退出: {traceback.format_exc()}", "ERROR") - - -if __name__ == "__main__": - main() diff --git a/app/amazon/match_action.py b/app/amazon/match_action.py deleted file mode 100644 index 1faa795..0000000 --- a/app/amazon/match_action.py +++ /dev/null @@ -1,591 +0,0 @@ -import time -import re -import traceback - -from config import runing_task, runing_shop,DELETE_BRAND_API_BASE -from datetime import datetime -from amazon.amazon_base import AmamzonBase, kill_process,TaskBase -from amazon.tool import show_notification -import requests - - -class AmzoneMatchAction(AmamzonBase): - mark_name = "匹配价格" - - def __init__(self, user_info: dict, socket_port: int = 19890): - super().__init__(user_info,socket_port) - self.already_asin = set() - - def reset_already_asin(self): - self.already_asin = set() - self.log("already_asin 已重置") - - def wait_loaded(self): - # 等待加载完成 - try: - load_ele = self.tab.ele( - 'xpath://kat-panel[@data-testid="kat-panel-ActionPanelContent"]//div[contains(@class,"Loader-module__loader")]|//kat-panel[@data-testid="kat-panel-ActionPanelContent"]/div[@data-f1-component]//div[contains(@class,"==")]/div[contains(@class,"==")]/span', - timeout=3) - load_ele.wait.deleted(timeout=5, raise_err=False) - except Exception as e: - print(f"【{self.mark_name}】等待加载中消失出错", e) - - def run_page_action(self,skip_asin=[]): - self.log(f"==================={self.mark_name}=======================") - self.log("开始执行...") - num = 0 - retry_num = 0 - - max_retry_num = 5 - total_page = 0 - current_page = 0 - - while retry_num < max_retry_num: - # if num > 3: #测试 - # return - # 等待加载完成 - try: - load_ele = self.tab.eles("xpath://div[contains(@class,'Loader-module__loader')]",timeout=5) - if len(load_ele) > 0: - load_ele[0].wait.deleted(timeout=3, raise_err=False) - - time.sleep(0.5) - - # 获取当前页码 - try: - page_pamel = self.tab.eles('xpath://kat-pagination',timeout=5) - if len(page_pamel) > 0: - current_page = page_pamel[0].sr('xpath:.//ul[@class="pages"]//li[@aria-current="true"]').text - current_page = int(current_page.strip()) - # 测试 - # if current_page > 1: - # break - # 总页数 - total_page = page_pamel[0].sr.eles('xpath:.//ul[@class="pages"]//span[@class="page__inner"][last()]') - if len(total_page) > 0: - total_page = int(total_page[-1].text.strip()) - self.log(f"【{self.mark_name}】当前页码: {current_page} / 总页数: {total_page}") - except Exception as e: - self.log(f"【{self.mark_name}】获取页码失败", e) - - # 保存当前URL,用于失败重试时访问 - try: - self.url = self.tab.url - self.log(f"获取当前的链接:{self.url}") - except Exception as e: - self.url = None - self.log(f"获取当前的链接失败:{e}") - - - sku_ls = self.tab.eles("xpath://div[@data-sku]",timeout=10) - self.log(f"【{self.mark_name}】获取到 {len(sku_ls)}") - if len(sku_ls) == 0: - retry_num += 1 - self.log(f"没有获取到SKU列表,重试{retry_num}/{max_retry_num}") - self.tab.refresh() - self.tab.wait.doc_loaded(raise_err=False, timeout=120) - if retry_num == max_retry_num: - raise RuntimeError(f"与页面的连接已断开,没有获取到SKU列表,重试{retry_num}/{max_retry_num}") - continue - - # for sku_ele in sku_ls[0:2]: - for sku_ele in sku_ls: - # solve_problem = sku_ele.eles('xpath:.//kat-link[@label="解决商品信息问题"]') - - asin = sku_ele.ele('xpath:.//div[contains(@class,"JanusSplitBox-module__container")]//div[contains(@class,"JanusSplitBox-module__panel--") and contains(string(.),"ASIN")]/..//div[last()]',timeout=3).text - self.log(f"ASIN {asin} 找到....") - if asin in skip_asin: - self.log(f"ASIN {asin} 跳过....") - yield (asin,"有最低价跳过") - self.already_asin.add(asin) - continue - - if asin in self.already_asin: - self.log(f"【{self.mark_name}】{asin} 已经处理过了,跳过") - continue - - price_match = sku_ele.eles('xpath:.//div[@data-test-id="FeaturedOfferPrice"]//a[text()="匹配"]',timeout=2) - if len(price_match) == 0: - self.log(f"【{self.mark_name}】{asin},没有推荐价格匹配按钮") - yield (asin,"无需处理") - self.already_asin.add(asin) - continue - try: - price_match[0].click() - - save_all_btn = self.tab.ele('xpath://kat-button[@label="保存所有"]',timeout=10) - save_all_btn.wait.displayed(timeout=10, raise_err=False) - save_all_btn.click() - - save_all_btn.wait.deleted(timeout=10, raise_err=False) - - yield (asin,"处理完成") - self.already_asin.add(asin) - except Exception as e: - print(f"{asin} 处理失败", e) - yield (asin,"处理失败") - self.already_asin.add(asin) - continue - - - # 判断是否存在需要翻页的情况 - page_pamel = self.tab.eles('xpath://kat-pagination',timeout=5) - if len(page_pamel) == 0: - break - next_page_btn = page_pamel[0].sr('xpath:.//span[@part="pagination-nav-right"]') - class_str = next_page_btn.attr('class') - if "end" in class_str: - break - next_page_btn.click() - num += 1 - self.log(f"【{self.mark_name}】【程序计算】正在翻页,已翻 {num} 页...") - - except Exception as e: - self.log(f"【{self.mark_name}】处理匹配操作异常", e) - traceback.print_exc() - retry_num += 1 - self.tab.refresh() - self.tab.wait.doc_loaded(raise_err=False,timeout=120) - - #检查页数是否相等,不相等则继续 - self.log(f"开始检查页数,当前页数 {current_page} / {total_page}") - if total_page != 0 and current_page!= 0 and current_page < total_page: - self.log(f"检查到页数还未完成,重启浏览器继续") - raise RuntimeError(f"与页面的连接已断开,检查到页数还未完成,重启浏览器继续") - - -class MatchTak(TaskBase): - task_name = "匹配价格-TASK" - - def process_task(self, task_data: dict): - """处理审批任务主入口 - Args: - task_data: 任务数据 - """ - try: - data = task_data.get("data", {}) - task_id = data.get("taskId") - items = data.get("items", []) - country_codes = data.get("country_codes", []) - risk_listing_filter = data.get("risk_listing_filter", "All") - user_id = data.get("user_id") - stage_index = data.get("stage_index") - final_stage = bool(data.get("final_stage", True)) - - # 用于测试 - limit = data.get("limit",None) - - if not task_id or not items or not country_codes: - self.log(f"任务ID为空{task_id}/店铺列表为空{items}/国家列表为空{country_codes},跳过", "WARNING") - return - - self.log(f"开始处理审批任务 {task_id},共 {len(items)} 个店铺,{len(country_codes)} 个国家") - - runing_task[task_id] = { - "status": "running", - "start_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), - "total_shops": len(items), - "processed_shops": 0, - "total_countries": len(country_codes) * len(items), - "processed_countries": 0, - "total_asins": 0, - "processed_asins": 0, - "success_count": 0, - "failed_count": 0, - "stop_requested": False - } - - # 遍历处理每个店铺 - for idx, shop_item in enumerate(items, 1): - # 检查是否收到暂停请求 - if task_id in runing_task and runing_task[task_id].get("stop_requested", False): - self.log(f"检测到任务 {task_id} 的暂停请求,停止处理", "WARNING") - runing_task[task_id]["status"] = "stopped" - return - - shop_name = shop_item.get("shopName", "未知店铺") - self.log(f"[{idx}/{len(items)}] 开始处理店铺: {shop_name}") - show_notification(f"开始处理店铺: {shop_name}", "info") - - try: - self.process_shop(shop_item, country_codes, task_id, risk_listing_filter, user_id, stage_index, final_stage,limit=limit) - - # self.process_shop(shop_item, country_codes, task_id,risk_listing_filter) - # 更新已处理店铺数 - if task_id in runing_task: - runing_task[task_id]["processed_shops"] += 1 - except Exception as e: - self.log(f"处理店铺 {shop_name} 失败: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - - # 更新任务状态 - if task_id in runing_task: - if runing_task[task_id].get("stop_requested", False): - runing_task[task_id]["status"] = "stopped" - self.log(f"任务 {task_id} 已被暂停!") - else: - runing_task[task_id]["status"] = "completed" - self.log(f"任务 {task_id} 处理完成!") - - except Exception as e: - self.log(f"任务处理失败: {traceback.format_exc()}", "ERROR") - if task_id: - if task_id in runing_task: - runing_task[task_id]["status"] = "failed" - runing_task[task_id]["error"] = str(e) - - def process_shop(self, shop_item: dict, country_codes: list, task_id: int, risk_listing_filter: str, - user_id=None, stage_index=None, final_stage: bool = True,limit:str=None): - """处理单个店铺 - - Args: - shop_item: 店铺信息 - country_codes: 国家代码列表 - task_id: 任务ID - risk_listing_filter: 风险商品筛选条件 - """ - shop_name = shop_item.get("shopName", "未知店铺") - company_name = shop_item.get("companyName", "") - - skip_asins_by_country = shop_item.get("skipAsinsByCountry",{}) - skipAsinDetailsByCountry = shop_item.get("skipAsinDetailsByCountry",{}) - - if not company_name: - self.log(f"店铺 {shop_name} 的公司名称为空,跳过", "WARNING") - return - - if task_id in runing_task: - runing_task[task_id]["current_shop"] = shop_name - - # 将店铺添加到正在执行中的店铺列表 - start_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - runing_shop[shop_name] = start_time - self.log(f"店铺 {shop_name} 已添加到执行列表,账号: {company_name},开始时间: {start_time}") - - # 店铺打开重试最多3次 - driver = None - max_retries = 3 - iskill = False - - # 处理每个国家 - for country_code in country_codes: - # 检查是否收到暂停请求 - if task_id in runing_task and runing_task[task_id].get("stop_requested", False): - self.log(f"检测到任务 {task_id} 的暂停请求,停止处理国家", "WARNING") - break - - skip_asin = skip_asins_by_country.get(country_code,[]) - if skipAsinDetailsByCountry : - skipAsinDetails = {i.get("asin"):i.get("minimumPrice") for i in skipAsinDetailsByCountry.get(country_code)} - else: - skipAsinDetails = {} - # 打开店铺 - driver = self.open_shop(cls=AmzoneMatchAction,max_retries=max_retries, company_name=company_name, - shop_name=shop_name, iskill=iskill) - if driver is None: - self.log(f"任务 {task_id} 启动店铺失败,结束任务", "ERROR") - for country_code in country_codes: - self.post_result(task_id, shop_name, country_code, "", "", is_done=True) - return - - current_url = None - max_retries = 200 - for _ in range(max_retries): - try: - self.process_country(driver, country_code, task_id, shop_name,risk_listing_filter,limit, - target_url=current_url,skip_asin=skip_asin,skipAsinDetails=skipAsinDetails) - driver.reset_already_asin() - driver.close_store() - break - except Exception as e: - self.log(f"处理国家 {country_code} 失败: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - if "与页面的连接已断开" in str(e): - iskill = True - current_url = driver.url - - # 更新已处理国家数 - if task_id in runing_task: - runing_task[task_id]["processed_countries"] += 1 - - self.log(f"{task_id}任务处理完成") - # 最后回传,标记完成 - try: - # self.post_result(task_id, shop_name, country_code, "", "", is_done=True) - if final_stage: - self.post_result(task_id, shop_name, country_code, "", "", is_done=True) - else: - self.post_stage_finished(task_id, user_id, stage_index) - except Exception as e: - self.log(f"回传结果失败: {str(e)}", "ERROR") - - - # 从正在执行中的店铺列表中移除 - if shop_name in runing_shop: - del runing_shop[shop_name] - self.log(f"店铺 {shop_name} 已从执行列表中移除") - - def process_country(self, driver, country_code, task_id, shop_name, risk_listing_filter,limit=None,target_url=None, - skip_asin=[],skipAsinDetails={}): - """处理单个国家的审批任务 - """ - - # 转换国家代码为中文名称 - country_name = self.country_info.get(country_code, country_code) - info_mes = f"开始处理国家: {country_name} ({country_code})" - self.log(info_mes) - show_notification(info_mes, "info") - - # 更新当前处理的国家 - if task_id in runing_task: - runing_task[task_id]["current_country"] = country_name - - - max_retries = 5 - switch_success, switch_success_pg, search_success, sku_ls = self.action_init(driver, country_name, shop_name, - risk_listing_filter) - # 如果切换失败,直接返回 - if not switch_success or not switch_success_pg or not search_success: - error_message = f"切换到国家({switch_success})/库存页面({switch_success_pg})/搜索筛选到指定选项({search_success}) {country_name} 失败,已重试 {max_retries} 次,跳过该国家" - self.log(error_message, "ERROR") - if task_id in runing_task: - runing_task[task_id]["processed_countries"] += 1 - return - - # # 如果没有需要审批的商品,直接返回 - if len(sku_ls) == 0: - self.log(f"国家 {country_name} 没有需要审批的商品") - if task_id in runing_task: - runing_task[task_id]["processed_countries"] += 1 - return - - self.log(f"国家 {country_name} 搜索出 {len(sku_ls)} 商品,开始处理...") - - if target_url is not None: # 从失败的链接继续 - self.log(f"开始访问:{target_url}") - driver.tab.get(url=target_url) - driver.tab.wait.doc_loaded(timeout=60, raise_err=False) - - result = [] - # 处理所有需要审批的商品(通过yield获取结果) - for asin, status in driver.run_page_action(skip_asin): - # 检查是否收到暂停请求 - if task_id in runing_task and runing_task[task_id].get("stop_requested", False): - self.log(f"检测到任务 {task_id} 的暂停请求,停止处理ASIN", "WARNING") - break - - self.log(f"ASIN {asin} 处理结果: {status}") - - # 更新任务状态 - if task_id in runing_task: - runing_task[task_id]["current_asin"] = asin - runing_task[task_id]["processed_asins"] += 1 - runing_task[task_id]["failed_count"] += 1 - - minimumPrice = "" - if "有最低价跳过" in status: - minimumPrice = skipAsinDetails.get(asin) - result.append({ - "asin": asin, - "status": status, - "minimumPrice": minimumPrice, - "done": False - }) - - if len(result) > 10: - self.post_result_batch(task_id, shop_name, country_code,result) - result = [] - - if len(result) > 0: - self.post_result_batch(task_id, shop_name, country_code, result) - - self.log(f"国家 {country_name} 处理完成") - - def post_stage_finished(self, task_id: int, user_id, stage_index): - - if user_id in (None, "", 0): - raise ValueError("user_id is required for stage completion callback") - if stage_index is None: - raise ValueError("stage_index is required for stage completion callback") - - url = f"{DELETE_BRAND_API_BASE}/api/shop-match/tasks/{task_id}/stage-finished" - payload = {"stage_index": stage_index} - params = {"user_id": user_id} - - max_retries = 3 - for retry in range(max_retries): - try: - self.log(f"Attempting stage completion callback ({retry + 1}/{max_retries})") - response = requests.post( - url, - params=params, - json=payload, - headers={"Content-Type": "application/json"}, - timeout=30, - verify=False, - ) - self.log(f"Stage completion callback response: {response.text}") - data = response.json() if response.text else {} - if response.status_code == 200 and isinstance(data, dict) and data.get("success"): - self.log(f"Stage completion callback succeeded: task={task_id}, stage={stage_index}") - return - self.log(f"Stage completion callback failed, status={response.status_code}", "WARNING") - except Exception as e: - self.log(f"Stage completion callback exception: {str(e)}", "ERROR") - if retry < max_retries - 1: - time.sleep(2) - - raise RuntimeError(f"Stage completion callback failed after retries: task={task_id}, stage={stage_index}") - - def post_result(self, task_id: int, shop_name: str, country_code: str, asin: str, status: str,is_done: bool = False): - """回传处理结果到API - - Args: - task_id: 任务ID - shop_name: 店铺名称 - country_code: 国家代码 - asin: ASIN - status: 处理状态 - """ - - url = f"{DELETE_BRAND_API_BASE}/api/shop-match/tasks/{task_id}/result" - - payload = { - "shops": [ - { - "error": "", - "countries": { - country_code: [ - { - "asin": asin, - "status": status, - "done": is_done - } - ] - }, - "shopName": shop_name - } - ] - } - - max_retries = 3 - for retry in range(max_retries): - try: - print("================【匹配】=====================") - self.log(f"尝试回传结果 (第 {retry + 1}/{max_retries} 次)") - self.log(f"回传URL: {url}") - self.log(f"回传数据: {payload}") - response = requests.post( - url, - json=payload, - headers={"Content-Type": "application/json"}, - timeout=30, - verify=False - ) - self.log(f"回传结果: {response.text}") - data = response.json() if response.text else {} - if response.status_code == 200 and isinstance(data, dict) and data.get("success"): - self.log(f"结果回传成功: {asin} - {status}") - return - else: - self.log(f"结果回传失败,状态码: {response.status_code}", "WARNING") - print("=====================================") - - except Exception as e: - self.log(f"调用API异常: {str(e)}", "ERROR") - print("=====================================") - - # 如果还有重试机会,等待后继续 - if retry < max_retries - 1: - time.sleep(2) - - self.log(f"已达到最大重试次数,结果回传最终失败", "ERROR") - raise RuntimeError("已达到最大重试次数,结果回传最终失败") - - def post_result_batch(self, task_id: int, shop_name: str, country_code: str, country_data:list, - is_done: bool = False): - """回传处理结果到API - - Args: - task_id: 任务ID - shop_name: 店铺名称 - country_code: 国家代码 - asin: ASIN - status: 处理状态 - """ - - url = f"{DELETE_BRAND_API_BASE}/api/shop-match/tasks/{task_id}/result" - - payload = { - "shops": [ - { - "error": "", - "countries": { - country_code: country_data - }, - "shopName": shop_name - } - ] - } - - max_retries = 3 - for retry in range(max_retries): - try: - print("================【匹配】=====================") - self.log(f"尝试回传结果 (第 {retry + 1}/{max_retries} 次)") - self.log(f"回传URL: {url}") - self.log(f"回传数据: {payload}") - response = requests.post( - url, - json=payload, - headers={"Content-Type": "application/json"}, - timeout=30, - verify=False - ) - self.log(f"回传结果: {response.text}") - data = response.json() if response.text else {} - if response.status_code == 200 and isinstance(data, dict) and data.get("success"): - self.log(f"结果回传成功") - return - else: - self.log(f"结果回传失败,状态码: {response.status_code}", "WARNING") - print("=====================================") - - except Exception as e: - self.log(f"调用API异常: {str(e)}", "ERROR") - print("=====================================") - - # 如果还有重试机会,等待后继续 - if retry < max_retries - 1: - time.sleep(2) - - self.log(f"已达到最大重试次数,结果回传最终失败", "ERROR") - raise RuntimeError("已达到最大重试次数,结果回传最终失败") - - -if __name__ == "__main__": - user_info = { - "company": "rongchuang123", - "username": "自动化_Robot", - "password": "#20zsg25" - } - shop_name = "魏振峰" - country = "德国" - kill_process('v6') - driver = AmzoneMatchAction(user_info) - browser = driver.open_shop(shop_name) - sw_suc = driver.SwitchingCountries(country) - driver.SwitchPage() - risk_listing_filter = "All" - for _ in range(3): - try: - sku_ls = driver.search(filter_type=risk_listing_filter) - break - except Exception as e: - print(e) - driver.tab.refresh() - if len(sku_ls) > 0: - print("有数据,开始操作") - for asin, status in driver.run_page_action(): - print(f"ASIN {asin} 的处理结果: {status}") - print("已完成操作") \ No newline at end of file diff --git a/app/amazon/patrol_delete.py b/app/amazon/patrol_delete.py deleted file mode 100644 index 4ea8ad3..0000000 --- a/app/amazon/patrol_delete.py +++ /dev/null @@ -1,2515 +0,0 @@ -import json -import re -import sys -import time -from copy import deepcopy -from datetime import datetime -from pathlib import Path -from typing import Any, Dict, Iterable, List, Optional, Set - -import requests -from loguru import logger - -from amazon.base import AmamzonBase, kill_process -from amazon.tool import get_shop_info, show_notification - - -DROPDOWN_OPEN_DELAY = 0.8 -DROPDOWN_OPTIONS_TIMEOUT = 6 -LISTING_STATUS_DROPDOWN_READY_TIMEOUT = 20 -QUICK_VIEW_OPEN_DELAY = 1 -QUICK_VIEW_TAGS_TIMEOUT = 8 -QUICK_VIEW_ENTRY_TIMEOUT = 15 -COMPLETE_DRAFT_PAGE_URL = "https://sellercentral.amazon.co.uk/myinventory/inventory/views/drafts?subview=unsubmitted-drafts" -RECOMMENDED_OFFER_HOME_URL = "https://sellercentral.amazon.co.uk/home" -RECOMMENDED_OFFER_OPEN_DELAY = 1 -RECOMMENDED_OFFER_ROWS_TIMEOUT = 10 -RECOMMENDED_OFFER_COUNTRIES = ["欧洲", "英国", "德国", "法国", "西班牙", "意大利"] -RECOMMENDED_OFFER_EXPAND_XPATHS = [ - 'xpath://div[@data-key="KPI_CARD_BUYBOX"]//casino-button[@data-actionname="expand"]', - 'xpath://casino-card[@id="KPI_CARD_BUYBOX"]//casino-button[@data-actionname="expand"]', - 'xpath://div[@data-key="KPI_CARD_BUYBOX"]//*[@aria-label="chevron-down"]', -] - - -SCRIPT_DIR = Path(__file__).with_name("scripts") / "patrol_delete" - - -def _new_trace_id(prefix: str) -> str: - return f"{prefix}-{int(time.time() * 1000) % 1000000:06d}" - - -def _safe_log_text(value: Any, limit: int = 3000) -> str: - text = "" if value is None else str(value) - text = re.sub(r"[\x00-\x08\x0b\x0c\x0e-\x1f]", " ", text) - if len(text) > limit: - text = text[: limit - 3] + "..." - encoding = getattr(getattr(sys, "stderr", None), "encoding", None) or "utf-8" - return text.encode(encoding, errors="backslashreplace").decode(encoding, errors="replace") - - -def _load_patrol_delete_script(name: str) -> str: - return (SCRIPT_DIR / name).read_text(encoding="utf-8") - - -LISTING_STATUS_DROPDOWN_OPEN_SCRIPT = _load_patrol_delete_script("listing_status_dropdown_open.js") -LISTING_STATUS_DROPDOWN_OPTIONS_SCRIPT = _load_patrol_delete_script("listing_status_dropdown_options.js") -LISTING_STATUS_DROPDOWN_CLOSE_SCRIPT = _load_patrol_delete_script("listing_status_dropdown_close.js") -LISTING_STATUS_SELECT_OPTION_SCRIPT = _load_patrol_delete_script("listing_status_select_option.js") -LISTING_STATUS_SECTION_SCRIPT = _load_patrol_delete_script("listing_status_section.js") -INVENTORY_SELECT_ALL_SCRIPT = _load_patrol_delete_script("inventory_select_all.js") -INVENTORY_DELETE_SELECTED_SCRIPT = _load_patrol_delete_script("inventory_delete_selected.js") -DELETE_CONFIRM_MODAL_CLICK_SCRIPT = _load_patrol_delete_script("delete_confirm_modal_click.js") -DELETE_SUCCESS_MESSAGES_SCRIPT = _load_patrol_delete_script("delete_success_messages.js") -COMPLETE_DRAFT_QUICK_VIEW_TAGS_SCRIPT = _load_patrol_delete_script("complete_draft_quick_view_tags.js") -COMPLETE_DRAFT_QUICK_VIEW_DIAGNOSTIC_SCRIPT = _load_patrol_delete_script("complete_draft_quick_view_diagnostic.js") -COMPLETE_DRAFT_SELECT_TAG_SCRIPT = _load_patrol_delete_script("complete_draft_select_tag.js") -COMPLETE_DRAFT_SELECT_ALL_SCRIPT = _load_patrol_delete_script("complete_draft_select_all.js") -COMPLETE_DRAFT_DELETE_SELECTED_SCRIPT = _load_patrol_delete_script("complete_draft_delete_selected.js") -RECOMMENDED_OFFER_PERCENTAGE_OPEN_SCRIPT = _load_patrol_delete_script("recommended_offer_percentage_open.js") -RECOMMENDED_OFFER_PERCENTAGE_ROWS_SCRIPT = _load_patrol_delete_script("recommended_offer_percentage_rows.js") -RECOMMENDED_OFFER_PERCENTAGE_DIAGNOSTIC_SCRIPT = _load_patrol_delete_script("recommended_offer_percentage_diagnostic.js") - -LISTING_STATUS_SELECT_DELAY = 0.8 -INVENTORY_ROW_TIMEOUT = 10 -INVENTORY_LOADER_TIMEOUT = 5 -DELETE_SUCCESS_TIMEOUT = 20 -PRODUCT_TASK_MAX_RETRIES = 3 -PRODUCT_TASK_RETRY_DELAY = 2 -PRODUCT_TASK_OPEN_SHOP_DELAY = 3 -PRODUCT_TASK_BROWSER_RESET_DELAY = 2 -DELETE_SUCCESS_COUNT_PATTERNS = ( - re.compile(r"(\d+)\s*个商品(?:已删除|已经删除)"), - re.compile(r"(?:已删除|已经删除)\s*(\d+)\s*个商品"), -) -DELETE_SUCCESS_TEXT_PATTERNS = ( - re.compile(r"一个或多个商品(?:已删除|已经删除)"), -) -COMPLETE_DRAFT_DELETE_SUCCESS_PATTERNS = ( - re.compile(r"商品信息草稿(?:已删除|已经删除)"), - re.compile(r"已删除\s*\d*\s*个?\s*商品信息草稿"), -) -LISTING_STATUS_DELETE_WHITELIST = { - "全部", - "定价问题", - "需要批准", - "在搜索结果中禁止显示", - "配送问题", - "缺少报价", - "已停售", - "不可售", - "在售", -} -LISTING_STATUS_COMPATIBILITY_MAP = { - "搜尋結果中禁止顯示": "在搜索结果中禁止显示", - "搜索结果中禁止显示": "在搜索结果中禁止显示", - "在搜索中禁止显示结果": "在搜索结果中禁止显示", - "配送問題": "配送问题", - "缺少報價": "缺少报价", - "订单页面已删除": "详情页面已删除", -} - - -class InventoryManage(AmamzonBase): - mark_name = "管理所有库存" - - def switch_to_manage_inventory(self): - """ - 切换至管理所有库存页面 - 1、等待 //navigation-favorites-bar[@class="hydrated"] 出现 - """ - logger.info("开始切换到管理所有库存页面") - navigation = self.tab.ele('xpath://navigation-favorites-bar[@class="hydrated"]') - navigation.wait.displayed(raise_err=False) - page_btn = navigation.sr('xpath://internal-fav-bar-links[@data-internal="navigation"]').sr( - 'xpath://a[@data-page-id="ezdpc-gui-inventory-mons"]' - ) - page_btn.wait.displayed(raise_err=False) - page_btn.click(timeout=5) - - self.tab.wait.doc_loaded() - search_region = self.tab.ele('xpath://div[@id="searchBoxContainer"]//kat-input-group') - search_region.wait.displayed(raise_err=False) - self._wait_inventory_loader(timeout=INVENTORY_LOADER_TIMEOUT) - logger.info("已进入管理所有库存页面") - - def open_listing_status_dropdown(self) -> Dict[str, Any]: - """只打开实测识别出的商品状态下拉框,不点击任何选项。""" - deadline = time.time() + LISTING_STATUS_DROPDOWN_READY_TIMEOUT - result: Dict[str, Any] = {} - while time.time() < deadline: - self.tab.wait.doc_loaded(raise_err=False) - self._wait_inventory_loader(timeout=2) - result = self._run_js(LISTING_STATUS_DROPDOWN_OPEN_SCRIPT) or {} - if result.get("ok"): - time.sleep(DROPDOWN_OPEN_DELAY) - return result - if result.get("reason") != "listing status dropdown disabled/loading": - logger.info("商品状态下拉框暂不可用,继续等待: {}", json.dumps(result, ensure_ascii=False)) - time.sleep(0.5) - raise RuntimeError(f"未找到可用商品状态下拉框: {result}") - - def get_listing_status_dropdown_options(self, shop_name: str, country: str) -> List[Dict[str, Any]]: - """读取商品状态下拉框展开区域中的选项。""" - open_result = self.open_listing_status_dropdown() - option_rows = self._wait_listing_status_option_rows() - parsed_rows = self._parse_status_option_rows(option_rows, shop_name, country) - self._close_listing_status_dropdown() - if not parsed_rows: - raise RuntimeError(f"商品状态下拉框已打开但未读取到选项: {open_result}") - return parsed_rows - - def open_complete_draft_quick_view(self) -> Dict[str, Any]: - """直接打开补全草稿页面。""" - if self.tab is None: - raise RuntimeError("浏览器页面不存在,请先打开店铺") - self.tab.get(COMPLETE_DRAFT_PAGE_URL) - self.tab.wait.doc_loaded(raise_err=False) - time.sleep(QUICK_VIEW_OPEN_DELAY) - return {"ok": True, "url": COMPLETE_DRAFT_PAGE_URL, "title": getattr(self.tab, "title", "")} - - def get_complete_draft_quick_view_tags(self, shop_name: str, country: str) -> List[Dict[str, Any]]: - """读取补全草稿快速查看区域中的全部“标签 + 数量”项。""" - open_result = self.open_complete_draft_quick_view() - tag_rows = self._wait_complete_draft_quick_view_tag_rows() - parsed_rows = self._parse_quick_view_tag_rows(tag_rows, shop_name, country) - if not parsed_rows: - raise RuntimeError(f"补全草稿快速查看已打开但未读取到标签: {open_result}") - return parsed_rows - - def delete_complete_drafts_from_non_whitelisted_tags( - self, - shop_name: str, - country: str, - max_delete_operations: Optional[int] = None, - trace_id: str = "", - delete_conditions: Optional[Iterable[Any]] = None, - allowed_statuses: Optional[Iterable[str]] = None, - ) -> Dict[str, Any]: - """按补全草稿快速查看的准确标签数量,删除非白名单标签下方商品。""" - trace_id = trace_id or _new_trace_id("draft") - effective_conditions = delete_conditions if delete_conditions is not None else allowed_statuses - logger.info( - f"trace_id={trace_id} 开始删除非白名单补全草稿: " - f"shop={shop_name}, country={country}, max_delete_operations={max_delete_operations}, " - f"delete_conditions={self._format_delete_conditions(effective_conditions)}" - ) - initial_tags = self.get_complete_draft_quick_view_tags(shop_name, country) - delete_candidates = self._build_deletable_complete_draft_tag_rows(initial_tags, effective_conditions) - results: List[Dict[str, Any]] = [] - delete_counts: Dict[str, int] = {} - total_deleted = 0 - stop_reason = "no-candidates" - - if not delete_candidates: - logger.info(f"trace_id={trace_id} 补全草稿没有可删除标签: shop={shop_name}, country={country}") - return { - "shopName": shop_name, - "country": country, - "draftRows": initial_tags, - "deleteCandidates": delete_candidates, - "results": results, - "deleteCounts": delete_counts, - "totalDeleted": total_deleted, - "stopReason": stop_reason, - } - - stop_reason = "processed-candidates" - for candidate in delete_candidates: - tag = candidate["tag"] - quantity = candidate["quantity"] - canonical_tag = candidate["canonicalTag"] - logger.info( - f"trace_id={trace_id} 开始删除补全草稿标签下方商品: " - f"shop={shop_name}, country={country}, tag={tag}, quantity={quantity}" - ) - self.select_complete_draft_tag(tag, trace_id=trace_id) - deleted_for_tag = 0 - - while quantity <= 0 or deleted_for_tag < quantity: - remaining_limit = None - if max_delete_operations is not None: - remaining_limit = max(0, max_delete_operations - total_deleted) - if remaining_limit <= 0: - stop_reason = "max-delete-operations" - break - select_result = self._select_all_complete_draft_rows( - tag, - trace_id=trace_id, - max_select_count=remaining_limit, - ) - selected_count = int(select_result.get("selectedCount") or select_result.get("rowCount") or 0) - if select_result.get("empty"): - logger.info( - f"trace_id={trace_id} 补全草稿标签下方已无商品,跳过删除: " - f"shop={shop_name}, country={country}, tag={tag}" - ) - break - if selected_count <= 0: - logger.info( - f"trace_id={trace_id} 补全草稿标签下方没有可删除商品: " - f"shop={shop_name}, country={country}, tag={tag}" - ) - break - - delete_result = self._click_complete_draft_delete_selected(tag, trace_id=trace_id) - self._confirm_delete_modal(tag, trace_id=trace_id) - self._wait_complete_draft_rows_after_delete(tag, select_result, trace_id=trace_id) - deleted_count = min(selected_count, quantity - deleted_for_tag) if quantity > 0 else selected_count - deleted_for_tag += deleted_count - total_deleted += deleted_count - delete_counts[canonical_tag] = delete_counts.get(canonical_tag, 0) + deleted_count - results.append( - { - "tag": tag, - "canonicalTag": canonical_tag, - "tagQuantity": quantity, - "deletedCount": deleted_count, - "selectResult": select_result, - "deleteResult": delete_result, - } - ) - logger.info( - f"trace_id={trace_id} 补全草稿标签删除成功: " - f"shop={shop_name}, country={country}, tag={tag}, " - f"deleted_count={deleted_count}, tag_deleted={deleted_for_tag}, total_deleted={total_deleted}" - ) - - if max_delete_operations is not None and total_deleted >= max_delete_operations: - stop_reason = "max-delete-operations" - break - if quantity > 0 and deleted_for_tag >= quantity: - break - - if stop_reason == "max-delete-operations": - break - - final_tags = self.get_complete_draft_quick_view_tags(shop_name, country) - return { - "shopName": shop_name, - "country": country, - "draftRows": final_tags, - "deleteCandidates": delete_candidates, - "results": results, - "deleteCounts": delete_counts, - "totalDeleted": total_deleted, - "stopReason": stop_reason, - } - - def select_complete_draft_tag(self, tag: str, trace_id: str = "") -> Dict[str, Any]: - normalized_tag = self._normalize_option_text(tag) - if not normalized_tag: - raise RuntimeError("补全草稿标签为空,无法执行筛选") - trace_id = trace_id or _new_trace_id("draft") - result = self._run_js(COMPLETE_DRAFT_SELECT_TAG_SCRIPT, {"tag": normalized_tag}) or {} - if not result.get("ok"): - logger.info( - f"trace_id={trace_id} 补全草稿快速查看标签未命中: " - f"tag={normalized_tag}, result={_safe_log_text(result)}" - ) - raise RuntimeError(f"未找到补全草稿标签[{normalized_tag}]: {result}") - time.sleep(LISTING_STATUS_SELECT_DELAY) - return result - - def _select_all_complete_draft_rows( - self, - tag: str, - trace_id: str = "", - max_select_count: Optional[int] = None, - ) -> Dict[str, Any]: - trace_id = trace_id or _new_trace_id("draft") - deadline = time.time() + INVENTORY_ROW_TIMEOUT - result: Dict[str, Any] = {} - saw_empty = False - while time.time() < deadline: - payload = {"maxSelectCount": max_select_count} if max_select_count is not None else None - result = self._run_js(COMPLETE_DRAFT_SELECT_ALL_SCRIPT, payload) if payload else self._run_js(COMPLETE_DRAFT_SELECT_ALL_SCRIPT) - result = result or {} - if result.get("ok"): - time.sleep(0.5) - logger.info(f"trace_id={trace_id} 补全草稿已全选: tag={tag}, result={_safe_log_text(result)}") - return result - if result.get("reason") == "no complete draft rows": - saw_empty = True - time.sleep(0.5) - continue - if result.get("reason") and result.get("reason") != "no complete draft rows": - break - time.sleep(0.5) - - if not result.get("ok"): - if saw_empty and result.get("reason") == "no complete draft rows": - logger.info(f"trace_id={trace_id} 补全草稿标签下方无商品行: tag={tag}, result={_safe_log_text(result)}") - return {**result, "ok": True, "empty": True, "selectedCount": 0, "rowCount": 0} - logger.info( - f"trace_id={trace_id} 补全草稿全选失败: tag={tag}, result={_safe_log_text(result)}" - ) - raise RuntimeError(f"补全草稿标签[{tag}]全选失败: {result}") - return result - - def _click_complete_draft_delete_selected(self, tag: str, trace_id: str = "") -> Dict[str, Any]: - trace_id = trace_id or _new_trace_id("draft") - result: Dict[str, Any] = {} - for attempt in range(8): - result = self._run_js(COMPLETE_DRAFT_DELETE_SELECTED_SCRIPT) or {} - if result.get("ok"): - break - if result.get("menuOpened"): - logger.info( - f"trace_id={trace_id} 补全草稿选择组操作菜单已打开,等待删除选项出现: " - f"tag={tag}, attempt={attempt + 1}, result={_safe_log_text(result)}" - ) - time.sleep(0.8) - continue - break - if not result.get("ok"): - logger.info( - f"trace_id={trace_id} 补全草稿点击删除失败: tag={tag}, result={_safe_log_text(result)}" - ) - raise RuntimeError(f"补全草稿标签[{tag}]点击删除失败: {result}") - time.sleep(0.5) - logger.info(f"trace_id={trace_id} 补全草稿删除按钮点击成功: tag={tag}, result={_safe_log_text(result)}") - return result - - def _wait_complete_draft_rows_after_delete( - self, - tag: str, - before_result: Dict[str, Any], - trace_id: str = "", - ) -> None: - trace_id = trace_id or _new_trace_id("draft") - before_count = int(before_result.get("rowCount") or 0) - deadline = time.time() + DELETE_SUCCESS_TIMEOUT - last_result: Dict[str, Any] = {} - while time.time() < deadline: - time.sleep(0.5) - result = self._run_js(COMPLETE_DRAFT_SELECT_ALL_SCRIPT, {"probeOnly": True}) or {} - last_result = result - row_count = int(result.get("rowCount") or 0) - if row_count < before_count or row_count == 0: - logger.info( - f"trace_id={trace_id} 补全草稿删除后行数已变化: " - f"tag={tag}, before={before_count}, after={row_count}" - ) - return - for text in self._collect_delete_success_messages(): - if self._is_complete_draft_delete_success_message(text) or self._is_delete_success_message(text): - logger.info(f"trace_id={trace_id} 补全草稿删除读取到成功提示: tag={tag}, message={_safe_log_text(text)}") - return - logger.info( - f"trace_id={trace_id} 补全草稿删除后未确认行数变化: " - f"tag={tag}, before={before_count}, last_result={_safe_log_text(last_result)}" - ) - raise RuntimeError("补全草稿删除后未确认行数变化") - - def open_recommended_offer_percentage_detail(self) -> Dict[str, Any]: - """打开 Seller Central 首页中的推荐报价百分比明细。""" - if self.tab is None: - raise RuntimeError("浏览器页面不存在,请先打开店铺") - self.tab.get(RECOMMENDED_OFFER_HOME_URL) - self.tab.wait.doc_loaded(raise_err=False) - result = self._open_recommended_offer_percentage_detail_with_driver() - if not result.get("ok"): - result = self._run_js(RECOMMENDED_OFFER_PERCENTAGE_OPEN_SCRIPT) or {} - if not result.get("ok"): - raise RuntimeError(f"未找到推荐报价百分比入口: {result}") - time.sleep(RECOMMENDED_OFFER_OPEN_DELAY) - return result - - def get_recommended_offer_cart_ratios(self) -> Dict[str, List[Dict[str, str]]]: - """打开一次推荐报价百分比下拉,读取全部目标商城的明细。""" - open_result = self.open_recommended_offer_percentage_detail() - rows = self._wait_recommended_offer_percentage_rows() - cart_ratios = self._parse_all_cart_ratio_rows(rows) - - incomplete = [item["country"] for item in cart_ratios if not item["ratio2DaysAgo"] or not item["ratio30DaysAgo"]] - if incomplete: - logger.info( - "推荐报价百分比未完整读取: countries={}, open_result={}, rows={}", - ",".join(incomplete), - json.dumps(open_result, ensure_ascii=False), - json.dumps(rows, ensure_ascii=False), - ) - - return {"cartRatios": cart_ratios} - - def _wait_listing_status_option_rows(self) -> List[Dict[str, Any]]: - deadline = time.time() + DROPDOWN_OPTIONS_TIMEOUT - rows = [] - while time.time() < deadline: - rows = self._run_js(LISTING_STATUS_DROPDOWN_OPTIONS_SCRIPT) or [] - if rows: - return rows - time.sleep(0.3) - return rows - - def get_listing_status_country_sections(self, shop_name: str, country: str) -> List[Dict[str, Any]]: - trace_id = _new_trace_id("status") - logger.info(f"trace_id={trace_id} 开始读取商品状态统计: shop={shop_name}, country={country}") - rows = self._wait_listing_status_section_rows() - parsed_rows = self._parse_listing_status_section_rows(rows) - if not parsed_rows: - logger.info( - f"trace_id={trace_id} 商品状态统计读取为空: " - f"raw_rows={_safe_log_text(json.dumps(rows, ensure_ascii=False))}" - ) - raise RuntimeError(f"未读取到商品状态统计标签: {rows}") - logger.info( - f"trace_id={trace_id} 商品状态统计读取完成: " - f"shop={shop_name}, country={country}, row_count={len(parsed_rows)}" - ) - return [{"country": country, "rows": self._build_country_section_rows(parsed_rows)}] - - def delete_all_listings_from_non_whitelisted_statuses( - self, - shop_name: str, - country: str, - max_delete_operations: Optional[int] = None, - trace_id: str = "", - delete_conditions: Optional[Iterable[Any]] = None, - allowed_statuses: Optional[Iterable[str]] = None, - ) -> Dict[str, Any]: - """循环删除非白名单分类商品,直到当前国家没有可删项。""" - trace_id = trace_id or _new_trace_id("del") - effective_conditions = delete_conditions if delete_conditions is not None else allowed_statuses - logger.info( - f"trace_id={trace_id} 开始批量删除非白名单商品: " - f"shop={shop_name}, country={country}, max_delete_operations={max_delete_operations}, " - f"delete_conditions={self._format_delete_conditions(effective_conditions)}" - ) - all_results: List[Dict[str, Any]] = [] - delete_counts: Dict[str, int] = {} - latest_status_rows: List[Dict[str, str]] = [] - latest_delete_candidates: List[Dict[str, Any]] = [] - total_deleted = 0 - stop_reason = "no-candidates" - - latest_status_rows = self._read_listing_status_rows_for_delete(shop_name, country, trace_id=trace_id) - latest_delete_candidates = self._build_deletable_status_rows( - latest_status_rows, - delete_conditions=effective_conditions, - ) - if not latest_delete_candidates: - logger.info(f"trace_id={trace_id} 未找到可删除商品分类: shop={shop_name}, country={country}") - final_status_rows = latest_status_rows - return { - "shopName": shop_name, - "country": country, - "statusRows": final_status_rows, - "deleteCandidates": latest_delete_candidates, - "results": all_results, - "deleteCounts": delete_counts, - "totalDeleted": total_deleted, - "stopReason": stop_reason, - } - - logger.info( - f"trace_id={trace_id} 可删除商品分类已生成: shop={shop_name}, country={country}, " - f"candidates={self._format_deletable_candidates(latest_delete_candidates)}" - ) - stop_reason = "processed-candidates" - for candidate in latest_delete_candidates: - logger.info( - f"trace_id={trace_id} 开始处理可删除分类: shop={shop_name}, country={country}, " - f"status={candidate['status']}, quantity={candidate['quantity']}" - ) - self.select_listing_status(candidate["status"], trace_id=trace_id) - deleted_for_status = 0 - status_quantity = candidate["quantity"] - - while status_quantity <= 0 or deleted_for_status < status_quantity: - bulk_result = self._delete_selected_filtered_inventory_rows(candidate["status"], trace_id=trace_id) - deleted_count = int(bulk_result.get("deletedCount") or 0) - if deleted_count <= 0: - logger.info( - f"trace_id={trace_id} 当前分类未删除到商品,结束分类处理: " - f"shop={shop_name}, country={country}, status={candidate['status']}, " - f"deleted_for_status={deleted_for_status}" - ) - break - - result = { - "status": candidate["status"], - "canonicalStatus": candidate["canonicalStatus"], - "statusQuantity": candidate["quantity"], - "target": bulk_result.get("target") or {}, - "successMessage": bulk_result.get("successMessage", ""), - } - all_results.append(result) - delete_counts[candidate["canonicalStatus"]] = ( - delete_counts.get(candidate["canonicalStatus"], 0) + deleted_count - ) - total_deleted += deleted_count - deleted_for_status += deleted_count - logger.info( - f"trace_id={trace_id} 批量删除成功: shop={shop_name}, country={country}, " - f"status={candidate['status']}, deleted_count={deleted_count}, " - f"status_deleted={deleted_for_status}, total_deleted={total_deleted}, " - f"success_message={bulk_result.get('successMessage', '')}" - ) - - if max_delete_operations is not None and total_deleted >= max_delete_operations: - stop_reason = "max-delete-operations" - logger.info( - f"trace_id={trace_id} 达到最大删除次数,准备停止: " - f"shop={shop_name}, country={country}, total_deleted={total_deleted}, " - f"limit={max_delete_operations}" - ) - break - - self._wait_inventory_loader() - - if stop_reason == "max-delete-operations": - break - logger.info( - f"trace_id={trace_id} 可删除分类处理完成: shop={shop_name}, country={country}, " - f"status={candidate['status']}, deleted_for_status={deleted_for_status}" - ) - - final_status_rows = self._read_listing_status_rows_for_delete(shop_name, country, trace_id=trace_id) - logger.info( - f"trace_id={trace_id} 批量删除非白名单商品完成: " - f"shop={shop_name}, country={country}, total_deleted={total_deleted}, stop_reason={stop_reason}" - ) - - return { - "shopName": shop_name, - "country": country, - "statusRows": final_status_rows, - "deleteCandidates": latest_delete_candidates, - "results": all_results, - "deleteCounts": delete_counts, - "totalDeleted": total_deleted, - "stopReason": stop_reason, - } - - def _read_listing_status_rows_for_delete( - self, - shop_name: str, - country: str, - trace_id: str = "", - ) -> List[Dict[str, str]]: - trace_id = trace_id or _new_trace_id("rows") - logger.info(f"trace_id={trace_id} 开始读取商品状态行: shop={shop_name}, country={country}") - option_rows = self.get_listing_status_dropdown_options(shop_name, country) - rows = self._build_country_section_rows(option_rows) - logger.info(f"trace_id={trace_id} 商品状态行读取完成: shop={shop_name}, country={country}, row_count={len(rows)}") - return rows - - def select_listing_status(self, status: str, trace_id: str = "") -> Dict[str, Any]: - normalized_status = self._normalize_option_text(status) - if not normalized_status: - raise RuntimeError("商品状态为空,无法执行筛选") - - trace_id = trace_id or _new_trace_id("status") - logger.info(f"trace_id={trace_id} 开始筛选商品状态: status={normalized_status}") - open_result = self.open_listing_status_dropdown() - option_rows = self._wait_listing_status_option_rows() - if not option_rows: - logger.info( - f"trace_id={trace_id} 商品状态下拉选项为空: " - f"open_result={_safe_log_text(json.dumps(open_result, ensure_ascii=False))}" - ) - raise RuntimeError(f"商品状态下拉框已打开但未读取到选项: {open_result}") - - result = self._run_js(LISTING_STATUS_SELECT_OPTION_SCRIPT, {"status": normalized_status}) or {} - if not result.get("ok"): - logger.info( - f"trace_id={trace_id} 商品状态选项未命中: " - f"status={normalized_status}, result={_safe_log_text(result)}" - ) - raise RuntimeError(f"未找到商品状态选项[{normalized_status}]: {result}") - time.sleep(LISTING_STATUS_SELECT_DELAY) - self._wait_inventory_loader() - logger.info(f"trace_id={trace_id} 商品状态筛选完成: status={normalized_status}, result={result}") - return {"mode": "dropdown-option", **result} - - def _close_listing_status_dropdown(self) -> None: - try: - self._run_js(LISTING_STATUS_DROPDOWN_CLOSE_SCRIPT) - except Exception as exc: - logger.info("关闭商品状态下拉框失败,继续执行: {}", exc) - time.sleep(0.2) - - def _wait_inventory_loader(self, timeout: int = INVENTORY_LOADER_TIMEOUT) -> None: - try: - loader = self.tab.ele("xpath://div[contains(@class,'Loader-module__loader')]", timeout=1) - except Exception: - loader = None - if loader: - loader.wait.deleted(timeout=timeout, raise_err=False) - time.sleep(0.5) - - def _get_first_inventory_row(self, status: str): - deadline = time.time() + INVENTORY_ROW_TIMEOUT - while time.time() < deadline: - self._wait_inventory_loader(timeout=2) - rows = self.tab.eles("xpath://div[@data-sku]", timeout=2) - if rows: - return rows[0] - time.sleep(0.4) - raise RuntimeError(f"状态[{status}]筛选后未找到商品行") - - def _get_first_inventory_row_or_none(self, status: str): - try: - return self._get_first_inventory_row(status) - except RuntimeError as exc: - logger.info("状态[{}]未找到可删除商品行: {}", status, exc) - return None - - def _delete_selected_filtered_inventory_rows(self, status: str, trace_id: str = "") -> Dict[str, Any]: - trace_id = trace_id or _new_trace_id("del") - logger.info(f"trace_id={trace_id} 开始批量删除当前筛选结果: status={status}") - row = self._get_first_inventory_row_or_none(status) - if row is None: - logger.info(f"trace_id={trace_id} 当前筛选结果没有可删除商品: status={status}") - return {"deletedCount": 0, "target": {}, "successMessage": ""} - - target = self._summarize_inventory_row(row) - select_result = self._run_js(INVENTORY_SELECT_ALL_SCRIPT) or {} - if not select_result.get("ok"): - logger.info(f"trace_id={trace_id} 全选商品失败: status={status}, result={_safe_log_text(select_result)}") - raise RuntimeError(f"状态[{status}]全选商品失败: {select_result}") - logger.info( - f"trace_id={trace_id} 当前筛选结果已全选: status={status}, " - f"row_count={select_result.get('rowCount')}, first_sku={target.get('sku', '')}" - ) - - delete_result: Dict[str, Any] = {} - for attempt in range(8): - time.sleep(0.8 if attempt else 0.3) - delete_result = self._run_js(INVENTORY_DELETE_SELECTED_SCRIPT) or {} - if delete_result.get("ok"): - break - if delete_result.get("menuOpened"): - logger.info( - f"trace_id={trace_id} 状态[{status}]已点击选择组操作,等待删除菜单展开: " - f"{_safe_log_text(delete_result)}" - ) - time.sleep(1) - continue - logger.info( - f"trace_id={trace_id} 状态[{status}]第{attempt + 1}次点击批量删除未命中: " - f"{_safe_log_text(delete_result)}" - ) - if not delete_result.get("ok"): - logger.info(f"trace_id={trace_id} 点击批量删除失败: status={status}, result={_safe_log_text(delete_result)}") - raise RuntimeError(f"状态[{status}]点击批量删除失败: {delete_result}") - logger.info(f"trace_id={trace_id} 批量删除按钮点击成功: status={status}, result={_safe_log_text(delete_result)}") - - self._confirm_delete_modal(status, trace_id=trace_id) - success_message = self._wait_delete_success_message(status, trace_id=trace_id) - deleted_count = self._extract_delete_success_count(success_message) or int(select_result.get("rowCount") or 1) - logger.info( - f"trace_id={trace_id} 批量删除确认完成: status={status}, " - f"deleted_count={deleted_count}, success_message={_safe_log_text(success_message)}" - ) - return { - "deletedCount": deleted_count, - "target": { - **target, - "selectedRows": select_result.get("rowCount"), - "selectResult": select_result, - "deleteResult": delete_result, - }, - "successMessage": success_message, - } - - @classmethod - def _summarize_inventory_row(cls, row) -> Dict[str, str]: - sku = "" - text = "" - try: - sku = row.attr("data-sku") or "" - except Exception: - sku = "" - try: - text = cls._normalize_option_text(getattr(row, "text", "") or "") - except Exception: - text = "" - return {"sku": sku, "rawText": text[:400]} - - def _confirm_delete_modal(self, status: str, trace_id: str = "") -> None: - trace_id = trace_id or _new_trace_id("modal") - js_result = self._click_confirm_delete_modal_with_js() - if js_result.get("ok"): - logger.info(f"trace_id={trace_id} 已通过 JS 确认删除弹窗: status={status}, result={_safe_log_text(js_result)}") - return - - logger.info( - f"trace_id={trace_id} JS 确认删除弹窗未命中,尝试驱动点击: " - f"status={status}, result={_safe_log_text(js_result)}" - ) - confirm_button = self.tab.ele( - 'xpath://kat-modal[@data-testid="action-modal"]//kat-button[@variant="primary"]', - timeout=5, - ) - if not confirm_button: - logger.info(f"trace_id={trace_id} 删除确认弹窗未出现: status={status}") - raise RuntimeError(f"状态[{status}]未出现删除确认弹窗") - - confirm_button.wait.displayed(raise_err=False) - confirm_button.wait.enabled() - confirm_button.click() - logger.info(f"trace_id={trace_id} 已通过驱动确认删除弹窗: status={status}") - - def _click_confirm_delete_modal_with_js(self) -> Dict[str, Any]: - try: - return self._run_js(DELETE_CONFIRM_MODAL_CLICK_SCRIPT) or {} - except Exception as exc: - logger.info("JS 点击删除确认按钮失败,回退到驱动点击: {}", exc) - return {"ok": False, "reason": str(exc)} - - def _wait_delete_success_message(self, status: str, trace_id: str = "") -> str: - trace_id = trace_id or _new_trace_id("toast") - deadline = time.time() + DELETE_SUCCESS_TIMEOUT - seen_messages = [] - while time.time() < deadline: - for text in self._collect_delete_success_messages(): - if not text: - continue - if text not in seen_messages: - seen_messages.append(text) - if self._is_delete_success_message(text): - logger.info(f"trace_id={trace_id} 读取到删除成功提示: status={status}, message={_safe_log_text(text)}") - return text - time.sleep(0.3) - logger.info( - f"trace_id={trace_id} 删除后未读取到成功提示: " - f"status={status}, seen_messages={_safe_log_text(seen_messages)}" - ) - raise RuntimeError("删除后未读取到成功提示") - - def _collect_delete_success_messages(self) -> List[str]: - messages: List[str] = [] - try: - alerts = self.tab.eles("xpath://kat-alert[not(@dismissed)]", timeout=1) - for alert in alerts: - text = self._extract_alert_text(alert) - if text and text not in messages: - messages.append(text) - except Exception: - pass - - try: - js_messages = self._run_js(DELETE_SUCCESS_MESSAGES_SCRIPT) or [] - for text in js_messages: - normalized = self._normalize_option_text(str(text or "")) - if normalized and normalized not in messages: - messages.append(normalized) - except Exception as exc: - logger.info("JS 读取删除提示失败,继续等待: {}", exc) - - return messages - - @classmethod - def _extract_alert_text(cls, alert) -> str: - parts = [] - try: - text = cls._normalize_option_text(getattr(alert, "text", "") or "") - if text: - parts.append(text) - except Exception: - pass - - for attr_name in ("description", "text", "label", "header"): - try: - value = cls._normalize_option_text(alert.attr(attr_name) or "") - except Exception: - value = "" - if value and value not in parts: - parts.append(value) - - return " ".join(parts).strip() - - @staticmethod - def _is_delete_success_message(text: str) -> bool: - normalized = re.sub(r"\s+", "", text or "") - if InventoryManage._extract_delete_success_count(normalized) > 0: - return True - return any(pattern.search(normalized) for pattern in DELETE_SUCCESS_TEXT_PATTERNS) - - @staticmethod - def _is_complete_draft_delete_success_message(text: str) -> bool: - normalized = re.sub(r"\s+", "", text or "") - return any(pattern.search(normalized) for pattern in COMPLETE_DRAFT_DELETE_SUCCESS_PATTERNS) - - @staticmethod - def _extract_delete_success_count(text: str) -> int: - normalized = re.sub(r"\s+", "", text or "") - for pattern in DELETE_SUCCESS_COUNT_PATTERNS: - match = pattern.search(normalized) - if match: - return int(match.group(1)) - return 0 - - def _wait_complete_draft_quick_view_tag_rows(self) -> List[Dict[str, Any]]: - deadline = time.time() + QUICK_VIEW_TAGS_TIMEOUT - rows = [] - last_result: Dict[str, Any] = {} - while time.time() < deadline: - result = self._run_js(COMPLETE_DRAFT_QUICK_VIEW_TAGS_SCRIPT) or {} - last_result = result - rows = result.get("rows") or [] - if rows: - return rows - time.sleep(0.3) - diagnostics = self._run_js(COMPLETE_DRAFT_QUICK_VIEW_DIAGNOSTIC_SCRIPT) or {} - logger.info("补全草稿快速查看未读取到标签,最后一次 DOM 探测:\n{}", json.dumps(last_result, ensure_ascii=False, indent=2)) - logger.info("补全草稿快速查看诊断信息:\n{}", json.dumps(diagnostics, ensure_ascii=False, indent=2)) - return rows - - def _wait_recommended_offer_percentage_rows(self) -> List[Dict[str, Any]]: - deadline = time.time() + RECOMMENDED_OFFER_ROWS_TIMEOUT - rows = [] - last_result: Dict[str, Any] = {} - while time.time() < deadline: - result = self._run_js(RECOMMENDED_OFFER_PERCENTAGE_ROWS_SCRIPT) or {} - last_result = result - rows = list(result.get("rows") or []) - if self._has_complete_cart_ratio_rows(rows): - return rows - time.sleep(0.3) - logger.info("推荐报价百分比明细未读取到目标日期,最后一次 DOM 探测:\n{}", json.dumps(last_result, ensure_ascii=False, indent=2)) - diagnostics = self._run_js(RECOMMENDED_OFFER_PERCENTAGE_DIAGNOSTIC_SCRIPT) or {} - compact = { - "url": diagnostics.get("url"), - "title": diagnostics.get("title"), - "buyBoxFound": diagnostics.get("buyBoxFound"), - "buyBoxLeafMatches": diagnostics.get("buyBoxLeafMatches") or [], - } - logger.info("推荐报价百分比诊断信息:\n{}", json.dumps(compact, ensure_ascii=False, indent=2)) - return rows - - def _run_js(self, script: str, *args): - if self.tab is None: - raise RuntimeError("浏览器页面不存在,请先打开店铺并进入管理所有库存页面") - if hasattr(self.tab, "run_js"): - return self.tab.run_js(script, *args) - if hasattr(self.tab, "run_js_loaded"): - return self.tab.run_js_loaded(script, *args) - raise RuntimeError("当前页面对象不支持执行 JavaScript,无法探测 Shadow DOM") - - def _open_recommended_offer_percentage_detail_with_driver(self) -> Dict[str, Any]: - if self.tab is None: - return {"ok": False, "reason": "tab missing"} - - for xpath in RECOMMENDED_OFFER_EXPAND_XPATHS: - try: - button = self.tab.ele(xpath, timeout=3) - except Exception as exc: - logger.info("定位推荐报价展开按钮失败: xpath={}, error={}", xpath, exc) - button = None - if not button: - continue - - try: - button.click() - return {"ok": True, "source": "driver", "xpath": xpath} - except Exception as exc: - logger.info("点击推荐报价展开按钮失败: xpath={}, error={}", xpath, exc) - - return {"ok": False, "reason": "expand button not found by driver"} - - def _wait_listing_status_section_rows(self) -> List[Dict[str, Any]]: - deadline = time.time() + DROPDOWN_OPTIONS_TIMEOUT - rows = [] - while time.time() < deadline: - result = self._run_js(LISTING_STATUS_SECTION_SCRIPT) or {} - rows = result.get("rows") or [] - if self._has_listing_status_rows(rows): - return rows - time.sleep(0.3) - return rows - - @staticmethod - def _has_listing_status_rows(rows: Iterable[Dict[str, Any]]) -> bool: - parsed_rows = [row for row in rows if (row.get("status") or "").strip()] - quantity_count = sum(1 for row in parsed_rows if str(row.get("quantity") or "").strip()) - return len(parsed_rows) >= 3 and quantity_count >= 2 - - @classmethod - def _parse_status_option_rows( - cls, option_rows: Iterable[Dict[str, Any]], shop_name: str, country: str - ) -> List[Dict[str, Any]]: - rows = [] - for option in option_rows: - raw_text = cls._normalize_option_text(option.get("raw_text") or "") - value = option.get("value") - if not raw_text and not value: - continue - - status, quantity = cls._parse_status_text(raw_text or str(value)) - if not status: - continue - - rows.append( - { - "shop_name": shop_name, - "country": country, - "status": status, - "quantity": quantity, - "value": value, - "raw_text": raw_text, - } - ) - return rows - - @classmethod - def _parse_listing_status_section_rows(cls, rows: Iterable[Dict[str, Any]]) -> List[Dict[str, Any]]: - parsed_rows = [] - seen = set() - - for row in rows: - status = cls._normalize_option_text(row.get("status") or "") - quantity = cls._normalize_quantity_text(row.get("quantity")) - raw_text = cls._normalize_option_text(row.get("raw_text") or "") - - if not status and raw_text: - for item in cls._extract_listing_status_rows_from_text(raw_text): - key = (item["status"], item["quantity"]) - if key in seen: - continue - seen.add(key) - parsed_rows.append(item) - continue - - if not status: - continue - - key = (status, quantity) - if key in seen: - continue - seen.add(key) - parsed_rows.append({"status": status, "quantity": quantity, "raw_text": raw_text or status}) - - return parsed_rows - - @classmethod - def _extract_listing_status_rows_from_text(cls, raw_text: str) -> List[Dict[str, Any]]: - text = cls._normalize_option_text(raw_text) - if not text: - return [] - - pattern = re.compile( - r"(全部|在搜索结果中禁止显示|配送问题|缺少报价|已停售|详情页面已删除|订单页面已删除|商品信息草稿|缺少的信息|定价问题|需要批准|不可售|在售)" - r"\s*(?:[((]\s*([\d,]+)\s*[))])?" - ) - rows = [] - for match in pattern.finditer(text): - rows.append( - { - "status": match.group(1).strip(), - "quantity": cls._normalize_quantity_text(match.group(2)), - "raw_text": cls._normalize_option_text(match.group(0)), - } - ) - return rows - - @staticmethod - def _normalize_quantity_text(quantity: Any) -> str: - if quantity is None: - return "" - text = re.sub(r"[^\d,]", "", str(quantity)) - return text.replace(",", "") - - @classmethod - def _build_country_section_rows(cls, rows: Iterable[Dict[str, Any]]) -> List[Dict[str, str]]: - return [ - { - "status": cls._normalize_option_text(row.get("status") or ""), - "quantity": cls._normalize_quantity_text(row.get("quantity")), - "deleteQuantity": "", - "processStatus": "", - } - for row in rows - if cls._normalize_option_text(row.get("status") or "") - ] - - @classmethod - def _build_deletable_status_rows( - cls, - rows: Iterable[Dict[str, Any]], - delete_conditions: Optional[Iterable[Any]] = None, - ) -> List[Dict[str, Any]]: - condition_texts = cls._normalize_delete_condition_texts(delete_conditions) - if not condition_texts: - return [] - inventory_status_enabled = cls._matches_any_delete_condition( - ("库存状态删除", "商品状态删除", "库存状态"), - condition_texts, - ) - candidates = [] - for row in rows: - status = cls._normalize_option_text(row.get("status") or "") - if not status: - continue - - quantity_text = cls._normalize_quantity_text(row.get("quantity")) - quantity = int(quantity_text) if quantity_text else 0 - canonical_status = cls._canonical_listing_status(status) - if not quantity_text or quantity <= 0 or canonical_status in LISTING_STATUS_DELETE_WHITELIST: - continue - if not inventory_status_enabled and not cls._matches_delete_conditions(status, condition_texts): - continue - - candidates.append( - { - "status": status, - "canonicalStatus": canonical_status, - "quantity": quantity, - } - ) - return candidates - - @classmethod - def _normalize_delete_condition_texts( - cls, - delete_conditions: Optional[Iterable[Any]], - ) -> List[str]: - texts = [] - if delete_conditions is None: - return texts - if isinstance(delete_conditions, (str, bytes, dict)): - delete_conditions = [delete_conditions] - for condition in delete_conditions or []: - if isinstance(condition, dict): - raw_text = next( - ( - condition.get(key) - for key in ("conditionText", "condition_text", "status", "text", "label", "name") - if condition.get(key) - ), - "", - ) - else: - raw_text = condition - for part in re.split(r"[,,;;、\r\n]+", str(raw_text or "")): - text = cls._normalize_option_text(part).lower() - if text: - texts.append(text) - return list(dict.fromkeys(texts)) - - @classmethod - def _matches_delete_conditions(cls, status: str, condition_texts: List[str]) -> bool: - normalized_status = cls._normalize_option_text(status).lower() - canonical_status = cls._canonical_listing_status(status).lower() - return any( - condition in normalized_status - or condition in canonical_status - or normalized_status in condition - or canonical_status in condition - for condition in condition_texts - ) - - @classmethod - def _matches_any_delete_condition(cls, statuses: Iterable[str], condition_texts: List[str]) -> bool: - return any(cls._matches_delete_conditions(status, condition_texts) for status in statuses) - - @classmethod - def _format_delete_conditions(cls, delete_conditions: Optional[Iterable[Any]]) -> str: - texts = cls._normalize_delete_condition_texts(delete_conditions) - return ", ".join(texts) if texts else "未指定" - - @classmethod - def _build_deletable_complete_draft_tag_rows( - cls, - rows: Iterable[Dict[str, Any]], - delete_conditions: Optional[Iterable[Any]] = None, - ) -> List[Dict[str, Any]]: - condition_texts = cls._normalize_delete_condition_texts(delete_conditions) - if not condition_texts: - return [] - complete_draft_enabled = bool( - cls._matches_any_delete_condition( - ("补全草稿删除", "补全草稿", "商品信息草稿"), - condition_texts, - ) - ) - candidates = [] - for row in rows: - tag = cls._normalize_option_text(row.get("tag") or row.get("status") or "") - if not tag: - continue - quantity_text = cls._normalize_quantity_text(row.get("quantity")) - quantity = int(quantity_text) if quantity_text else 0 - canonical_tag = cls._canonical_listing_status(tag) - if not quantity_text or quantity <= 0 or canonical_tag in LISTING_STATUS_DELETE_WHITELIST: - continue - if not complete_draft_enabled and not cls._matches_delete_conditions(tag, condition_texts): - continue - candidates.append( - { - "tag": tag, - "canonicalTag": canonical_tag, - "quantity": quantity, - } - ) - return candidates - - @staticmethod - def _format_deletable_candidates(candidates: Iterable[Dict[str, Any]]) -> str: - summary = [] - for candidate in candidates: - status = str(candidate.get("status") or "") - quantity = candidate.get("quantity") - summary.append(f"{status}({quantity})") - return ", ".join(summary) if summary else "无" - - @classmethod - def _canonical_listing_status(cls, status: str) -> str: - normalized = cls._normalize_option_text(status) - return LISTING_STATUS_COMPATIBILITY_MAP.get(normalized, normalized) - - @classmethod - def _normalize_allowed_status_set(cls, statuses: Optional[Iterable[str]]) -> Optional[Set[str]]: - if statuses is None: - return None - allowed = set() - for status in statuses: - text = cls._normalize_option_text(str(status or "")) - if not text: - continue - for part in re.split(r"[,,;;、\r\n]+", text): - normalized = cls._normalize_option_text(part) - if normalized: - allowed.add(cls._canonical_listing_status(normalized)) - return allowed - - @staticmethod - def _normalize_option_text(text: str) -> str: - return re.sub(r"\s+", " ", text).strip() - - @staticmethod - def _parse_status_text(raw_text: str) -> tuple[str, Optional[int]]: - text = re.sub(r"\s+", " ", raw_text).strip() - if not text: - return "", None - - match = re.search(r"^(.*?)\s*[((]\s*([\d,]+)\s*[))]\s*$", text) - if match: - return match.group(1).strip(), int(match.group(2).replace(",", "")) - - match = re.search(r"^(.*?)\s+([\d,]+)\s*$", text) - if match and not re.search(r"\d", match.group(1)): - return match.group(1).strip(), int(match.group(2).replace(",", "")) - - return text, None - - @classmethod - def _parse_quick_view_tag_rows( - cls, rows: Iterable[Dict[str, Any]], shop_name: str, country: str - ) -> List[Dict[str, Any]]: - parsed_rows = [] - seen = set() - - for row in rows: - raw_text = cls._normalize_option_text(row.get("raw_text") or "") - label_text = cls._normalize_option_text(row.get("label_text") or "") - quantity_text = cls._normalize_option_text(str(row.get("quantity_text") or "")) - - parsed = cls._parse_label_quantity_text(raw_text) - if parsed is None and label_text and quantity_text: - parsed = cls._parse_label_quantity_text(f"{label_text} ({quantity_text})") - if parsed is None: - continue - - tag, quantity = parsed - if not cls._is_complete_draft_tag_candidate(tag): - continue - key = (tag, quantity) - if key in seen: - continue - seen.add(key) - - parsed_rows.append( - { - "shop_name": shop_name, - "country": country, - "tag": tag, - "quantity": quantity, - "raw_text": raw_text or f"{label_text} ({quantity_text})", - } - ) - - return parsed_rows - - @staticmethod - def _is_complete_draft_tag_candidate(tag: str) -> bool: - normalized_tag = re.sub(r"\s+", " ", tag).strip() - if not normalized_tag: - return False - if normalized_tag == "补全草稿": - return False - if "/" in normalized_tag: - return False - if re.search(r"\b页面\b", normalized_tag): - return False - return True - - @staticmethod - def _parse_label_quantity_text(raw_text: str) -> Optional[tuple[str, int]]: - text = re.sub(r"\s+", " ", raw_text).strip() - if not text: - return None - - match = re.search(r"^(.*?)\s*[((]\s*([\d,]+)\s*[))]\s*$", text) - if not match: - return None - - tag = match.group(1).strip() - if not tag or re.fullmatch(r"[\d,]+", tag): - return None - if re.search(r"[((]\s*[\d,]+\s*[))]", tag): - return None - - return tag, int(match.group(2).replace(",", "")) - - @classmethod - def _parse_cart_ratio_rows(cls, rows: Iterable[Dict[str, Any]], country: str) -> Dict[str, str]: - ratio = cls._empty_cart_ratio(country) - texts = cls._cart_ratio_texts(rows) - - for text in texts: - if not ratio["ratio2DaysAgo"]: - ratio["ratio2DaysAgo"] = cls._extract_ratio_for_days(text, 2) - if not ratio["ratio30DaysAgo"]: - ratio["ratio30DaysAgo"] = cls._extract_ratio_for_days(text, 30) - if ratio["ratio2DaysAgo"] and ratio["ratio30DaysAgo"]: - return ratio - - combined_text = " ".join(texts) - if not ratio["ratio2DaysAgo"]: - ratio["ratio2DaysAgo"] = cls._extract_ratio_for_days(combined_text, 2) - if not ratio["ratio30DaysAgo"]: - ratio["ratio30DaysAgo"] = cls._extract_ratio_for_days(combined_text, 30) - return ratio - - @classmethod - def _parse_all_cart_ratio_rows(cls, rows: Iterable[Dict[str, Any]]) -> List[Dict[str, str]]: - rect_rows = cls._parse_rect_based_cart_ratio_rows(rows) - if rect_rows: - return rect_rows - - direct_rows = cls._parse_direct_cart_ratio_rows(rows) - if direct_rows: - return direct_rows - - texts = cls._cart_ratio_texts(rows) - combined_text = cls._normalize_option_text(" ".join(texts)) - return [cls._parse_country_cart_ratio(texts, combined_text, country) for country in RECOMMENDED_OFFER_COUNTRIES] - - @classmethod - def _parse_rect_based_cart_ratio_rows(cls, rows: Iterable[Dict[str, Any]]) -> List[Dict[str, str]]: - countries = [] - percentages = [] - - for row in rows: - attrs = row.get("attrs") or {} - candidate = str( - attrs.get("title") - or row.get("label_text") - or row.get("raw_text") - or "" - ).strip() - if not candidate or len(candidate) > 20: - continue - - left = row.get("rect_left") - top = row.get("rect_top") - width = row.get("rect_width") - height = row.get("rect_height") - if not all(isinstance(value, (int, float)) for value in (left, top, width, height)): - continue - if width <= 0 or height <= 0: - continue - - country_match = next( - ( - target - for target in RECOMMENDED_OFFER_COUNTRIES - if any(candidate.lower() == alias.lower() for alias in cls._country_aliases(target)) - ), - None, - ) - if country_match: - countries.append( - { - "country": country_match, - "x": float(left), - "y": float(top) + float(height) / 2, - "h": float(height), - "area": float(width) * float(height), - } - ) - continue - - if re.fullmatch(r"\d+(?:\.\d+)?\s*%", candidate): - percentages.append( - { - "value": cls._normalize_ratio_text(candidate), - "x": float(left), - "y": float(top) + float(height) / 2, - "area": float(width) * float(height), - } - ) - - if not countries or not percentages: - return [] - - deduped_countries = [] - for item in sorted(countries, key=lambda row: (row["y"], row["x"], row["area"])): - exists = any( - row["country"] == item["country"] and abs(row["y"] - item["y"]) < 8 - for row in deduped_countries - ) - if not exists: - deduped_countries.append(item) - - parsed = [] - for row in deduped_countries: - row_y_tolerance = max(12.0, min(24.0, row["h"] / 2 + 4.0)) - same_row = sorted( - ( - item - for item in percentages - if item["x"] > row["x"] + 20 and abs(item["y"] - row["y"]) <= row_y_tolerance - ), - key=lambda item: (item["x"], item["y"], item["area"]), - ) - - unique = [] - for item in same_row: - if not any(abs(existing["x"] - item["x"]) < 24 for existing in unique): - unique.append(item) - - parsed.append( - { - "country": row["country"], - "ratio2DaysAgo": unique[0]["value"] if len(unique) >= 1 else "", - "ratio30DaysAgo": unique[1]["value"] if len(unique) >= 2 else "", - } - ) - - if not any(item["ratio2DaysAgo"] or item["ratio30DaysAgo"] for item in parsed): - return [] - - by_country = {item["country"]: item for item in parsed} - return [by_country.get(country, cls._empty_cart_ratio(country)) for country in RECOMMENDED_OFFER_COUNTRIES] - - @classmethod - def _parse_direct_cart_ratio_rows(cls, rows: Iterable[Dict[str, Any]]) -> List[Dict[str, str]]: - by_country: Dict[str, Dict[str, str]] = {} - for row in rows: - country = str(row.get("country") or "").strip() - if country not in RECOMMENDED_OFFER_COUNTRIES: - continue - - ratio = by_country.setdefault(country, cls._empty_cart_ratio(country)) - ratio2 = cls._normalize_ratio_text(str(row.get("ratio2DaysAgo") or "")) if row.get("ratio2DaysAgo") else "" - ratio30 = cls._normalize_ratio_text(str(row.get("ratio30DaysAgo") or "")) if row.get("ratio30DaysAgo") else "" - if ratio2 and not ratio["ratio2DaysAgo"]: - ratio["ratio2DaysAgo"] = ratio2 - if ratio30 and not ratio["ratio30DaysAgo"]: - ratio["ratio30DaysAgo"] = ratio30 - - if not by_country: - return [] - return [by_country.get(country, cls._empty_cart_ratio(country)) for country in RECOMMENDED_OFFER_COUNTRIES] - - @classmethod - def _parse_country_cart_ratio(cls, texts: List[str], combined_text: str, country: str) -> Dict[str, str]: - ratio = cls._empty_cart_ratio(country) - - for text in texts: - segment = cls._extract_country_segment(text, country) - if not segment: - continue - if not ratio["ratio2DaysAgo"]: - ratio["ratio2DaysAgo"] = cls._extract_ratio_for_days(segment, 2) - if not ratio["ratio30DaysAgo"]: - ratio["ratio30DaysAgo"] = cls._extract_ratio_for_days(segment, 30) - if ratio["ratio2DaysAgo"] and ratio["ratio30DaysAgo"]: - return ratio - - segment = cls._extract_country_segment(combined_text, country) - if segment: - if not ratio["ratio2DaysAgo"]: - ratio["ratio2DaysAgo"] = cls._extract_ratio_for_days(segment, 2) - if not ratio["ratio30DaysAgo"]: - ratio["ratio30DaysAgo"] = cls._extract_ratio_for_days(segment, 30) - if not ratio["ratio2DaysAgo"] or not ratio["ratio30DaysAgo"]: - header_ratio = cls._extract_ratio_pair_from_country_table(segment, combined_text) - if not ratio["ratio2DaysAgo"]: - ratio["ratio2DaysAgo"] = header_ratio["ratio2DaysAgo"] - if not ratio["ratio30DaysAgo"]: - ratio["ratio30DaysAgo"] = header_ratio["ratio30DaysAgo"] - return ratio - - @classmethod - def _extract_country_segment(cls, text: str, country: str) -> str: - normalized = cls._normalize_option_text(text) - if not normalized: - return "" - - matches = sorted( - ( - (alias, match.start(), match.end()) - for alias in cls._country_aliases(country) - for match in re.finditer(re.escape(alias), normalized, flags=re.IGNORECASE) - ), - key=lambda item: item[1], - ) - if not matches: - return "" - - all_boundaries = sorted( - ( - (match.start(), match.end()) - for target_country in RECOMMENDED_OFFER_COUNTRIES - for alias in cls._country_aliases(target_country) - for match in re.finditer(re.escape(alias), normalized, flags=re.IGNORECASE) - ), - key=lambda item: item[0], - ) - - for _, start, end in matches: - next_boundary = next((boundary_start for boundary_start, _ in all_boundaries if boundary_start > start), len(normalized)) - segment = normalized[start:next_boundary].strip() - if cls._extract_ratio_for_days(segment, 2) or cls._extract_ratio_for_days(segment, 30): - return segment - trailing_segment = normalized[end:next_boundary].strip() - if cls._extract_ratio_for_days(trailing_segment, 2) or cls._extract_ratio_for_days(trailing_segment, 30): - return trailing_segment - if re.search(r"\d+(?:\.\d+)?\s*%", segment): - return segment - if re.search(r"\d+(?:\.\d+)?\s*%", trailing_segment): - return trailing_segment - return "" - - @staticmethod - def _country_aliases(country: str) -> List[str]: - aliases = { - "欧洲": ["欧洲", "Europe"], - "英国": ["英国", "UK", "United Kingdom"], - "德国": ["德国", "Germany"], - "法国": ["法国", "France"], - "西班牙": ["西班牙", "Spain"], - "意大利": ["意大利", "Italy"], - } - return aliases.get(country, [country]) - - @classmethod - def _has_any_cart_ratio(cls, rows: Iterable[Dict[str, Any]]) -> bool: - return any( - item["ratio2DaysAgo"] or item["ratio30DaysAgo"] for item in cls._parse_all_cart_ratio_rows(rows) - ) - - @classmethod - def _has_complete_cart_ratio_rows(cls, rows: Iterable[Dict[str, Any]]) -> bool: - return all( - item["ratio2DaysAgo"] and item["ratio30DaysAgo"] - for item in cls._parse_all_cart_ratio_rows(rows) - ) - - @classmethod - def _extract_ratio_pair_from_country_table(cls, segment: str, full_text: str) -> Dict[str, str]: - ratio = {"ratio2DaysAgo": "", "ratio30DaysAgo": ""} - if not cls._looks_like_cart_ratio_table(full_text): - return ratio - - percentages = [cls._normalize_ratio_text(match.group(0)) for match in re.finditer(r"\d+(?:\.\d+)?\s*%", segment)] - if len(percentages) >= 1: - ratio["ratio2DaysAgo"] = percentages[0] - if len(percentages) >= 2: - ratio["ratio30DaysAgo"] = percentages[1] - return ratio - - @classmethod - def _looks_like_cart_ratio_table(cls, text: str) -> bool: - normalized = cls._normalize_option_text(text) - if not normalized: - return False - - if cls._extract_ratio_for_days(normalized, 2) and cls._extract_ratio_for_days(normalized, 30): - return True - - if not re.search(r"推荐报价|featured offer|buy box", normalized, flags=re.IGNORECASE): - return False - - country_hits = sum( - 1 - for country in RECOMMENDED_OFFER_COUNTRIES - if any(alias.lower() in normalized.lower() for alias in cls._country_aliases(country)) - ) - if country_hits >= 2: - return True - - date_patterns = [ - r"\b\d{1,2}\s+[A-Za-z]{3,9}\b", - r"\b[A-Za-z]{3,9}\s+\d{1,2}\b", - r"\b\d{1,2}[/-]\d{1,2}(?:[/-]\d{2,4})?\b", - r"\b\d{4}[/-]\d{1,2}[/-]\d{1,2}\b", - ] - return any(re.search(pattern, normalized, flags=re.IGNORECASE) for pattern in date_patterns) - - @staticmethod - def _empty_cart_ratio(country: str) -> Dict[str, str]: - return {"country": country, "ratio2DaysAgo": "", "ratio30DaysAgo": ""} - - @classmethod - def _cart_ratio_texts(cls, rows: Iterable[Dict[str, Any]]) -> List[str]: - texts = [] - seen = set() - for row in rows: - parts = [ - str(row.get("raw_text") or ""), - str(row.get("label_text") or ""), - str(row.get("percentage_text") or ""), - ] - text = cls._normalize_option_text(" ".join(part for part in parts if part)) - if not text or text in seen: - continue - seen.add(text) - texts.append(text) - return texts - - @classmethod - def _extract_ratio_for_days(cls, raw_text: str, days: int) -> str: - text = cls._normalize_option_text(raw_text) - if not text: - return "" - - day_matches = list(cls._iter_day_matches(text, days)) - if not day_matches: - return "" - - percent_matches = list(re.finditer(r"\d+(?:\.\d+)?\s*%", text)) - if not percent_matches: - return "" - - all_day_matches = sorted( - [match for target_days in (2, 30) for match in cls._iter_day_matches(text, target_days)], - key=lambda match: match.start(), - ) - prefer_before = percent_matches[0].start() < all_day_matches[0].start() if all_day_matches else False - - for day_match in day_matches: - next_day_start = next( - (match.start() for match in all_day_matches if match.start() > day_match.start()), - len(text), - ) - previous_day_end = max( - [match.end() for match in all_day_matches if match.end() < day_match.start()], - default=0, - ) - before = [match for match in percent_matches if previous_day_end <= match.end() <= day_match.start()] - after = [match for match in percent_matches if day_match.end() <= match.start() < next_day_start] - nearest_before = before[-1] if before else None - nearest_after = after[0] if after else None - if nearest_before and nearest_after: - if prefer_before: - return cls._normalize_ratio_text(nearest_before.group(0)) - return cls._normalize_ratio_text(nearest_after.group(0)) - if nearest_before: - return cls._normalize_ratio_text(nearest_before.group(0)) - if nearest_after: - return cls._normalize_ratio_text(nearest_after.group(0)) - - return "" - - @staticmethod - def _iter_day_matches(text: str, days: int) -> Iterable[re.Match[str]]: - patterns = [ - rf"(? str: - return re.sub(r"\s+", "", text) - - -class PatrolDeleteTask: - """巡店删除任务处理类。""" - - mark_name = "巡店删除" - - def __init__(self, user_info: dict = None): - self.user_info = user_info or {} - self.running = True - - def log(self, message: str, level: str = "INFO"): - level_name = str(level or "INFO").upper() - logger.log(level_name, f"[PatrolDeleteTask] {_safe_log_text(message)}") - - def process_task(self, task_data: dict): - """处理巡店删除任务主入口。""" - task_id = None - try: - data = task_data.get("data", {}) - task_id = data.get("taskId") - items = data.get("items", []) - country_sections = data.get("country_sections", []) - cart_ratios = data.get("cart_ratios", []) - delete_conditions = self._resolve_delete_condition_texts(data) - - if not task_id: - self.log("任务ID为空,跳过", "WARNING") - return - if not items: - self.log("店铺列表为空,跳过", "WARNING") - return - - from config import runing_task - - total_countries = sum(len(self._resolve_country_sections(item, country_sections)) for item in items) - runing_task[task_id] = { - "status": "running", - "start_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), - "total_shops": len(items), - "total_countries": total_countries, - "processed_shops": 0, - "processed_countries": 0, - "success_count": 0, - "failed_count": 0, - "failed_countries": 0, - "deleted_listings_count": 0, - "delete_conditions": delete_conditions, - "stop_requested": False, - } - - self.log( - f"开始处理巡店删除任务 {task_id},共 {len(items)} 个店铺,{total_countries} 个国家," - f"删除条件={delete_conditions if delete_conditions is not None else '未指定'}" - ) - for index, shop_item in enumerate(items, 1): - if runing_task[task_id].get("stop_requested", False): - self.log(f"检测到任务 {task_id} 的暂停请求,停止处理", "WARNING") - runing_task[task_id]["status"] = "stopped" - return - - shop_name = shop_item.get("shopName", "未知店铺") - self.log(f"[{index}/{len(items)}] 开始处理店铺: {shop_name}") - self.process_shop(task_id, shop_item, country_sections, cart_ratios, delete_conditions) - runing_task[task_id]["processed_shops"] += 1 - - if runing_task[task_id].get("stop_requested", False): - runing_task[task_id]["status"] = "stopped" - self.log(f"任务 {task_id} 已被暂停!") - else: - runing_task[task_id]["status"] = "completed" - self.log(f"任务 {task_id} 处理完成!") - except Exception as exc: - import traceback - - self.log(f"任务处理失败: {traceback.format_exc()}", "ERROR") - if task_id: - from config import runing_task - - if task_id in runing_task: - runing_task[task_id]["status"] = "failed" - runing_task[task_id]["error"] = str(exc) - - def process_shop( - self, - task_id: int, - shop_item: Dict[str, Any], - country_sections: List[Dict[str, Any]], - cart_ratios: List[Dict[str, Any]], - delete_conditions: Optional[List[str]] = None, - ): - """处理单个店铺。""" - from config import runing_shop, runing_task - - shop_name = shop_item.get("shopName", "") - company_name = shop_item.get("companyName", "") - if not shop_name: - self.log("店铺名称为空,跳过", "WARNING") - return - if not company_name: - raise RuntimeError(f"店铺 {shop_name} 的公司名称为空") - - runing_task[task_id]["current_shop"] = shop_name - runing_shop[shop_name] = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - self.log(f"店铺 {shop_name} 已添加到执行列表") - - try: - payload_country_sections = self._resolve_country_sections(shop_item, country_sections) - payload_cart_ratios = self._resolve_cart_ratios(shop_item, cart_ratios) - if not payload_country_sections: - raise RuntimeError(f"店铺 {shop_name} 缺少国家模板,无法执行巡店删除") - - country_names = self._ordered_countries(payload_country_sections) - aggregated_sections = self._build_country_section_templates(payload_country_sections) - aggregated_cart_ratios = self._build_cart_ratio_templates(country_names, payload_cart_ratios) - self.log( - f"店铺 {shop_name} 待处理国家: {', '.join(country_names)}," - f"删除条件={delete_conditions if delete_conditions is not None else '未指定'}" - ) - - driver: Optional[InventoryManage] = None - requires_browser_reset = False - country_results = [] - for country_name in country_names: - if runing_task[task_id].get("stop_requested", False): - self.log(f"检测到任务 {task_id} 的暂停请求,停止处理店铺 {shop_name}", "WARNING") - break - - if driver is None or requires_browser_reset: - if driver is not None: - self._safe_close_store(driver) - driver = self.open_shop( - max_retries=PRODUCT_TASK_MAX_RETRIES, - company_name=company_name, - shop_name=shop_name, - iskill=requires_browser_reset, - ) - requires_browser_reset = False - if driver is None: - raise RuntimeError(f"店铺 {shop_name} 打开失败") - - country_result = self.process_country( - driver=driver, - task_id=task_id, - shop_name=shop_name, - country_name=country_name, - delete_conditions=delete_conditions, - ) - country_results.append(country_result) - aggregated_sections[country_name] = country_result["countrySection"] - aggregated_cart_ratios[country_name] = country_result["cartRatio"] - runing_task[task_id]["processed_countries"] += 1 - runing_task[task_id]["deleted_listings_count"] += country_result["deletedCount"] - if not country_result["success"]: - runing_task[task_id]["failed_countries"] += 1 - requires_browser_reset = country_result["reopenRequired"] - self.log( - f"国家 {country_name} 处理结束,success={country_result['success']}," - f"deleted={country_result['deletedCount']},reopenRequired={requires_browser_reset}" - ) - self._post_progress_result_safely( - task_id=task_id, - shop_name=shop_name, - ) - - if driver is not None: - self.log(f"店铺 {shop_name} 国家处理完成,正在关闭店铺") - self._safe_close_store(driver) - - self.log(f"店铺 {shop_name} 处理结果已汇总,准备回传") - self.post_result( - task_id=task_id, - shop_name=shop_name, - country_sections=[aggregated_sections[country] for country in country_names], - cart_ratios=[aggregated_cart_ratios[country] for country in country_names], - shop_done=True, - ) - if any(result["success"] for result in country_results): - runing_task[task_id]["success_count"] += 1 - else: - runing_task[task_id]["failed_count"] += 1 - self.log(f"店铺 {shop_name} 处理完成,成功国家数: {sum(1 for result in country_results if result['success'])}/{len(country_names)}") - except Exception as exc: - self.log(f"处理店铺 {shop_name} 失败: {str(exc)}", "ERROR") - runing_task[task_id]["failed_count"] += 1 - try: - self.post_result(task_id=task_id, shop_name=shop_name, error=str(exc), shop_done=True) - except Exception as post_exc: - self.log(f"回传店铺失败结果失败: {str(post_exc)}", "ERROR") - finally: - if shop_name in runing_shop: - del runing_shop[shop_name] - self.log(f"店铺 {shop_name} 已从执行列表中移除") - - def _post_progress_result_safely( - self, - task_id: int, - shop_name: str, - ) -> None: - """Submit a heartbeat-only payload so Java does not append duplicate result rows.""" - try: - self.post_result( - task_id=task_id, - shop_name=shop_name, - shop_done=False, - heartbeat_only=True, - ) - except Exception as exc: - self.log(f"店铺 {shop_name} 中间结果回传失败,继续执行: {str(exc)}", "WARNING") - - def open_shop(self, max_retries: int, company_name: str, shop_name: str, iskill: bool = False) -> Optional[InventoryManage]: - error_info = "" - driver: Optional[InventoryManage] = None - browser = None - for retry in range(max_retries): - try: - self.log(f"尝试打开店铺 {shop_name} (第 {retry + 1}/{max_retries} 次)") - - if iskill: - self.log("重试前先杀掉浏览器进程...") - kill_process("v6") - kill_process("v5") - time.sleep(PRODUCT_TASK_BROWSER_RESET_DELAY) - - user_info = {**self.user_info, "company": company_name} - driver = InventoryManage(user_info) - browser = driver.open_shop(shop_name) - - if not browser or browser == "店铺不存在": - self.log(f"打开店铺失败: {browser}", "WARNING") - driver = None - continue - - if driver.need_login(): - self.log(f"店铺 {shop_name} 需要登录,正在登录...") - response = get_shop_info(shop_name) - credential_payload = response.json() if response is not None else {} - password = str(((credential_payload.get("data") or {}).get("password") or "")).strip() - if not password: - message = f"获取店铺 {shop_name} 凭证失败" - self.log(message, "ERROR") - show_notification(message, "error") - driver = None - continue - - if not driver.login(password): - self.log(f"店铺 {shop_name} 登录失败", "WARNING") - driver = None - continue - - browser = driver.open_shop(shop_name) - if not browser or browser == "店铺不存在": - self.log(f"登录后打开店铺失败: {browser}", "WARNING") - driver = None - continue - - self.log(f"成功打开店铺 {shop_name}") - return driver - except Exception as exc: - error_info = str(exc) - self.log(f"打开店铺异常: {error_info}", "ERROR") - driver = None - if retry < max_retries - 1: - time.sleep(PRODUCT_TASK_RETRY_DELAY) - - if retry < max_retries - 1: - time.sleep(PRODUCT_TASK_OPEN_SHOP_DELAY) - - self.log(f"店铺 {shop_name} 打开失败,已重试 {max_retries} 次,错误: {error_info}", "ERROR") - return driver - - def process_country( - self, - driver: InventoryManage, - task_id: int, - shop_name: str, - country_name: str, - delete_conditions: Optional[List[str]] = None, - ) -> Dict[str, Any]: - from config import runing_task - - trace_id = _new_trace_id("country") - self.log(f"trace_id={trace_id} 开始处理国家: task_id={task_id}, shop={shop_name}, country={country_name}") - show_notification(f"开始处理巡店删除国家: {country_name}", "info") - if task_id in runing_task: - runing_task[task_id]["current_country"] = country_name - - latest_status_rows: List[Dict[str, Any]] = [] - try: - self.log(f"trace_id={trace_id} 准备切换国家: country={country_name}") - self._switch_country_with_retry(driver, country_name) - self.log(f"trace_id={trace_id} 国家切换完成,准备进入管理所有库存页面: country={country_name}") - driver.switch_to_manage_inventory() - self.log(f"trace_id={trace_id} 已进入管理所有库存页面,开始删除非白名单商品: country={country_name}") - - delete_result = driver.delete_all_listings_from_non_whitelisted_statuses( - shop_name, - country_name, - trace_id=trace_id, - delete_conditions=delete_conditions, - ) - latest_status_rows = delete_result.get("statusRows") or [] - self.log( - f"trace_id={trace_id} 国家 {country_name} 删除步骤完成,deleted={delete_result.get('totalDeleted', 0)}," - f"stopReason={delete_result.get('stopReason', '')}" - ) - country_section = self._build_country_section_result( - country_name=country_name, - status_rows=latest_status_rows, - delete_counts=delete_result.get("deleteCounts") or {}, - default_process_status="无可删商品" if delete_result.get("totalDeleted", 0) == 0 else "", - ) - complete_draft_delete_result = self._delete_complete_draft_country_section_safe( - driver, - shop_name, - country_name, - delete_conditions, - ) - complete_draft_section = complete_draft_delete_result.get("countrySection") - country_section = self._replace_complete_draft_rows(country_section, complete_draft_section) - - cart_ratio = self._read_country_cart_ratio_safe(driver, country_name) - self.log(f"trace_id={trace_id} 国家 {country_name} 购物车比例读取完成: {cart_ratio.get('ratio', '')}") - - total_deleted = int(delete_result.get("totalDeleted") or 0) + int( - complete_draft_delete_result.get("deletedCount") or 0 - ) - return { - "success": True, - "countrySection": country_section, - "cartRatio": cart_ratio, - "deletedCount": total_deleted, - "reopenRequired": False, - } - except Exception as exc: - self.log(f"trace_id={trace_id} 处理国家 {country_name} 失败: {str(exc)}", "ERROR") - cart_ratio = self._read_country_cart_ratio_safe(driver, country_name) - failure_rows = latest_status_rows or [{"status": "全部", "quantity": "", "deleteQuantity": "", "processStatus": ""}] - country_section = self._build_country_section_result( - country_name=country_name, - status_rows=failure_rows, - delete_counts={}, - default_process_status=f"处理失败: {self._short_error(str(exc))}", - ) - return { - "success": False, - "countrySection": country_section, - "cartRatio": cart_ratio, - "deletedCount": 0, - "reopenRequired": self._should_reopen_browser(str(exc)), - } - - def _read_country_cart_ratio_safe(self, driver: InventoryManage, country_name: str) -> Dict[str, str]: - trace_id = _new_trace_id("cart") - try: - self.log(f"trace_id={trace_id} 开始读取国家 {country_name} 购物车比例") - cart_ratio = self._extract_country_cart_ratio( - driver.get_recommended_offer_cart_ratios().get("cartRatios") or [], - country_name, - ) - self.log(f"trace_id={trace_id} 国家 {country_name} 购物车比例读取成功: {cart_ratio.get('ratio', '')}") - return cart_ratio - except Exception as cart_exc: - self.log(f"trace_id={trace_id} 读取国家 {country_name} 购物车比例失败: {str(cart_exc)}", "WARNING") - return self._empty_cart_ratio(country_name) - - def _read_complete_draft_country_section_safe( - self, - driver: InventoryManage, - shop_name: str, - country_name: str, - ) -> Optional[Dict[str, Any]]: - trace_id = _new_trace_id("draft") - try: - self.log(f"trace_id={trace_id} 开始读取国家 {country_name} 补全草稿") - tags = driver.get_complete_draft_quick_view_tags(shop_name, country_name) - rows = [] - for item in tags: - quantity = InventoryManage._normalize_quantity_text(item.get("quantity")) - rows.append( - { - "type": "completeDraft", - "status": PatrolDeleteTask._string_result_field(item.get("tag")), - "quantity": quantity, - "deleteQuantity": "", - "processStatus": "", - } - ) - self.log(f"trace_id={trace_id} 国家 {country_name} 补全草稿读取完成: rows={rows}") - return {"country": country_name, "rows": rows} if rows else None - except Exception as draft_exc: - self.log(f"trace_id={trace_id} 读取国家 {country_name} 补全草稿失败: {str(draft_exc)}", "WARNING") - return None - - def _delete_complete_draft_country_section_safe( - self, - driver: InventoryManage, - shop_name: str, - country_name: str, - delete_conditions: Optional[List[str]] = None, - ) -> Dict[str, Any]: - trace_id = _new_trace_id("draft") - try: - self.log(f"trace_id={trace_id} 开始处理国家 {country_name} 补全草稿删除") - delete_result = driver.delete_complete_drafts_from_non_whitelisted_tags( - shop_name, - country_name, - trace_id=trace_id, - delete_conditions=delete_conditions, - ) - rows = [] - delete_counts = delete_result.get("deleteCounts") or {} - for item in delete_result.get("draftRows") or []: - status = PatrolDeleteTask._string_result_field(item.get("tag") or item.get("status")) - canonical_status = InventoryManage._canonical_listing_status(status) - deleted_count = int(delete_counts.get(canonical_status) or 0) - rows.append( - { - "type": "completeDraft", - "status": status, - "quantity": InventoryManage._normalize_quantity_text(item.get("quantity")), - "deleteQuantity": str(deleted_count), - "processStatus": "已完成" if deleted_count > 0 else "", - } - ) - section = {"country": country_name, "rows": rows} if rows else None - self.log( - f"trace_id={trace_id} 国家 {country_name} 补全草稿删除处理完成: " - f"deleted={delete_result.get('totalDeleted', 0)}, rows={rows}" - ) - return { - "countrySection": section, - "deletedCount": int(delete_result.get("totalDeleted") or 0), - "deleteResult": delete_result, - } - except Exception as draft_exc: - self.log(f"trace_id={trace_id} 删除国家 {country_name} 补全草稿失败: {str(draft_exc)}", "WARNING") - fallback_section = self._read_complete_draft_country_section_safe(driver, shop_name, country_name) - return {"countrySection": fallback_section, "deletedCount": 0, "error": str(draft_exc)} - - def _switch_country_with_retry(self, driver: InventoryManage, country_name: str) -> None: - trace_id = _new_trace_id("switch") - for retry in range(PRODUCT_TASK_MAX_RETRIES): - try: - self.log( - f"trace_id={trace_id} 尝试切换到国家 {country_name} " - f"(第 {retry + 1}/{PRODUCT_TASK_MAX_RETRIES} 次)" - ) - if driver.switch_to_country(country_name): - self.log(f"trace_id={trace_id} 成功切换到国家 {country_name}") - return - if retry < PRODUCT_TASK_MAX_RETRIES - 1: - try: - driver.tab.refresh() - except Exception: - pass - time.sleep(PRODUCT_TASK_RETRY_DELAY) - except Exception as exc: - if retry >= PRODUCT_TASK_MAX_RETRIES - 1: - raise RuntimeError(f"切换国家 {country_name} 失败: {exc}") from exc - self.log(f"trace_id={trace_id} 切换国家 {country_name} 异常,准备重试: {str(exc)}", "WARNING") - time.sleep(PRODUCT_TASK_RETRY_DELAY) - raise RuntimeError(f"切换国家 {country_name} 失败") - - @classmethod - def _resolve_delete_condition_texts(cls, data: Dict[str, Any]) -> Optional[List[str]]: - if "delete_conditions" in data: - raw_conditions = data.get("delete_conditions") - elif "deleteConditions" in data: - raw_conditions = data.get("deleteConditions") - else: - return [] - return cls._parse_delete_condition_texts(raw_conditions) - - @classmethod - def _parse_delete_condition_texts(cls, raw_conditions: Any) -> List[str]: - if raw_conditions is None: - return [] - if not isinstance(raw_conditions, list): - raw_conditions = [raw_conditions] - - texts: List[str] = [] - for item in raw_conditions: - text = "" - if isinstance(item, dict): - for key in ("conditionText", "condition_text", "status", "text", "label", "name"): - value = item.get(key) - if value: - text = str(value) - break - elif item is not None: - text = str(item) - - for part in re.split(r"[,,;;、\r\n]+", text): - normalized = InventoryManage._normalize_option_text(part) - if normalized and normalized not in texts: - texts.append(normalized) - return texts - - def post_result( - self, - task_id: int, - shop_name: str, - country_sections: Optional[List[Dict[str, Any]]] = None, - cart_ratios: Optional[List[Dict[str, Any]]] = None, - error: str = "", - shop_done: bool = False, - heartbeat_only: bool = False, - ): - """回传巡店删除结果到 Java API。""" - from config import DELETE_BRAND_API_BASE - - trace_id = _new_trace_id("post") - shop_payload: Dict[str, Any] = { - "shopName": shop_name, - "shopDone": shop_done, - "submissionId": self._build_submission_id(task_id, shop_name), - "chunkIndex": 1, - "chunkTotal": 1, - } - if error: - shop_payload["error"] = error - elif heartbeat_only: - shop_payload["heartbeatOnly"] = True - else: - shop_payload["countrySections"] = self._normalize_country_sections_for_result(country_sections) - shop_payload["cartRatios"] = self._normalize_cart_ratios_for_result(cart_ratios) - self._validate_success_result_payload(shop_payload) - - payload = {"shops": [shop_payload]} - url = f"{DELETE_BRAND_API_BASE}/api/patrol-delete/tasks/{task_id}/result" - self._log_result_payload_summary(task_id, shop_payload, trace_id=trace_id) - - max_retries = 3 - for retry in range(max_retries): - try: - self.log(f"trace_id={trace_id} 尝试回传巡店删除结果 (第 {retry + 1}/{max_retries} 次)") - self.log(f"trace_id={trace_id} 回传URL: {url}") - self.log(f"trace_id={trace_id} 回传数据: {_safe_log_text(payload)}") - response = requests.post( - url, - json=payload, - headers={"Content-Type": "application/json"}, - timeout=30, - verify=False, - ) - self.log(f"trace_id={trace_id} 回传结果: {_safe_log_text(response.text)}") - try: - response_data = response.json() - except (AttributeError, ValueError): - response_data = None - api_success = not (isinstance(response_data, dict) and response_data.get("success") is False) - self.log( - f"trace_id={trace_id} 巡店删除结果回传响应: status_code={response.status_code}, " - f"api_success={api_success}, response={_safe_log_text(response.text)}" - ) - if response.status_code == 200 and api_success: - self.log(f"trace_id={trace_id} 巡店删除结果回传成功: {shop_name}") - return - self.log( - f"trace_id={trace_id} 巡店删除结果回传失败,状态码: {response.status_code}, " - f"响应: {_safe_log_text(response.text)}", - "WARNING", - ) - except Exception as exc: - self.log(f"trace_id={trace_id} 调用巡店删除结果API异常: {str(exc)}", "ERROR") - - if retry < max_retries - 1: - time.sleep(2) - - raise RuntimeError("巡店删除结果回传最终失败") - - def _log_result_payload_summary(self, task_id: int, shop_payload: Dict[str, Any], trace_id: str = "") -> None: - trace_id = trace_id or _new_trace_id("post") - country_sections = shop_payload.get("countrySections") or [] - cart_ratios = shop_payload.get("cartRatios") or [] - countries = [str(section.get("country") or "").strip() for section in country_sections] - row_count = sum(len(section.get("rows") or []) for section in country_sections) - deleted_total = self._sum_result_delete_quantity(country_sections) - self.log( - f"trace_id={trace_id} 巡店删除结果回传摘要: " - f"task_id={task_id}, shop={shop_payload.get('shopName', '')}, " - f"shopDone={shop_payload.get('shopDone', False)}, " - f"hasError={bool(shop_payload.get('error'))}, " - f"countryCount={len(country_sections)}, countries={','.join(countries)}, " - f"rowCount={row_count}, cartRatioCount={len(cart_ratios)}, deletedTotal={deleted_total}" - ) - - @staticmethod - def _sum_result_delete_quantity(country_sections: List[Dict[str, Any]]) -> int: - total = 0 - for section in country_sections or []: - for row in section.get("rows") or []: - text = str(row.get("deleteQuantity") or "").replace(",", "").strip() - if not text: - continue - match = re.search(r"\d+", text) - if match: - total += int(match.group(0)) - return total - - @classmethod - def _normalize_country_sections_for_result( - cls, country_sections: Optional[List[Dict[str, Any]]] - ) -> List[Dict[str, Any]]: - normalized = [] - for section in country_sections or []: - country = str(section.get("country") or "").strip() - rows = [] - for row in section.get("rows") or []: - if cls._is_complete_draft_result_row(row): - delete_quantity = cls._string_result_field(row.get("deleteQuantity")) - normalized_row = { - "status": cls._complete_draft_result_status(row), - "quantity": cls._string_result_field(row.get("quantity")), - "deleteQuantity": delete_quantity, - "processStatus": cls._complete_draft_process_status(row, delete_quantity), - } - else: - normalized_row = { - "status": cls._string_result_field(row.get("status")), - "quantity": cls._string_result_field(row.get("quantity")), - "deleteQuantity": cls._string_result_field(row.get("deleteQuantity")), - "processStatus": cls._string_result_field(row.get("processStatus")), - } - rows.append(normalized_row) - if country and rows: - normalized.append({"country": country, "rows": rows}) - return normalized - - @staticmethod - def _normalize_cart_ratios_for_result( - cart_ratios: Optional[List[Dict[str, Any]]] - ) -> List[Dict[str, str]]: - normalized = [] - for item in cart_ratios or []: - country = str(item.get("country") or "").strip() - if country: - normalized.append({"country": country, "ratio": PatrolDeleteTask._string_result_field(item.get("ratio"))}) - return normalized - - @staticmethod - def _string_result_field(value: Any) -> str: - return "" if value is None else str(value) - - @staticmethod - def _is_complete_draft_result_row(row: Dict[str, Any]) -> bool: - status = InventoryManage._normalize_option_text(str(row.get("status") or "")) - tag = InventoryManage._normalize_option_text(str(row.get("tag") or "")) - row_type = str(row.get("type") or row.get("kind") or row.get("_kind") or "").strip() - return status in {"补全草稿", "商品信息草稿"} or tag == "补全草稿" or row_type == "completeDraft" - - @staticmethod - def _complete_draft_result_status(row: Dict[str, Any]) -> str: - status = PatrolDeleteTask._string_result_field(row.get("status") or row.get("tag")).strip() - return status or "商品信息草稿" - - @staticmethod - def _complete_draft_process_status(row: Dict[str, Any], delete_quantity: str) -> str: - process_status = PatrolDeleteTask._string_result_field(row.get("processStatus")).strip() - if process_status: - return process_status - match = re.search(r"\d+", str(delete_quantity or "")) - return "已完成" if match and int(match.group(0)) > 0 else "" - - @classmethod - def _replace_complete_draft_rows( - cls, - country_section: Dict[str, Any], - complete_draft_section: Optional[Dict[str, Any]], - ) -> Dict[str, Any]: - draft_rows = list((complete_draft_section or {}).get("rows") or []) - if not draft_rows: - return country_section - - rows = [] - replaced = False - for row in country_section.get("rows") or []: - if cls._is_complete_draft_result_row(row): - if not replaced: - rows.extend(draft_rows) - replaced = True - continue - rows.append(row) - - if not replaced: - rows.extend(draft_rows) - return {**country_section, "rows": rows} - - @staticmethod - def _validate_success_result_payload(shop_payload: Dict[str, Any]) -> None: - country_sections = shop_payload.get("countrySections") or [] - cart_ratios = shop_payload.get("cartRatios") or [] - if not country_sections: - raise RuntimeError("巡店删除成功结果缺少国家状态数据,已阻止空回传") - empty_sections = [ - str(section.get("country") or "") - for section in country_sections - if not section.get("rows") - ] - if empty_sections: - raise RuntimeError(f"巡店删除成功结果存在空国家状态行: {', '.join(empty_sections)}") - if not cart_ratios: - raise RuntimeError("巡店删除成功结果缺少购物车比例数据,已阻止空回传") - - @staticmethod - def _resolve_country_sections( - shop_item: Dict[str, Any], country_sections: List[Dict[str, Any]] - ) -> List[Dict[str, Any]]: - return deepcopy(country_sections or shop_item.get("countrySections") or []) - - @staticmethod - def _resolve_cart_ratios(shop_item: Dict[str, Any], cart_ratios: List[Dict[str, Any]]) -> List[Dict[str, Any]]: - return deepcopy(cart_ratios or shop_item.get("cartRatios") or []) - - @staticmethod - def _build_submission_id(task_id: int, shop_name: str) -> str: - return f"patrol-delete:{task_id}:{shop_name}:{int(time.time() * 1000)}" - - @staticmethod - def _ordered_countries(country_sections: List[Dict[str, Any]]) -> List[str]: - ordered = [] - for section in country_sections: - country = str(section.get("country") or "").strip() - if country and country not in ordered: - ordered.append(country) - return ordered - - @classmethod - def _build_country_section_templates(cls, country_sections: List[Dict[str, Any]]) -> Dict[str, Dict[str, Any]]: - templates = {} - for section in country_sections: - country = str(section.get("country") or "").strip() - if not country: - continue - rows = section.get("rows") or [] - templates[country] = { - "country": country, - "rows": [ - { - "status": str(row.get("status") or ""), - "quantity": str(row.get("quantity") or ""), - "deleteQuantity": str(row.get("deleteQuantity") or ""), - "processStatus": str(row.get("processStatus") or ""), - } - for row in rows - ], - } - if not templates[country]["rows"]: - templates[country]["rows"] = [{"status": "全部", "quantity": "", "deleteQuantity": "", "processStatus": ""}] - return templates - - @classmethod - def _build_cart_ratio_templates( - cls, - country_names: List[str], - cart_ratios: List[Dict[str, Any]], - ) -> Dict[str, Dict[str, str]]: - ratios_by_country: Dict[str, Dict[str, str]] = {} - for item in cart_ratios: - country = str(item.get("country") or "").strip() - if not country: - continue - ratios_by_country[country] = { - "country": country, - "ratio": str(item.get("ratio") or ""), - } - for country in country_names: - ratios_by_country.setdefault(country, cls._empty_cart_ratio(country)) - return ratios_by_country - - @classmethod - def _build_country_section_result( - cls, - country_name: str, - status_rows: List[Dict[str, Any]], - delete_counts: Dict[str, int], - default_process_status: str = "", - ) -> Dict[str, Any]: - rows = [] - default_status_applied = False - for row in status_rows: - status = InventoryManage._normalize_option_text(str(row.get("status") or "")) - if not status: - continue - canonical_status = InventoryManage._canonical_listing_status(status) - delete_count = delete_counts.get(canonical_status, 0) - process_status = "已完成" if delete_count > 0 else "" - if not process_status and default_process_status and not default_status_applied: - process_status = default_process_status - default_status_applied = True - if canonical_status in LISTING_STATUS_DELETE_WHITELIST: - delete_quantity = "无需删除" - else: - delete_quantity = str(delete_count) if delete_count > 0 else "" - if default_process_status == "无可删商品" and canonical_status not in LISTING_STATUS_DELETE_WHITELIST: - delete_quantity = "0" - rows.append( - { - "status": status, - "quantity": InventoryManage._normalize_quantity_text(row.get("quantity")), - "deleteQuantity": delete_quantity, - "processStatus": process_status, - } - ) - - if not rows: - rows = [ - { - "status": "全部", - "quantity": "", - "deleteQuantity": "无需删除" if default_process_status == "无可删商品" else "", - "processStatus": default_process_status, - } - ] - elif default_process_status and not default_status_applied and not any(row["processStatus"] for row in rows): - rows[0]["processStatus"] = default_process_status - - return {"country": country_name, "rows": rows} - - @classmethod - def _extract_country_cart_ratio( - cls, - cart_ratios: List[Dict[str, Any]], - country_name: str, - ) -> Dict[str, str]: - for item in cart_ratios: - if str(item.get("country") or "").strip() != country_name: - continue - ratio = str(item.get("ratio2DaysAgo") or item.get("ratio") or "").strip() - return {"country": country_name, "ratio": ratio} - return cls._empty_cart_ratio(country_name) - - @staticmethod - def _empty_cart_ratio(country_name: str) -> Dict[str, str]: - return {"country": country_name, "ratio": ""} - - @staticmethod - def _short_error(message: str, limit: int = 80) -> str: - compact = re.sub(r"\s+", " ", message or "").strip() - if "删除后未读取到成功提示" in compact: - return "删除后未读取到成功提示" - if any( - keyword in compact - for keyword in ("与页面的连接已断开", "target frame detached", "disconnected", "connection disconnected") - ): - return "浏览器连接中断" - if any(keyword in compact for keyword in ("stop_requested", "暂停请求", "用户取消", "任务取消", "取消任务", "interrupted")): - return "任务已中断" - if "切换国家" in compact and "失败" in compact: - return "切换国家失败" - - simplified_errors = ( - ("浏览器页面不存在", "浏览器页面不存在"), - ("当前页面对象不支持执行 JavaScript", "当前页面无法执行 JavaScript"), - ("未找到可用商品状态下拉框", "未找到商品状态下拉框"), - ("商品状态下拉框已打开但未读取到选项", "未读取到商品状态下拉选项"), - ("未读取到商品状态统计标签", "未读取到商品状态统计标签"), - ("未找到商品状态选项", "未找到商品状态选项"), - ("商品状态为空", "商品状态为空"), - ("全选商品失败", "全选商品失败"), - ("点击批量删除失败", "点击批量删除失败"), - ("未出现删除确认弹窗", "未出现删除确认弹窗"), - ) - for keyword, label in simplified_errors: - if keyword in compact: - return label - if len(compact) <= limit: - return compact - return compact[: limit - 3] + "..." - - @staticmethod - def _should_reopen_browser(message: str) -> bool: - return any(keyword in (message or "") for keyword in ("与页面的连接已断开", "浏览器", "target frame detached")) - - @staticmethod - def _safe_close_store(driver: InventoryManage) -> None: - try: - driver.close_store() - except Exception: - pass diff --git a/app/amazon/price_match.py b/app/amazon/price_match.py deleted file mode 100644 index a5bca12..0000000 --- a/app/amazon/price_match.py +++ /dev/null @@ -1,1311 +0,0 @@ -import json -import time -import re -import traceback -from datetime import datetime -import requests - -from amazon.amazon_base import AmamzonBase, kill_process,TaskBase -from amazon.tool import show_notification,get_shop_info,remove_special_characters,split_currency_values - -from config import runing_task, runing_shop,DELETE_BRAND_API_BASE - -class RepricingLogic: - - @staticmethod - def situation_1_general_decrease(my_price, rank1_price, is_first_time=False): - """ - 情况1:常规递减跟价 (最左侧独立长图块) - """ - if is_first_time: - return rank1_price - 0.3 - - # 这里的 diff 算出的是一个正数,代表“我比第一名低多少” - diff = rank1_price - my_price - - # 如果当前价格高于或等于第一名,默认按照第一名减0.3处理 - if diff <= 0: - return rank1_price - 0.3 - - # 逻辑更清晰的写法:第一名价格 - (差价 + 对应阶梯值) - # 例如差价0.7,则相当于 第一名价格 - (0.7 + 0.5) = 第一名价格 - 1.2 - if diff <= 0.3: - return rank1_price - (diff + 0.5) - elif diff <= 0.8: - return rank1_price - (diff + 0.7) - elif diff <= 10.5: - # 0.8 到 10.5 之间全部是在减1 - return rank1_price - (diff + 1.0) - else: - return rank1_price - 10.5 # 相差10.5以上,跳过 - - @staticmethod - def situation_2_own_buybox(my_price, rank2_price): - """ - 情况2:已经是自己购物车 - """ - diff = rank2_price - my_price - - if diff >= 2.0: - return rank2_price - 0.3 - - if (20 <= my_price < 30 and diff >= 4) or \ - (30 <= my_price < 60 and diff >= 8) or \ - (60 <= my_price <= 150 and diff >= 15): - return rank2_price - 0.3 - - return my_price - - @staticmethod - def situation_3_not_own_buybox(my_price, rank1_price): - """ - 情况3:不是自己购物车 (除Amazon US外) - """ - diff = rank1_price - my_price - - if diff <= 0: - return rank1_price - 0.3 - - # 逻辑更清晰的写法:第一名价格 - (差价 + 对应阶梯值) - if diff <= 0.3: - return rank1_price - (diff + 0.5) - elif diff <= 0.8: - return rank1_price - (diff + 0.7) - elif diff <= 2.5: - return rank1_price - (diff + 1.0) - else: - return None # 2.5-3.5以上跳过 - - @staticmethod - def situation_4_encounter_amz_us_1st(my_price, amz_us_price): - """ - 情况4:遇到第一名是 Amazon US 卖家 - """ - diff = amz_us_price - my_price - - if diff <= 0: - return amz_us_price - 3 - - # 逻辑更清晰的写法:第一名价格 - (差价 + 对应阶梯值) - if diff <= 3: - return amz_us_price - (diff + 2) - elif diff <= 6: - return amz_us_price - (diff + 3) - else: - return None # 超过6直接跳过 - - @staticmethod - def situation_5_im_1st_amz_us_2nd(my_price, amz_us_price): - """ - 情况5:自己是第一名,第二名是 Amazon US 卖家 - """ - diff = amz_us_price - my_price - - if diff <= 7: - return None # 相差7以内跳过 (保持原价) - else: - return amz_us_price - 5 - - -def calculate_target_price( - front_end_data,current_Price,current_shop_name, - recommended_price,recommended_shipping -): - """ - - recommended_price 推荐价格 - recommended_shipping 推荐运费 - """ - # --- Step 1: 获取基础数据 --- - cart_seller = front_end_data.get("cart_seller") - - my_price = current_Price # 我当前的售价 - - is_my_buybox = True if cart_seller == current_shop_name else False # 当前是否自己占据购物车 - - # --- Step 2: 紫鸟后台特殊判定 (最高优先级) --- - if recommended_shipping > 0: - price_1 = float(front_end_data.get("top_sellers")[0].get("price")) # 实际第一名价格 - if is_my_buybox: - price_col = price_1 - else: - price_col = recommended_price + recommended_shipping - print(f"【紫鸟后台价格】{is_my_buybox} 推荐价格: {recommended_price},推荐运费: {recommended_shipping},总和: {price_col}") - return RepricingLogic.situation_1_general_decrease(my_price,price_col,is_my_buybox) - - # # 第一名是自己, 第二名 Amazon US 卖家 的情况 - shop_name_1 = front_end_data.get("top_sellers")[0].get("shop_name") - shop_name_2 = front_end_data.get("top_sellers")[1].get("shop_name") if len(front_end_data.get("top_sellers")) >=2 else "" - if shop_name_1 == current_shop_name and "Amazon" in shop_name_2: - price_2 = float(front_end_data.get("top_sellers")[1].get("price")) # 实际第二名价格 - return RepricingLogic.situation_5_im_1st_amz_us_2nd(my_price,price_2) - - # --- Step 3: 常规核心分流逻辑 (如果没有紫鸟后台数据) --- - # 分支 A:第一名是 Amazon US 卖家 (特殊强敌优先) - price_1 = float(front_end_data.get("top_sellers")[0].get("price")) # 实际第一名价格 - if "Amazon" in shop_name_1: - # 增补第6种情况,如果是自己购物车 且 第一名是Amazon 且Amazon的价格高于自己的价格 按照这个 :如果低于自己的价格 就跳过, - if is_my_buybox: - if price_1 > my_price: - diff = price_1 - my_price - if diff <= 7 : - return None - else: - return price_1 - 5 - else: - return None - else: - return RepricingLogic.situation_4_encounter_amz_us_1st(my_price,price_1) - - # 分支 B:不是 Amazon US,且目前是自己的购物车 - elif is_my_buybox: - if len(front_end_data.get("top_sellers")) < 2: - return None - - price_2 = float(front_end_data.get("top_sellers")[1].get("price")) # 实际第二名价格 - - return RepricingLogic.situation_2_own_buybox(my_price,price_2) - - # 分支 C:不是 Amazon US,也不是自己的购物车 - else: - # 正常情况下的普通跟价,调用阶梯逻辑 - return RepricingLogic.situation_3_not_own_buybox(my_price, price_1) - - - -class ChromeAmzone: - mark_name = "亚马逊详情采集" - - country_info = { - "英国": { - "url": "https://www.amazon.co.uk/dp/B0CJ8SNXXV", - "zip_code": "SW1A 1AA", - "mark": "SW1A 1" - }, - "德国": { - "url": "https://www.amazon.de/dp/B0CC8CW9G2?th=1", - "zip_code": "10115" - }, - "法国": { - "url": "https://www.amazon.fr/dp/B0FRG1MJ8H?th=1", - "zip_code": "75001" - }, - "西班牙": { - "url": "https://www.amazon.es/dp/B08ZXVNYNN", - "zip_code": "28001" - }, - "意大利": { - "url": "https://www.amazon.it/dp/B0D1P17T2Q", - "zip_code": "20121" - } - } - - def __init__(self,tab): - self.tab = tab - - def close_init_popup(self): - """ - 关闭所有的初始化弹窗 - """ - self.tab.wait.doc_loaded(timeout=60,raise_err=True) - footbar = self.tab.eles('xpath://footer[@class="el-dialog__footer"]',timeout=5) - if len(footbar) > 0: - do_not_remind = footbar[0].eles('xpath:.//input[@class="el-checkbox__original"]') - if len(do_not_remind) > 0: - do_not_remind[0].check() - resume_immediately = footbar[0].eles('xpath:.//button') - if len(resume_immediately) > 0: - resume_immediately[0].click() - - self.tab.wait.doc_loaded(timeout=60,raise_err=True) - accept_btn = self.tab.eles('xpath://input[@id="sp-cc-accept"]',timeout=10) - if len(accept_btn) > 0: - accept_btn[0].click() - - def _set_zip_code(self, zip_code, mark=None): - """ - 设置邮编 - - Args: - zip_code: 目标邮编 - """ - try: - # 检查当前邮编 - zip_display = self.tab.ele('xpath://div[@id="glow-ingress-block"]', timeout=10) - - if zip_display: - current_text = zip_display.text - # print(f"当前地址信息: {current_text}") - # 先检查标识 - if mark is not None and mark in current_text: - print(f"邮编检测到标识: {mark},无需修改") - return True - # 检查是否已经包含目标邮编 - if zip_code in current_text: - print(f"邮编已经设置为: {zip_code},无需修改") - return True - - # 需要设置邮编 - print(f"正在设置邮编为: {zip_code}") - - # 点击地址选择按钮 - location_link = self.tab.ele('xpath://a[@id="nav-global-location-popover-link"]', timeout=10) - if not location_link: - print("找不到地址设置按钮") - return False - - location_link.click() - time.sleep(1) - - # 等待邮编输入框出现 - zip_input = self.tab.ele('xpath://input[@id="GLUXZipUpdateInput"]', timeout=10) - if not zip_input: - print("找不到邮编输入框") - return False - - # 输入邮编 - zip_input.input(zip_code, clear=True) - time.sleep(0.5) - - # 点击提交按钮 - submit_btn = self.tab.ele('xpath://input[@aria-labelledby="GLUXZipUpdate-announce"]', timeout=10) - if not submit_btn: - print("找不到提交按钮") - return False - - submit_btn.click() - - continue_btn = self.tab.eles('xpath://div[@class="a-popover-footer"]//input[@id="GLUXConfirmClose"]', - timeout=10) - if len(continue_btn) > 0: - continue_btn[0].click() - - # 等待提交按钮消失(表示请求已发送) - print("等待邮编更新...") - time.sleep(2) - - # 等待页面加载完成 - self.tab.wait.doc_loaded(timeout=30, raise_err=False) - time.sleep(2) - - # 验证邮编是否设置成功 - zip_display_after = self.tab.ele('xpath://div[@id="glow-ingress-block"]', timeout=10) - if zip_display_after: - updated_text = zip_display_after.text - # print(f"更新后的地址信息: {updated_text}") - - if zip_code in updated_text: - print(f"邮编设置成功: {zip_code}") - return True - else: - # print(f"邮编设置可能失败,当前显示: {updated_text}") - return False - - return True - - except Exception as e: - print(f"设置邮编时出错: {traceback.format_exc()}") - return False - - def run(self,country): - """ - 运行亚马逊详情采集任务 - - Args: - country: 国家名称(如:英国、德国、法国、西班牙、意大利) - asin: 亚马逊商品ASIN码 - - Returns: - dict: 包含采集到的数据 - """ - try: - if country not in self.country_info: - error_msg = f"不支持的国家: {country},支持的国家有: {list(self.country_info.keys())}" - print(error_msg) - show_notification(error_msg, "error") - return None - # 获取国家配置 - country_config = self.country_info[country] - zip_code = country_config["zip_code"] - mark = country_config.get("mark") - - self._set_zip_code(zip_code,mark) - - self.tab.wait.doc_loaded(timeout=5,raise_err=False) - - - self.tab.wait.doc_loaded(timeout=30, raise_err=False) - - self.close_init_popup() - - self.tab.wait.doc_loaded(timeout=5,raise_err=False) - - # 3. 抓取数据 - print("===================正在抓取商品数据...====================") - data = self._scrape_data() - data['timestamp'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') - print(f"数据抓取完成: {json.dumps(data)}") - print("======================================================") - return data - - except Exception as e: - error_msg = f"运行出错: {traceback.format_exc()}" - print(error_msg) - show_notification(f"采集失败: {str(e)}", "error") - return None - - def _scrape_data(self): - """ - 抓取商品数据 - - Returns: - dict: 抓取到的数据 - """ - data = { - 'top_sellers': [], # 前两名卖家信息 - 'cart_seller': None # 购物车所属卖家 - } - - try: - # 等待页面加载 - time.sleep(3) - h4 = self.tab.eles('xpath://div[@id="rightCol"]//h4[text()="卖家精灵-库存监控"]',timeout=10) - print("【家精灵-库存监控】数量",len(h4)) - - # 1. 获取前两名卖家的价格和库存(来自 sellersprite 插件) - print("正在抓取卖家排名数据...") - surplus_tables = self.tab.eles( - 'xpath://div[@id="sellersprite-extension-Inventory-surplus-count"]//div[@class="surplus-table"]', - timeout=10 - ) - - if surplus_tables: - print(f"找到 {len(surplus_tables)} 个卖家数据") - # 只获取前两个 - for idx, table in enumerate(surplus_tables[:2]): - try: - # 提取价格和库存信息 - # 注意:需要根据实际的HTML结构调整选择器 - # print(f"第{idx+1}名卖家数据: {text_content}") - - seller_info = { - 'rank': idx + 1, - } - - # 尝试提取更结构化的数据 - # 这里需要根据实际HTML结构来解析 - # 可能需要查找子元素 - try: - # 示例:查找价格和库存的具体子节点 - price_ele = table.ele('xpath:.//span[contains(@class,"price")]', timeout=2) - stock_ele = table.ele('xpath:.//span[@class="surplus-count-num"]', timeout=2) - shop_name_ele = table.ele('xpath:.//div[@class="surplus-table-item"][2]//a', timeout=2) - - seller_info['price'] = remove_special_characters(price_ele.text.strip()) - seller_info['stock'] = remove_special_characters(stock_ele.text.strip()) - seller_info['shop_name'] = shop_name_ele.text.strip() - - except Exception as e: - print("解析出错",e) - pass - - data['top_sellers'].append(seller_info) - - except Exception as e: - print(f"解析第{idx+1}名卖家数据失败: {str(e)}") - else: - print("未找到 sellersprite 插件数据,可能插件未启用") - show_notification("未找到 sellersprite 插件数据,可能插件未启用") - - # 2. 获取购物车所属卖家 - print("正在抓取购物车卖家信息...") - cart_seller = self.tab.ele( - 'xpath://div[@data-csa-c-content-id="desktop-merchant-info"]//a[@id="sellerProfileTriggerId"]', - timeout=10 - ) - - if cart_seller: - seller_name = cart_seller.text.strip() - print(f"购物车所属卖家: {seller_name}") - data['cart_seller'] = seller_name - else: - print("未找到购物车卖家信息") - # 尝试其他可能的选择器 - try: - alt_seller = self.tab.ele('xpath://a[@id="sellerProfileTriggerId"]', timeout=5) - if alt_seller: - data['cart_seller'] = alt_seller.text.strip() - print(f"购物车所属卖家(备用方式): {data['cart_seller']}") - except: - pass - - return data - - except Exception as e: - print(f"抓取数据时出错: {traceback.format_exc()}") - return data - - def close(self): - """关闭浏览器""" - try: - self.tab.close() - except Exception as e: - print(f"关闭标签页时出错: {str(e)}") - - -class AmzonePriceMatch(AmamzonBase): - mark_name = "跟价" - - def __init__(self, user_info: dict, socket_port: int = 19890): - super().__init__(user_info,socket_port) - self.already_asin = set() - - - - def reset_already_asin(self): - self.already_asin = set() - self.log("already_asin 已重置") - - def search_asin(self, asin): - search_region = self.tab.ele('xpath://div[@id="searchBoxContainer"]//kat-input-group') - search_region.wait.displayed(raise_err=False) - time.sleep(0.6) - search_input = self.tab.ele("xpath://kat-input[contains(@class,'SearchBox-module__searchInput')]").sr( - 'xpath://span[@class="container"]//input[@part="input"]') - search_input.input(asin,clear=True) - sku_ls = [] - for _ in range(3): - search_btn = self.tab.ele("xpath://kat-icon[@name='search']") - search_btn.click() - - load_ele = self.tab.ele("xpath://div[contains(@class,'Loader-module__loader')]") - # load_ele.wait.hidden(timeout=3, raise_err=False) - load_ele.wait.deleted(timeout=3, raise_err=False) - time.sleep(0.5) - - sku_ls = self.tab.eles("xpath://div[@data-sku]",timeout=3) - if len(sku_ls) > 0: - break - return sku_ls - - def search_asin_action(self,asin:str): - load_ele = self.tab.eles("xpath://div[contains(@class,'Loader-module__loader')]", timeout=5) - if len(load_ele) > 0: - load_ele[0].wait.deleted(timeout=3, raise_err=False) - time.sleep(0.5) - - sku_ls = self.search_asin(asin=asin) - print(f"【{self.mark_name}】{asin} 搜索到 {len(sku_ls)} 个SKU") - - def clear_tab(self): - all_tab = self.browser.get_tabs() - close_tab = [] - for tab in all_tab: - tab_id = tab if isinstance(tab,str) else tab.tab_id - if self.tab.tab_id == tab_id: - continue - close_tab.append(tab) - print("需要关闭的标签页",close_tab) - print("当前操作的tab_id",self.tab.tab_id) - self.browser.close_tabs(close_tab) - - def run_page_action(self,current_shop_name:str,mode:str, - appoint_asin:str=None,skip_asin:list=[],miniprice_info:dict={}): - self.log(f"==================={self.mark_name}=======================") - self.log("开始执行...") - num = 0 - retry_num = 0 - already_asin = self.already_asin - #获取当前国家 - current_country_ele = self.tab.ele('xpath://div[@class="dropdown-account-switcher-header-label"]/span[last()]', - timeout=20) - current_country = current_country_ele.text.strip() - max_retry_num = 5 - total_page = 0 - current_page = 0 - while retry_num < max_retry_num: - try: - if appoint_asin is not None: - self.log(f"指定asin操作,{appoint_asin}") - self.search_asin_action(asin=appoint_asin) - - load_ele = self.tab.eles("xpath://div[contains(@class,'Loader-module__loader')]", timeout=5) - if len(load_ele) > 0: - load_ele[0].wait.deleted(timeout=3, raise_err=False) - time.sleep(0.5) - - # 获取当前页码 - try: - page_pamel = self.tab.eles('xpath://kat-pagination', timeout=5) - if len(page_pamel) > 0: - current_page = page_pamel[0].sr('xpath:.//ul[@class="pages"]//li[@aria-current="true"]').text - current_page = int(current_page.strip()) - #测试===== - # if int(current_page) > 1: - # break - # 测试=========== - - # yield (None,{"page":int(current_page.strip())}) - # 总页数 - total_page = page_pamel[0].sr.eles( - 'xpath:.//ul[@class="pages"]//span[@class="page__inner"][last()]') - if len(total_page) > 0: - total_page = int(total_page[-1].text.strip()) - - self.log(f"【{self.mark_name}】当前页码: {current_page} / 总页数: {total_page}") - except Exception as e: - self.log(f"获取页码失败,{e}") - - - # 保存当前URL,用于失败重试时访问 - try: - self.url = self.tab.url - self.log(f"获取当前的链接:{self.url}") - except Exception as e: - self.url = None - self.log(f"获取当前的链接失败:{e}") - - - sku_ls = self.tab.eles("xpath://div[@data-sku]", timeout=10) - self.log(f"【{self.mark_name}】获取到 {len(sku_ls)}") - - if len(sku_ls) == 0: - if mode == "asin": - self.log(f"asin 模式查询不到,{appoint_asin}") - yield (appoint_asin, { - "statu": "查询不到" - }) - break - - retry_num += 1 - self.log(f"没有获取到 ASIN 商品,重试{retry_num}/{max_retry_num}") - self.tab.refresh() - self.tab.wait.doc_loaded(raise_err=False, timeout=120) - if retry_num == max_retry_num: - raise RuntimeError(f"与页面的连接已断开,没有获取到 ASIN 商品,重试{retry_num}/{max_retry_num}") - continue - - # for sku_ele in sku_ls[0:2]: - for sku_ele in sku_ls: - asin = sku_ele.ele( - 'xpath:.//div[contains(@class,"JanusSplitBox-module__container")]//div[contains(@class,"JanusSplitBox-module__panel--") and contains(string(.),"ASIN")]/..//div[last()]', - timeout=3).text - self.log(f"【{self.mark_name}】ASIN {asin} 找到....") - try: - # if asin in already_asin: - # print(f"【{self.mark_name}】{asin} 已经处理过了,跳过") - # continue - if asin in skip_asin: - yield (asin, { - "statu": "跳过,需要跳过的ASIN" - }) - continue - bottom_price_ele = sku_ele.eles('xpath:.//div[@data-test-id="LowestPrice"]/div[2]',timeout=5) - bottom_price = "" #初始化为空 - if len(bottom_price_ele) > 0: - try: - bottom_price_text = bottom_price_ele[0].text - # print("最低价格->>",bottom_price_text) - bottom_price = f"{sum(split_currency_values(bottom_price_text))}" - except Exception as e: - self.log(f"最低价提取失败,{e}") - - current_price_ele = sku_ele.eles('xpath:.//b[text()="价格"]/../..//kat-input',timeout=5) - if len(current_price_ele) > 0: - current_price = current_price_ele[0].attr("value") - self.log(f"获取到当前价格为 ->{current_price}") - # 如果紫鸟里当前价格低于最低价则删除,否则跳过 - # if mode == "status" and miniprice_info.get(asin): - if miniprice_info.get(asin): - backend_price = float(miniprice_info.get(asin)) - if float(current_price) <= backend_price: - yield (asin, { - "statu": "跳过(当前价格低于或等于最低价)", - "currentPrice": current_price, - "minimumPrice": backend_price, # 最低价格 - }) - continue - - else: - self.log(f"没有获取到当前价格") - yield (asin, { - "statu": "失败(没有获取到当前的价格)" - }) - continue - - self.clear_tab() - detail_url_ele = sku_ele.ele('xpath:.//div[contains(@class,"ProductDetails-module__titleContainer")]//a') - # detail_url_ele.click() - detail_url = detail_url_ele.attr("href") - self.log(f"详情链接,{detail_url}") - # time.sleep(1) - for _ in range(10): - try: - new_tab = self.browser.new_tab(url=detail_url) - print("获取新标签页成功",new_tab) - time.sleep(1) - break - except Exception as e: - time.sleep(1) - pass - chrome = ChromeAmzone(tab=new_tab) - front_end_data = chrome.run(country=current_country) - chrome.close() - self.clear_tab() - self.log(f"亚马逊前台抓取到数据,{front_end_data}") - if front_end_data is None or len(front_end_data.get("top_sellers")) == 0: - yield (asin, { - "statu": "失败(第一名获取失败,请检查卖家精灵是否启用)", - "currentPrice": current_price, - }) - continue - - cart_seller = front_end_data.get("cart_seller") - if cart_seller == current_shop_name and len(front_end_data.get("top_sellers"))< 2: - yield (asin, { - "statu": "跳过(自己的购物车,只有第一名)", - "currentPrice": current_price, - }) - continue - - recommend_price_ele= sku_ele.eles('xpath:.//div[@data-test-id="FeaturedOfferPrice"]/div[2]',timeout=5) - if len(recommend_price_ele) > 0: - try: - price_text = recommend_price_ele[0].text - # print("推荐价格 ->>",price_text) - recommend_price,shipping_fee = split_currency_values(price_text) - except Exception as e: - print("推荐价格和运费提取失败 ->>",e) - recommend_price, shipping_fee = 0, 0 - else: - print(f"{self.mark_name} 没有查找有推荐价格和运费") - recommend_price,shipping_fee = 0,0 - - adjust_prices = calculate_target_price( - front_end_data, float(current_price), current_shop_name, - recommend_price, shipping_fee - ) - # adjust_prices = 236.56 - - self.log(f"{asin}【逻辑计算后的价格】{adjust_prices}") - if adjust_prices is not None and adjust_prices != float(current_price): - #修改价格 - self.log(f"准备填入的原始值:{adjust_prices}") - adjust_prices = round(adjust_prices, 2) - self.log(f"保留两位小数后的::{adjust_prices}") - self.tab.actions.click(current_price_ele[0]) - time.sleep(1) - current_price_ele[0].input(f"{adjust_prices}", clear=True) - time.sleep(1) - # current_price_ele[0].sr('xpath:.//inpu[@part="input"]').input(f"{adjust_prices}",clear=True) - out_focus = sku_ele.ele('xpath:.//b[text()="价格"]/../..//kat-label',timeout=5) - out_focus.click() - time.sleep(1) - save_all_btn = self.tab.ele('xpath://kat-button[@label="保存所有"]', timeout=10) - save_all_btn.wait.displayed(timeout=10, raise_err=False) - save_all_btn.click() - save_all_btn.wait.deleted(timeout=10, raise_err=False) - recommendedPrice = recommend_price + shipping_fee - price_1 = float(front_end_data.get("top_sellers")[0].get("price")) if len(front_end_data.get("top_sellers")) >= 1 else "" # 实际第一名价格 - price_2 = float(front_end_data.get("top_sellers")[1].get("price")) if len(front_end_data.get("top_sellers")) >= 2 else "" # 实际第二名价格 - cartShopName = front_end_data.get("cart_seller") - yield (asin,{ - "statu" : "改价成功", - "currentPrice" : current_price, - "recommendedPrice" : f"{recommendedPrice}", - "minimumPrice" : f"{miniprice_info.get(asin)}" if miniprice_info.get(asin) else "",#bottom_price, #最低价格 - "firstPlace": price_1, - "secondPlace": price_2, - "cartShopName" : cartShopName, - "shippingFee" : f"{shipping_fee}", - "priceChangePrice" : f"{adjust_prices}", - "priceChangeStatus" : "改价成功", - }) - else: - recommendedPrice = recommend_price + shipping_fee - price_1 = float(front_end_data.get("top_sellers")[0].get("price")) if len( - front_end_data.get("top_sellers")) >= 2 else "" # 实际第一名价格 - price_2 = float(front_end_data.get("top_sellers")[1].get("price")) if len( - front_end_data.get("top_sellers")) >= 2 else "" # 实际第二名价格 - cartShopName = front_end_data.get("cart_seller") - yield (asin, { - "statu": "跳过,无需改价", - "currentPrice": current_price, - "recommendedPrice": f"{recommendedPrice}", - # "minimumPrice": bottom_price, # 最低价格 - "minimumPrice": f"{miniprice_info.get(asin)}" if miniprice_info.get(asin) else "", - "firstPlace": price_1, - "secondPlace": price_2, - "cartShopName": cartShopName, - "shippingFee": f"{shipping_fee}", - "priceChangeStatus": "跳过,无需改价", - "priceChangePrice": f"{adjust_prices}".replace("None",""), - }) - except Exception as e: - self.log(f"{asin},操作出错,{e}") - continue - already_asin.add(asin) - - # 判断是否存在需要翻页的情况 - page_pamel = self.tab.eles('xpath://kat-pagination', timeout=5) - if len(page_pamel) == 0: - break - next_page_btn = page_pamel[0].sr('xpath:.//span[@part="pagination-nav-right"]') - class_str = next_page_btn.attr('class') - if "end" in class_str: - break - next_page_btn.click() - num += 1 - self.log(f"【程序计算】正在翻页,已翻 {num} 页...") - already_asin = set() - retry_num = 0 - - except Exception as e: - self.log(f"处理跟价操作异常", e) - traceback.print_exc() - retry_num += 1 - self.tab.refresh() - self.tab.wait.doc_loaded(raise_err=False, timeout=120) - #检查页数是否相等,不相等则继续 - self.log(f"开始检查页数,当前页数 {current_page} / {total_page}") - if total_page != 0 and current_page!= 0 and current_page < total_page: - self.log(f"检查到页数还未完成,重启浏览器继续") - raise RuntimeError(f"与页面的连接已断开,检查到页数还未完成,重启浏览器继续") - - -class PriceTask(TaskBase): - task_name = "跟价-TASK" - - def process_task(self, task_data: dict): - """处理审批任务主入口 - - Args: - task_data: 任务数据 - """ - try: - data = task_data.get("data", {}) - task_id = data.get("task_id") - # items = data.get("items", []) - shop_name = data.get("shop_name") - country_codes = data.get("country_codes", []) - risk_listing_filter = data.get("risk_listing_filter", "Active") - user_id = data.get("user_id") - stage_index = data.get("stage_index") - final_stage = bool(data.get("final_stage", True)) - - # 用于测试 - limit = data.get("limit", None) - - if not task_id: - self.log("任务ID为空,跳过", "WARNING") - return - - # if not items: - # self.log("店铺列表为空,跳过", "WARNING") - # return - - if not country_codes: - self.log("国家列表为空,跳过", "WARNING") - return - - self.log(f"开始处理审批任务 {task_id},共 1 个店铺,{len(country_codes)} 个国家") - - from config import runing_task - runing_task[task_id] = { - "status": "running", - "start_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), - "total_shops": 1, - "processed_shops": 0, - "total_countries": len(country_codes) , - "processed_countries": 0, - "total_asins": 0, - "processed_asins": 0, - "success_count": 0, - "failed_count": 0, - "stop_requested": False - } - - # 检查是否收到暂停请求 - if task_id in runing_task and runing_task[task_id].get("stop_requested", False): - self.log(f"检测到任务 {task_id} 的暂停请求,停止处理", "WARNING") - runing_task[task_id]["status"] = "stopped" - return - - self.log(f"开始处理店铺: {shop_name}") - show_notification(f"开始处理店铺: {shop_name}", "info") - - try: - self.process_shop(data, country_codes, task_id, risk_listing_filter, user_id, stage_index, - final_stage, limit=limit) - - # self.process_shop(shop_item, country_codes, task_id,risk_listing_filter) - # 更新已处理店铺数 - if task_id in runing_task: - runing_task[task_id]["processed_shops"] += 1 - except Exception as e: - self.log(f"处理店铺 {shop_name} 失败: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - - # 更新任务状态 - if task_id in runing_task: - if runing_task[task_id].get("stop_requested", False): - runing_task[task_id]["status"] = "stopped" - self.log(f"任务 {task_id} 已被暂停!") - else: - runing_task[task_id]["status"] = "completed" - self.log(f"任务 {task_id} 处理完成!") - - except Exception as e: - self.log(f"任务处理失败: {traceback.format_exc()}", "ERROR") - if task_id: - from config import runing_task - if task_id in runing_task: - runing_task[task_id]["status"] = "failed" - runing_task[task_id]["error"] = str(e) - - def process_shop(self, shop_item: dict, country_codes: list, task_id: int, risk_listing_filter: str, - user_id=None, stage_index=None, final_stage: bool = True, limit: str = None): - """处理单个店铺 - - Args: - shop_item: 店铺信息 - country_codes: 国家代码列表 - task_id: 任务ID - risk_listing_filter: 风险商品筛选条件 - """ - shop_name = shop_item.get("shopName", "未知店铺") - company_name = shop_item.get("companyName", "") - shopMallName = shop_item.get("shopMallName","") - skip_asins_by_country = shop_item.get("skip_asins_by_country",{}) - asin_rows_by_country = shop_item.get("asin_rows_by_country",{}) - skip_asin_details_by_country = shop_item.get("skip_asin_details_by_country",{}) - minimum_price_by_country_and_asin = shop_item.get("minimum_price_by_country_and_asin",{}) - if len(minimum_price_by_country_and_asin) > 0: - country_codes = minimum_price_by_country_and_asin.keys() - - # 指定ASIN的情况 - mode = shop_item.get("mode") - - if not company_name: - self.log(f"店铺 {shop_name} 的公司名称为空,跳过", "WARNING") - return - - if task_id in runing_task: - runing_task[task_id]["current_shop"] = shop_name - - # 将店铺添加到正在执行中的店铺列表 - start_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - runing_shop[shop_name] = start_time - self.log(f"店铺 {shop_name} 已添加到执行列表,账号: {company_name},开始时间: {start_time}") - - # 店铺打开重试最多3次 - driver = None - max_retries = 3 - iskill = False - # 处理每个国家 - for country_code in country_codes: - # 打开店铺 - driver = self.open_shop(cls=AmzonePriceMatch,max_retries=max_retries, company_name=company_name, - shop_name=shop_name,iskill=iskill) - if driver is None: - self.log(f"任务 {task_id} 启动店铺失败,结束任务", "ERROR") - for country_code in country_codes: - self.post_result(task_id, shop_name, country_code, "", {}, shopMallName, is_done=True) - return - - # 检查是否收到暂停请求 - if task_id in runing_task and runing_task[task_id].get("stop_requested", False): - self.log(f"检测到任务 {task_id} 的暂停请求,停止处理国家", "ERROR") - driver.close_store() - break - - skip_asin = skip_asins_by_country.get(country_code,[]) #需要跳过的asin - appoint_asin = asin_rows_by_country.get(country_code,[]) - if mode == "status": - miniprice_info = {i.get('asin'):i.get('minimumPrice') for i in skip_asin_details_by_country.get(country_code,[])} - else: - miniprice_info = minimum_price_by_country_and_asin.get(country_code,{}) - - current_url = None - max_retries = 200 - for _ in range(max_retries): - try: - self.process_country(driver, country_code, task_id, shop_name, risk_listing_filter, - shopMallName=shopMallName,skip_asin=skip_asin, limit=limit, - appoint_asin=appoint_asin,mode=mode,miniprice_info=miniprice_info, - target_url=current_url - ) - driver.reset_already_asin() - driver.close_store() - break - except Exception as e: - self.log(f"处理国家 {country_code} 失败: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - if "与页面的连接已断开" in str(e): - iskill = True - current_url = driver.url - - # 更新已处理国家数 - if task_id in runing_task: - runing_task[task_id]["processed_countries"] += 1 - - # 关闭店铺 - driver.close_store() - - # 最后回传,标记完成 - try: - # self.post_result(task_id, shop_name, country_code, "", "", is_done=True) - if final_stage: - self.post_result(task_id, shop_name, country_code, "", {},shopMallName,is_done=True) - else: - self.post_stage_finished(task_id, user_id, stage_index) - except Exception as e: - self.log(f"回传结果失败: {str(e)}", "ERROR") - self.log(f"{task_id}任务处理完成") - - # 从正在执行中的店铺列表中移除 - if shop_name in runing_shop: - del runing_shop[shop_name] - self.log(f"店铺 {shop_name} 已从执行列表中移除") - - def process_country(self, driver: AmzonePriceMatch, country_code: str, task_id: int, shop_name: str, - risk_listing_filter: str,shopMallName:str,skip_asin:list,appoint_asin:list,mode:str, - miniprice_info:dict={}, limit: str = None,target_url:str=None): - """处理单个国家的审批任务 - - Args: - driver: AmzoneApprove驱动实例 - country_code: 国家代码(如 UK, DE, FR 等) - task_id: 任务ID - shop_name: 店铺名称 - risk_listing_filter: 风险商品筛选条件 - """ - - # 转换国家代码为中文名称 - country_name = self.country_info.get(country_code, country_code) - info_mes = f"开始处理国家: {country_name} ({country_code}),需要跳过的asin {skip_asin}" - self.log(info_mes) - show_notification(f"开始处理国家:{country_name}", "info") - - # 更新当前处理的国家 - if task_id in runing_task: - runing_task[task_id]["current_country"] = country_name - - # 切换国家,最多重试3次 - max_retries = 5 - - switch_success,switch_success_pg,search_success,sku_ls = self.action_init( driver, country_name, shop_name, risk_listing_filter) - # 如果切换失败,直接返回 - if not switch_success or not switch_success_pg or not search_success: - error_message = f"切换到国家({switch_success})/库存页面({switch_success_pg})/搜索筛选到指定选项({search_success}) {country_name} 失败,已重试 {max_retries} 次,跳过该国家" - self.log(error_message, "ERROR") - if task_id in runing_task: - runing_task[task_id]["processed_countries"] += 1 - return - - self.log(f"国家 {country_name} ,开始处理...") - - if target_url is not None: #从失败的链接继续 - self.log(f"开始访问:{target_url}") - driver.tab.get(url=target_url) - driver.tab.wait.doc_loaded(timeout=60,raise_err=False) - - result = [] - # 指定 asin - max_range = max(1,len(appoint_asin)) - for i in range(max_range): - if len(appoint_asin) > i: - _shopMallName = appoint_asin[i]["shopMallName"] - ap_asin = appoint_asin[i]["asin"] - else: - _shopMallName = shopMallName - ap_asin = None - - if not _shopMallName: - self.log(f"没有店铺名,不执行,{_shopMallName}","ERROR") - return - - for _ in range(max_retries): - for asin, status in driver.run_page_action( - current_shop_name=_shopMallName, - appoint_asin=ap_asin,skip_asin=skip_asin,mode=mode, - miniprice_info=miniprice_info - ): - if asin is None: - continue - # 检查是否收到暂停请求 - if task_id in runing_task and runing_task[task_id].get("stop_requested", False): - self.log(f"检测到任务 {task_id} 的暂停请求,停止处理ASIN", "WARNING") - break - - self.log(f"ASIN {asin} 处理结果: {status}") - - # 更新任务状态 - if task_id in runing_task: - runing_task[task_id]["current_asin"] = asin - runing_task[task_id]["processed_asins"] += 1 - - runing_task[task_id]["failed_count"] += 1 - - result.append({ - "shopMallName": shopMallName, - "asin": asin, - "price": status.get("currentPrice") if status.get("currentPrice") else "", - "recommendedPrice": status.get("recommendedPrice") if status.get( - "recommendedPrice") else "", - "minimumPrice": status.get("minimumPrice") if status.get("minimumPrice") else "", - "firstPlace": status.get("firstPlace") if status.get("firstPlace") else "", - "secondPlace": status.get("secondPlace") if status.get("secondPlace") else "", - "cartShopName": status.get("cartShopName") if status.get("cartShopName") else "", - # "priceChangeStatus": "UPDATED", - "deleteSkipAsin": status.get("deleteSkipAsin", False), - "removeAsin": status.get("removeAsin") if status.get("removeAsin") else "", - "modifyCount": "1", - "shippingFee": status.get("shippingFee") if status.get("shippingFee") else "", - "status": status.get("statu"), - "priceChangeStatus": status.get("priceChangeStatus") if status.get( - "priceChangeStatus") else "", - "priceChangePrice": status.get("priceChangePrice") if status.get( - "priceChangePrice") else "", - } - ) - if len(result) > 10: - self.post_result_batch(task_id, shop_name, country_code, result) - result = [] - - break - - if len(result) > 0: - self.post_result_batch(task_id, shop_name, country_code, result) - - self.log(f"国家 {country_name} 处理完成") - - def post_stage_finished(self, task_id: int, user_id, stage_index): - - if user_id in (None, "", 0): - raise ValueError("user_id is required for stage completion callback") - if stage_index is None: - raise ValueError("stage_index is required for stage completion callback") - - url = f"{DELETE_BRAND_API_BASE}/api/shop-match/tasks/{task_id}/stage-finished" - payload = {"stage_index": stage_index} - params = {"user_id": user_id} - - max_retries = 3 - for retry in range(max_retries): - try: - self.log(f"Attempting stage completion callback ({retry + 1}/{max_retries})") - response = requests.post( - url, - params=params, - json=payload, - headers={"Content-Type": "application/json"}, - timeout=30, - verify=False, - ) - self.log(f"Stage completion callback response: {response.text}") - data = response.json() if response.text else {} - if response.status_code == 200 and isinstance(data, dict) and data.get("success"): - self.log(f"Stage completion callback succeeded: task={task_id}, stage={stage_index}") - return - self.log(f"Stage completion callback failed, status={response.status_code}", "WARNING") - except Exception as e: - self.log(f"Stage completion callback exception: {str(e)}", "ERROR") - if retry < max_retries - 1: - time.sleep(2) - - raise RuntimeError(f"Stage completion callback failed after retries: task={task_id}, stage={stage_index}") - - def post_result(self, task_id: int, shop_name: str, country_code: str, asin: str, status: dict,shopMallName:str, - is_done: bool = False): - """回传处理结果到API - - Args: - task_id: 任务ID - shop_name: 店铺名称 - country_code: 国家代码 - asin: ASIN - status: 处理状态 - """ - - url = f"{DELETE_BRAND_API_BASE}/api/price-track/tasks/{task_id}/result" - country_aliases = {name: code for code, name in self.country_info.items()} - country_key = country_aliases.get(str(country_code).strip(), str(country_code).strip()) - - payload = { - "shops": [ - { - "shopName": shop_name, - "countries": { - country_key : [ - { - "shopMallName": shopMallName, - "asin": asin, - "price": status.get("currentPrice") if status.get("currentPrice") else "", - "recommendedPrice": status.get("recommendedPrice") if status.get("recommendedPrice") else "", - "minimumPrice": status.get("minimumPrice") if status.get("minimumPrice") else "", - "firstPlace": status.get("firstPlace") if status.get("firstPlace") else "", - "secondPlace": status.get("secondPlace") if status.get("secondPlace") else "", - "cartShopName": status.get("cartShopName") if status.get("cartShopName") else "", - # "priceChangeStatus": "UPDATED", - "deleteSkipAsin": status.get("deleteSkipAsin",False), - "removeAsin": status.get("removeAsin") if status.get("removeAsin") else "", - "modifyCount": "1", - "shippingFee" : status.get("shippingFee") if status.get("shippingFee") else "", - "status": status.get("statu"), - "priceChangeStatus" : status.get("priceChangeStatus") if status.get("priceChangeStatus") else "", - "priceChangePrice" : status.get("priceChangePrice") if status.get("priceChangePrice") else "", - } - ] - }, - "error": "" - } - ] - } - if is_done: - payload["shops"][0]["success"] = is_done - - max_retries = 3 - for retry in range(max_retries): - try: - print("================【跟价】=====================") - self.log(f"尝试回传结果 (第 {retry + 1}/{max_retries} 次)") - self.log(f"回传URL: {url}") - self.log(f"回传数据: {payload}") - response = requests.post( - url, - json=payload, - headers={"Content-Type": "application/json"}, - timeout=30, - verify=False - ) - self.log(f"回传结果: {response.text}") - data = response.json() if response.text else {} - if response.status_code == 200 and isinstance(data, dict) and data.get("success"): - self.log(f"结果回传成功: {asin} - {status}") - return - else: - self.log(f"结果回传失败,状态码: {response.status_code}", "WARNING") - print("=====================================") - - except Exception as e: - self.log(f"调用API异常: {str(e)}", "ERROR") - print("=====================================") - - # 如果还有重试机会,等待后继续 - if retry < max_retries - 1: - time.sleep(2) - - self.log(f"已达到最大重试次数,结果回传最终失败", "ERROR") - # raise RuntimeError("已达到最大重试次数,结果回传最终失败") - - def post_result_batch(self, task_id: int, shop_name: str, country_code: str, country_data,is_done: bool = False): - """回传处理结果到API - """ - - url = f"{DELETE_BRAND_API_BASE}/api/price-track/tasks/{task_id}/result" - country_aliases = {name: code for code, name in self.country_info.items()} - country_key = country_aliases.get(str(country_code).strip(), str(country_code).strip()) - - payload = { - "shops": [ - { - "shopName": shop_name, - "countries": { - country_key: country_data - }, - "error": "" - } - ] - } - if is_done: - payload["shops"][0]["success"] = is_done - - max_retries = 3 - for retry in range(max_retries): - try: - self.log("================【跟价】=====================") - self.log(f"尝试回传结果 (第 {retry + 1}/{max_retries} 次)") - self.log(f"回传URL: {url}") - self.log(f"回传数据: {payload}") - response = requests.post( - url, - json=payload, - headers={"Content-Type": "application/json"}, - timeout=30, - verify=False - ) - self.log(f"回传结果: {response.text}") - data = response.json() if response.text else {} - if response.status_code == 200 and isinstance(data, dict) and data.get("success"): - self.log(f"结果回传成功") - return - else: - self.log(f"结果回传失败,状态码: {response.status_code}", "WARNING") - self.log("=====================================") - - except Exception as e: - self.log(f"调用API异常: {str(e)}", "ERROR") - self.log("=====================================") - - # 如果还有重试机会,等待后继续 - if retry < max_retries - 1: - time.sleep(2) - - self.log(f"已达到最大重试次数,结果回传最终失败", "ERROR") - -if __name__ == '__main__': - # 使用示例 - user_info = { - "company": "尾号5578的公司115", - "username": "自动化_Robot", - "password": "#20zsg25" - } - # shop_name = "周洪" - # country = "德国" - # kill_process('v6') - # driver = AmzonePriceMatch(user_info) - # browser = driver.open_shop(shop_name) - # sw_suc = driver.SwitchingCountries(country) - # driver.SwitchPage() - # risk_listing_filter = "Active" - # _shopMallName = "Zhou Hong 600" - # ap_asin ="B0FK574K91" - # skip_asin = [] - # for _ in range(3): - # try: - # sku_ls = driver.search(filter_type=risk_listing_filter) - # break - # except Exception as e: - # print(e) - # driver.tab.refresh() - # if len(sku_ls) > 0: - # print("有数据,开始操作") - # for asin, status in driver.run_page_action( - # current_shop_name=_shopMallName, - # appoint_asin=ap_asin,skip_asin=skip_asin,mode="asin" - # ): - # print(f"ASIN {asin} 的处理结果: {status}") - # print("已完成操作") - - # front_end_data = {'top_sellers': [{'rank': 1, 'price': '30.14', 'stock': '100', 'shop_name': 'Zhou Hong 600'}], 'cart_seller': 'Zhou Hong 600', 'timestamp': '2026-04-30 23:47:02'} - # - # current_Price = 30.14 - # current_shop_name = "Zhou Hong 600" - # recommended_price = 30.14 - # recommended_shipping =0.0 - # res = calculate_target_price( - # front_end_data, current_Price, current_shop_name, - # recommended_price, recommended_shipping - # ) - # print(res) - - - task_data = {'type': 'price-track-run', 'ts': 1777746140975, 'data': {'task_id': 5658, 'result_id': 7627, 'shop_name': '郭锋滨', 'shop_id': '27769139291498', 'platform': '亚马逊', 'company_name': '尾号5578的公司115', 'shop_mall_name': '', 'matched': True, 'match_status': 'MATCHED', 'match_message': None, 'success': False, 'error': None, 'output_filename': None, 'download_url': None, 'task_status': 'RUNNING', 'loop_run_id': 235, 'round_index': 1, 'country_codes': ['UK', 'DE', 'FR', 'ES', 'IT'], 'mode': 'status', 'skip_asins': {'DE': ['B0FMKM1BYH', 'B0DJT78FNR', 'B0DJLJ73RB', 'B0D6QL2JMY', 'B0CFKLPKF5', 'B09BMWX6Q1', 'B07C4MNWFL', 'B0FHDGLQK7', 'B0FHD9S7K7', 'B0FB2FB6G6', 'B0F9W8VXWQ', 'B0F9W81F2F', 'B0F9W7KLNM', 'B0F2ZJWJNC', 'B0D49F7LM4', 'B0CXSP3PDP', 'B0CLXZHM2G', 'B0CG8RNWL6', 'B0C4SZ8GZW', 'B0BVM53J3B', 'B0BNHN9N9X', 'B0BMXBNMP5', 'B0BLN7D2JZ', 'B09MYVN5YK', 'B09MBNG7P4', 'B0DXTSTZC6', 'B0D25871WL', 'B0CL69XRTY', 'B0CKXMDBN8', 'B0CGDF2G8V', 'B0CFTGXVYF', 'B0CFT6XPPD', 'B09YXTN8JP', 'B0DHX32XJH', 'B0DHL7FQJM', 'B0DHL63M79', 'B0CWXYY74V', 'B0CWXYRGZW', 'B0CPLR6YHB', 'B0BXP4RC25', 'B0BFRRZDCH', 'B0B65R3N47', 'B0F36ZSWTQ', 'B0DT1DYWC6', 'B0DNZ5WX1L', 'B0DNZ5N7HY', 'B0DCJJ3PCM', 'B0D8JV9MB9', 'B0D2KCRLJ1', 'B0CRVRDS8C', 'B0CQK7QWJB', 'B0CQK5SRXW', 'B0BCL2DLPC', 'B0B9JBHPFY', 'B09TVY4V8Z', 'B0FJBD6Q3D', 'B0DG8LQLXZ', 'B0CD7Q1BX3', 'B0BV1SR48Y', 'B0F29CFJJ9', 'B0DSL6PKR7', 'B0CPV21W4L', 'B0CNQZ7FXY', 'B0CLY9XT5M', 'B0CGTMZ8GP', 'B0CF881PG4', 'B0CF4K1G4R', 'B0CB5T79XG', 'B0C73PQ9KM', 'B0C28TBN79', 'B09T31ZRJF', 'B01LBOYWNO', 'B0DDTB25YZ', 'B0D1Q8GL1Y', 'B0CW9JC84B', 'B0CLGJG36H', 'B0CF9JWKHJ', 'B0C2J3V92Q', 'B0BVVYZ6TN', 'B0B8J8VF7C', 'B0B4BFVZD1', 'B09R1CPKVX', 'B0924BNVH2', 'B0F54M2147', 'B0F1BZNBY6', 'B0F1BXV9WG', 'B0DC957VHC', 'B0D8778SZB', 'B0CP9WVSRY', 'B0CKNQP1PT', 'B0CJ4PW758', 'B0BYFD87C6', 'B0B492K9KT', 'B09968XMC7', 'B0FGJ8RCW1', 'B0FGJ4WK8B', 'B0FFMYGWHP', 'B0FD3DLFKL', 'B0FBWRWXG2', 'B0F99RW38N', 'B0F62LZ4G3', 'B0F629FLVV', 'B0F2N88DS9', 'B0F23Y11GD', 'B0F1YV8T2S', 'B0DXK9PR5X', 'B0DRV7QZ85', 'B0DRV7LN4V', 'B0DR4QYC2M', 'B0D5QL869M', 'B0D41VK3YL', 'B0D3XBW4KT', 'B0D2KW1ZRL', 'B0CPPC6PDW', 'B0CHVPSJ61', 'B0C5C1V5JD', 'B0C232Z6C6', 'B0C22KBMJC', 'B0BZVL6Y9X', 'B0BX58MW7N', 'B0B9M86GMC', 'B08DQVJ2VB', 'B07WKYLJ3T', 'B092D7P9BP', 'B0F9W2MZJY', 'B09KXV2C3T', 'B092D7TM65', 'B0CR3P2F5L', 'B0BWCSCYFL', 'B08JLW8S3Y', 'B0D4H73BJH', 'B08D77WTYG', 'B08D73XW2J', 'B09H4RB4ZL', 'B09WMQ29GH', 'B0DJ2M2RYC', 'B0BGF2QCKT', 'B0DS6FC8M7', 'B098QFLVDZ', 'B0DMD16GTD', 'B0CNVLLQ3J', 'B0CP3JZ1P5', 'B0C1GR4K6W', 'B0CBM792D2', 'B09NJK6K5T', 'B0D8Q5MK31', 'B0CYSCV19T', 'B0C5D5XPLJ', 'B09R3NFGH2', 'B09BG1QD9M', 'B092QY1823', 'B0C55PGK51', 'B0DRN8MXRG', 'B08152JKFB', 'B09Y1P7GK7', 'B0CG62X5GT', 'B0DHJKKZDD', 'B0DYHZ59YL', 'B0D2D5WS2D', 'B0G6LHVRKG', 'B0DQ53F84K', 'ASDASD', 'B0CJTCGDB7232', 'B0CJTCGDB7213', 'B0CJTCGDB79', 'B0CJTCGDB78', 'B0CJTCGDB77', 'B0CJTCGDB76', 'B0CJTCGDB75', 'B0CJTCGDB74', 'B0CJTCGDB73', 'B0CJTCGDB72', 'B0CJTCGDB71', 'B0CJTCGDB7', '1'], 'UK': ['B0FGJD2P9Q', 'B0DKBSWJ93', 'B0DJT78FNR', 'B0DFCR79L5', 'B0DCBJ3WY5', 'B0D9LPW1YB', 'B0D7VDQG19', 'B0CP5K31TL', 'B0CG3RG7RQ', 'B0C8DSPMNC', 'B0B6H8RCHC', 'B08TVWB36K', 'B08FZMZQ11', 'B0G6LHVRKG', 'B0FF36SY6Q', 'B0DYTNBMB2', 'B0DQNLGSMQ', 'B0DNSNN7NH', 'B0DJWHHFBS', 'B0DJHSJ9LS', 'B0D2D5WS2D', 'B0CG8RNWL6', 'B0C5D5XPLJ', 'B09WHYGBSR', 'B09WHV9JCJ', 'B09P4VCL2V', 'B09MYVN5YK', 'B09MBNG7P4', 'B0DM63394K', 'B0D1Q4RR99', 'B0CZD1HLY7', 'B0CWD9R2FS', 'B0CS6WYRFW', 'B0CRVTSQGQ', 'B0CR8FTHYP', 'B0CCB5Q5ZY', 'B0CC94W5G7', 'B0CC948Q8Q', 'B0CC93R18S', 'B0CC92F33P', 'B0BZ4DNWPY', 'B0BZ4CMQDL', 'B07Q4RBT32', 'B0DHX32XJH', 'B0DHX1HR7X', 'B0DHTT1X71', 'B0DHTRLQ2L', 'B0DHL7FQJM', 'B0D3V1BJX9', 'B0D3TZ45C3', 'B0D2SDNYS5', 'B0CQY5SM94', 'B0CQLN2FC1', 'B0CQF6W2JT', 'B0BY85GDF5', 'B0BY82BRTZ', 'B0B73K6QZQ', 'B0B4MDDD7D', 'B0F1X5Q9Q6', 'B0DYHPWTVJ', 'B0DQNJPS5M', 'B0DQ4B5SF7', 'B0DNZ5WX1L', 'B0DKX28SNX', 'B0DHVTGXPD', 'B0DHDBN98L', 'B0DFXRP8X1', 'B0DFGPGXY6', 'B0D8JV9MB9', 'B0D2KCRLJ1', 'B0CW63X5XY', 'B0CRVRDS8C', 'B0CRHWLDY4', 'B0CLZBR5CM', 'B0CL67FJFL', 'B0CG2C89ZZ', 'B0BP7YMCXH', 'B0BM8Y94QC', 'B0BJKBRTK7', 'B0BCL2DLPC', 'B0B6PSLTPF', 'B0B6PS4RQ1', 'B0B5L4HC95', 'B08ZT1PJ2K', 'B0FGQ31VWT', 'B0FFT33WRF', 'B0FD3S6DRN', 'B0F2GBR7MP', 'B0F2G5TG4S', 'B0F2FZVS7X', 'B0F2FYW3HN', 'B0F2B6924H', 'B0DSJMMMXN', 'B0DJT68ZM3', 'B0DJT66VG3', 'B0DJT5YJXD', 'B0DCGSFTYX', 'B0D8C6KL4G', 'B0C9H8MJC3', 'B0C85JQNRC', 'B0C5QQFN1G', 'B0BZ8FXRZG', 'B0BS8SW341', 'B0FLVP9N4Y', 'B0F2MPWSCQ', 'B0F29CFJJ9', 'B0DSKC1GQB', 'B0DSCBZSGS', 'B0DSCB329P', 'B0DLNXW8W5', 'B0DJQHVBZZ', 'B0DGCW7WBY', 'B0DFTG85NG', 'B0D99N1DZY', 'B0D8B849BJ', 'B0D89YCGCR', 'B0D89WK6JF', 'B0D89PMKKP', 'B0D7X1634D', 'B0D7V3W7D1', 'B0CYT3R89Z', 'B0CY7P61VD', 'B0CQ8B9PZM', 'B0CNK1SV4P', 'B0CF4K1G4R', 'B0CF4JJXHY', 'B0CF4BJ42D', 'B0C6T346MQ', 'B0BX2KDVMY', 'B0BR4YWSF9', 'B0BR4XHP5Z', 'B09Z68FK4Q', 'B09SL3PTTM', 'B09JBQZQQL', 'B08PSSRS3C', 'B08G4P4F76', 'B0DRD7T6TQ', 'B0DQXT78DT', 'B0DQXRV47R', 'B0DQXRV18S', 'B0DQXRLK5X', 'B0DQXQNL6Z', 'B0D2KQVS2Y', 'B0CXJC74TK', 'B0CW9JC84B', 'B0CSYBNXWX', 'B0CRHSTGX6', 'B0CPPJTX5C', 'B0CJB9WFHD', 'B0CF9JWKHJ', 'B0BVVYZ6TN', 'B0BND2YKJF', 'B09TRCQNQH', 'B09H5J6YQX', 'B09CNRP5FJ', 'B08BZ9LW9Z', 'B0F54M2147', 'B0F388HQLY', 'B0F1BZNBY6', 'B0F1BXV9WG', 'B0DSD949P4', 'B0DFQ2FP96', 'B0D9YXGFQW', 'B0CP9WVSRY', 'B0CKZ35SJC', 'B0CHYNDX87', 'B0CH66SNFC', 'B0BHSWP8RD', 'B0BGRW6858', 'B0B6JKD25B', 'B0B1LJB3M5', 'B09P3S4SH5', 'B09NLSRHGV', 'B0FVDPV5NS', 'B0FQJ5CDL2', 'B0FLJLWTLV', 'B0FGQ1VP2J', 'B0FD6YL7MM', 'B0FBWP9GJL', 'B0F99RW38N', 'B0F3Y3M538', 'B0F27ZM2TG', 'B0F23Y11GD', 'B0F23WZ78P', 'B0F1MY4PF6', 'B0DXKC6H1G', 'B0DQLNTLF4', 'B0DM8DYG77', 'B0DHJNBFVH', 'B0DH1XKG95', 'B0DFYG7C4K', 'B0DFTR1CMN', 'B0DB8FM915', 'B0D5H65VW3', 'B0D3XBW4KT', 'B0CRKJWJ4X', 'B0CPPGX6FQ', 'B0CPPGSBHD', 'B0CL9PVZD1', 'B0C232Z6C6', 'B0C22KBMJC', 'B0BX58MW7N', 'B0B6T3N5MG', 'B0B4S9QYWM', 'B0B4S93T7Q', 'B09R1PMW3J', 'B08MLN92JM', 'B0BHN71FWM', 'B09NKRWXPC', 'B0C89TNVTN', 'B0D1VDMZR1', 'B0DS2QT1YZ', 'B09Y29P5YF', 'B0DBQDSHVZ', 'B0CFF62JY3', 'B0BHPGTWQR', 'B0D4F4D3W2', 'B0F13BRF4V', 'B0D1FXTY99', 'B00KY0LLFO', 'B0B7MJXDZC', 'B0B4DV8NLV', 'B0DJXRFCF7', 'B0BPHMFD7V', 'B0F281ZQWR', 'B0D7V2FNW3', 'B0D57X7KV9', 'B0CJ2SST5Z', 'B0CZ92LPP4', 'B0CG5Z2Z44', 'B0D6T9H5LX', 'B0CQJNR9MP', 'ZXCA', 'B0CJTGDB7232', 'B0CJTGDB7213', 'B0CJTGDB79', 'B0CJTGDB78', 'B0CJTGDB77', 'B0CJCGDB76', 'B0CJCGDB75', 'B0CJCGDB74', 'B0CJCGDB73', 'B0CJCGDB72', 'B0CJCGDB71', 'B0CJCGDB7', 'B0CTCGDB7', 'B0FGTNLTG3', 'WQDASDAS', 'SADAD', 'DFHFGH78979'], 'FR': ['B0FY6JY4BF', 'B0DZNRB5Q1', 'B0DNSKFLGK', 'B0DGLCQDTR', 'B0D9W93869', 'B0CG8RNWL6', 'B0BX94RYT1', 'B0BLN7D2JZ', 'B09WHV9JCJ', 'B0DKX28SNX', 'B0CZCVTMRJ', 'B0CC95H28M', 'B0CC942XSZ', 'B0CC93WW6S', 'B0CC93TDB9', 'B0816GGCFY', 'B0CQY5SM94', 'B0DQTKRNLH', 'B0DCB85F3J', 'B0D8JR3W53', 'B0D2KCRLJ1', 'B0CQK7QWJB', 'B0B9XM29C9', 'B0B5L4HC95', 'B0F9FCT8RD', 'B0BZ8J16JM', 'B0BV1TRMGN', 'B09G68LMB3', 'B0DCRJSMJP', 'B093Y447R2', 'B0D8Y5KWB8', 'B0BJK43Z6X', 'B0DXK7YZ5D', 'B0C232Z6C6', 'B0BZVL6Y9X', 'B0B4S98HLZ', 'B09VPMBMB8', 'B0D17L6YKN'], 'IT': ['B0DTK87KJ5', 'B0DNSNN7NH', 'B0D9W93869', 'B0CLXZHM2G', 'B0CG8RNWL6', 'B0BX94RYT1', 'B0BVM53J3B', 'B0BLN7D2JZ', 'B0F9KVS6Y2', 'B0F8QGHMLL', 'B0CY5KW8RY', 'B0CC94P4H1', 'B0CC94K2HN', 'B0CC922QN8', 'B0C7Q51PL1', 'B0D8JR3W53', 'B0B5L4HC95', 'B0C5C53444', 'B0F5PRVRLF', 'B0BJK43Z6X', 'B09WKFD3G8', 'B08NT2BNGH', 'B0DRV6D214', 'B08QRKHD3C', 'B09JMW3F1R', 'B0CKYHTDJ5', 'B098QFLVDZ', '32EGDFGS4', 'B087JP6PWL89'], 'ES': ['B0D2J11TKY', 'B0CLY2THTY', 'B0D8JS8NPH', 'B0CYGSBXSQ', 'B0CKXMDBN8', 'B0CJ5F9J4Z', 'B0CC95XMD4', 'B0CC93ZNH2', 'B07L281N1M', 'B0DNZ5N7HY', 'B0C7V4BFSZ', 'B0B5L4HC95', 'B0DZCC4B4T', 'B0DZBQ4ZNC', 'B0C5QQFN1G', 'B0BFXD4LYN', 'B0F3122Q81', 'B0BG73XTFC', 'B0CNM269LZ', 'B08QS37RHQ', 'B087JP6PWL89']}, 'skip_asins_by_country': {'DE': ['B0FMKM1BYH', 'B0DJT78FNR', 'B0DJLJ73RB', 'B0D6QL2JMY', 'B0CFKLPKF5', 'B09BMWX6Q1', 'B07C4MNWFL', 'B0FHDGLQK7', 'B0FHD9S7K7', 'B0FB2FB6G6', 'B0F9W8VXWQ', 'B0F9W81F2F', 'B0F9W7KLNM', 'B0F2ZJWJNC', 'B0D49F7LM4', 'B0CXSP3PDP', 'B0CLXZHM2G', 'B0CG8RNWL6', 'B0C4SZ8GZW', 'B0BVM53J3B', 'B0BNHN9N9X', 'B0BMXBNMP5', 'B0BLN7D2JZ', 'B09MYVN5YK', 'B09MBNG7P4', 'B0DXTSTZC6', 'B0D25871WL', 'B0CL69XRTY', 'B0CKXMDBN8', 'B0CGDF2G8V', 'B0CFTGXVYF', 'B0CFT6XPPD', 'B09YXTN8JP', 'B0DHX32XJH', 'B0DHL7FQJM', 'B0DHL63M79', 'B0CWXYY74V', 'B0CWXYRGZW', 'B0CPLR6YHB', 'B0BXP4RC25', 'B0BFRRZDCH', 'B0B65R3N47', 'B0F36ZSWTQ', 'B0DT1DYWC6', 'B0DNZ5WX1L', 'B0DNZ5N7HY', 'B0DCJJ3PCM', 'B0D8JV9MB9', 'B0D2KCRLJ1', 'B0CRVRDS8C', 'B0CQK7QWJB', 'B0CQK5SRXW', 'B0BCL2DLPC', 'B0B9JBHPFY', 'B09TVY4V8Z', 'B0FJBD6Q3D', 'B0DG8LQLXZ', 'B0CD7Q1BX3', 'B0BV1SR48Y', 'B0F29CFJJ9', 'B0DSL6PKR7', 'B0CPV21W4L', 'B0CNQZ7FXY', 'B0CLY9XT5M', 'B0CGTMZ8GP', 'B0CF881PG4', 'B0CF4K1G4R', 'B0CB5T79XG', 'B0C73PQ9KM', 'B0C28TBN79', 'B09T31ZRJF', 'B01LBOYWNO', 'B0DDTB25YZ', 'B0D1Q8GL1Y', 'B0CW9JC84B', 'B0CLGJG36H', 'B0CF9JWKHJ', 'B0C2J3V92Q', 'B0BVVYZ6TN', 'B0B8J8VF7C', 'B0B4BFVZD1', 'B09R1CPKVX', 'B0924BNVH2', 'B0F54M2147', 'B0F1BZNBY6', 'B0F1BXV9WG', 'B0DC957VHC', 'B0D8778SZB', 'B0CP9WVSRY', 'B0CKNQP1PT', 'B0CJ4PW758', 'B0BYFD87C6', 'B0B492K9KT', 'B09968XMC7', 'B0FGJ8RCW1', 'B0FGJ4WK8B', 'B0FFMYGWHP', 'B0FD3DLFKL', 'B0FBWRWXG2', 'B0F99RW38N', 'B0F62LZ4G3', 'B0F629FLVV', 'B0F2N88DS9', 'B0F23Y11GD', 'B0F1YV8T2S', 'B0DXK9PR5X', 'B0DRV7QZ85', 'B0DRV7LN4V', 'B0DR4QYC2M', 'B0D5QL869M', 'B0D41VK3YL', 'B0D3XBW4KT', 'B0D2KW1ZRL', 'B0CPPC6PDW', 'B0CHVPSJ61', 'B0C5C1V5JD', 'B0C232Z6C6', 'B0C22KBMJC', 'B0BZVL6Y9X', 'B0BX58MW7N', 'B0B9M86GMC', 'B08DQVJ2VB', 'B07WKYLJ3T', 'B092D7P9BP', 'B0F9W2MZJY', 'B09KXV2C3T', 'B092D7TM65', 'B0CR3P2F5L', 'B0BWCSCYFL', 'B08JLW8S3Y', 'B0D4H73BJH', 'B08D77WTYG', 'B08D73XW2J', 'B09H4RB4ZL', 'B09WMQ29GH', 'B0DJ2M2RYC', 'B0BGF2QCKT', 'B0DS6FC8M7', 'B098QFLVDZ', 'B0DMD16GTD', 'B0CNVLLQ3J', 'B0CP3JZ1P5', 'B0C1GR4K6W', 'B0CBM792D2', 'B09NJK6K5T', 'B0D8Q5MK31', 'B0CYSCV19T', 'B0C5D5XPLJ', 'B09R3NFGH2', 'B09BG1QD9M', 'B092QY1823', 'B0C55PGK51', 'B0DRN8MXRG', 'B08152JKFB', 'B09Y1P7GK7', 'B0CG62X5GT', 'B0DHJKKZDD', 'B0DYHZ59YL', 'B0D2D5WS2D', 'B0G6LHVRKG', 'B0DQ53F84K', 'ASDASD', 'B0CJTCGDB7232', 'B0CJTCGDB7213', 'B0CJTCGDB79', 'B0CJTCGDB78', 'B0CJTCGDB77', 'B0CJTCGDB76', 'B0CJTCGDB75', 'B0CJTCGDB74', 'B0CJTCGDB73', 'B0CJTCGDB72', 'B0CJTCGDB71', 'B0CJTCGDB7', '1'], 'UK': ['B0FGJD2P9Q', 'B0DKBSWJ93', 'B0DJT78FNR', 'B0DFCR79L5', 'B0DCBJ3WY5', 'B0D9LPW1YB', 'B0D7VDQG19', 'B0CP5K31TL', 'B0CG3RG7RQ', 'B0C8DSPMNC', 'B0B6H8RCHC', 'B08TVWB36K', 'B08FZMZQ11', 'B0G6LHVRKG', 'B0FF36SY6Q', 'B0DYTNBMB2', 'B0DQNLGSMQ', 'B0DNSNN7NH', 'B0DJWHHFBS', 'B0DJHSJ9LS', 'B0D2D5WS2D', 'B0CG8RNWL6', 'B0C5D5XPLJ', 'B09WHYGBSR', 'B09WHV9JCJ', 'B09P4VCL2V', 'B09MYVN5YK', 'B09MBNG7P4', 'B0DM63394K', 'B0D1Q4RR99', 'B0CZD1HLY7', 'B0CWD9R2FS', 'B0CS6WYRFW', 'B0CRVTSQGQ', 'B0CR8FTHYP', 'B0CCB5Q5ZY', 'B0CC94W5G7', 'B0CC948Q8Q', 'B0CC93R18S', 'B0CC92F33P', 'B0BZ4DNWPY', 'B0BZ4CMQDL', 'B07Q4RBT32', 'B0DHX32XJH', 'B0DHX1HR7X', 'B0DHTT1X71', 'B0DHTRLQ2L', 'B0DHL7FQJM', 'B0D3V1BJX9', 'B0D3TZ45C3', 'B0D2SDNYS5', 'B0CQY5SM94', 'B0CQLN2FC1', 'B0CQF6W2JT', 'B0BY85GDF5', 'B0BY82BRTZ', 'B0B73K6QZQ', 'B0B4MDDD7D', 'B0F1X5Q9Q6', 'B0DYHPWTVJ', 'B0DQNJPS5M', 'B0DQ4B5SF7', 'B0DNZ5WX1L', 'B0DKX28SNX', 'B0DHVTGXPD', 'B0DHDBN98L', 'B0DFXRP8X1', 'B0DFGPGXY6', 'B0D8JV9MB9', 'B0D2KCRLJ1', 'B0CW63X5XY', 'B0CRVRDS8C', 'B0CRHWLDY4', 'B0CLZBR5CM', 'B0CL67FJFL', 'B0CG2C89ZZ', 'B0BP7YMCXH', 'B0BM8Y94QC', 'B0BJKBRTK7', 'B0BCL2DLPC', 'B0B6PSLTPF', 'B0B6PS4RQ1', 'B0B5L4HC95', 'B08ZT1PJ2K', 'B0FGQ31VWT', 'B0FFT33WRF', 'B0FD3S6DRN', 'B0F2GBR7MP', 'B0F2G5TG4S', 'B0F2FZVS7X', 'B0F2FYW3HN', 'B0F2B6924H', 'B0DSJMMMXN', 'B0DJT68ZM3', 'B0DJT66VG3', 'B0DJT5YJXD', 'B0DCGSFTYX', 'B0D8C6KL4G', 'B0C9H8MJC3', 'B0C85JQNRC', 'B0C5QQFN1G', 'B0BZ8FXRZG', 'B0BS8SW341', 'B0FLVP9N4Y', 'B0F2MPWSCQ', 'B0F29CFJJ9', 'B0DSKC1GQB', 'B0DSCBZSGS', 'B0DSCB329P', 'B0DLNXW8W5', 'B0DJQHVBZZ', 'B0DGCW7WBY', 'B0DFTG85NG', 'B0D99N1DZY', 'B0D8B849BJ', 'B0D89YCGCR', 'B0D89WK6JF', 'B0D89PMKKP', 'B0D7X1634D', 'B0D7V3W7D1', 'B0CYT3R89Z', 'B0CY7P61VD', 'B0CQ8B9PZM', 'B0CNK1SV4P', 'B0CF4K1G4R', 'B0CF4JJXHY', 'B0CF4BJ42D', 'B0C6T346MQ', 'B0BX2KDVMY', 'B0BR4YWSF9', 'B0BR4XHP5Z', 'B09Z68FK4Q', 'B09SL3PTTM', 'B09JBQZQQL', 'B08PSSRS3C', 'B08G4P4F76', 'B0DRD7T6TQ', 'B0DQXT78DT', 'B0DQXRV47R', 'B0DQXRV18S', 'B0DQXRLK5X', 'B0DQXQNL6Z', 'B0D2KQVS2Y', 'B0CXJC74TK', 'B0CW9JC84B', 'B0CSYBNXWX', 'B0CRHSTGX6', 'B0CPPJTX5C', 'B0CJB9WFHD', 'B0CF9JWKHJ', 'B0BVVYZ6TN', 'B0BND2YKJF', 'B09TRCQNQH', 'B09H5J6YQX', 'B09CNRP5FJ', 'B08BZ9LW9Z', 'B0F54M2147', 'B0F388HQLY', 'B0F1BZNBY6', 'B0F1BXV9WG', 'B0DSD949P4', 'B0DFQ2FP96', 'B0D9YXGFQW', 'B0CP9WVSRY', 'B0CKZ35SJC', 'B0CHYNDX87', 'B0CH66SNFC', 'B0BHSWP8RD', 'B0BGRW6858', 'B0B6JKD25B', 'B0B1LJB3M5', 'B09P3S4SH5', 'B09NLSRHGV', 'B0FVDPV5NS', 'B0FQJ5CDL2', 'B0FLJLWTLV', 'B0FGQ1VP2J', 'B0FD6YL7MM', 'B0FBWP9GJL', 'B0F99RW38N', 'B0F3Y3M538', 'B0F27ZM2TG', 'B0F23Y11GD', 'B0F23WZ78P', 'B0F1MY4PF6', 'B0DXKC6H1G', 'B0DQLNTLF4', 'B0DM8DYG77', 'B0DHJNBFVH', 'B0DH1XKG95', 'B0DFYG7C4K', 'B0DFTR1CMN', 'B0DB8FM915', 'B0D5H65VW3', 'B0D3XBW4KT', 'B0CRKJWJ4X', 'B0CPPGX6FQ', 'B0CPPGSBHD', 'B0CL9PVZD1', 'B0C232Z6C6', 'B0C22KBMJC', 'B0BX58MW7N', 'B0B6T3N5MG', 'B0B4S9QYWM', 'B0B4S93T7Q', 'B09R1PMW3J', 'B08MLN92JM', 'B0BHN71FWM', 'B09NKRWXPC', 'B0C89TNVTN', 'B0D1VDMZR1', 'B0DS2QT1YZ', 'B09Y29P5YF', 'B0DBQDSHVZ', 'B0CFF62JY3', 'B0BHPGTWQR', 'B0D4F4D3W2', 'B0F13BRF4V', 'B0D1FXTY99', 'B00KY0LLFO', 'B0B7MJXDZC', 'B0B4DV8NLV', 'B0DJXRFCF7', 'B0BPHMFD7V', 'B0F281ZQWR', 'B0D7V2FNW3', 'B0D57X7KV9', 'B0CJ2SST5Z', 'B0CZ92LPP4', 'B0CG5Z2Z44', 'B0D6T9H5LX', 'B0CQJNR9MP', 'ZXCA', 'B0CJTGDB7232', 'B0CJTGDB7213', 'B0CJTGDB79', 'B0CJTGDB78', 'B0CJTGDB77', 'B0CJCGDB76', 'B0CJCGDB75', 'B0CJCGDB74', 'B0CJCGDB73', 'B0CJCGDB72', 'B0CJCGDB71', 'B0CJCGDB7', 'B0CTCGDB7', 'B0FGTNLTG3', 'WQDASDAS', 'SADAD', 'DFHFGH78979'], 'FR': ['B0FY6JY4BF', 'B0DZNRB5Q1', 'B0DNSKFLGK', 'B0DGLCQDTR', 'B0D9W93869', 'B0CG8RNWL6', 'B0BX94RYT1', 'B0BLN7D2JZ', 'B09WHV9JCJ', 'B0DKX28SNX', 'B0CZCVTMRJ', 'B0CC95H28M', 'B0CC942XSZ', 'B0CC93WW6S', 'B0CC93TDB9', 'B0816GGCFY', 'B0CQY5SM94', 'B0DQTKRNLH', 'B0DCB85F3J', 'B0D8JR3W53', 'B0D2KCRLJ1', 'B0CQK7QWJB', 'B0B9XM29C9', 'B0B5L4HC95', 'B0F9FCT8RD', 'B0BZ8J16JM', 'B0BV1TRMGN', 'B09G68LMB3', 'B0DCRJSMJP', 'B093Y447R2', 'B0D8Y5KWB8', 'B0BJK43Z6X', 'B0DXK7YZ5D', 'B0C232Z6C6', 'B0BZVL6Y9X', 'B0B4S98HLZ', 'B09VPMBMB8', 'B0D17L6YKN'], 'IT': ['B0DTK87KJ5', 'B0DNSNN7NH', 'B0D9W93869', 'B0CLXZHM2G', 'B0CG8RNWL6', 'B0BX94RYT1', 'B0BVM53J3B', 'B0BLN7D2JZ', 'B0F9KVS6Y2', 'B0F8QGHMLL', 'B0CY5KW8RY', 'B0CC94P4H1', 'B0CC94K2HN', 'B0CC922QN8', 'B0C7Q51PL1', 'B0D8JR3W53', 'B0B5L4HC95', 'B0C5C53444', 'B0F5PRVRLF', 'B0BJK43Z6X', 'B09WKFD3G8', 'B08NT2BNGH', 'B0DRV6D214', 'B08QRKHD3C', 'B09JMW3F1R', 'B0CKYHTDJ5', 'B098QFLVDZ', '32EGDFGS4', 'B087JP6PWL89'], 'ES': ['B0D2J11TKY', 'B0CLY2THTY', 'B0D8JS8NPH', 'B0CYGSBXSQ', 'B0CKXMDBN8', 'B0CJ5F9J4Z', 'B0CC95XMD4', 'B0CC93ZNH2', 'B07L281N1M', 'B0DNZ5N7HY', 'B0C7V4BFSZ', 'B0B5L4HC95', 'B0DZCC4B4T', 'B0DZBQ4ZNC', 'B0C5QQFN1G', 'B0BFXD4LYN', 'B0F3122Q81', 'B0BG73XTFC', 'B0CNM269LZ', 'B08QS37RHQ', 'B087JP6PWL89']}, 'skip_asin_details_by_country': {'DE': [{'asin': 'B0FMKM1BYH', 'minimumPrice': ''}, {'asin': 'B0DJT78FNR', 'minimumPrice': ''}, {'asin': 'B0DJLJ73RB', 'minimumPrice': ''}, {'asin': 'B0D6QL2JMY', 'minimumPrice': ''}, {'asin': 'B0CFKLPKF5', 'minimumPrice': ''}, {'asin': 'B09BMWX6Q1', 'minimumPrice': ''}, {'asin': 'B07C4MNWFL', 'minimumPrice': ''}, {'asin': 'B0FHDGLQK7', 'minimumPrice': ''}, {'asin': 'B0FHD9S7K7', 'minimumPrice': ''}, {'asin': 'B0FB2FB6G6', 'minimumPrice': ''}, {'asin': 'B0F9W8VXWQ', 'minimumPrice': ''}, {'asin': 'B0F9W81F2F', 'minimumPrice': ''}, {'asin': 'B0F9W7KLNM', 'minimumPrice': ''}, {'asin': 'B0F2ZJWJNC', 'minimumPrice': ''}, {'asin': 'B0D49F7LM4', 'minimumPrice': ''}, {'asin': 'B0CXSP3PDP', 'minimumPrice': ''}, {'asin': 'B0CLXZHM2G', 'minimumPrice': ''}, {'asin': 'B0CG8RNWL6', 'minimumPrice': ''}, {'asin': 'B0C4SZ8GZW', 'minimumPrice': ''}, {'asin': 'B0BVM53J3B', 'minimumPrice': ''}, {'asin': 'B0BNHN9N9X', 'minimumPrice': ''}, {'asin': 'B0BMXBNMP5', 'minimumPrice': ''}, {'asin': 'B0BLN7D2JZ', 'minimumPrice': ''}, {'asin': 'B09MYVN5YK', 'minimumPrice': ''}, {'asin': 'B09MBNG7P4', 'minimumPrice': ''}, {'asin': 'B09MBNG7P4', 'minimumPrice': '30.28'}, {'asin': 'B0DXTSTZC6', 'minimumPrice': ''}, {'asin': 'B0D25871WL', 'minimumPrice': ''}, {'asin': 'B0CL69XRTY', 'minimumPrice': ''}, {'asin': 'B0CKXMDBN8', 'minimumPrice': ''}, {'asin': 'B0CGDF2G8V', 'minimumPrice': ''}, {'asin': 'B0CFTGXVYF', 'minimumPrice': ''}, {'asin': 'B0CFT6XPPD', 'minimumPrice': ''}, {'asin': 'B09YXTN8JP', 'minimumPrice': ''}, {'asin': 'B0DHX32XJH', 'minimumPrice': ''}, {'asin': 'B0DHL7FQJM', 'minimumPrice': ''}, {'asin': 'B0DHL63M79', 'minimumPrice': ''}, {'asin': 'B0CWXYY74V', 'minimumPrice': ''}, {'asin': 'B0CWXYRGZW', 'minimumPrice': ''}, {'asin': 'B0CPLR6YHB', 'minimumPrice': ''}, {'asin': 'B0BXP4RC25', 'minimumPrice': ''}, {'asin': 'B0BFRRZDCH', 'minimumPrice': ''}, {'asin': 'B0B65R3N47', 'minimumPrice': ''}, {'asin': 'B0FB2FB6G6', 'minimumPrice': ''}, {'asin': 'B0F36ZSWTQ', 'minimumPrice': ''}, {'asin': 'B0DT1DYWC6', 'minimumPrice': ''}, {'asin': 'B0DNZ5WX1L', 'minimumPrice': ''}, {'asin': 'B0DNZ5N7HY', 'minimumPrice': ''}, {'asin': 'B0DCJJ3PCM', 'minimumPrice': ''}, {'asin': 'B0D8JV9MB9', 'minimumPrice': ''}, {'asin': 'B0D2KCRLJ1', 'minimumPrice': ''}, {'asin': 'B0CRVRDS8C', 'minimumPrice': ''}, {'asin': 'B0CQK7QWJB', 'minimumPrice': ''}, {'asin': 'B0CQK5SRXW', 'minimumPrice': ''}, {'asin': 'B0BCL2DLPC', 'minimumPrice': ''}, {'asin': 'B0B9JBHPFY', 'minimumPrice': ''}, {'asin': 'B09TVY4V8Z', 'minimumPrice': ''}, {'asin': 'B0FJBD6Q3D', 'minimumPrice': ''}, {'asin': 'B0DG8LQLXZ', 'minimumPrice': ''}, {'asin': 'B0CD7Q1BX3', 'minimumPrice': ''}, {'asin': 'B0BV1SR48Y', 'minimumPrice': ''}, {'asin': 'B0F29CFJJ9', 'minimumPrice': '26.70'}, {'asin': 'B0DSL6PKR7', 'minimumPrice': '8.80'}, {'asin': 'B0CPV21W4L', 'minimumPrice': '21.87'}, {'asin': 'B0CNQZ7FXY', 'minimumPrice': '74.46'}, {'asin': 'B0CLY9XT5M', 'minimumPrice': '19.72'}, {'asin': 'B0CGTMZ8GP', 'minimumPrice': '33.44'}, {'asin': 'B0CF881PG4', 'minimumPrice': '31.82'}, {'asin': 'B0CF4K1G4R', 'minimumPrice': '31.44'}, {'asin': 'B0CB5T79XG', 'minimumPrice': '16.59'}, {'asin': 'B0C73PQ9KM', 'minimumPrice': '20.92'}, {'asin': 'B0C28TBN79', 'minimumPrice': '12.70'}, {'asin': 'B09T31ZRJF', 'minimumPrice': '35.64'}, {'asin': 'B01LBOYWNO', 'minimumPrice': '11.21'}, {'asin': 'B0DDTB25YZ', 'minimumPrice': ''}, {'asin': 'B0D1Q8GL1Y', 'minimumPrice': ''}, {'asin': 'B0CW9JC84B', 'minimumPrice': ''}, {'asin': 'B0CLGJG36H', 'minimumPrice': ''}, {'asin': 'B0CF9JWKHJ', 'minimumPrice': ''}, {'asin': 'B0C2J3V92Q', 'minimumPrice': ''}, {'asin': 'B0BVVYZ6TN', 'minimumPrice': ''}, {'asin': 'B0B8J8VF7C', 'minimumPrice': ''}, {'asin': 'B0B4BFVZD1', 'minimumPrice': ''}, {'asin': 'B09R1CPKVX', 'minimumPrice': ''}, {'asin': 'B0924BNVH2', 'minimumPrice': ''}, {'asin': 'B0F54M2147', 'minimumPrice': ''}, {'asin': 'B0F1BZNBY6', 'minimumPrice': ''}, {'asin': 'B0F1BXV9WG', 'minimumPrice': ''}, {'asin': 'B0DC957VHC', 'minimumPrice': ''}, {'asin': 'B0D8778SZB', 'minimumPrice': ''}, {'asin': 'B0CP9WVSRY', 'minimumPrice': ''}, {'asin': 'B0CKNQP1PT', 'minimumPrice': ''}, {'asin': 'B0CJ4PW758', 'minimumPrice': ''}, {'asin': 'B0BYFD87C6', 'minimumPrice': ''}, {'asin': 'B0B492K9KT', 'minimumPrice': ''}, {'asin': 'B09968XMC7', 'minimumPrice': ''}, {'asin': 'B0FGJ8RCW1', 'minimumPrice': '12.09'}, {'asin': 'B0FGJ4WK8B', 'minimumPrice': '19.77'}, {'asin': 'B0FFMYGWHP', 'minimumPrice': '34.02'}, {'asin': 'B0FD3DLFKL', 'minimumPrice': '14.13'}, {'asin': 'B0FBWRWXG2', 'minimumPrice': '10.53'}, {'asin': 'B0F99RW38N', 'minimumPrice': '14.21'}, {'asin': 'B0F62LZ4G3', 'minimumPrice': '19.95'}, {'asin': 'B0F629FLVV', 'minimumPrice': '22.62'}, {'asin': 'B0F2N88DS9', 'minimumPrice': '18.43'}, {'asin': 'B0F23Y11GD', 'minimumPrice': '14.54'}, {'asin': 'B0F1YV8T2S', 'minimumPrice': '10.38'}, {'asin': 'B0DXK9PR5X', 'minimumPrice': '18.44'}, {'asin': 'B0DRV7QZ85', 'minimumPrice': '17.72'}, {'asin': 'B0DRV7LN4V', 'minimumPrice': '18.91'}, {'asin': 'B0DR4QYC2M', 'minimumPrice': '15.46'}, {'asin': 'B0D5QL869M', 'minimumPrice': '31.89'}, {'asin': 'B0D41VK3YL', 'minimumPrice': '15.94'}, {'asin': 'B0D3XBW4KT', 'minimumPrice': '26.18'}, {'asin': 'B0D2KW1ZRL', 'minimumPrice': '32.36'}, {'asin': 'B0CPPC6PDW', 'minimumPrice': '27.00'}, {'asin': 'B0CHVPSJ61', 'minimumPrice': '31.30'}, {'asin': 'B0C5C1V5JD', 'minimumPrice': '33.84'}, {'asin': 'B0C232Z6C6', 'minimumPrice': '42.55'}, {'asin': 'B0C22KBMJC', 'minimumPrice': '35.85'}, {'asin': 'B0BZVL6Y9X', 'minimumPrice': '50.46'}, {'asin': 'B0BX58MW7N', 'minimumPrice': '26.73'}, {'asin': 'B0B9M86GMC', 'minimumPrice': '15.93'}, {'asin': 'B08DQVJ2VB', 'minimumPrice': '37.30'}, {'asin': 'B07WKYLJ3T', 'minimumPrice': '64.75'}, {'asin': 'B092D7P9BP', 'minimumPrice': '28.12'}, {'asin': 'B0F9W2MZJY', 'minimumPrice': '77.28'}, {'asin': 'B09KXV2C3T', 'minimumPrice': '27.74'}, {'asin': 'B092D7TM65', 'minimumPrice': '29.44'}, {'asin': 'B0CR3P2F5L', 'minimumPrice': '47.54'}, {'asin': 'B0BWCSCYFL', 'minimumPrice': '45.18'}, {'asin': 'B08JLW8S3Y', 'minimumPrice': '28.56'}, {'asin': 'B0D4H73BJH', 'minimumPrice': '19.57'}, {'asin': 'B08D77WTYG', 'minimumPrice': '30.35'}, {'asin': 'B08D73XW2J', 'minimumPrice': '31.35'}, {'asin': 'B09H4RB4ZL', 'minimumPrice': '25.08'}, {'asin': 'B09WMQ29GH', 'minimumPrice': '29.45'}, {'asin': 'B0DJ2M2RYC', 'minimumPrice': '13.87'}, {'asin': 'B0BGF2QCKT', 'minimumPrice': '35.52'}, {'asin': 'B0DS6FC8M7', 'minimumPrice': '14.94'}, {'asin': 'B098QFLVDZ', 'minimumPrice': '66.04'}, {'asin': 'B0DMD16GTD', 'minimumPrice': '21.90'}, {'asin': 'B0CNVLLQ3J', 'minimumPrice': '42.27'}, {'asin': 'B0CP3JZ1P5', 'minimumPrice': '37.09'}, {'asin': 'B0C1GR4K6W', 'minimumPrice': '21.71'}, {'asin': 'B0CBM792D2', 'minimumPrice': '17.03'}, {'asin': 'B09NJK6K5T', 'minimumPrice': '22.51'}, {'asin': 'B0D8Q5MK31', 'minimumPrice': '21.37'}, {'asin': 'B0CYSCV19T', 'minimumPrice': '32.71'}, {'asin': 'B0C5D5XPLJ', 'minimumPrice': '50.72'}, {'asin': 'B09R3NFGH2', 'minimumPrice': '16.51'}, {'asin': 'B09BG1QD9M', 'minimumPrice': '23.84'}, {'asin': 'B092QY1823', 'minimumPrice': '16.86'}, {'asin': 'B0C55PGK51', 'minimumPrice': '13.77'}, {'asin': 'B0DRN8MXRG', 'minimumPrice': '29.13'}, {'asin': 'B08152JKFB', 'minimumPrice': '21.98'}, {'asin': 'B09Y1P7GK7', 'minimumPrice': '29.43'}, {'asin': 'B0CG62X5GT', 'minimumPrice': '16.88'}, {'asin': 'B0DHJKKZDD', 'minimumPrice': '17.96'}, {'asin': 'B0DYHZ59YL', 'minimumPrice': '20.74'}, {'asin': 'B0CG8RNWL6', 'minimumPrice': '28.08'}, {'asin': 'B0BLN7D2JZ', 'minimumPrice': '27.15'}, {'asin': 'B0D2D5WS2D', 'minimumPrice': '40.27'}, {'asin': 'B0G6LHVRKG', 'minimumPrice': '23.41'}, {'asin': 'B0DQ53F84K', 'minimumPrice': '53.79'}, {'asin': 'ASDASD', 'minimumPrice': '90.00'}, {'asin': 'B0CJTCGDB7232', 'minimumPrice': '32.00'}, {'asin': 'B0CJTCGDB7213', 'minimumPrice': '23.00'}, {'asin': 'B0CJTCGDB79', 'minimumPrice': '32.00'}, {'asin': 'B0CJTCGDB78', 'minimumPrice': '321.00'}, {'asin': 'B0CJTCGDB77', 'minimumPrice': '32.00'}, {'asin': 'B0CJTCGDB76', 'minimumPrice': '32.00'}, {'asin': 'B0CJTCGDB75', 'minimumPrice': '321.00'}, {'asin': 'B0CJTCGDB74', 'minimumPrice': '21.00'}, {'asin': 'B0CJTCGDB73', 'minimumPrice': '231.00'}, {'asin': 'B0CJTCGDB72', 'minimumPrice': '21.00'}, {'asin': 'B0CJTCGDB71', 'minimumPrice': '20.00'}, {'asin': 'B0CJTCGDB7', 'minimumPrice': '15.00'}, {'asin': '1', 'minimumPrice': '1.00'}, {'asin': 'ASDASD', 'minimumPrice': '50.00'}], 'UK': [{'asin': 'B0FGJD2P9Q', 'minimumPrice': ''}, {'asin': 'B0DKBSWJ93', 'minimumPrice': ''}, {'asin': 'B0DJT78FNR', 'minimumPrice': ''}, {'asin': 'B0DFCR79L5', 'minimumPrice': ''}, {'asin': 'B0DCBJ3WY5', 'minimumPrice': ''}, {'asin': 'B0D9LPW1YB', 'minimumPrice': ''}, {'asin': 'B0D7VDQG19', 'minimumPrice': ''}, {'asin': 'B0CP5K31TL', 'minimumPrice': ''}, {'asin': 'B0CG3RG7RQ', 'minimumPrice': ''}, {'asin': 'B0C8DSPMNC', 'minimumPrice': ''}, {'asin': 'B0B6H8RCHC', 'minimumPrice': ''}, {'asin': 'B08TVWB36K', 'minimumPrice': ''}, {'asin': 'B08FZMZQ11', 'minimumPrice': ''}, {'asin': 'B0G6LHVRKG', 'minimumPrice': ''}, {'asin': 'B0FF36SY6Q', 'minimumPrice': ''}, {'asin': 'B0DYTNBMB2', 'minimumPrice': ''}, {'asin': 'B0DQNLGSMQ', 'minimumPrice': ''}, {'asin': 'B0DNSNN7NH', 'minimumPrice': ''}, {'asin': 'B0DJWHHFBS', 'minimumPrice': ''}, {'asin': 'B0DJHSJ9LS', 'minimumPrice': ''}, {'asin': 'B0D2D5WS2D', 'minimumPrice': ''}, {'asin': 'B0CG8RNWL6', 'minimumPrice': ''}, {'asin': 'B0C5D5XPLJ', 'minimumPrice': ''}, {'asin': 'B09WHYGBSR', 'minimumPrice': ''}, {'asin': 'B09WHV9JCJ', 'minimumPrice': ''}, {'asin': 'B09P4VCL2V', 'minimumPrice': ''}, {'asin': 'B09MYVN5YK', 'minimumPrice': ''}, {'asin': 'B09MBNG7P4', 'minimumPrice': ''}, {'asin': 'B0DM63394K', 'minimumPrice': ''}, {'asin': 'B0D1Q4RR99', 'minimumPrice': ''}, {'asin': 'B0CZD1HLY7', 'minimumPrice': ''}, {'asin': 'B0CWD9R2FS', 'minimumPrice': ''}, {'asin': 'B0CS6WYRFW', 'minimumPrice': ''}, {'asin': 'B0CRVTSQGQ', 'minimumPrice': ''}, {'asin': 'B0CR8FTHYP', 'minimumPrice': ''}, {'asin': 'B0CCB5Q5ZY', 'minimumPrice': ''}, {'asin': 'B0CC94W5G7', 'minimumPrice': ''}, {'asin': 'B0CC948Q8Q', 'minimumPrice': ''}, {'asin': 'B0CC93R18S', 'minimumPrice': ''}, {'asin': 'B0CC92F33P', 'minimumPrice': ''}, {'asin': 'B0BZ4DNWPY', 'minimumPrice': ''}, {'asin': 'B0BZ4CMQDL', 'minimumPrice': ''}, {'asin': 'B07Q4RBT32', 'minimumPrice': ''}, {'asin': 'B0DHX32XJH', 'minimumPrice': ''}, {'asin': 'B0DHX1HR7X', 'minimumPrice': ''}, {'asin': 'B0DHTT1X71', 'minimumPrice': ''}, {'asin': 'B0DHTRLQ2L', 'minimumPrice': ''}, {'asin': 'B0DHL7FQJM', 'minimumPrice': ''}, {'asin': 'B0D3V1BJX9', 'minimumPrice': ''}, {'asin': 'B0D3TZ45C3', 'minimumPrice': ''}, {'asin': 'B0D2SDNYS5', 'minimumPrice': ''}, {'asin': 'B0CQY5SM94', 'minimumPrice': ''}, {'asin': 'B0CQLN2FC1', 'minimumPrice': ''}, {'asin': 'B0CQF6W2JT', 'minimumPrice': ''}, {'asin': 'B0BY85GDF5', 'minimumPrice': ''}, {'asin': 'B0BY82BRTZ', 'minimumPrice': ''}, {'asin': 'B0B73K6QZQ', 'minimumPrice': ''}, {'asin': 'B0B4MDDD7D', 'minimumPrice': ''}, {'asin': 'B0F1X5Q9Q6', 'minimumPrice': ''}, {'asin': 'B0DYHPWTVJ', 'minimumPrice': ''}, {'asin': 'B0DQNJPS5M', 'minimumPrice': ''}, {'asin': 'B0DQ4B5SF7', 'minimumPrice': ''}, {'asin': 'B0DNZ5WX1L', 'minimumPrice': ''}, {'asin': 'B0DKX28SNX', 'minimumPrice': ''}, {'asin': 'B0DHVTGXPD', 'minimumPrice': ''}, {'asin': 'B0DHDBN98L', 'minimumPrice': ''}, {'asin': 'B0DFXRP8X1', 'minimumPrice': ''}, {'asin': 'B0DFGPGXY6', 'minimumPrice': ''}, {'asin': 'B0D8JV9MB9', 'minimumPrice': ''}, {'asin': 'B0D2KCRLJ1', 'minimumPrice': ''}, {'asin': 'B0CW63X5XY', 'minimumPrice': ''}, {'asin': 'B0CRVRDS8C', 'minimumPrice': ''}, {'asin': 'B0CRHWLDY4', 'minimumPrice': ''}, {'asin': 'B0CLZBR5CM', 'minimumPrice': ''}, {'asin': 'B0CL67FJFL', 'minimumPrice': ''}, {'asin': 'B0CG2C89ZZ', 'minimumPrice': ''}, {'asin': 'B0BP7YMCXH', 'minimumPrice': ''}, {'asin': 'B0BM8Y94QC', 'minimumPrice': ''}, {'asin': 'B0BJKBRTK7', 'minimumPrice': ''}, {'asin': 'B0BCL2DLPC', 'minimumPrice': ''}, {'asin': 'B0B6PSLTPF', 'minimumPrice': ''}, {'asin': 'B0B6PS4RQ1', 'minimumPrice': ''}, {'asin': 'B0B5L4HC95', 'minimumPrice': ''}, {'asin': 'B08ZT1PJ2K', 'minimumPrice': ''}, {'asin': 'B0FGQ31VWT', 'minimumPrice': ''}, {'asin': 'B0FFT33WRF', 'minimumPrice': ''}, {'asin': 'B0FD3S6DRN', 'minimumPrice': ''}, {'asin': 'B0F2GBR7MP', 'minimumPrice': ''}, {'asin': 'B0F2G5TG4S', 'minimumPrice': ''}, {'asin': 'B0F2FZVS7X', 'minimumPrice': ''}, {'asin': 'B0F2FYW3HN', 'minimumPrice': ''}, {'asin': 'B0F2B6924H', 'minimumPrice': ''}, {'asin': 'B0DSJMMMXN', 'minimumPrice': ''}, {'asin': 'B0DJT68ZM3', 'minimumPrice': ''}, {'asin': 'B0DJT66VG3', 'minimumPrice': ''}, {'asin': 'B0DJT5YJXD', 'minimumPrice': ''}, {'asin': 'B0DCGSFTYX', 'minimumPrice': ''}, {'asin': 'B0D8C6KL4G', 'minimumPrice': ''}, {'asin': 'B0C9H8MJC3', 'minimumPrice': ''}, {'asin': 'B0C85JQNRC', 'minimumPrice': ''}, {'asin': 'B0C5QQFN1G', 'minimumPrice': ''}, {'asin': 'B0BZ8FXRZG', 'minimumPrice': ''}, {'asin': 'B0BS8SW341', 'minimumPrice': ''}, {'asin': 'B0FLVP9N4Y', 'minimumPrice': '6.16'}, {'asin': 'B0F2MPWSCQ', 'minimumPrice': '7.51'}, {'asin': 'B0F29CFJJ9', 'minimumPrice': '21.91'}, {'asin': 'B0DSKC1GQB', 'minimumPrice': '25.52'}, {'asin': 'B0DSCBZSGS', 'minimumPrice': '18.23'}, {'asin': 'B0DSCB329P', 'minimumPrice': '19.00'}, {'asin': 'B0DLNXW8W5', 'minimumPrice': '6.44'}, {'asin': 'B0DJQHVBZZ', 'minimumPrice': '17.62'}, {'asin': 'B0DGCW7WBY', 'minimumPrice': '24.73'}, {'asin': 'B0DFTG85NG', 'minimumPrice': '8.54'}, {'asin': 'B0D99N1DZY', 'minimumPrice': '37.69'}, {'asin': 'B0D8B849BJ', 'minimumPrice': '38.90'}, {'asin': 'B0D89YCGCR', 'minimumPrice': '38.97'}, {'asin': 'B0D89WK6JF', 'minimumPrice': '37.82'}, {'asin': 'B0D89PMKKP', 'minimumPrice': '36.47'}, {'asin': 'B0D7X1634D', 'minimumPrice': '15.56'}, {'asin': 'B0D7V3W7D1', 'minimumPrice': '76.14'}, {'asin': 'B0CYT3R89Z', 'minimumPrice': '68.79'}, {'asin': 'B0CY7P61VD', 'minimumPrice': '32.79'}, {'asin': 'B0CQ8B9PZM', 'minimumPrice': '31.31'}, {'asin': 'B0CNK1SV4P', 'minimumPrice': '16.61'}, {'asin': 'B0CF4K1G4R', 'minimumPrice': '48.07'}, {'asin': 'B0CF4JJXHY', 'minimumPrice': '34.72'}, {'asin': 'B0CF4BJ42D', 'minimumPrice': '24.82'}, {'asin': 'B0C6T346MQ', 'minimumPrice': '11.52'}, {'asin': 'B0BX2KDVMY', 'minimumPrice': '23.14'}, {'asin': 'B0BR4YWSF9', 'minimumPrice': '24.32'}, {'asin': 'B0BR4XHP5Z', 'minimumPrice': '24.71'}, {'asin': 'B09Z68FK4Q', 'minimumPrice': '17.34'}, {'asin': 'B09SL3PTTM', 'minimumPrice': '21.86'}, {'asin': 'B09JBQZQQL', 'minimumPrice': '13.87'}, {'asin': 'B08PSSRS3C', 'minimumPrice': '8.06'}, {'asin': 'B08G4P4F76', 'minimumPrice': '11.61'}, {'asin': 'B0DRD7T6TQ', 'minimumPrice': ''}, {'asin': 'B0DQXT78DT', 'minimumPrice': ''}, {'asin': 'B0DQXRV47R', 'minimumPrice': ''}, {'asin': 'B0DQXRV18S', 'minimumPrice': ''}, {'asin': 'B0DQXRLK5X', 'minimumPrice': ''}, {'asin': 'B0DQXQNL6Z', 'minimumPrice': ''}, {'asin': 'B0D2KQVS2Y', 'minimumPrice': ''}, {'asin': 'B0CXJC74TK', 'minimumPrice': ''}, {'asin': 'B0CW9JC84B', 'minimumPrice': ''}, {'asin': 'B0CSYBNXWX', 'minimumPrice': ''}, {'asin': 'B0CRHSTGX6', 'minimumPrice': ''}, {'asin': 'B0CPPJTX5C', 'minimumPrice': ''}, {'asin': 'B0CJB9WFHD', 'minimumPrice': ''}, {'asin': 'B0CF9JWKHJ', 'minimumPrice': ''}, {'asin': 'B0BVVYZ6TN', 'minimumPrice': ''}, {'asin': 'B0BND2YKJF', 'minimumPrice': ''}, {'asin': 'B09TRCQNQH', 'minimumPrice': ''}, {'asin': 'B09H5J6YQX', 'minimumPrice': ''}, {'asin': 'B09CNRP5FJ', 'minimumPrice': ''}, {'asin': 'B08BZ9LW9Z', 'minimumPrice': ''}, {'asin': 'B0F54M2147', 'minimumPrice': ''}, {'asin': 'B0F388HQLY', 'minimumPrice': ''}, {'asin': 'B0F1BZNBY6', 'minimumPrice': ''}, {'asin': 'B0F1BXV9WG', 'minimumPrice': ''}, {'asin': 'B0DSD949P4', 'minimumPrice': ''}, {'asin': 'B0DFQ2FP96', 'minimumPrice': ''}, {'asin': 'B0D9YXGFQW', 'minimumPrice': ''}, {'asin': 'B0CP9WVSRY', 'minimumPrice': ''}, {'asin': 'B0CKZ35SJC', 'minimumPrice': ''}, {'asin': 'B0CHYNDX87', 'minimumPrice': ''}, {'asin': 'B0CH66SNFC', 'minimumPrice': ''}, {'asin': 'B0BHSWP8RD', 'minimumPrice': ''}, {'asin': 'B0BGRW6858', 'minimumPrice': ''}, {'asin': 'B0B6JKD25B', 'minimumPrice': ''}, {'asin': 'B0B1LJB3M5', 'minimumPrice': ''}, {'asin': 'B09P3S4SH5', 'minimumPrice': ''}, {'asin': 'B09NLSRHGV', 'minimumPrice': ''}, {'asin': 'B0FVDPV5NS', 'minimumPrice': '16.54'}, {'asin': 'B0FQJ5CDL2', 'minimumPrice': '16.44'}, {'asin': 'B0FLJLWTLV', 'minimumPrice': '14.91'}, {'asin': 'B0FGQ1VP2J', 'minimumPrice': '18.19'}, {'asin': 'B0FD6YL7MM', 'minimumPrice': '10.10'}, {'asin': 'B0FBWP9GJL', 'minimumPrice': '11.34'}, {'asin': 'B0F99RW38N', 'minimumPrice': '21.47'}, {'asin': 'B0F3Y3M538', 'minimumPrice': '16.85'}, {'asin': 'B0F27ZM2TG', 'minimumPrice': '15.78'}, {'asin': 'B0F23Y11GD', 'minimumPrice': '16.44'}, {'asin': 'B0F23WZ78P', 'minimumPrice': '12.64'}, {'asin': 'B0F1MY4PF6', 'minimumPrice': '5.96'}, {'asin': 'B0DXKC6H1G', 'minimumPrice': '16.49'}, {'asin': 'B0DQLNTLF4', 'minimumPrice': '7.20'}, {'asin': 'B0DM8DYG77', 'minimumPrice': '13.80'}, {'asin': 'B0DHJNBFVH', 'minimumPrice': '11.19'}, {'asin': 'B0DH1XKG95', 'minimumPrice': '19.34'}, {'asin': 'B0DFYG7C4K', 'minimumPrice': '10.85'}, {'asin': 'B0DFTR1CMN', 'minimumPrice': '15.79'}, {'asin': 'B0DB8FM915', 'minimumPrice': '24.17'}, {'asin': 'B0D5H65VW3', 'minimumPrice': '9.83'}, {'asin': 'B0D3XBW4KT', 'minimumPrice': '19.21'}, {'asin': 'B0CRKJWJ4X', 'minimumPrice': '17.66'}, {'asin': 'B0CPPGX6FQ', 'minimumPrice': '40.53'}, {'asin': 'B0CPPGSBHD', 'minimumPrice': '32.58'}, {'asin': 'B0CL9PVZD1', 'minimumPrice': '24.79'}, {'asin': 'B0C232Z6C6', 'minimumPrice': '32.87'}, {'asin': 'B0C22KBMJC', 'minimumPrice': '25.72'}, {'asin': 'B0BX58MW7N', 'minimumPrice': '22.04'}, {'asin': 'B0B6T3N5MG', 'minimumPrice': '15.33'}, {'asin': 'B0B4S9QYWM', 'minimumPrice': '14.36'}, {'asin': 'B0B4S93T7Q', 'minimumPrice': '14.57'}, {'asin': 'B09R1PMW3J', 'minimumPrice': '14.07'}, {'asin': 'B08MLN92JM', 'minimumPrice': '9.63'}, {'asin': 'B0BHN71FWM', 'minimumPrice': '18.09'}, {'asin': 'B09NKRWXPC', 'minimumPrice': '12.53'}, {'asin': 'B0C89TNVTN', 'minimumPrice': '39.64'}, {'asin': 'B0D1VDMZR1', 'minimumPrice': '21.46'}, {'asin': 'B0DS2QT1YZ', 'minimumPrice': '23.49'}, {'asin': 'B09Y29P5YF', 'minimumPrice': '20.23'}, {'asin': 'B0DBQDSHVZ', 'minimumPrice': '31.03'}, {'asin': 'B0CFF62JY3', 'minimumPrice': '21.88'}, {'asin': 'B0BHPGTWQR', 'minimumPrice': '28.06'}, {'asin': 'B0D4F4D3W2', 'minimumPrice': '18.17'}, {'asin': 'B0F13BRF4V', 'minimumPrice': '14.89'}, {'asin': 'B0D1FXTY99', 'minimumPrice': '14.36'}, {'asin': 'B00KY0LLFO', 'minimumPrice': '16.48'}, {'asin': 'B0B7MJXDZC', 'minimumPrice': '18.28'}, {'asin': 'B0B4DV8NLV', 'minimumPrice': '18.09'}, {'asin': 'B0DJXRFCF7', 'minimumPrice': '34.13'}, {'asin': 'B0BPHMFD7V', 'minimumPrice': '17.16'}, {'asin': 'B0F281ZQWR', 'minimumPrice': '24.51'}, {'asin': 'B0D7V2FNW3', 'minimumPrice': '49.89'}, {'asin': 'B0D57X7KV9', 'minimumPrice': '15.04'}, {'asin': 'B0CJ2SST5Z', 'minimumPrice': '21.25'}, {'asin': 'B0CZ92LPP4', 'minimumPrice': '8.74'}, {'asin': 'B0CG5Z2Z44', 'minimumPrice': '13.24'}, {'asin': 'B0D6T9H5LX', 'minimumPrice': '14.42'}, {'asin': 'B0CQJNR9MP', 'minimumPrice': '10.64'}, {'asin': 'ZXCA', 'minimumPrice': '60.00'}, {'asin': 'B0CJTGDB7232', 'minimumPrice': '854.00'}, {'asin': 'B0CJTGDB7213', 'minimumPrice': '54.00'}, {'asin': 'B0CJTGDB79', 'minimumPrice': '54.00'}, {'asin': 'B0CJTGDB78', 'minimumPrice': '54.00'}, {'asin': 'B0CJTGDB77', 'minimumPrice': '4.00'}, {'asin': 'B0CJCGDB76', 'minimumPrice': '458.00'}, {'asin': 'B0CJCGDB75', 'minimumPrice': '45.00'}, {'asin': 'B0CJCGDB74', 'minimumPrice': '45.00'}, {'asin': 'B0CJCGDB73', 'minimumPrice': '485.00'}, {'asin': 'B0CJCGDB72', 'minimumPrice': '545.00'}, {'asin': 'B0CJCGDB71', 'minimumPrice': '545.00'}, {'asin': 'B0CJCGDB7', 'minimumPrice': '854.00'}, {'asin': 'B0CTCGDB7', 'minimumPrice': '84.00'}, {'asin': 'B0FGTNLTG3', 'minimumPrice': '56.00'}, {'asin': 'B0D57X7KV9', 'minimumPrice': '11.07'}, {'asin': 'B0D1VDMZR1', 'minimumPrice': '23.73'}, {'asin': 'B0DS2QT1YZ', 'minimumPrice': '19.36'}, {'asin': 'WQDASDAS', 'minimumPrice': '60.00'}, {'asin': 'B0BHPGTWQR', 'minimumPrice': '28.48'}, {'asin': 'SADAD', 'minimumPrice': '50.00'}, {'asin': 'DFHFGH78979', 'minimumPrice': '34.00'}], 'FR': [{'asin': 'B0FY6JY4BF', 'minimumPrice': ''}, {'asin': 'B0DZNRB5Q1', 'minimumPrice': ''}, {'asin': 'B0DNSKFLGK', 'minimumPrice': ''}, {'asin': 'B0DGLCQDTR', 'minimumPrice': ''}, {'asin': 'B0D9W93869', 'minimumPrice': ''}, {'asin': 'B0CG8RNWL6', 'minimumPrice': ''}, {'asin': 'B0BX94RYT1', 'minimumPrice': ''}, {'asin': 'B0BLN7D2JZ', 'minimumPrice': ''}, {'asin': 'B09WHV9JCJ', 'minimumPrice': ''}, {'asin': 'B0DKX28SNX', 'minimumPrice': ''}, {'asin': 'B0CZCVTMRJ', 'minimumPrice': ''}, {'asin': 'B0CC95H28M', 'minimumPrice': ''}, {'asin': 'B0CC942XSZ', 'minimumPrice': ''}, {'asin': 'B0CC93WW6S', 'minimumPrice': ''}, {'asin': 'B0CC93TDB9', 'minimumPrice': ''}, {'asin': 'B0816GGCFY', 'minimumPrice': ''}, {'asin': 'B0CQY5SM94', 'minimumPrice': ''}, {'asin': 'B0DQTKRNLH', 'minimumPrice': ''}, {'asin': 'B0DCB85F3J', 'minimumPrice': ''}, {'asin': 'B0D8JR3W53', 'minimumPrice': ''}, {'asin': 'B0D2KCRLJ1', 'minimumPrice': ''}, {'asin': 'B0CQK7QWJB', 'minimumPrice': ''}, {'asin': 'B0B9XM29C9', 'minimumPrice': ''}, {'asin': 'B0B5L4HC95', 'minimumPrice': ''}, {'asin': 'B0F9FCT8RD', 'minimumPrice': ''}, {'asin': 'B0BZ8J16JM', 'minimumPrice': ''}, {'asin': 'B0BV1TRMGN', 'minimumPrice': ''}, {'asin': 'B09G68LMB3', 'minimumPrice': ''}, {'asin': 'B0DCRJSMJP', 'minimumPrice': '10.72'}, {'asin': 'B093Y447R2', 'minimumPrice': '79.17'}, {'asin': 'B0D8Y5KWB8', 'minimumPrice': ''}, {'asin': 'B0BJK43Z6X', 'minimumPrice': ''}, {'asin': 'B0DXK7YZ5D', 'minimumPrice': '15.06'}, {'asin': 'B0C232Z6C6', 'minimumPrice': '48.25'}, {'asin': 'B0BZVL6Y9X', 'minimumPrice': '54.37'}, {'asin': 'B0B4S98HLZ', 'minimumPrice': '14.61'}, {'asin': 'B09VPMBMB8', 'minimumPrice': '18.01'}, {'asin': 'B0D17L6YKN', 'minimumPrice': '16.95'}], 'IT': [{'asin': 'B0DTK87KJ5', 'minimumPrice': ''}, {'asin': 'B0DNSNN7NH', 'minimumPrice': ''}, {'asin': 'B0D9W93869', 'minimumPrice': ''}, {'asin': 'B0CLXZHM2G', 'minimumPrice': ''}, {'asin': 'B0CG8RNWL6', 'minimumPrice': ''}, {'asin': 'B0BX94RYT1', 'minimumPrice': ''}, {'asin': 'B0BVM53J3B', 'minimumPrice': ''}, {'asin': 'B0BLN7D2JZ', 'minimumPrice': ''}, {'asin': 'B0F9KVS6Y2', 'minimumPrice': ''}, {'asin': 'B0F8QGHMLL', 'minimumPrice': ''}, {'asin': 'B0CY5KW8RY', 'minimumPrice': ''}, {'asin': 'B0CC94P4H1', 'minimumPrice': ''}, {'asin': 'B0CC94K2HN', 'minimumPrice': ''}, {'asin': 'B0CC922QN8', 'minimumPrice': ''}, {'asin': 'B0C7Q51PL1', 'minimumPrice': ''}, {'asin': 'B0D8JR3W53', 'minimumPrice': ''}, {'asin': 'B0B5L4HC95', 'minimumPrice': ''}, {'asin': 'B0C5C53444', 'minimumPrice': ''}, {'asin': 'B0F5PRVRLF', 'minimumPrice': ''}, {'asin': 'B0BJK43Z6X', 'minimumPrice': ''}, {'asin': 'B09WKFD3G8', 'minimumPrice': ''}, {'asin': 'B08NT2BNGH', 'minimumPrice': ''}, {'asin': 'B0DRV6D214', 'minimumPrice': '20.50'}, {'asin': 'B08QRKHD3C', 'minimumPrice': '38.36'}, {'asin': 'B09JMW3F1R', 'minimumPrice': '28.64'}, {'asin': 'B0CKYHTDJ5', 'minimumPrice': '24.05'}, {'asin': 'B098QFLVDZ', 'minimumPrice': '77.89'}, {'asin': '32EGDFGS4', 'minimumPrice': '56.00'}, {'asin': 'B087JP6PWL89', 'minimumPrice': ''}], 'ES': [{'asin': 'B0D2J11TKY', 'minimumPrice': ''}, {'asin': 'B0CLY2THTY', 'minimumPrice': ''}, {'asin': 'B0D8JS8NPH', 'minimumPrice': ''}, {'asin': 'B0CYGSBXSQ', 'minimumPrice': ''}, {'asin': 'B0CKXMDBN8', 'minimumPrice': ''}, {'asin': 'B0CJ5F9J4Z', 'minimumPrice': ''}, {'asin': 'B0CC95XMD4', 'minimumPrice': ''}, {'asin': 'B0CC93ZNH2', 'minimumPrice': ''}, {'asin': 'B07L281N1M', 'minimumPrice': ''}, {'asin': 'B0DNZ5N7HY', 'minimumPrice': ''}, {'asin': 'B0C7V4BFSZ', 'minimumPrice': ''}, {'asin': 'B0B5L4HC95', 'minimumPrice': ''}, {'asin': 'B0DZCC4B4T', 'minimumPrice': ''}, {'asin': 'B0DZBQ4ZNC', 'minimumPrice': ''}, {'asin': 'B0C5QQFN1G', 'minimumPrice': ''}, {'asin': 'B0BFXD4LYN', 'minimumPrice': '33.02'}, {'asin': 'B0F3122Q81', 'minimumPrice': ''}, {'asin': 'B0BG73XTFC', 'minimumPrice': ''}, {'asin': 'B0CNM269LZ', 'minimumPrice': '9.24'}, {'asin': 'B08QS37RHQ', 'minimumPrice': '42.40'}, {'asin': 'B087JP6PWL89', 'minimumPrice': ''}]}, 'minimum_price_by_country_and_asin': {}, 'skip_asin_delete_policy': {'enabled': True, 'mode': 'DELETE_WHEN_PRICE_BELOW_MINIMUM', 'deleteWhenPriceBelowMinimum': True, 'compareField': 'price', 'thresholdField': 'minimumPrice', 'target': 'skip_asin', 'source': 'frontend-price-track'}, 'delete_skip_asin_when_price_below_minimum': True, 'deleteSkipAsinWhenPriceBelowMinimum': True, 'asin_rows_by_country': {}, 'taskId': 5658, 'resultId': 7627, 'shopName': '郭锋滨', 'shopId': '27769139291498', 'platformName': '亚马逊', 'companyName': '尾号5578的公司115', 'shopMallName': '', 'matchStatus': 'MATCHED', 'matchMessage': None, 'outputFilename': None, 'downloadUrl': None, 'taskStatus': 'RUNNING', 'loopRunId': 235, 'roundIndex': 1}} - price_cls = PriceTask(user_info) - price_cls.process_task(task_data) - - - - - diff --git a/app/amazon/price_match_旧.py b/app/amazon/price_match_旧.py deleted file mode 100644 index 59f2864..0000000 --- a/app/amazon/price_match_旧.py +++ /dev/null @@ -1,1270 +0,0 @@ -import json -import sys -import os -import io -# sys.stdout.reconfigure(encoding='utf-8') - -import time -import re -import traceback -from datetime import datetime -from DrissionPage import Chromium, ChromiumOptions -import requests - -from amazon.del_brand import AmamzonBase, kill_process -from amazon.tool import show_notification,get_shop_info,remove_special_characters,split_currency_values - -from config import runing_task, runing_shop,base_dir,DELETE_BRAND_API_BASE - - -def calculate_target_price( - front_end_data,current_Price,current_shop_name, - recommended_price,recommended_shipping -): - """ - - recommended_price 推荐价格 - recommended_shipping 推荐运费 - """ - # --- Step 1: 获取基础数据 --- - price_1 = float(front_end_data.get("top_sellers")[0].get("price")) # 实际第一名价格 - cart_seller = front_end_data.get("cart_seller") - - my_price = current_Price # 我当前的售价 - - is_my_buybox = True if cart_seller == current_shop_name else False # 当前是否自己占据购物车 - - # --- Step 2: 紫鸟后台特殊判定 (最高优先级) --- - if recommended_shipping > 0: - backend_base_price = recommended_price - backend_shipping = recommended_shipping - total_price = backend_base_price + backend_shipping - - if is_my_buybox: - # 🌟【逻辑更新】:如果是自己的购物车,直接跳过,不做任何价格调整 - return None - else: - # 不是自己的购物车:直接将紫鸟的总和作为"第一名"价格,强制抛入阶梯跟价逻辑 - return calculate_standard_competitor_pricing(my_price, total_price) - - # --- Step 3: 常规核心分流逻辑 (如果没有紫鸟后台数据) --- - - # 分支 A:第一名是 Amazon US 卖家 (特殊强敌优先) - if "Amazon." in cart_seller: - diff = abs(my_price - price_1) - if diff <= 5.0 or my_price > price_1: - return price_1 - 5.0 - elif 5.0 < diff <= 8.0: - return price_1 - 3.0 - elif 8.0 < diff <= 12.0: - return None # 跳过,不跟价 - - - # 分支 B:不是 Amazon US,且目前是自己的购物车 - elif is_my_buybox: - price_2 = float(front_end_data.get("top_sellers")[1].get("price")) # 实际第二名价格 - - diff_with_2nd = price_2 - my_price - if diff_with_2nd >= 2.0: - return price_2 - 0.3 - else: - # 提价区间判定 - if (20 <= my_price <= 30) and diff_with_2nd >= 4: - return price_2 - 0.3 - elif (30 <= my_price <= 60) and diff_with_2nd >= 8: - return price_2 - 0.3 - elif (60 <= my_price <= 150) and diff_with_2nd >= 15: - return price_2 - 0.3 - else: - return None - - - # 分支 C:不是 Amazon US,也不是自己的购物车 - else: - # 正常情况下的普通跟价,调用阶梯逻辑 - return calculate_standard_competitor_pricing(my_price, price_1) - - -# ===================================================================== -# --- 辅助函数:封装“不是自己购物车”的阶梯降价逻辑 --- -# ===================================================================== -def calculate_standard_competitor_pricing(my_current_price, target_competitor_price): - # 基础策略:比目标价格低0.3 - base_target = target_competitor_price - 0.3 - - # 计算当前价格与目标价格的差值 - diff = abs(my_current_price - target_competitor_price) - - # 根据阶梯执行跟价扣减 - if diff <= 0.3: - return base_target - 0.5 - elif 0.5 <= diff <= 0.8: - return base_target - 0.7 - elif 0.8 <= diff <= 1.5: - return base_target - 1.0 - elif 1.5 <= diff <= 2.5: - return base_target - 1.0 - elif diff > 2.5: - return my_current_price # 差距过大,跳过不跟价 - - - - - -class ChromeAmzone: - - mark_name = "亚马逊详情采集" - country_info = { - "英国": { - "url": "https://www.amazon.co.uk/dp/B0CJ8SNXXV", - "zip_code": "SW1A 1AA", - "mark" : "SW1A 1" - }, - "德国": { - "url": "https://www.amazon.de/dp/B0CC8CW9G2?th=1", - "zip_code": "10115" - }, - "法国": { - "url": "https://www.amazon.fr/dp/B0FRG1MJ8H?th=1", - "zip_code": "75001" - }, - "西班牙": { - "url": "https://www.amazon.es/dp/B08ZXVNYNN", - "zip_code": "28001" - }, - "意大利": { - "url": "https://www.amazon.it/dp/B0D1P17T2Q", - "zip_code": "20121" - } - } - - def __init__(self): - """ - 杀死当前谷歌浏览器进程,并使用 drissionpage 启动谷歌浏览器,使用系统安装的浏览器默认用户文件夹 - """ - # 杀死现有的Chrome进程 - print("正在关闭现有的chromium浏览器进程...") - os.system('taskkill /f /t /im chromium.exe') - time.sleep(2) - - print("正在启动chromium浏览器...") - sellersprite_plug_path = os.path.join(base_dir,"app_resource","sellersprite-extension-mv3") - # sellersprite_plug_path = os.path.join("D:\\私单交付\\maixiang_AI\\","app_resource","sellersprite-extension-mv3") - print(sellersprite_plug_path) - # 配置浏览器选项 - co = ChromiumOptions() - # co.use_system_user_path(on_off=True) - user_data_path = os.path.join(base_dir,"user_data","chrome_data") - if not os.path.exists(user_data_path): - os.makedirs(user_data_path,exist_ok=True) - co.set_user_data_path(user_data_path) - # co.set_user_data_path(r"D:\私单交付\maixiang_AI\user_data\chrome_data") - co.set_local_port(port=19897) - co.add_extension(sellersprite_plug_path) - # co.set_argument('--disable-features=DisableLoadExtensionCommandLineSwitch') - # co.set_argument('--load-extension',sellersprite_plug_path) - broswer_path = os.path.join(base_dir,"app_resource","chrome-win","chromium.exe") - co.set_browser_path(broswer_path) - # co.set_browser_path(r'D:\私单交付\maixiang_AI\app_resource\chrome-win\chromium.exe') - - # 使用系统默认的用户数据目录 - # co.set_user_data_path(r'C:\Users\{}\AppData\Local\Google\Chrome\User Data'.format(os.getenv('USERNAME'))) - self.browser = Chromium(co) - self.tab = self.browser.latest_tab - print("Chrome浏览器启动成功") - - def close_init_popup(self): - """ - 关闭所有的初始化弹窗 - """ - self.tab.wait.doc_loaded(timeout=60,raise_err=True) - footbar = self.tab.eles('xpath://footer[@class="el-dialog__footer"]',timeout=5) - if len(footbar) > 0: - do_not_remind = footbar[0].eles('xpath:.//input[@class="el-checkbox__original"]') - if len(do_not_remind) > 0: - do_not_remind[0].check() - resume_immediately = footbar[0].eles('xpath:.//button') - if len(resume_immediately) > 0: - resume_immediately[0].click() - - self.tab.wait.doc_loaded(timeout=60,raise_err=True) - accept_btn = self.tab.eles('xpath://input[@id="sp-cc-accept"]',timeout=10) - if len(accept_btn) > 0: - accept_btn[0].click() - - - def run(self, country, asin): - """ - 运行亚马逊详情采集任务 - - Args: - country: 国家名称(如:英国、德国、法国、西班牙、意大利) - asin: 亚马逊商品ASIN码 - - Returns: - dict: 包含采集到的数据 - """ - try: - # 验证国家是否支持 - if country not in self.country_info: - error_msg = f"不支持的国家: {country},支持的国家有: {list(self.country_info.keys())}" - print(error_msg) - show_notification(error_msg, "error") - return None - - # 获取国家配置 - country_config = self.country_info[country] - zip_code = country_config["zip_code"] - mark = country_config.get("mark") - - # 1. 根据国家和ASIN拼接链接 - base_url = country_config["url"] - # 提取域名部分 - domain = base_url.split("/dp/")[0] - # 拼接新的URL - product_url = f"{domain}/dp/{asin}" - print(f"正在访问: {product_url}") - - # 打开链接 - self.tab.get(product_url) - time.sleep(3) # 等待页面初步加载 - self.tab.wait.doc_loaded(timeout=30, raise_err=False) - - self.close_init_popup() - # 2. 切换国家/设置邮编 - print(f"正在检查并设置邮编: {zip_code},标识: {mark}") - self._set_zip_code(zip_code,mark) - - self.tab.wait.doc_loaded(timeout=5,raise_err=False) - - - # 3. 抓取数据 - print("正在抓取商品数据...") - data = self._scrape_data() - - # 添加基本信息 - data['country'] = country - data['asin'] = asin - data['url'] = product_url - data['timestamp'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') - - print(f"数据抓取完成: {json.dumps(data)}") - return data - - except Exception as e: - error_msg = f"运行出错: {traceback.format_exc()}" - print(error_msg) - show_notification(f"采集失败: {str(e)}", "error") - return None - - def _set_zip_code(self, zip_code,mark=None): - """ - 设置邮编 - - Args: - zip_code: 目标邮编 - """ - try: - # 检查当前邮编 - zip_display = self.tab.ele('xpath://div[@id="glow-ingress-block"]', timeout=10) - - if zip_display: - current_text = zip_display.text - # print(f"当前地址信息: {current_text}") - # 先检查标识 - if mark is not None and mark in current_text: - print(f"邮编检测到标识: {mark},无需修改") - return True - # 检查是否已经包含目标邮编 - if zip_code in current_text: - print(f"邮编已经设置为: {zip_code},无需修改") - return True - - # 需要设置邮编 - print(f"正在设置邮编为: {zip_code}") - - # 点击地址选择按钮 - location_link = self.tab.ele('xpath://a[@id="nav-global-location-popover-link"]', timeout=10) - if not location_link: - print("找不到地址设置按钮") - return False - - location_link.click() - time.sleep(1) - - # 等待邮编输入框出现 - zip_input = self.tab.ele('xpath://input[@id="GLUXZipUpdateInput"]', timeout=10) - if not zip_input: - print("找不到邮编输入框") - return False - - # 输入邮编 - zip_input.input(zip_code, clear=True) - time.sleep(0.5) - - # 点击提交按钮 - submit_btn = self.tab.ele('xpath://input[@aria-labelledby="GLUXZipUpdate-announce"]', timeout=10) - if not submit_btn: - print("找不到提交按钮") - return False - - submit_btn.click() - - continue_btn = self.tab.eles('xpath://div[@class="a-popover-footer"]//input[@id="GLUXConfirmClose"]',timeout=10) - if len(continue_btn) > 0: - continue_btn[0].click() - - # 等待提交按钮消失(表示请求已发送) - print("等待邮编更新...") - time.sleep(2) - - # 等待页面加载完成 - self.tab.wait.doc_loaded(timeout=30, raise_err=False) - time.sleep(2) - - # 验证邮编是否设置成功 - zip_display_after = self.tab.ele('xpath://div[@id="glow-ingress-block"]', timeout=10) - if zip_display_after: - updated_text = zip_display_after.text - # print(f"更新后的地址信息: {updated_text}") - - if zip_code in updated_text: - print(f"邮编设置成功: {zip_code}") - return True - else: - # print(f"邮编设置可能失败,当前显示: {updated_text}") - return False - - return True - - except Exception as e: - print(f"设置邮编时出错: {traceback.format_exc()}") - return False - - def _scrape_data(self): - """ - 抓取商品数据 - - Returns: - dict: 抓取到的数据 - """ - data = { - 'top_sellers': [], # 前两名卖家信息 - 'cart_seller': None # 购物车所属卖家 - } - - try: - # 等待页面加载 - time.sleep(3) - - # 1. 获取前两名卖家的价格和库存(来自 sellersprite 插件) - print("正在抓取卖家排名数据...") - surplus_tables = self.tab.eles( - 'xpath://div[@id="sellersprite-extension-Inventory-surplus-count"]//div[@class="surplus-table"]', - timeout=10 - ) - - if surplus_tables: - print(f"找到 {len(surplus_tables)} 个卖家数据") - # 只获取前两个 - for idx, table in enumerate(surplus_tables[:2]): - try: - # 提取价格和库存信息 - # 注意:需要根据实际的HTML结构调整选择器 - # print(f"第{idx+1}名卖家数据: {text_content}") - - seller_info = { - 'rank': idx + 1, - } - - # 尝试提取更结构化的数据 - # 这里需要根据实际HTML结构来解析 - # 可能需要查找子元素 - try: - # 示例:查找价格和库存的具体子节点 - price_ele = table.ele('xpath:.//span[contains(@class,"price")]', timeout=2) - stock_ele = table.ele('xpath:.//span[@class="surplus-count-num"]', timeout=2) - shop_name_ele = table.ele('xpath:.//div[@class="surplus-table-item"][2]//a', timeout=2) - - seller_info['price'] = remove_special_characters(price_ele.text.strip()) - seller_info['stock'] = remove_special_characters(stock_ele.text.strip()) - seller_info['shop_name'] = shop_name_ele.text.strip() - - except Exception as e: - print("解析出错",e) - pass - - data['top_sellers'].append(seller_info) - - except Exception as e: - print(f"解析第{idx+1}名卖家数据失败: {str(e)}") - else: - print("未找到 sellersprite 插件数据,可能插件未启用") - - # 2. 获取购物车所属卖家 - print("正在抓取购物车卖家信息...") - cart_seller = self.tab.ele( - 'xpath://div[@data-csa-c-content-id="desktop-merchant-info"]//a[@id="sellerProfileTriggerId"]', - timeout=10 - ) - - if cart_seller: - seller_name = cart_seller.text.strip() - print(f"购物车所属卖家: {seller_name}") - data['cart_seller'] = seller_name - else: - print("未找到购物车卖家信息") - # 尝试其他可能的选择器 - try: - alt_seller = self.tab.ele('xpath://a[@id="sellerProfileTriggerId"]', timeout=5) - if alt_seller: - data['cart_seller'] = alt_seller.text.strip() - print(f"购物车所属卖家(备用方式): {data['cart_seller']}") - except: - pass - - return data - - except Exception as e: - print(f"抓取数据时出错: {traceback.format_exc()}") - return data - - def close(self): - """关闭浏览器""" - try: - if self.browser: - self.browser.quit() - print("浏览器已关闭") - except Exception as e: - print(f"关闭浏览器时出错: {str(e)}") - - -class AmzonePriceMatch(AmamzonBase): - mark_name = "跟价" - - def SwitchPage(self): - """ - 切换至 管理所有库存页面 - 1、等待 //navigation-favorites-bar[@class="hydrated"] 出现 - """ - navigation = self.tab.ele('xpath://navigation-favorites-bar[@class="hydrated"]') - navigation.wait.displayed(raise_err=False) - page_btn = navigation.sr('xpath://internal-fav-bar-links[@data-internal="navigation"]').sr( - 'xpath://a[@data-page-id="ezdpc-gui-inventory-mons"]') - page_btn.wait.displayed(raise_err=False) - page_btn.click(timeout=5) - - self.tab.wait.doc_loaded() - # 等待搜索框出现 - search_region = self.tab.ele('xpath://div[@id="searchBoxContainer"]//kat-input-group') - search_region.wait.displayed(raise_err=False) - - def search(self,filter_type="ApprovalRequired"): - sku_ls = [] - - load_ele = self.tab.eles("xpath://div[contains(@class,'Loader-module__loader')]",timeout=5) - if len(load_ele) > 0: - load_ele[0].wait.deleted(timeout=3, raise_err=False) - time.sleep(0.5) - - drop_down = self.tab.ele('xpath://div[contains(@class,"VolusListingStatusDropDown-module__verticalContainer")]//kat-dropdown') - drop_down.wait.displayed(raise_err=False) - drop_down.wait.enabled(raise_err=False) - time.sleep(0.6) - drop_down.click() - # //kat-option[@value="SearchSuppressed"] - xp = f'xpath://kat-option[@value="{filter_type}"]' - print(f"【{self.mark_name}】正在寻找筛选条件 {filter_type},xpath: {xp}") - approval_required = self.tab.eles(xp,timeout=5) - if len(approval_required) == 0: - print(f"【{self.mark_name}】没有需要{filter_type}选项】没有需要{filter_type}的商品了") - return sku_ls # "没有需要审批的商品了" - else: - approval_required = approval_required[0] - approval_required.wait.displayed(raise_err=False) - approval_required.click() - - approval_required_text = approval_required.text - print(f"【{self.mark_name}】已选择筛选条件: {approval_required_text}") - - count = re.findall(r'\d+', approval_required_text) - if count: - count = int(count[0]) - print(f"【{self.mark_name}】待审批的商品数量: {count}") - if count <= 0: - print(f"【{self.mark_name}】没有需要{filter_type}的商品了") - return sku_ls #"没有需要审批的商品了" - for _ in range(3): - # 等待加载完成 - load_ele = self.tab.eles("xpath://div[contains(@class,'Loader-module__loader')]") - if len(load_ele) > 0: - load_ele[0].wait.deleted(timeout=3, raise_err=False) - time.sleep(0.5) - - sku_ls = self.tab.eles("xpath://div[@data-sku]",timeout=3) - if len(sku_ls) > 0: - break - approval_required.click() - return sku_ls - - def search_asin(self, asin): - search_region = self.tab.ele('xpath://div[@id="searchBoxContainer"]//kat-input-group') - search_region.wait.displayed(raise_err=False) - time.sleep(0.6) - search_input = self.tab.ele("xpath://kat-input[contains(@class,'SearchBox-module__searchInput')]").sr( - 'xpath://span[@class="container"]//input[@part="input"]') - search_input.input(asin,clear=True) - sku_ls = [] - for _ in range(3): - search_btn = self.tab.ele("xpath://kat-icon[@name='search']") - search_btn.click() - - load_ele = self.tab.ele("xpath://div[contains(@class,'Loader-module__loader')]") - # load_ele.wait.hidden(timeout=3, raise_err=False) - load_ele.wait.deleted(timeout=3, raise_err=False) - time.sleep(0.5) - - sku_ls = self.tab.eles("xpath://div[@data-sku]",timeout=3) - if len(sku_ls) > 0: - break - return sku_ls - - def search_asin_action(self,asin:str): - load_ele = self.tab.eles("xpath://div[contains(@class,'Loader-module__loader')]", timeout=5) - if len(load_ele) > 0: - load_ele[0].wait.deleted(timeout=3, raise_err=False) - time.sleep(0.5) - - sku_ls = self.search_asin(asin=asin) - print(f"【{self.mark_name}】{asin} 搜索到 {len(sku_ls)} 个SKU") - - def run_page_action(self,chrome:ChromeAmzone,current_shop_name:str,appoint_asin:str=None,skip_asin:list=[]): - print(f"【{self.mark_name}】,开始执行") - num = 0 - retry_num = 0 - already_asin = set() - get_page_faild = 0 - #获取当前国家 - current_country_ele = self.tab.ele('xpath://div[@class="dropdown-account-switcher-header-label"]/span[last()]', - timeout=20) - current_country = current_country_ele.text.strip() - - while retry_num < 3: # 最多重试3次 - try: - if appoint_asin is not None: - print(self.mark_name,"指定asin操作",appoint_asin) - self.search_asin_action(asin=appoint_asin) - - load_ele = self.tab.eles("xpath://div[contains(@class,'Loader-module__loader')]", timeout=5) - if len(load_ele) > 0: - load_ele[0].wait.deleted(timeout=3, raise_err=False) - time.sleep(0.5) - - # 获取当前页码 - try: - page_pamel = self.tab.eles('xpath://kat-pagination', timeout=5) - if len(page_pamel) > 0: - current_page = page_pamel[0].sr('xpath:.//ul[@class="pages"]//li[@aria-current="true"]').text - - # 总页数 - total_page = page_pamel[0].sr.eles( - 'xpath:.//ul[@class="pages"]//span[@class="page__inner"][last()]') - if len(total_page) > 0: - total_page = total_page[-1].text - else: - total_page = 0 - print(f"【{self.mark_name}】当前页码: {current_page} / 总页数: {total_page}") - get_page_faild = 0 - except Exception as e: - print("【{self.mark_name}】","获取页码失败", e) - get_page_faild += 1 - if get_page_faild > 2: - show_notification(f"【{self.mark_name}】获取页码失败超3次停止任务!") - break - - sku_ls = self.tab.eles("xpath://div[@data-sku]", timeout=10) - print(f"【{self.mark_name}】获取到 {len(sku_ls)}") - # for sku_ele in sku_ls[0:2]: - for sku_ele in sku_ls: - - asin = sku_ele.ele( - 'xpath:.//div[contains(@class,"JanusSplitBox-module__container")]//div[contains(@class,"JanusSplitBox-module__panel--") and contains(string(.),"ASIN")]/..//div[last()]', - timeout=3).text - print(f"【{self.mark_name}】ASIN {asin} 找到....") - if asin in already_asin: - print(f"【{self.mark_name}】{asin} 已经处理过了,跳过") - continue - if asin in skip_asin: - yield (asin, { - "statu": "跳过,需要跳过的ASIN" - }) - continue - bottom_price_ele = sku_ele.eles('xpath:.//div[@data-test-id="LowestPrice"]/div[2]',timeout=5) - bottom_price = "" #初始化为空 - if len(bottom_price_ele) > 0: - try: - bottom_price_text = bottom_price_ele[0].text - # print("最低价格->>",bottom_price_text) - bottom_price = f"{sum(split_currency_values(bottom_price_text))}" - except Exception as e: - print("最低价提取失败",e) - current_price_ele = sku_ele.eles('xpath:.//b[text()="价格"]/../..//kat-input',timeout=5) - if len(current_price_ele) > 0: - current_price = current_price_ele[0].attr("value") - else: - print(f"{self.mark_name} 没有获取到当前价格") - yield (asin, { - "statu": "失败(没有获取到当前的价格)" - }) - continue - front_end_data = chrome.run(country=current_country,asin=asin) - print(self.mark_name,"亚马逊前台抓取到数据",front_end_data) - # - cart_seller = front_end_data.get("cart_seller") - if cart_seller == current_shop_name and len(front_end_data.get("top_sellers"))< 2: - yield (asin, { - "statu": "跳过(自己的购物车,只有第一名)", - "currentPrice": current_price, - }) - continue - - recommend_price_ele= sku_ele.eles('xpath:.//div[@data-test-id="FeaturedOfferPrice"]/div[2]',timeout=5) - if len(recommend_price_ele) > 0: - try: - price_text = recommend_price_ele[0].text - # print("推荐价格 ->>",price_text) - recommend_price,shipping_fee = split_currency_values(price_text) - except Exception as e: - print("推荐价格和运费提取失败 ->>",e) - recommend_price, shipping_fee = 0, 0 - else: - print(f"{self.mark_name} 没有查找有推荐价格和运费") - recommend_price,shipping_fee = 0,0 - - adjust_prices = calculate_target_price( - front_end_data, float(current_price), current_shop_name, - recommend_price, shipping_fee - ) - print(asin,"-->>",f"【逻辑计算后的价格】",adjust_prices) - if adjust_prices is not None: - #修改价格 - current_price_ele[0].input(f"{adjust_prices}",clear=True) - out_focus = sku_ele.ele('xpath:.//b[text()="价格"]/../..//kat-label',timeout=5) - out_focus.click() - - save_all_btn = self.tab.ele('xpath://kat-button[@label="保存所有"]', timeout=10) - save_all_btn.wait.displayed(timeout=10, raise_err=False) - save_all_btn.click() - save_all_btn.wait.deleted(timeout=10, raise_err=False) - recommendedPrice = recommend_price + shipping_fee - price_1 = float(front_end_data.get("top_sellers")[0].get("price")) # 实际第一名价格 - price_2 = float(front_end_data.get("top_sellers")[1].get("price")) if len(front_end_data.get("top_sellers")) >= 2 else "" # 实际第二名价格 - cartShopName = front_end_data.get("cart_seller") - yield (asin,{ - "statu" : "改价成功", - "currentPrice" : current_price, - "recommendedPrice" : f"{recommendedPrice}", - "minimumPrice" : bottom_price, #最低价格 - "firstPlace": price_1, - "secondPlace": price_2, - "cartShopName" : cartShopName, - "priceChangeStatus" : "改价成功", - }) - except Exception as e: - print(f"【{self.mark_name}】处理跟价操作异常", e) - traceback.print_exc() - retry_num += 1 - self.tab.refresh() - self.tab.wait.doc_loaded(raise_err=False, timeout=120) - -class PriceTask: - country_info = { - "DE": "德国", - "FR": "法国", - "ES": "西班牙", - "IT": "意大利", - "UK": "英国" - } - - def __init__(self, user_info: dict = None): - """初始化审批任务处理器 - - Args: - user_info: 用户信息字典,包含 company, username, password - """ - self.user_info = user_info or {} - self.running = True - - def log(self, message: str, level: str = "INFO"): - timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - if level == "ERROR": - show_notification(message, "error") - print(f"[{timestamp}] [PriceTask] [{level}] {message}") - - def process_task(self, task_data: dict): - """处理审批任务主入口 - - Args: - task_data: 任务数据 - """ - try: - data = task_data.get("data", {}) - task_id = data.get("task_id") - # items = data.get("items", []) - shop_name = data.get("shop_name") - country_codes = data.get("country_codes", []) - risk_listing_filter = data.get("risk_listing_filter", "Active") - user_id = data.get("user_id") - stage_index = data.get("stage_index") - final_stage = bool(data.get("final_stage", True)) - - # 用于测试 - limit = data.get("limit", None) - - if not task_id: - self.log("任务ID为空,跳过", "WARNING") - return - - # if not items: - # self.log("店铺列表为空,跳过", "WARNING") - # return - - if not country_codes: - self.log("国家列表为空,跳过", "WARNING") - return - - self.log(f"开始处理审批任务 {task_id},共 1 个店铺,{len(country_codes)} 个国家") - - from config import runing_task - runing_task[task_id] = { - "status": "running", - "start_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), - "total_shops": 1, - "processed_shops": 0, - "total_countries": len(country_codes) , - "processed_countries": 0, - "total_asins": 0, - "processed_asins": 0, - "success_count": 0, - "failed_count": 0, - "stop_requested": False - } - - # 检查是否收到暂停请求 - if task_id in runing_task and runing_task[task_id].get("stop_requested", False): - self.log(f"检测到任务 {task_id} 的暂停请求,停止处理", "WARNING") - runing_task[task_id]["status"] = "stopped" - return - - self.log(f"开始处理店铺: {shop_name}") - show_notification(f"开始处理店铺: {shop_name}", "info") - - try: - self.process_shop(data, country_codes, task_id, risk_listing_filter, user_id, stage_index, - final_stage, limit=limit) - - # self.process_shop(shop_item, country_codes, task_id,risk_listing_filter) - # 更新已处理店铺数 - if task_id in runing_task: - runing_task[task_id]["processed_shops"] += 1 - except Exception as e: - import traceback - self.log(f"处理店铺 {shop_name} 失败: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - - # 更新任务状态 - if task_id in runing_task: - if runing_task[task_id].get("stop_requested", False): - runing_task[task_id]["status"] = "stopped" - self.log(f"任务 {task_id} 已被暂停!") - else: - runing_task[task_id]["status"] = "completed" - self.log(f"任务 {task_id} 处理完成!") - - except Exception as e: - import traceback - self.log(f"任务处理失败: {traceback.format_exc()}", "ERROR") - if task_id: - from config import runing_task - if task_id in runing_task: - runing_task[task_id]["status"] = "failed" - runing_task[task_id]["error"] = str(e) - - # def process_shop(self, shop_item: dict, country_codes: list, task_id: int, risk_listing_filter: str): - def process_shop(self, shop_item: dict, country_codes: list, task_id: int, risk_listing_filter: str, - user_id=None, stage_index=None, final_stage: bool = True, limit: str = None): - """处理单个店铺 - - Args: - shop_item: 店铺信息 - country_codes: 国家代码列表 - task_id: 任务ID - risk_listing_filter: 风险商品筛选条件 - """ - shop_name = shop_item.get("shopName", "未知店铺") - company_name = shop_item.get("companyName", "") - shopMallName = shop_item.get("shopMallName","") - skip_asins_by_country = shop_item.get("skip_asins_by_country",{}) - asin_rows_by_country = shop_item.get("asin_rows_by_country",{}) - - if not company_name: - self.log(f"店铺 {shop_name} 的公司名称为空,跳过", "WARNING") - return - - if task_id in runing_task: - runing_task[task_id]["current_shop"] = shop_name - - # 将店铺添加到正在执行中的店铺列表 - start_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - runing_shop[shop_name] = start_time - self.log(f"店铺 {shop_name} 已添加到执行列表,账号: {company_name},开始时间: {start_time}") - - # 店铺打开重试最多3次 - driver = None - max_retries = 3 - - error_info = "" - for retry in range(max_retries): - try: - self.log(f"尝试打开店铺 {shop_name} (第 {retry + 1}/{max_retries} 次)") - - # 如果不是第一次尝试,先杀进程 - # if retry > 0: - # self.log("重试前先杀掉浏览器进程...") - # kill_process("v6") - # kill_process("v5") - # time.sleep(2) - - # 组装用户信息并创建驱动 - user_info = { - **self.user_info, - "company": company_name - } - driver = AmzonePriceMatch(user_info) - browser = driver.open_shop(shop_name) - - if browser and browser != "店铺不存在": - self.log(f"成功打开店铺 {shop_name}") - else: - self.log(f"打开店铺失败: {browser}", "WARNING") - driver = None - continue - - # 判断是否需要登录 - need_login = driver.need_login() - print("【是否需要登录】:", need_login) - if need_login: - self.log(f"店铺 {shop_name} 需要登录,正在登录...") - # 获取店铺凭证 - response = get_shop_info(shop_name) - print("【获取店铺凭证返回】:", response.text) - shop_data = response.json() - if not shop_data: - mes = f"获取店铺凭证失败,响应数据: {shop_data.get('message', '未知错误')}" - self.log(mes, "ERROR") - show_notification(mes, "ERROR") - continue - - password = shop_data["data"]["password"] - - login_success = driver.login(password) - if login_success: - self.log(f"店铺 {shop_name} 登录成功,正在重新打开店铺...") - browser = driver.open_shop(shop_name) - if browser and browser != "店铺不存在": - self.log(f"成功打开店铺 {shop_name} 登录后") - break - else: - self.log(f"登录后打开店铺失败: {browser}", "WARNING") - driver = None - else: - self.log(f"店铺 {shop_name} 登录失败", "WARNING") - driver = None - else: - break - - except Exception as e: - import traceback - self.log(f"打开店铺异常: {traceback.format_exc()}", "INFO") - driver = None - error_info = str(e) - time.sleep(10) - - # 如果还有重试机会,等待后继续 - if retry < max_retries - 1: - time.sleep(3) - - # 检查是否成功打开 - if not driver or not browser or browser == "店铺不存在": - error_msg = f"店铺 {shop_name} 打开失败,已重试 {max_retries} 次,跳过该店铺,{error_info}" - self.log(error_msg, "ERROR") - # 从执行列表中移除 - if shop_name in runing_shop: - del runing_shop[shop_name] - return - - try: - # 处理每个国家 - for country_code in country_codes: - # 检查是否收到暂停请求 - if task_id in runing_task and runing_task[task_id].get("stop_requested", False): - self.log(f"检测到任务 {task_id} 的暂停请求,停止处理国家", "WARNING") - break - skip_asin = skip_asins_by_country.get(country_code,[]) #需要跳过的asin - appoint_asin = asin_rows_by_country.get(country_code,[]) - try: - self.process_country(driver, country_code, task_id, shop_name, risk_listing_filter, - shopMallName=shopMallName,skip_asin=skip_asin, limit=limit,appoint_asin=appoint_asin) - except Exception as e: - import traceback - self.log(f"处理国家 {country_code} 失败: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - # 最后回传,标记完成 - try: - # self.post_result(task_id, shop_name, country_code, "", "", is_done=True) - if final_stage: - self.post_result(task_id, shop_name, country_code, "", {},shopMallName,is_done=True) - else: - self.post_stage_finished(task_id, user_id, stage_index) - except Exception as e: - self.log(f"回传结果失败: {str(e)}", "ERROR") - finally: - # 关闭店铺 - try: - if driver: - self.log(f"关闭店铺 {shop_name}") - driver.close_store() - time.sleep(2) - except Exception as e: - self.log(f"关闭店铺失败: {str(e)}", "WARNING") - - # 从正在执行中的店铺列表中移除 - if shop_name in runing_shop: - del runing_shop[shop_name] - self.log(f"店铺 {shop_name} 已从执行列表中移除") - - def process_country(self, driver: AmzonePriceMatch, country_code: str, task_id: int, shop_name: str, - risk_listing_filter: str,shopMallName:str,skip_asin:list,appoint_asin:list,limit: str = None): - """处理单个国家的审批任务 - - Args: - driver: AmzoneApprove驱动实例 - country_code: 国家代码(如 UK, DE, FR 等) - task_id: 任务ID - shop_name: 店铺名称 - risk_listing_filter: 风险商品筛选条件 - """ - - # 转换国家代码为中文名称 - country_name = self.country_info.get(country_code, country_code) - info_mes = f"开始处理国家: {country_name} ({country_code}),需要跳过的asin {skip_asin}" - self.log(info_mes) - show_notification(info_mes, "info") - - # 更新当前处理的国家 - if task_id in runing_task: - runing_task[task_id]["current_country"] = country_name - - # 切换国家,最多重试3次 - max_retries = 3 - switch_success = False - - for retry in range(max_retries): - try: - self.log(f"尝试切换到国家 {country_name} (第 {retry + 1}/{max_retries} 次)") - - # 如果不是第一次尝试,先刷新页面 - if retry > 0: - self.log("重试前刷新页面...") - try: - driver.tab.refresh() - time.sleep(3) - except Exception as e: - self.log(f"刷新页面失败: {str(e)}", "WARNING") - - switch_success = driver.SwitchingCountries(country_name) - if switch_success: - self.log(f"成功切换到国家 {country_name}") - break - else: - self.log(f"切换到国家 {country_name} 失败", "WARNING") - - except Exception as e: - import traceback - self.log(f"切换国家 {country_name} 异常: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - - # 如果还有重试机会,等待后继续 - if retry < max_retries - 1: - time.sleep(2) - - # 如果切换失败,直接返回 - if not switch_success: - error_message = f"切换到国家 {country_name} 失败,已重试 {max_retries} 次,跳过该国家" - self.log(error_message, "ERROR") - if task_id in runing_task: - runing_task[task_id]["processed_countries"] += 1 - return - - # 切换到库存管理页面 - for retry in range(max_retries): - try: - driver.SwitchPage() - self.log(f"已切换到库存管理页面") - except Exception as e: - import traceback - self.log(f"切换页面失败: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - - if retry >= max_retries-1: - if task_id in runing_task: - runing_task[task_id]["processed_countries"] += 1 - self.log(f"切换页面失败重试退出", "ERROR") - return - - # 搜索需要审批的商品,最多重试3次 - sku_ls = [] - for retry in range(max_retries): - try: - self.log(f"尝试搜索匹配操作商品 (第 {retry + 1}/{max_retries} 次)") - sku_ls = driver.search(filter_type=risk_listing_filter) - break - except Exception as e: - self.log(f"搜索商品异常: {str(e)}", "ERROR") - if retry < max_retries - 1: - try: - driver.tab.refresh() - time.sleep(3) - except Exception as refresh_error: - self.log(f"刷新页面失败: {str(refresh_error)}", "WARNING") - - # 如果没有需要审批的商品,直接返回 - if len(sku_ls) == 0: - self.log(f"国家 {country_name} 没有搜索出的商品") - if task_id in runing_task: - runing_task[task_id]["processed_countries"] += 1 - return - - self.log(f"国家 {country_name} 搜索出 {len(sku_ls)} 商品,开始处理...") - chrome = None - for _ in range(3): - try: - chrome = ChromeAmzone() - break - except Exception as e: - print("启动谷歌浏览器失败",e) - if chrome is None: - self.log(f"启动谷歌浏览器失败,跳过执行国家:{country_name}","ERROR") - return - - # 处理所有需要审批的商品(通过yield获取结果) - try: - # 指定 asin - max_range = max(1,len(appoint_asin)) - for i in range(max_range): - if len(appoint_asin) > i: - _shopMallName = appoint_asin[i]["shopMallName"] - ap_asin = appoint_asin[i]["shopMallName"] - else: - _shopMallName = shopMallName - ap_asin = None - - for asin, status in driver.run_page_action( - chrome = chrome, current_shop_name=_shopMallName, - appoint_asin=ap_asin,skip_asin=skip_asin - ): - # 检查是否收到暂停请求 - if task_id in runing_task and runing_task[task_id].get("stop_requested", False): - self.log(f"检测到任务 {task_id} 的暂停请求,停止处理ASIN", "WARNING") - break - - self.log(f"ASIN {asin} 处理结果: {status}") - - # 更新任务状态 - if task_id in runing_task: - runing_task[task_id]["current_asin"] = asin - runing_task[task_id]["processed_asins"] += 1 - - runing_task[task_id]["failed_count"] += 1 - - # 回传结果到API - try: - self.post_result(task_id, shop_name, country_code, asin, status,shopMallName) - except Exception as e: - self.log(f"回传结果失败: {str(e)}", "ERROR") - - except Exception as e: - import traceback - self.log(f"处理审批商品异常: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - - # 更新已处理国家数 - if task_id in runing_task: - runing_task[task_id]["processed_countries"] += 1 - - try: - chrome.close() - except Exception as e: - print("退出谷歌浏览器失败",e) - os.system('taskkill /f /t /im chromium.exe') - - self.log(f"国家 {country_name} 处理完成") - - def post_stage_finished(self, task_id: int, user_id, stage_index): - import requests - from config import DELETE_BRAND_API_BASE - - if user_id in (None, "", 0): - raise ValueError("user_id is required for stage completion callback") - if stage_index is None: - raise ValueError("stage_index is required for stage completion callback") - - url = f"{DELETE_BRAND_API_BASE}/api/shop-match/tasks/{task_id}/stage-finished" - payload = {"stage_index": stage_index} - params = {"user_id": user_id} - - max_retries = 3 - for retry in range(max_retries): - try: - self.log(f"Attempting stage completion callback ({retry + 1}/{max_retries})") - response = requests.post( - url, - params=params, - json=payload, - headers={"Content-Type": "application/json"}, - timeout=30, - verify=False, - ) - self.log(f"Stage completion callback response: {response.text}") - data = response.json() if response.text else {} - if response.status_code == 200 and isinstance(data, dict) and data.get("success"): - self.log(f"Stage completion callback succeeded: task={task_id}, stage={stage_index}") - return - self.log(f"Stage completion callback failed, status={response.status_code}", "WARNING") - except Exception as e: - self.log(f"Stage completion callback exception: {str(e)}", "ERROR") - if retry < max_retries - 1: - time.sleep(2) - - raise RuntimeError(f"Stage completion callback failed after retries: task={task_id}, stage={stage_index}") - - def post_result(self, task_id: int, shop_name: str, country_code: str, asin: str, status: dict,shopMallName:str, - is_done: bool = False): - """回传处理结果到API - - Args: - task_id: 任务ID - shop_name: 店铺名称 - country_code: 国家代码 - asin: ASIN - status: 处理状态 - """ - - url = f"{DELETE_BRAND_API_BASE}/api/price-track/tasks/{task_id}/result" - """ - (asin,{ - "statu" : "改价成功", - "currentPrice" : current_price, - "recommendedPrice" : f"{recommendedPrice}", - "minimumPrice" : bottom_price, #最低价格 - "firstPlace": price_1, - "secondPlace": price_2, - "cartShopName" : current_shop_name, - "priceChangeStatus" : "改价成功", - }) - """ - - payload = { - "shops": [ - { - "shopName": shop_name, - "countries": { - "additionalProperties1": [ - { - "shopMallName": shopMallName, - "asin": asin, - "price": status.get("currentPrice") if status.get("currentPrice") else "", - "recommendedPrice": status.get("recommendedPrice") if status.get("recommendedPrice") else "", - "minimumPrice": status.get("minimumPrice") if status.get("minimumPrice") else "", - "firstPlace": status.get("firstPlace") if status.get("firstPlace") else "", - "secondPlace": status.get("secondPlace") if status.get("secondPlace") else "", - "cartShopName": status.get("cartShopName") if status.get("cartShopName") else "", - "priceChangeStatus": "UPDATED", - # "modifyCount": "2", - "status": status.get("statu") - } - ] - }, - "error": "" - } - ] - } - if is_done: - payload["shops"][0]["success"] = is_done - - max_retries = 3 - for retry in range(max_retries): - try: - print("================【跟价】=====================") - self.log(f"尝试回传结果 (第 {retry + 1}/{max_retries} 次)") - self.log(f"回传URL: {url}") - self.log(f"回传数据: {payload}") - response = requests.post( - url, - json=payload, - headers={"Content-Type": "application/json"}, - timeout=30, - verify=False - ) - self.log(f"回传结果: {response.text}") - data = response.json() if response.text else {} - if response.status_code == 200 and isinstance(data, dict) and data.get("success"): - self.log(f"结果回传成功: {asin} - {status}") - return - else: - self.log(f"结果回传失败,状态码: {response.status_code}", "WARNING") - print("=====================================") - - except Exception as e: - self.log(f"调用API异常: {str(e)}", "ERROR") - print("=====================================") - - # 如果还有重试机会,等待后继续 - if retry < max_retries - 1: - time.sleep(2) - - self.log(f"已达到最大重试次数,结果回传最终失败", "ERROR") - raise RuntimeError("已达到最大重试次数,结果回传最终失败") - - -if __name__ == '__main__': - # 使用示例 - print("=" * 50) - print("亚马逊详情采集示例") - print("=" * 50) - - try: - # 创建ChromeAmzone实例 - chrome = ChromeAmzone() - - # 示例1:采集英国站点的商品信息 - print("\n示例1:采集英国站点商品") - result1 = chrome.run(country="英国", asin="B0CJ8SNXXV") - if result1: - print(f"采集成功: {result1}") - - # 示例2:采集德国站点的商品信息 - # print("\n示例2:采集德国站点商品") - # result2 = chrome.run(country="德国", asin="B0CC8CW9G2") - # if result2: - # print(f"采集成功: {result2}") - - # # 关闭浏览器 - # print("\n正在关闭浏览器...") - # chrome.close() - - except Exception as e: - print(f"运行出错: {traceback.format_exc()}") - - - diff --git a/app/amazon/scripts/patrol_delete/complete_draft_delete_selected.js b/app/amazon/scripts/patrol_delete/complete_draft_delete_selected.js deleted file mode 100644 index 7a8ce61..0000000 --- a/app/amazon/scripts/patrol_delete/complete_draft_delete_selected.js +++ /dev/null @@ -1,128 +0,0 @@ -function textOf(node) { - return ((node && (node.innerText || node.textContent || '')) || '').replace(/\s+/g, ' ').trim(); -} - -function isVisible(el) { - if (!el || !el.getBoundingClientRect) return false; - const rect = el.getBoundingClientRect(); - const style = window.getComputedStyle(el); - return rect.width > 0 && rect.height > 0 && style.display !== 'none' && style.visibility !== 'hidden'; -} - -function clickElement(el) { - el.scrollIntoView({ block: 'center', inline: 'nearest' }); - if (el.focus) el.focus(); - for (const eventName of ['pointerdown', 'mousedown', 'pointerup', 'mouseup']) { - el.dispatchEvent(new MouseEvent(eventName, { bubbles: true, cancelable: true, view: window })); - } - el.click(); -} - -function summarize(el) { - return { - tag: el.tagName, - text: textOf(el).slice(0, 500), - attrs: Array.from(el.attributes || []).reduce((acc, attr) => { - acc[attr.name] = attr.value; - return acc; - }, {}), - outerHTML: (el.outerHTML || '').slice(0, 1000), - }; -} - -const view = document.querySelector('[data-testid="complete-drafts-view"]'); -if (!view) return { ok: false, reason: 'complete drafts view not found' }; - -const selectedRows = Array.from(view.querySelectorAll('.ag-center-cols-container [role="row"]')) - .filter((row) => isVisible(row) && (row.getAttribute('aria-selected') === 'true' || row.classList.contains('ag-row-selected'))); -if (!selectedRows.length) return { ok: false, reason: 'no selected complete draft rows' }; - -const bulkDropdown = view.querySelector('#bulk-dropdown'); -if (!bulkDropdown) { - return { - ok: false, - reason: 'bulk dropdown not found', - selectedCount: selectedRows.length, - }; -} - -const toggle = bulkDropdown.shadowRoot && bulkDropdown.shadowRoot.querySelector('button[part="dropdown-button-toggle-button"], button'); -clickElement(toggle || bulkDropdown); - -function findBulkDeleteAction() { - const all = []; - const seen = new Set(); - function walk(root) { - if (!root || seen.has(root)) return; - seen.add(root); - const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT); - let node = walker.currentNode; - while (node) { - if (node.nodeType === Node.ELEMENT_NODE && node.tagName) all.push(node); - if (node.shadowRoot) walk(node.shadowRoot); - if ((node.tagName || '').toLowerCase() === 'slot' && node.assignedElements) { - for (const assigned of node.assignedElements({ flatten: true })) walk(assigned); - } - node = walker.nextNode(); - } - } - walk(document); - const exactAction = all.find((el) => { - const action = String(el.getAttribute && el.getAttribute('data-action') || ''); - const text = textOf(el); - return isVisible(el) && action === 'DELETE_DRAFTS' && /删除商品信息草稿/.test(text); - }); - if (exactAction) return exactAction; - - return all.find((el) => { - const text = textOf(el); - const attrs = Array.from(el.attributes || []).map((attr) => `${attr.name}=${attr.value}`).join(' '); - const haystack = `${text} ${attrs}`; - if (!isVisible(el) || !/删除商品信息草稿/.test(haystack)) return false; - if (/^(HTML|BODY|KAT-DATA-GRID)$/i.test(el.tagName || '') && text.length > 80) return false; - if (/^DIV$/i.test(el.tagName || '') && text !== '删除商品信息草稿') return false; - if ((el.tagName || '').toLowerCase() === 'kat-icon') return false; - return /^(BUTTON|KAT-BUTTON|KAT-OPTION|KAT-DROPDOWN-OPTION|LI|A|SPAN|DIV)$/i.test(el.tagName || ''); - }); -} - -const deleteAction = findBulkDeleteAction(); - -if (!deleteAction) { - const candidates = []; - const seen = new Set(); - function walkCandidates(root) { - if (!root || seen.has(root)) return; - seen.add(root); - const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT); - let node = walker.currentNode; - while (node) { - if (node.nodeType === Node.ELEMENT_NODE && node.tagName && isVisible(node)) { - const text = textOf(node); - const attrs = Array.from(node.attributes || []).map((attr) => `${attr.name}=${attr.value}`).join(' '); - if (/删除|草稿|选择组操作|menu|option/i.test(`${text} ${attrs}`)) candidates.push(summarize(node)); - } - if (node.shadowRoot) walkCandidates(node.shadowRoot); - node = walker.nextNode(); - } - } - walkCandidates(document); - return { - ok: false, - reason: 'bulk delete draft action not found', - menuOpened: true, - selectedCount: selectedRows.length, - bulkDropdown: summarize(bulkDropdown), - candidates: candidates.slice(0, 50), - }; -} - -clickElement(deleteAction); - -return { - ok: true, - selectedCount: selectedRows.length, - bulkDropdown: summarize(bulkDropdown), - clicked: summarize(deleteAction), - rows: selectedRows.slice(0, 10).map(summarize), -}; diff --git a/app/amazon/scripts/patrol_delete/complete_draft_quick_view_debug.js b/app/amazon/scripts/patrol_delete/complete_draft_quick_view_debug.js deleted file mode 100644 index f3df1e5..0000000 --- a/app/amazon/scripts/patrol_delete/complete_draft_quick_view_debug.js +++ /dev/null @@ -1,55 +0,0 @@ -function textOf(node) { - return (node && (node.innerText || node.textContent || '') || '').replace(/\s+/g, ' ').trim(); -} - -function attrsOf(el) { - const attrs = {}; - if (!el || !el.attributes) return attrs; - for (const attr of el.attributes) attrs[attr.name] = attr.value; - return attrs; -} - -function isVisible(el) { - if (!el || !el.getBoundingClientRect) return false; - const rect = el.getBoundingClientRect(); - const style = window.getComputedStyle(el); - return rect.width > 0 && rect.height > 0 && style.display !== 'none' && style.visibility !== 'hidden'; -} - -function walkRoots(root, rows, seen) { - if (!root || seen.has(root)) return; - seen.add(root); - - const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT); - let node = walker.currentNode; - while (node) { - if (node.nodeType === Node.ELEMENT_NODE && node.tagName) rows.push(node); - if (node.shadowRoot) walkRoots(node.shadowRoot, rows, seen); - node = walker.nextNode(); - } -} - -function allElements() { - const rows = []; - walkRoots(document, rows, new Set()); - return rows; -} - -function rowOf(el, index) { - const attrs = attrsOf(el); - return { - index, - tag: el.tagName.toLowerCase(), - visible: isVisible(el), - text: textOf(el), - attrs, - outerHTML: (el.outerHTML || '').slice(0, 2500), - }; -} - -const candidates = allElements() - .map((el, index) => rowOf(el, index)) - .filter((row) => row.visible && /补全草稿|快速查看|quick view|draft/i.test(`${row.tag} ${row.text} ${Object.values(row.attrs).join(' ')}`)) - .slice(0, 120); - -return candidates; diff --git a/app/amazon/scripts/patrol_delete/complete_draft_quick_view_diagnostic.js b/app/amazon/scripts/patrol_delete/complete_draft_quick_view_diagnostic.js deleted file mode 100644 index 5f61ef9..0000000 --- a/app/amazon/scripts/patrol_delete/complete_draft_quick_view_diagnostic.js +++ /dev/null @@ -1,73 +0,0 @@ -function textOf(node) { - return (node && (node.innerText || node.textContent || '') || '').replace(/\s+/g, ' ').trim(); -} - -function attrsOf(el) { - const attrs = {}; - if (!el || !el.attributes) return attrs; - for (const attr of el.attributes) attrs[attr.name] = attr.value; - return attrs; -} - -function isVisible(el) { - if (!el || !el.getBoundingClientRect) return false; - const rect = el.getBoundingClientRect(); - const style = window.getComputedStyle(el); - return rect.width > 0 && rect.height > 0 && style.display !== 'none' && style.visibility !== 'hidden'; -} - -function walkRoots(root, rows, seen) { - if (!root || seen.has(root)) return; - seen.add(root); - - const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT); - let node = walker.currentNode; - while (node) { - if (node.nodeType === Node.ELEMENT_NODE && node.tagName) rows.push(node); - if (node.shadowRoot) walkRoots(node.shadowRoot, rows, seen); - node = walker.nextNode(); - } -} - -function allElements() { - const rows = []; - walkRoots(document, rows, new Set()); - return rows; -} - -function attrsText(attrs) { - return Object.entries(attrs).map(([key, value]) => `${key}=${value}`).join(' '); -} - -const pattern = /快速查看|quick|draft|草稿|提交|submitted|missing|inventory|myinventory/i; -const elements = allElements() - .map((el, index) => { - const attrs = attrsOf(el); - const text = textOf(el); - return { - index, - tag: el.tagName.toLowerCase(), - visible: isVisible(el), - text: text.slice(0, 500), - attrs, - outerHTML: (el.outerHTML || '').slice(0, 1000), - haystack: `${el.tagName} ${text} ${attrsText(attrs)}`, - }; - }) - .filter((row) => pattern.test(row.haystack)) - .map(({ haystack, ...row }) => row) - .slice(0, 80); - -const resources = performance - .getEntriesByType('resource') - .map((entry) => entry.name) - .filter((url) => pattern.test(url)) - .slice(-120); - -return { - location: window.location.href, - readyState: document.readyState, - capturedResponses: (window.__crawlerCompleteDraftResponses || []).slice(-10), - elements, - resources, -}; diff --git a/app/amazon/scripts/patrol_delete/complete_draft_quick_view_tags.js b/app/amazon/scripts/patrol_delete/complete_draft_quick_view_tags.js deleted file mode 100644 index 496d01b..0000000 --- a/app/amazon/scripts/patrol_delete/complete_draft_quick_view_tags.js +++ /dev/null @@ -1,121 +0,0 @@ -function textOf(node) { - return (node && (node.innerText || node.textContent || '') || '').replace(/\s+/g, ' ').trim(); -} - -function attrsOf(el) { - const attrs = {}; - if (!el || !el.attributes) return attrs; - for (const attr of el.attributes) attrs[attr.name] = attr.value; - return attrs; -} - -function isVisible(el) { - if (!el || !el.getBoundingClientRect) return false; - const rect = el.getBoundingClientRect(); - const style = window.getComputedStyle(el); - return rect.width > 0 && rect.height > 0 && style.display !== 'none' && style.visibility !== 'hidden'; -} - -function walkRoots(root, rows, seen) { - if (!root || seen.has(root)) return; - seen.add(root); - - const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT); - let node = walker.currentNode; - while (node) { - if (node.nodeType === Node.ELEMENT_NODE && node.tagName) rows.push(node); - if (node.shadowRoot) walkRoots(node.shadowRoot, rows, seen); - node = walker.nextNode(); - } -} - -function allElements() { - const rows = []; - walkRoots(document, rows, new Set()); - return rows; -} - -function hasCountText(text) { - return /[((]\s*[\d,]+\s*[))]/.test(text); -} - -function insideListingRow(el) { - return Boolean(el.closest('[data-sku], tr, [role="row"], [data-testid*="row"]')); -} - -function rowOf(el, index) { - const attrs = attrsOf(el); - const text = textOf(el); - const labelText = attrs.label || attrs.title || attrs['aria-label'] || ''; - const valueText = attrs.value || attrs.count || attrs['data-count'] || attrs['data-value'] || ''; - return { - index, - raw_text: text, - label_text: labelText, - quantity_text: valueText, - attrs, - visible: isVisible(el), - outerHTML: (el.outerHTML || '').slice(0, 1200), - }; -} - -function splitCountRow(el, index) { - const countText = textOf(el); - if (!/^\s*[\d,]+\s*$/.test(countText)) return null; - - let parent = el.parentElement; - for (let depth = 0; parent && depth < 4; depth += 1, parent = parent.parentElement) { - const parentText = textOf(parent); - const labelText = parentText - .replace(new RegExp(`(^|\\s)${countText.replace(/,/g, '\\,')}(\\s|$)`), ' ') - .replace(/[((]\s*[\d,]+\s*[))]/g, ' ') - .replace(/\s+/g, ' ') - .trim(); - if (labelText && labelText !== parentText && !/^\s*[\d,]+\s*$/.test(labelText)) { - return { - index, - raw_text: '', - label_text: labelText, - quantity_text: countText, - attrs: attrsOf(parent), - visible: isVisible(parent), - outerHTML: (parent.outerHTML || '').slice(0, 1200), - }; - } - } - - return null; -} - -const regionRows = allElements().filter((el) => isVisible(el) && !insideListingRow(el)); - -const byText = new Map(); -regionRows - .forEach((el, index) => { - const row = rowOf(el, index); - const combined = `${row.raw_text} ${row.label_text} ${row.quantity_text}`; - if (row.raw_text.length > 200) return; - if (/[((]\s*[\d,]+\s*[))]/.test(combined)) { - const key = combined; - if (!byText.has(key)) byText.set(key, row); - return; - } - - const splitRow = splitCountRow(el, index); - if (splitRow) { - const key = `${splitRow.label_text} ${splitRow.quantity_text}`; - if (!byText.has(key)) byText.set(key, splitRow); - } - }); - -return { - region: { - url: window.location.href, - title: document.title, - }, - rows: Array.from(byText.values()).filter((row) => { - const combined = `${row.raw_text} ${row.label_text}`.toLowerCase(); - return !/所有商品|启售商品|改善商品信息/.test(combined); - }), - candidates: Array.from(byText.values()).slice(0, 80), -}; diff --git a/app/amazon/scripts/patrol_delete/complete_draft_select_all.js b/app/amazon/scripts/patrol_delete/complete_draft_select_all.js deleted file mode 100644 index c8c319a..0000000 --- a/app/amazon/scripts/patrol_delete/complete_draft_select_all.js +++ /dev/null @@ -1,100 +0,0 @@ -function textOf(node) { - return ((node && (node.innerText || node.textContent || '')) || '').replace(/\s+/g, ' ').trim(); -} - -function isVisible(el) { - if (!el || !el.getBoundingClientRect) return false; - const rect = el.getBoundingClientRect(); - const style = window.getComputedStyle(el); - return rect.width > 0 && rect.height > 0 && style.display !== 'none' && style.visibility !== 'hidden'; -} - -function clickElement(el) { - el.scrollIntoView({ block: 'center', inline: 'nearest' }); - if (el.focus) el.focus(); - for (const eventName of ['pointerdown', 'mousedown', 'pointerup', 'mouseup']) { - el.dispatchEvent(new MouseEvent(eventName, { bubbles: true, cancelable: true, view: window })); - } - el.click(); -} - -function summarizeRow(row) { - return { - rowId: row.getAttribute('row-id') || '', - text: textOf(row).slice(0, 500), - selected: row.getAttribute('aria-selected') === 'true' || row.classList.contains('ag-row-selected'), - }; -} - -const payload = arguments[0] || {}; -const view = document.querySelector('[data-testid="complete-drafts-view"]'); -if (!view) return { ok: false, reason: 'complete drafts view not found' }; - -const rows = Array.from(view.querySelectorAll('.ag-center-cols-container [role="row"]')) - .filter((row) => isVisible(row)); -const rowCount = rows.length; -const selectedBefore = rows.filter((row) => row.getAttribute('aria-selected') === 'true' || row.classList.contains('ag-row-selected')).length; -const maxSelectCountRaw = Number(payload.maxSelectCount || 0); -const maxSelectCount = Number.isFinite(maxSelectCountRaw) && maxSelectCountRaw > 0 ? Math.floor(maxSelectCountRaw) : 0; - -if (payload.probeOnly) { - return { - ok: true, - probeOnly: true, - rowCount, - selectedCount: selectedBefore, - rows: rows.slice(0, 10).map(summarizeRow), - }; -} - -if (rowCount <= 0) { - return { ok: false, reason: 'no complete draft rows', rowCount, selectedCount: selectedBefore }; -} - -const headerCheckbox = view.querySelector('.ag-header-select-all input[type="checkbox"]'); -if (!headerCheckbox) { - return { ok: false, reason: 'complete draft select-all checkbox not found', rowCount, selectedCount: selectedBefore }; -} - -if (maxSelectCount > 0 && maxSelectCount < rowCount) { - if (headerCheckbox.checked) { - clickElement(headerCheckbox); - } - for (const row of rows) { - if (row.getAttribute('aria-selected') === 'true' || row.classList.contains('ag-row-selected')) { - const checkbox = row.querySelector('input[type="checkbox"]'); - if (checkbox && checkbox.checked) clickElement(checkbox); - } - } - for (const row of rows.slice(0, maxSelectCount)) { - const checkbox = row.querySelector('input[type="checkbox"]'); - if (checkbox && !checkbox.checked) { - clickElement(checkbox); - } else if (!checkbox) { - clickElement(row); - } - } -} else if (!headerCheckbox.checked || selectedBefore < rowCount) { - clickElement(headerCheckbox); -} - -let selectedRows = Array.from(view.querySelectorAll('.ag-center-cols-container [role="row"]')) - .filter((row) => isVisible(row) && (row.getAttribute('aria-selected') === 'true' || row.classList.contains('ag-row-selected'))); - -if (selectedRows.length <= 0) { - const firstRowCheckbox = rows[0] && rows[0].querySelector('input[type="checkbox"]'); - if (firstRowCheckbox && !firstRowCheckbox.checked) { - clickElement(firstRowCheckbox); - } -} - -selectedRows = Array.from(view.querySelectorAll('.ag-center-cols-container [role="row"]')) - .filter((row) => isVisible(row) && (row.getAttribute('aria-selected') === 'true' || row.classList.contains('ag-row-selected'))); - -return { - ok: selectedRows.length > 0, - rowCount, - selectedCount: selectedRows.length, - headerChecked: headerCheckbox.checked, - rows: selectedRows.slice(0, 10).map(summarizeRow), -}; diff --git a/app/amazon/scripts/patrol_delete/complete_draft_select_tag.js b/app/amazon/scripts/patrol_delete/complete_draft_select_tag.js deleted file mode 100644 index 1dc213d..0000000 --- a/app/amazon/scripts/patrol_delete/complete_draft_select_tag.js +++ /dev/null @@ -1,59 +0,0 @@ -function textOf(node) { - return ((node && (node.innerText || node.textContent || '')) || '').replace(/\s+/g, ' ').trim(); -} - -function isVisible(el) { - if (!el || !el.getBoundingClientRect) return false; - const rect = el.getBoundingClientRect(); - const style = window.getComputedStyle(el); - return rect.width > 0 && rect.height > 0 && style.display !== 'none' && style.visibility !== 'hidden'; -} - -function clickElement(el) { - el.scrollIntoView({ block: 'center', inline: 'nearest' }); - if (el.focus) el.focus(); - for (const eventName of ['pointerdown', 'mousedown', 'pointerup', 'mouseup']) { - el.dispatchEvent(new MouseEvent(eventName, { bubbles: true, cancelable: true, view: window })); - } - el.click(); -} - -function summarize(el) { - return { - tag: el.tagName, - text: textOf(el), - className: el.className || '', - outerHTML: (el.outerHTML || '').slice(0, 1000), - }; -} - -const targetTag = String((arguments[0] && arguments[0].tag) || '').replace(/\s+/g, ' ').trim(); -if (!targetTag) return { ok: false, reason: 'target tag empty' }; - -const view = document.querySelector('[data-testid="complete-drafts-view"]'); -if (!view) return { ok: false, reason: 'complete drafts view not found' }; - -const chips = Array.from(view.querySelectorAll('.JanusChip-module__janusChipContainer--gRjdp')); -const chip = chips.find((el) => { - const text = textOf(el); - return text === targetTag || text.startsWith(`${targetTag} (`) || text.startsWith(`${targetTag}(`); -}); - -if (!chip) { - return { - ok: false, - reason: 'complete draft chip not found', - tag: targetTag, - chips: chips.map(summarize), - }; -} - -if (!/active/.test(String(chip.className || ''))) { - clickElement(chip); -} - -return { - ok: true, - tag: targetTag, - clicked: summarize(chip), -}; diff --git a/app/amazon/scripts/patrol_delete/delete_confirm_modal_click.js b/app/amazon/scripts/patrol_delete/delete_confirm_modal_click.js deleted file mode 100644 index 601f3da..0000000 --- a/app/amazon/scripts/patrol_delete/delete_confirm_modal_click.js +++ /dev/null @@ -1,89 +0,0 @@ -function textOf(node) { - return ((node && (node.innerText || node.textContent || '')) || '').replace(/\s+/g, ' ').trim(); -} - -function attrsText(el) { - if (!el || !el.attributes) return ''; - return Array.from(el.attributes).map((attr) => `${attr.name}=${attr.value}`).join(' '); -} - -function isVisible(el) { - if (!el || !el.getBoundingClientRect) return false; - const rect = el.getBoundingClientRect(); - const style = window.getComputedStyle(el); - return rect.width > 0 && rect.height > 0 && style.display !== 'none' && style.visibility !== 'hidden'; -} - -function walkRoots(root, rows, seen) { - if (!root || seen.has(root)) return; - seen.add(root); - - const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT); - let node = walker.currentNode; - while (node) { - if (node.nodeType === Node.ELEMENT_NODE && node.tagName) rows.push(node); - if (node.shadowRoot) walkRoots(node.shadowRoot, rows, seen); - if ((node.tagName || '').toLowerCase() === 'slot' && node.assignedElements) { - for (const assigned of node.assignedElements({ flatten: true })) { - walkRoots(assigned, rows, seen); - } - } - node = walker.nextNode(); - } -} - -function allElements(root) { - const rows = []; - walkRoots(root || document, rows, new Set()); - return rows; -} - -function clickElement(el) { - el.scrollIntoView({ block: 'center', inline: 'nearest' }); - if (el.focus) el.focus(); - for (const eventName of ['pointerdown', 'mousedown', 'pointerup', 'mouseup']) { - el.dispatchEvent(new MouseEvent(eventName, { bubbles: true, cancelable: true, view: window })); - } - el.click(); -} - -function clickTargetFor(el) { - if (el && el.shadowRoot) { - const button = el.shadowRoot.querySelector('button:not([disabled]), [role="button"]:not([disabled])'); - if (button) return button; - } - return el; -} - -const modal = document.querySelector('kat-modal[data-testid="action-modal"]') || - allElements(document).find((el) => /删除|Delete/i.test(textOf(el)) && (el.tagName || '').toLowerCase() === 'kat-modal'); - -if (!modal) return { ok: false, reason: 'delete modal not found' }; - -const buttons = allElements(modal).filter((el) => { - const haystack = `${el.tagName || ''} ${attrsText(el)} ${textOf(el)}`; - return isVisible(el) && /kat-button|button/i.test(el.tagName || '') && /variant=primary|删除|确认|Delete|Confirm/i.test(haystack); -}); -const button = buttons[0]; - -if (!button) { - return { - ok: false, - reason: 'confirm button not found', - modalText: textOf(modal), - modalHTML: (modal.outerHTML || '').slice(0, 2000), - }; -} - -const target = clickTargetFor(button); -clickElement(target); - -return { - ok: true, - clicked: { - tag: button.tagName, - text: textOf(button), - attrs: attrsText(button), - targetTag: target.tagName, - }, -}; diff --git a/app/amazon/scripts/patrol_delete/delete_success_messages.js b/app/amazon/scripts/patrol_delete/delete_success_messages.js deleted file mode 100644 index 5ee52fe..0000000 --- a/app/amazon/scripts/patrol_delete/delete_success_messages.js +++ /dev/null @@ -1,46 +0,0 @@ -function textOf(node) { - return ((node && (node.innerText || node.textContent || '')) || '').replace(/\s+/g, ' ').trim(); -} - -function attrsText(el) { - if (!el || !el.attributes) return ''; - return Array.from(el.attributes).map((attr) => `${attr.name}=${attr.value}`).join(' '); -} - -function isVisible(el) { - if (!el || !el.getBoundingClientRect) return false; - const rect = el.getBoundingClientRect(); - const style = window.getComputedStyle(el); - return rect.width > 0 && rect.height > 0 && style.display !== 'none' && style.visibility !== 'hidden'; -} - -function walkRoots(root, rows, seen) { - if (!root || seen.has(root)) return; - seen.add(root); - - const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT); - let node = walker.currentNode; - while (node) { - if (node.nodeType === Node.ELEMENT_NODE && node.tagName) rows.push(node); - if (node.shadowRoot) walkRoots(node.shadowRoot, rows, seen); - if ((node.tagName || '').toLowerCase() === 'slot' && node.assignedElements) { - for (const assigned of node.assignedElements({ flatten: true })) { - walkRoots(assigned, rows, seen); - } - } - node = walker.nextNode(); - } -} - -const rows = []; -walkRoots(document, rows, new Set()); - -const seen = new Set(); -return rows - .filter((el) => { - const haystack = `${el.tagName || ''} ${attrsText(el)} ${textOf(el)}`; - return isVisible(el) && /kat-alert|alert|toast|notification|已删除|已经删除|15\s*分钟|success/i.test(haystack); - }) - .map((el) => textOf(el) || attrsText(el)) - .filter((text) => text && !seen.has(text) && seen.add(text)) - .slice(0, 30); diff --git a/app/amazon/scripts/patrol_delete/inventory_delete_selected.js b/app/amazon/scripts/patrol_delete/inventory_delete_selected.js deleted file mode 100644 index 6a48275..0000000 --- a/app/amazon/scripts/patrol_delete/inventory_delete_selected.js +++ /dev/null @@ -1,187 +0,0 @@ -function textOf(node) { - return ((node && (node.innerText || node.textContent || '')) || '').replace(/\s+/g, ' ').trim(); -} - -function attrsText(el) { - if (!el || !el.attributes) return ''; - return Array.from(el.attributes).map((attr) => `${attr.name}=${attr.value}`).join(' '); -} - -function isVisible(el) { - if (!el || !el.getBoundingClientRect) return false; - const rect = el.getBoundingClientRect(); - const style = window.getComputedStyle(el); - return rect.width > 0 && rect.height > 0 && style.display !== 'none' && style.visibility !== 'hidden'; -} - -function walkRoots(root, rows, seen) { - if (!root || seen.has(root)) return; - seen.add(root); - - const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT); - let node = walker.currentNode; - while (node) { - if (node.nodeType === Node.ELEMENT_NODE && node.tagName) rows.push(node); - if (node.shadowRoot) walkRoots(node.shadowRoot, rows, seen); - if ((node.tagName || '').toLowerCase() === 'slot' && node.assignedElements) { - for (const assigned of node.assignedElements({ flatten: true })) { - walkRoots(assigned, rows, seen); - } - } - node = walker.nextNode(); - } -} - -function allElements(root) { - const rows = []; - walkRoots(root || document, rows, new Set()); - return rows; -} - -function closestDeep(el, selector) { - let node = el; - while (node) { - if (node.closest) { - const found = node.closest(selector); - if (found) return found; - } - const root = node.getRootNode && node.getRootNode(); - node = root && root.host ? root.host : null; - } - return null; -} - -function insideInventoryRow(el) { - return Boolean(closestDeep(el, 'div[data-sku]')); -} - -function isDeleteAction(el) { - const haystack = `${el.tagName || ''} ${attrsText(el)} ${textOf(el)}`; - return /data-action=DeleteListing|action=DeleteListing|删除商品信息|删除商品和报价|DeleteListing|delete\s+listing/i.test(haystack); -} - -function clickElement(el) { - el.scrollIntoView({ block: 'center', inline: 'nearest' }); - if (el.focus) el.focus(); - for (const eventName of ['pointerdown', 'mousedown', 'pointerup', 'mouseup']) { - el.dispatchEvent(new MouseEvent(eventName, { bubbles: true, cancelable: true, view: window })); - } - el.click(); -} - -function hostDropdownOf(el) { - const host = closestDeep(el, 'kat-dropdown-button'); - return host || ((el.tagName || '').toLowerCase() === 'kat-dropdown-button' ? el : null); -} - -function dropdownToggleOf(dropdown, fallback) { - if (!dropdown) return fallback; - if (fallback && textOf(fallback)) return fallback; - return fallback || dropdown; -} - -function openBulkActionMenu(candidate) { - const dropdown = hostDropdownOf(candidate); - const toggle = dropdownToggleOf(dropdown, candidate); - clickElement(toggle); - return { dropdown, toggle }; -} - -function summarize(el) { - return { - tag: el.tagName, - text: textOf(el), - attrs: attrsText(el), - visible: isVisible(el), - outerHTML: (el.outerHTML || '').slice(0, 1000), - }; -} - -function findVisibleBulkDeleteAction() { - return allElements(document).find((el) => isDeleteAction(el) && isVisible(el) && !insideInventoryRow(el)); -} - -function findDeleteActionAfterMenuOpen(candidate) { - const dropdown = hostDropdownOf(candidate) || candidate; - const exactMenuButton = allElements(dropdown).find((child) => { - const tag = (child.tagName || '').toLowerCase(); - const role = child.getAttribute && child.getAttribute('role'); - return tag === 'button' && role === 'menuitem' && isDeleteAction(child); - }); - if (exactMenuButton) return { mode: 'bulk-action-menuitem-delete', el: exactMenuButton }; - - const nestedDeleteAction = allElements(dropdown).find((child) => isDeleteAction(child) && isVisible(child)); - if (nestedDeleteAction) return { mode: 'bulk-action-nested-delete', el: nestedDeleteAction }; - - const deleteAction = findVisibleBulkDeleteAction(); - if (deleteAction) return { mode: 'bulk-action-visible-delete', el: deleteAction }; - - return null; -} - -function isBulkActionCandidate(el) { - const tag = (el.tagName || '').toLowerCase(); - if (!/^(button|kat-button|kat-dropdown-button|kat-select|kat-popover|kat-menu-button)$/.test(tag)) return false; - if (!isVisible(el) || insideInventoryRow(el)) return false; - const haystack = `${tag} ${attrsText(el)} ${textOf(el)}`; - return /DeleteListing|删除商品信息|删除|操作|更多|Action|Actions|selected|选定|已选择|批量/i.test(haystack); -} - -const directDelete = findVisibleBulkDeleteAction(); -if (directDelete) { - clickElement(directDelete); - return { ok: true, mode: 'direct-delete-button', clicked: summarize(directDelete) }; -} - -const rows = allElements(document); -const candidates = rows.filter(isBulkActionCandidate); - -for (const candidate of candidates) { - try { - const openResult = openBulkActionMenu(candidate); - const deleteAction = findDeleteActionAfterMenuOpen(candidate); - if (deleteAction) { - clickElement(deleteAction.el); - return { - ok: true, - mode: deleteAction.mode, - candidate: summarize(candidate), - opened: { - dropdown: openResult.dropdown ? summarize(openResult.dropdown) : null, - toggle: openResult.toggle ? summarize(openResult.toggle) : null, - }, - clicked: summarize(deleteAction.el), - }; - } - return { - ok: false, - reason: 'bulk action menu opened; delete action not visible yet', - menuOpened: true, - candidate: summarize(candidate), - opened: { - dropdown: openResult.dropdown ? summarize(openResult.dropdown) : null, - toggle: openResult.toggle ? summarize(openResult.toggle) : null, - }, - deleteLikeElements: allElements(document) - .filter((el) => /DeleteListing|删除商品信息|删除商品和报价|delete\s+listing/i.test(`${el.tagName || ''} ${attrsText(el)} ${textOf(el)}`) && !insideInventoryRow(el)) - .slice(0, 20) - .map(summarize), - }; - } catch (error) { - // Try the next non-row bulk action control. - } -} - -return { - ok: false, - reason: 'bulk delete action not found', - candidates: candidates.slice(0, 20).map(summarize), - deleteLikeElements: rows - .filter((el) => /DeleteListing|删除商品信息|删除商品和报价|delete\s+listing/i.test(`${el.tagName || ''} ${attrsText(el)} ${textOf(el)}`) && !insideInventoryRow(el)) - .slice(0, 20) - .map(summarize), - visibleButtons: rows - .filter((el) => /^(button|kat-button|kat-dropdown-button)$/i.test(el.tagName || '') && isVisible(el)) - .slice(0, 20) - .map(summarize), -}; diff --git a/app/amazon/scripts/patrol_delete/inventory_select_all.js b/app/amazon/scripts/patrol_delete/inventory_select_all.js deleted file mode 100644 index 151c4cd..0000000 --- a/app/amazon/scripts/patrol_delete/inventory_select_all.js +++ /dev/null @@ -1,71 +0,0 @@ -function isVisible(el) { - if (!el || !el.getBoundingClientRect) return false; - const rect = el.getBoundingClientRect(); - const style = window.getComputedStyle(el); - return rect.width > 0 && rect.height > 0 && style.display !== 'none' && style.visibility !== 'hidden'; -} - -function walkRoots(root, rows, seen) { - if (!root || seen.has(root)) return; - seen.add(root); - - const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT); - let node = walker.currentNode; - while (node) { - if (node.nodeType === Node.ELEMENT_NODE && node.tagName) rows.push(node); - if (node.shadowRoot) walkRoots(node.shadowRoot, rows, seen); - node = walker.nextNode(); - } -} - -function allElements() { - const rows = []; - walkRoots(document, rows, new Set()); - return rows; -} - -function insideInventoryRow(el) { - return Boolean(el && el.closest && el.closest('div[data-sku]')); -} - -function clickTargetFor(checkbox) { - if (!checkbox) return null; - if (checkbox.shadowRoot) { - const shadowTarget = checkbox.shadowRoot.querySelector('[role="checkbox"], .checkbox'); - if (shadowTarget) return shadowTarget; - } - return checkbox; -} - -const rowCount = document.querySelectorAll('div[data-sku]').length; -if (rowCount <= 0) { - return { ok: false, reason: 'no inventory rows after status filter', rowCount }; -} - -const checkboxes = allElements() - .filter((el) => (el.tagName || '').toLowerCase() === 'kat-checkbox' && isVisible(el)) - .sort((a, b) => { - const rectA = a.getBoundingClientRect(); - const rectB = b.getBoundingClientRect(); - return rectA.top - rectB.top || rectA.left - rectB.left; - }); - -const headerCheckbox = checkboxes.find((el) => !insideInventoryRow(el)) || checkboxes[0]; -if (!headerCheckbox) { - return { ok: false, reason: 'select-all checkbox not found', rowCount, checkboxCount: checkboxes.length }; -} - -const target = clickTargetFor(headerCheckbox); -target.scrollIntoView({ block: 'center', inline: 'nearest' }); -target.click(); - -return { - ok: true, - rowCount, - checkboxCount: checkboxes.length, - clicked: { - tag: headerCheckbox.tagName, - insideInventoryRow: insideInventoryRow(headerCheckbox), - outerHTML: (headerCheckbox.outerHTML || '').slice(0, 1000), - }, -}; diff --git a/app/amazon/scripts/patrol_delete/listing_status_click_visible_status.js b/app/amazon/scripts/patrol_delete/listing_status_click_visible_status.js deleted file mode 100644 index bf9601b..0000000 --- a/app/amazon/scripts/patrol_delete/listing_status_click_visible_status.js +++ /dev/null @@ -1,124 +0,0 @@ -function textOf(node) { - return ((node && (node.innerText || node.textContent || '')) || '').replace(/\s+/g, ' ').trim(); -} - -function normalize(text) { - return String(text || '').replace(/\s+/g, ' ').trim(); -} - -function isVisible(el) { - if (!el || !el.getBoundingClientRect) return false; - const rect = el.getBoundingClientRect(); - const style = window.getComputedStyle(el); - return rect.width > 0 && rect.height > 0 && style.display !== 'none' && style.visibility !== 'hidden'; -} - -function walkRoots(root, rows, seen) { - if (!root || seen.has(root)) return; - seen.add(root); - - const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT); - let node = walker.currentNode; - while (node) { - if (node.nodeType === Node.ELEMENT_NODE && node.tagName) rows.push(node); - if (node.shadowRoot) walkRoots(node.shadowRoot, rows, seen); - node = walker.nextNode(); - } -} - -function allElements() { - const rows = []; - walkRoots(document, rows, new Set()); - return rows; -} - -function parseStatus(rawText) { - const text = normalize(rawText); - if (!text) return ''; - const match = text.match(/^(.*?)\s*[((]\s*[\d,]+\s*[))]\s*$/); - return normalize(match ? match[1] : text); -} - -function collectStatusTargets() { - const pattern = /(全部|在搜索结果中禁止显示|配送问题|缺少报价|已停售|详情页面已删除|订单页面已删除|商品信息草稿|缺少的信息|定价问题|需要批准|不可售|在售)\s*[((]?\s*[\d,]*\s*[))]?/g; - const hits = []; - - for (const el of allElements()) { - if (!isVisible(el)) continue; - const text = normalize(textOf(el)); - if (!text) continue; - const match = text.match(pattern); - if (!match) continue; - const parsed = parseStatus(match[0]); - hits.push({ - el, - text, - parsed, - tag: el.tagName, - clickable: Boolean(el.onclick) || el.matches('button,[role="button"],kat-option,kat-label,a,[tabindex]'), - }); - } - - return hits; -} - -const targetStatus = normalize((__crawlerPayload || {}).status); -const candidates = collectStatusTargets() - .filter((item) => item.parsed === targetStatus || item.text.includes(targetStatus)) - .map((item) => ({ - ...item, - score: - (item.parsed === targetStatus ? 300 : 0) + - (item.clickable ? 120 : 0) + - (/^[^ ]+\s*[((]\s*[\d,]+\s*[))]$/.test(item.text) ? 80 : 0) + - (/button|option|label/i.test(item.tag) ? 30 : 0), - })) - .sort((a, b) => b.score - a.score); - -if (!candidates.length) { - return { ok: false, reason: 'visible status target not found', targetStatus }; -} - -for (const candidate of candidates) { - const chain = [candidate.el]; - let node = candidate.el.parentElement; - for (let depth = 0; node && depth < 5; depth += 1, node = node.parentElement) { - chain.push(node); - } - - for (const el of chain) { - try { - el.scrollIntoView({ block: 'center', inline: 'nearest' }); - el.click(); - return { - ok: true, - targetStatus, - clicked: { - tag: el.tagName, - text: normalize(textOf(el)).slice(0, 300), - }, - matched: { - tag: candidate.tag, - text: candidate.text.slice(0, 300), - parsed: candidate.parsed, - score: candidate.score, - }, - }; - } catch (error) { - // try parent - } - } -} - -return { - ok: false, - reason: 'visible status target click failed', - targetStatus, - candidates: candidates.slice(0, 10).map((item) => ({ - tag: item.tag, - text: item.text.slice(0, 300), - parsed: item.parsed, - score: item.score, - clickable: item.clickable, - })), -}; diff --git a/app/amazon/scripts/patrol_delete/listing_status_dropdown_close.js b/app/amazon/scripts/patrol_delete/listing_status_dropdown_close.js deleted file mode 100644 index cb9be2c..0000000 --- a/app/amazon/scripts/patrol_delete/listing_status_dropdown_close.js +++ /dev/null @@ -1,3 +0,0 @@ -document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', code: 'Escape', bubbles: true })); -document.body.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, view: window })); -return true; diff --git a/app/amazon/scripts/patrol_delete/listing_status_dropdown_debug.js b/app/amazon/scripts/patrol_delete/listing_status_dropdown_debug.js deleted file mode 100644 index ca21698..0000000 --- a/app/amazon/scripts/patrol_delete/listing_status_dropdown_debug.js +++ /dev/null @@ -1,95 +0,0 @@ -const keywords = ['ListingStatus', 'listing status', '商品状态', '商品狀態', 'status', 'filter', '库存']; - -function textOf(node) { - return (node && (node.innerText || node.textContent || '') || '').replace(/\s+/g, ' ').trim(); -} - -function attrsOf(el) { - const attrs = {}; - if (!el || !el.attributes) return attrs; - for (const attr of el.attributes) attrs[attr.name] = attr.value; - return attrs; -} - -function isVisible(el) { - if (!el || !el.getBoundingClientRect) return false; - const rect = el.getBoundingClientRect(); - const style = window.getComputedStyle(el); - return rect.width > 0 && rect.height > 0 && style.display !== 'none' && style.visibility !== 'hidden'; -} - -function walkRoots(root, rows, seen) { - if (!root || seen.has(root)) return; - seen.add(root); - - const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT); - let node = walker.currentNode; - while (node) { - if (node.nodeType === Node.ELEMENT_NODE && node.tagName) rows.push(node); - if (node.shadowRoot) walkRoots(node.shadowRoot, rows, seen); - node = walker.nextNode(); - } -} - -function allElements() { - const rows = []; - walkRoots(document, rows, new Set()); - return rows; -} - -function nearestLabel(el) { - const parts = []; - let node = el; - for (let depth = 0; node && depth < 6; depth += 1, node = node.parentElement) { - const text = textOf(node); - if (text) parts.push(text.slice(0, 400)); - } - const id = el.getAttribute('id'); - if (id) { - document.querySelectorAll(`label[for="${CSS.escape(id)}"]`).forEach((label) => { - const text = textOf(label); - if (text) parts.unshift(text); - }); - } - return [...new Set(parts)].join(' | '); -} - -function hasKeyword(text) { - return keywords.some((keyword) => text.toLowerCase().includes(keyword.toLowerCase())); -} - -function candidateRow(el, index) { - const attrs = attrsOf(el); - const attrText = Object.entries(attrs).map(([k, v]) => `${k}=${v}`).join(' '); - const label = nearestLabel(el); - const text = textOf(el); - const haystack = `${el.tagName} ${attrText} ${text} ${label}`; - let score = 0; - if (/商品状态|商品狀態|ListingStatus|listing status/i.test(haystack)) score += 100; - if (/status/i.test(haystack)) score += 25; - if (/filter|库存/i.test(haystack)) score += 10; - if (isVisible(el)) score += 5; - if (el.closest('[data-sku], tr, [role="row"]')) score -= 50; - return { - index, - score, - tag: el.tagName.toLowerCase(), - visible: isVisible(el), - text, - label, - attrs, - outerHTML: (el.outerHTML || '').slice(0, 2000), - }; -} - -const rows = allElements(); -const candidates = []; -rows.forEach((el, index) => { - const tag = (el.tagName || '').toLowerCase(); - const haystack = `${tag} ${textOf(el)} ${Object.values(attrsOf(el)).join(' ')} ${nearestLabel(el)}`; - if (tag === 'kat-dropdown' || tag === 'kat-option' || hasKeyword(haystack)) { - candidates.push(candidateRow(el, index)); - } -}); - -return candidates.sort((a, b) => b.score - a.score).slice(0, 80); diff --git a/app/amazon/scripts/patrol_delete/listing_status_dropdown_open.js b/app/amazon/scripts/patrol_delete/listing_status_dropdown_open.js deleted file mode 100644 index ba21550..0000000 --- a/app/amazon/scripts/patrol_delete/listing_status_dropdown_open.js +++ /dev/null @@ -1,295 +0,0 @@ -function textOf(node) { - return (node && (node.innerText || node.textContent || '') || '').replace(/\s+/g, ' ').trim(); -} - -function normalize(text) { - return String(text || '').replace(/\s+/g, ' ').trim(); -} - -function attrsText(el) { - if (!el || !el.attributes) return ''; - return Array.from(el.attributes).map((attr) => `${attr.name}=${attr.value}`).join(' '); -} - -function attrsOf(el) { - const attrs = {}; - if (!el || !el.attributes) return attrs; - for (const attr of el.attributes) attrs[attr.name] = attr.value; - return attrs; -} - -function isDisabled(el) { - if (!el) return false; - return ( - el.hasAttribute('disabled') || - el.disabled === true || - el.getAttribute('aria-disabled') === 'true' || - /\bdisabled\b/i.test(el.getAttribute('class') || '') - ); -} - -function isVisible(el) { - if (!el || !el.getBoundingClientRect) return false; - const rect = el.getBoundingClientRect(); - const style = window.getComputedStyle(el); - return rect.width > 0 && rect.height > 0 && style.display !== 'none' && style.visibility !== 'hidden'; -} - -function walkRoots(root, rows, seen) { - if (!root || seen.has(root)) return; - seen.add(root); - - const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT); - let node = walker.currentNode; - while (node) { - if (node.nodeType === Node.ELEMENT_NODE && node.tagName) rows.push(node); - if (node.shadowRoot) walkRoots(node.shadowRoot, rows, seen); - node = walker.nextNode(); - } -} - -function allElements() { - const rows = []; - walkRoots(document, rows, new Set()); - return rows; -} - -function nearestLabel(el) { - const parts = []; - let node = el; - for (let depth = 0; node && depth < 7; depth += 1, node = node.parentElement) { - const text = textOf(node); - if (text) parts.push(text.slice(0, 500)); - } - const id = el.getAttribute('id'); - if (id) { - document.querySelectorAll(`label[for="${CSS.escape(id)}"]`).forEach((label) => { - const text = textOf(label); - if (text) parts.unshift(text); - }); - } - return [...new Set(parts)].join(' | '); -} - -function optionTextOf(dropdown) { - const roots = [dropdown]; - if (dropdown.shadowRoot) roots.push(dropdown.shadowRoot); - const texts = []; - for (const root of roots) { - for (const option of Array.from(root.querySelectorAll('kat-option, kat-label, [role="option"], [class*="parentKatOptionStyle"]'))) { - texts.push(`${textOf(option)} ${attrsText(option)}`); - } - } - return normalize(texts.join(' ')); -} - -function isSearchFieldDropdown(text) { - return /(^|\s)(SKUS?|ASIN|FNSKU|UPC\/EAN|TITLE_KEYWORD|GTIN)(\s|$)|商品名称\/关键字|data-value=(SKU|ASIN|FNSKU|TITLE_KEYWORD|GTIN)|value=(SKU|ASIN|FNSKU|TITLE_KEYWORD|GTIN)/i.test(text); -} - -function statusHitCount(text) { - const matches = normalize(text).match( - /(全部|在售|不可售|详情页面已删除|订单页面已删除|商品信息草稿|缺少的信息|定价问题|需要批准|配送问题|缺少报价|已停售|在搜索结果中禁止显示)\s*(?:[((]\s*[\d,]+\s*[))])?/g - ); - return matches ? matches.length : 0; -} - -function scoreDropdown(el) { - const text = textOf(el); - const label = nearestLabel(el); - const attrs = attrsText(el); - const optionText = optionTextOf(el); - const haystack = `${el.tagName} ${attrs} ${text} ${label} ${optionText}`; - const statusHits = statusHitCount(`${text} ${label} ${optionText}`); - const isStatusDropdown = /statusDropdown|商品状态|商品狀態|ListingStatus|listing status/i.test(haystack); - let score = 0; - if (isSearchFieldDropdown(haystack)) score -= 1000; - if (isStatusDropdown) score += 500; - if (/商品状态|商品狀態|ListingStatus|listing status/i.test(haystack)) score += 120; - if (/\bstatus\b|状态/i.test(haystack)) score += 25; - if (/filter|筛选|筛選|库存/i.test(haystack)) score += 10; - if (/全部\s*[((]\s*[\d,]+\s*[))]/.test(`${text} ${label} ${optionText}`)) score += 300; - if (statusHits >= 2) score += statusHits * 180; - if (!isStatusDropdown && statusHits === 0) score -= 200; - if (isVisible(el)) score += 10; - if (el.closest('[data-sku], tr, [role="row"], [data-testid*="row"]')) score -= 80; - if (isDisabled(el)) score -= 20; - return { score, text, label, haystack, statusHits, disabled: isDisabled(el) }; -} - -function candidateTriggers(dropdown) { - const selectors = [ - 'kat-dropdown-button', - 'kat-button', - 'button', - '[role="button"]', - '[aria-haspopup]', - '[part="trigger"]', - '[part="button"]', - '.header', - '.trigger', - '.button', - 'span', - 'div', - ]; - - const seen = new Set(); - const triggers = []; - const roots = [dropdown]; - if (dropdown.shadowRoot) roots.push(dropdown.shadowRoot); - - for (const root of roots) { - for (const selector of selectors) { - for (const el of Array.from(root.querySelectorAll(selector))) { - if (!el || seen.has(el)) continue; - seen.add(el); - const text = textOf(el); - const attrs = attrsText(el); - const score = - (isVisible(el) ? 20 : 0) + - (/全部\s*[((]\s*[\d,]+\s*[))]/.test(text) ? 200 : 0) + - (/商品状态|商品狀態|ListingStatus|listing status/i.test(`${text} ${attrs}`) ? 120 : 0) + - (/button|trigger|toggle|dropdown|expand/i.test(`${el.tagName} ${attrs}`) ? 40 : 0); - triggers.push({ el, text, attrs, score }); - } - } - } - - return triggers - .filter((item) => item.score > 0) - .sort((a, b) => b.score - a.score); -} - -function clickTrigger(dropdown) { - const triggers = candidateTriggers(dropdown); - for (const trigger of triggers) { - try { - trigger.el.scrollIntoView({ block: 'center', inline: 'nearest' }); - trigger.el.click(); - return { - ok: true, - trigger: { - tag: trigger.el.tagName, - text: trigger.text, - attrs: trigger.attrs, - score: trigger.score, - }, - }; - } catch (error) { - // continue - } - } - - try { - dropdown.scrollIntoView({ block: 'center', inline: 'nearest' }); - dropdown.click(); - return { - ok: true, - trigger: { - tag: dropdown.tagName, - text: textOf(dropdown), - attrs: attrsText(dropdown), - score: -1, - }, - }; - } catch (error) { - return { - ok: false, - reason: String(error), - tried: triggers.slice(0, 10).map((item) => ({ - tag: item.el.tagName, - text: item.text, - attrs: item.attrs, - score: item.score, - })), - }; - } -} - -const dropdowns = allElements().filter((el) => el.tagName.toLowerCase() === 'kat-dropdown'); -const ranked = dropdowns - .map((el, index) => ({ el, index, ...scoreDropdown(el) })) - .filter((row) => row.score > 0) - .sort((a, b) => b.score - a.score); - -if (!ranked.length) { - return { ok: false, reason: 'listing status kat-dropdown not found', candidates: [] }; -} - -const selected = ranked[0]; -if (selected.disabled) { - return { - ok: false, - reason: 'listing status dropdown disabled/loading', - selected: { - index: selected.index, - score: selected.score, - statusHits: selected.statusHits, - text: selected.text, - label: selected.label, - attrs: attrsOf(selected.el), - outerHTML: (selected.el.outerHTML || '').slice(0, 2000), - }, - candidates: ranked.slice(0, 10).map((row) => ({ - index: row.index, - score: row.score, - statusHits: row.statusHits, - disabled: row.disabled, - text: row.text, - label: row.label, - attrs: attrsText(row.el), - outerHTML: (row.el.outerHTML || '').slice(0, 1000), - })), - }; -} - -selected.el.setAttribute('data-crawler-listing-status-dropdown', 'true'); -const clickResult = clickTrigger(selected.el); - -if (!clickResult.ok) { - return { - ok: false, - reason: 'listing status dropdown trigger click failed', - selected: { - index: selected.index, - score: selected.score, - text: selected.text, - label: selected.label, - attrs: attrsText(selected.el), - outerHTML: (selected.el.outerHTML || '').slice(0, 2000), - }, - clickResult, - candidates: ranked.slice(0, 10).map((row) => ({ - index: row.index, - score: row.score, - text: row.text, - label: row.label, - attrs: attrsText(row.el), - outerHTML: (row.el.outerHTML || '').slice(0, 1000), - })), - }; -} - -return { - ok: true, - selected: { - index: selected.index, - score: selected.score, - statusHits: selected.statusHits, - text: selected.text, - label: selected.label, - attrs: attrsText(selected.el), - outerHTML: (selected.el.outerHTML || '').slice(0, 2000), - }, - trigger: clickResult.trigger, - candidates: ranked.slice(0, 10).map((row) => ({ - index: row.index, - score: row.score, - statusHits: row.statusHits, - disabled: row.disabled, - text: row.text, - label: row.label, - attrs: attrsText(row.el), - outerHTML: (row.el.outerHTML || '').slice(0, 1000), - })), -}; diff --git a/app/amazon/scripts/patrol_delete/listing_status_dropdown_options.js b/app/amazon/scripts/patrol_delete/listing_status_dropdown_options.js deleted file mode 100644 index 9c71294..0000000 --- a/app/amazon/scripts/patrol_delete/listing_status_dropdown_options.js +++ /dev/null @@ -1,129 +0,0 @@ -function textOf(node) { - return (node && (node.innerText || node.textContent || '') || '').replace(/\s+/g, ' ').trim(); -} - -function attrsOf(el) { - const attrs = {}; - if (!el || !el.attributes) return attrs; - for (const attr of el.attributes) attrs[attr.name] = attr.value; - return attrs; -} - -function isVisible(el) { - if (!el || !el.getBoundingClientRect) return false; - const rect = el.getBoundingClientRect(); - const style = window.getComputedStyle(el); - return rect.width > 0 && rect.height > 0 && style.display !== 'none' && style.visibility !== 'hidden'; -} - -function walkRoots(root, rows, seen) { - if (!root || seen.has(root)) return; - seen.add(root); - - const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT); - let node = walker.currentNode; - while (node) { - if (node.nodeType === Node.ELEMENT_NODE && node.tagName) rows.push(node); - if (node.shadowRoot) walkRoots(node.shadowRoot, rows, seen); - node = walker.nextNode(); - } -} - -function allElements() { - const rows = []; - walkRoots(document, rows, new Set()); - return rows; -} - -function findMarkedDropdown() { - return allElements().find((el) => el.getAttribute('data-crawler-listing-status-dropdown') === 'true') || null; -} - -function insideListingRow(el) { - return Boolean(el.closest('[data-sku], tr, [role="row"], [data-testid*="row"]')); -} - -function normalize(text) { - return String(text || '').replace(/\s+/g, ' ').trim(); -} - -function isOptionLike(el) { - if (!el || !el.tagName) return false; - const tag = el.tagName.toLowerCase(); - const role = el.getAttribute('role'); - const className = el.getAttribute('class') || ''; - return ( - tag === 'kat-option' || - tag === 'kat-label' || - role === 'option' || - /parentKatOptionStyle/i.test(className) - ); -} - -function parseStatus(rawText) { - const text = normalize(rawText); - if (!text) return ''; - const match = text.match(/^(.*?)\s*[((]\s*[\d,]+\s*[))]\s*$/); - return normalize(match ? match[1] : text); -} - -function isListingStatusOption(row) { - const text = normalize(`${row.raw_text} ${row.value || ''}`); - const parsed = parseStatus(row.raw_text); - const haystack = normalize(`${text} ${parsed}`); - if (/^(所有|SKUS?|ASIN|FNSKU|UPC\/EAN|商品名称\/关键字)$|^(ALL|SKU|ASIN|FNSKU|TITLE_KEYWORD|GTIN)$/i.test(haystack)) { - return false; - } - return /^(全部|在售|不可售|详情页面已删除|订单页面已删除|商品信息草稿|缺少的信息|定价问题|需要批准|配送问题|缺少报价|已停售|在搜索结果中禁止显示)$/.test(parsed); -} - -function optionRow(el, index) { - const attrs = attrsOf(el); - const rawText = textOf(el) || attrs.label || attrs.text || attrs.value || ''; - return { - index, - raw_text: rawText, - value: attrs.value || attrs['data-value'] || attrs.name || null, - tag: (el.tagName || '').toLowerCase(), - attrs, - visible: isVisible(el), - outerHTML: (el.outerHTML || '').slice(0, 1200), - }; -} - -const markedDropdown = findMarkedDropdown(); -let scoped = []; -if (markedDropdown) { - const roots = [markedDropdown]; - if (markedDropdown.shadowRoot) roots.push(markedDropdown.shadowRoot); - for (const root of roots) { - scoped = scoped.concat(Array.from(root.querySelectorAll('kat-option, kat-label, [role="option"], [class*="parentKatOptionStyle"]'))); - } -} - -const allOptions = allElements().filter((el) => { - if (!isOptionLike(el)) return false; - if (insideListingRow(el)) return false; - return isVisible(el); -}); - -const byNode = new Map(); -const byStatus = new Map(); -scoped.concat(allOptions).forEach((el, index) => { - if (!byNode.has(el)) { - const row = optionRow(el, index); - if (isListingStatusOption(row)) { - byNode.set(el, row); - const parsed = parseStatus(row.raw_text); - const hasValue = Boolean(row.value); - const hasQuantity = /[((]\s*[\d,]+\s*[))]/.test(row.raw_text); - const quality = (hasValue ? 2 : 0) + (hasQuantity ? 1 : 0); - const existing = byStatus.get(parsed); - if (!existing || quality > existing.quality) { - byStatus.set(parsed, { row, quality }); - } - } - } -}); - -return Array.from(byStatus.values()).map((item) => item.row).filter((row) => row.raw_text); diff --git a/app/amazon/scripts/patrol_delete/listing_status_section.js b/app/amazon/scripts/patrol_delete/listing_status_section.js deleted file mode 100644 index b38cb39..0000000 --- a/app/amazon/scripts/patrol_delete/listing_status_section.js +++ /dev/null @@ -1,91 +0,0 @@ -function textOf(node) { - return (node && (node.innerText || node.textContent || '') || '').replace(/\s+/g, ' ').trim(); -} - -function walkRoots(root, rows, seen) { - if (!root || seen.has(root)) return; - seen.add(root); - - const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT); - let node = walker.currentNode; - while (node) { - if (node.nodeType === Node.ELEMENT_NODE && node.tagName) rows.push(node); - if (node.shadowRoot) walkRoots(node.shadowRoot, rows, seen); - node = walker.nextNode(); - } -} - -function allElements() { - const rows = []; - walkRoots(document, rows, new Set()); - return rows; -} - -function extractStatuses(text) { - const pattern = /(全部|在搜索结果中禁止显示|配送问题|缺少报价|已停售|详情页面已删除|订单页面已删除|商品信息草稿|缺少的信息|定价问题|需要批准|不可售|在售)\s*(?:[((]\s*([\d,]+)\s*[))])?/g; - const rows = []; - let match; - while ((match = pattern.exec(text)) !== null) { - rows.push({ - status: match[1], - quantity: match[2] || '', - raw_text: match[0].trim(), - }); - } - return rows; -} - -function parseDropdown(dropdown, index) { - const nodes = Array.from(dropdown.querySelectorAll('kat-option, kat-label, [class*="parentKatOptionStyle"]')); - const seen = new Set(); - const rows = nodes - .flatMap((node) => { - const rawText = textOf(node); - return extractStatuses(rawText).map((parsed) => ({ - ...parsed, - value: node.getAttribute('value') || '', - })); - }) - .filter((row) => { - const key = `${row.status}::${row.quantity}`; - if (seen.has(key)) return false; - seen.add(key); - return true; - }); - - const quantityCount = rows.filter((row) => row.quantity).length; - const rawText = textOf(dropdown); - const className = String(dropdown.className || ''); - const isStatusDropdown = /statusDropdown/i.test(className); - const score = - rows.length * 100 + - quantityCount * 50 + - (isStatusDropdown ? 500 : 0) + - (/在搜索结果中禁止显示|需要批准|详情页面已删除/.test(rawText) ? 200 : 0); - - return { - index, - tag: (dropdown.tagName || '').toLowerCase(), - raw_text: rawText, - rows, - rowCount: rows.length, - quantityCount, - score, - className, - outerHTML: (dropdown.outerHTML || '').slice(0, 1200), - }; -} - -const ranked = allElements() - .map((el, index) => ({ el, index })) - .filter(({ el }) => (el.tagName || '').toLowerCase() === 'kat-dropdown') - .map(({ el, index }) => parseDropdown(el, index)) - .filter((row) => row.rowCount >= 3) - .sort((a, b) => b.score - a.score); - -const best = ranked[0]; -return { - rows: best ? best.rows : [], - selected: best || null, - candidates: ranked.slice(0, 10), -}; diff --git a/app/amazon/scripts/patrol_delete/listing_status_select_option.js b/app/amazon/scripts/patrol_delete/listing_status_select_option.js deleted file mode 100644 index fe01096..0000000 --- a/app/amazon/scripts/patrol_delete/listing_status_select_option.js +++ /dev/null @@ -1,148 +0,0 @@ -const __crawlerPayload = arguments[0] || {}; - -function textOf(node) { - return ((node && (node.innerText || node.textContent || '')) || '').replace(/\s+/g, ' ').trim(); -} - -function isVisible(el) { - if (!el || !el.getBoundingClientRect) return false; - const rect = el.getBoundingClientRect(); - const style = window.getComputedStyle(el); - return rect.width > 0 && rect.height > 0 && style.display !== 'none' && style.visibility !== 'hidden'; -} - -function walkRoots(root, rows, seen) { - if (!root || seen.has(root)) return; - seen.add(root); - - const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT); - let node = walker.currentNode; - while (node) { - if (node.nodeType === Node.ELEMENT_NODE && node.tagName) rows.push(node); - if (node.shadowRoot) walkRoots(node.shadowRoot, rows, seen); - node = walker.nextNode(); - } -} - -function allElements() { - const rows = []; - walkRoots(document, rows, new Set()); - return rows; -} - -function findMarkedDropdown() { - return allElements().find((el) => el.getAttribute('data-crawler-listing-status-dropdown') === 'true') || null; -} - -function insideListingRow(el) { - return Boolean(el.closest('[data-sku], tr, [role="row"], [data-testid*="row"]')); -} - -function isOptionLike(el) { - if (!el || !el.tagName) return false; - const tag = el.tagName.toLowerCase(); - const role = el.getAttribute('role'); - const className = el.getAttribute('class') || ''; - return ( - tag === 'kat-option' || - tag === 'kat-label' || - role === 'option' || - /parentKatOptionStyle/i.test(className) - ); -} - -function isSearchFieldOption(meta) { - return /^(所有|SKUS?|ASIN|FNSKU|UPC\/EAN|商品名称\/关键字)$|^(ALL|SKU|ASIN|FNSKU|TITLE_KEYWORD|GTIN)$/i.test( - `${meta.rawText} ${meta.parsedStatus} ${meta.value}` - ); -} - -function isListingStatusOption(meta) { - if (isSearchFieldOption(meta)) return false; - return /^(全部|在售|不可售|详情页面已删除|订单页面已删除|商品信息草稿|缺少的信息|定价问题|需要批准|配送问题|缺少报价|已停售|在搜索结果中禁止显示)$/.test( - meta.parsedStatus - ); -} - -function normalize(text) { - return String(text || '').replace(/\s+/g, ' ').trim(); -} - -function parseStatus(rawText) { - const text = normalize(rawText); - if (!text) return ''; - const match = text.match(/^(.*?)\s*[((]\s*[\d,]+\s*[))]\s*$/); - return normalize(match ? match[1] : text); -} - -function optionMeta(el, index) { - const rawText = textOf(el) || el.getAttribute('label') || el.getAttribute('text') || el.getAttribute('value') || ''; - return { - index, - rawText: normalize(rawText), - parsedStatus: parseStatus(rawText), - value: el.getAttribute('value') || el.getAttribute('data-value') || '', - visible: isVisible(el), - }; -} - -function clickTargetFor(el) { - if (!el) return el; - return el.closest('[class*="parentKatOptionStyle"], kat-option, [role="option"]') || el; -} - -const targetStatus = normalize((__crawlerPayload || {}).status); -const dropdown = findMarkedDropdown(); -const options = []; - -if (dropdown) { - const roots = [dropdown]; - if (dropdown.shadowRoot) roots.push(dropdown.shadowRoot); - for (const root of roots) { - for (const el of Array.from(root.querySelectorAll('kat-option, kat-label, [role="option"], [class*="parentKatOptionStyle"]'))) { - options.push(el); - } - } -} - -if (!options.length) { - for (const el of allElements()) { - if (!isOptionLike(el)) continue; - if (!isVisible(el) || insideListingRow(el)) continue; - options.push(el); - } -} - -const metas = options - .map((el, index) => ({ el, ...optionMeta(el, index) })) - .filter((item) => isListingStatusOption(item)); -const matched = metas.find((item) => item.parsedStatus === targetStatus || item.rawText === targetStatus); -if (!matched) { - return { - ok: false, - reason: 'status option not found', - targetStatus, - options: metas.map(({ index, rawText, parsedStatus, value, visible }) => ({ - index, - rawText, - parsedStatus, - value, - visible, - })), - }; -} - -const clickTarget = clickTargetFor(matched.el); -clickTarget.scrollIntoView({ block: 'center', inline: 'nearest' }); -clickTarget.click(); -return { - ok: true, - targetStatus, - selected: { - index: matched.index, - rawText: matched.rawText, - parsedStatus: matched.parsedStatus, - value: matched.value, - clickedTag: clickTarget.tagName, - }, -}; diff --git a/app/amazon/scripts/patrol_delete/recommended_offer_percentage_diagnostic.js b/app/amazon/scripts/patrol_delete/recommended_offer_percentage_diagnostic.js deleted file mode 100644 index 768f363..0000000 --- a/app/amazon/scripts/patrol_delete/recommended_offer_percentage_diagnostic.js +++ /dev/null @@ -1,94 +0,0 @@ -function textOf(node) { - return (node && (node.innerText || node.textContent || '') || '').replace(/\s+/g, ' ').trim(); -} - -function attrsOf(el) { - const attrs = {}; - if (!el || !el.attributes) return attrs; - for (const attr of el.attributes) attrs[attr.name] = attr.value; - return attrs; -} - -function isVisible(el) { - if (!el || !el.getBoundingClientRect) return false; - const rect = el.getBoundingClientRect(); - const style = window.getComputedStyle(el); - return rect.width > 0 && rect.height > 0 && style.display !== 'none' && style.visibility !== 'hidden'; -} - -function walkRoots(root, rows, seen) { - if (!root || seen.has(root)) return; - seen.add(root); - - const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT); - let node = walker.currentNode; - while (node) { - if (node.nodeType === Node.ELEMENT_NODE && node.tagName) rows.push(node); - if (node.shadowRoot) walkRoots(node.shadowRoot, rows, seen); - node = walker.nextNode(); - } -} - -function allElements() { - const rows = []; - walkRoots(document, rows, new Set()); - return rows; -} - -function snapshot(el, index) { - return { - index, - tag: el.tagName.toLowerCase(), - text: textOf(el), - attrs: attrsOf(el), - outerHTML: (el.outerHTML || '').slice(0, 2000), - }; -} - -const KEYWORD_RE = /推荐报价|featured offer|buy box|商城|marketplace|欧洲|英国|德国|法国|西班牙|意大利|2\s*天前|30\s*天前|2\s*days?\s*ago|30\s*days?\s*ago/i; -const visible = allElements().filter((el) => isVisible(el)); - -const keywordMatches = visible - .map((el, index) => ({ el, index, text: textOf(el) })) - .filter((row) => KEYWORD_RE.test(`${row.el.tagName} ${row.text} ${Object.values(attrsOf(row.el)).join(' ')}`)) - .slice(0, 120) - .map(({ el, index }) => snapshot(el, index)); - -const buyBoxCard = visible.find((el) => (el.getAttribute('data-key') || '') === 'KPI_CARD_BUYBOX') - || visible.find((el) => (el.id || '') === 'KPI_CARD_BUYBOX'); - -const buyBoxNeighborhood = []; -if (buyBoxCard) { - let node = buyBoxCard; - for (let depth = 0; node && depth < 6; depth += 1, node = node.parentElement) { - buyBoxNeighborhood.push({ - depth, - tag: node.tagName.toLowerCase(), - text: textOf(node), - attrs: attrsOf(node), - outerHTML: (node.outerHTML || '').slice(0, 2500), - }); - } -} - -const buyBoxLeafMatches = []; -if (buyBoxCard) { - const scoped = []; - walkRoots(buyBoxCard, scoped, new Set()); - scoped - .filter((el) => isVisible(el)) - .map((el, index) => ({ el, index, text: textOf(el) })) - .filter((row) => row.text && row.text.length <= 200) - .filter((row) => /推荐报价|商城|marketplace|欧洲|英国|德国|法国|西班牙|意大利|\d+(?:\.\d+)?\s*%|2\s*天前|30\s*天前|2\s*days?\s*ago|30\s*days?\s*ago/i.test(row.text)) - .slice(0, 120) - .forEach(({ el, index }) => buyBoxLeafMatches.push(snapshot(el, index))); -} - -return { - url: window.location.href, - title: document.title, - buyBoxFound: !!buyBoxCard, - buyBoxNeighborhood, - buyBoxLeafMatches, - keywordMatches, -}; diff --git a/app/amazon/scripts/patrol_delete/recommended_offer_percentage_open.js b/app/amazon/scripts/patrol_delete/recommended_offer_percentage_open.js deleted file mode 100644 index 7c9f41e..0000000 --- a/app/amazon/scripts/patrol_delete/recommended_offer_percentage_open.js +++ /dev/null @@ -1,132 +0,0 @@ -function textOf(node) { - return (node && (node.innerText || node.textContent || '') || '').replace(/\s+/g, ' ').trim(); -} - -function attrsOf(el) { - const attrs = {}; - if (!el || !el.attributes) return attrs; - for (const attr of el.attributes) attrs[attr.name] = attr.value; - return attrs; -} - -function attrsText(el) { - return Object.entries(attrsOf(el)).map(([key, value]) => `${key}=${value}`).join(' '); -} - -function isVisible(el) { - if (!el || !el.getBoundingClientRect) return false; - const rect = el.getBoundingClientRect(); - const style = window.getComputedStyle(el); - return rect.width > 0 && rect.height > 0 && style.display !== 'none' && style.visibility !== 'hidden'; -} - -function walkRoots(root, rows, seen) { - if (!root || seen.has(root)) return; - seen.add(root); - - const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT); - let node = walker.currentNode; - while (node) { - if (node.nodeType === Node.ELEMENT_NODE && node.tagName) rows.push(node); - if (node.shadowRoot) walkRoots(node.shadowRoot, rows, seen); - node = walker.nextNode(); - } -} - -function allElements() { - const rows = []; - walkRoots(document, rows, new Set()); - return rows; -} - -function clickableFor(el) { - if (el && el.querySelector) { - const preferred = el.querySelector( - 'casino-button[data-actionname="expand"], [data-actionname="expand"], casino-button[aria-label="chevron-down"], [aria-label="chevron-down"]' - ); - if (preferred) return preferred; - } - - let node = el; - for (let depth = 0; node && depth < 7; depth += 1, node = node.parentElement) { - if (node.querySelector) { - const preferred = node.querySelector( - 'casino-button[data-actionname="expand"], [data-actionname="expand"], casino-button[aria-label="chevron-down"], [aria-label="chevron-down"]' - ); - if (preferred) return preferred; - } - const tag = node.tagName.toLowerCase(); - const role = node.getAttribute('role'); - if (tag === 'button' || tag === 'a' || tag === 'kat-button' || role === 'button' || node.onclick) { - return node; - } - } - return el; -} - -function scoreEntry(el) { - const text = textOf(el); - const haystack = `${el.tagName} ${attrsText(el)} ${text}`; - let score = 0; - if (/推荐报价百分比|推荐报价.*百分比|featured offer percentage|featured offer.*%|featured offer/i.test(haystack)) { - score += 120; - } - if (/buy box|购物车|报价/i.test(haystack)) score += 20; - if (/%/.test(haystack)) score += 15; - if (/button|link|href|click|card|metric/i.test(haystack)) score += 10; - if (isVisible(el)) score += 10; - if (text.length > 800) score -= 30; - return { score, text, haystack }; -} - -const ranked = allElements() - .filter((el) => isVisible(el)) - .map((el, index) => ({ el, index, ...scoreEntry(el) })) - .filter((row) => row.score > 0) - .sort((a, b) => { - if (b.score !== a.score) return b.score - a.score; - return a.text.length - b.text.length; - }); - -if (!ranked.length) { - return { - ok: false, - reason: 'recommended offer percentage entry not found', - url: window.location.href, - title: document.title, - candidates: allElements() - .filter((el) => isVisible(el)) - .map((el, index) => ({ index, tag: el.tagName.toLowerCase(), text: textOf(el), attrs: attrsOf(el) })) - .filter((row) => /推荐报价|featured offer|buy box|百分比|percentage/i.test(`${row.tag} ${row.text} ${Object.values(row.attrs).join(' ')}`)) - .slice(0, 80), - }; -} - -const selected = ranked[0]; -const clickable = clickableFor(selected.el); -clickable.setAttribute('data-crawler-recommended-offer-entry', 'true'); -clickable.scrollIntoView({ block: 'center', inline: 'nearest' }); -['pointerdown', 'mousedown', 'mouseup', 'click'].forEach((eventName) => { - clickable.dispatchEvent(new MouseEvent(eventName, { bubbles: true, cancelable: true, composed: true })); -}); -if (typeof clickable.click === 'function') clickable.click(); - -return { - ok: true, - selected: { - index: selected.index, - score: selected.score, - text: selected.text, - attrs: attrsText(selected.el), - clickableTag: clickable.tagName.toLowerCase(), - clickableText: textOf(clickable), - outerHTML: (selected.el.outerHTML || '').slice(0, 2000), - }, - candidates: ranked.slice(0, 12).map((row) => ({ - index: row.index, - score: row.score, - text: row.text, - attrs: attrsText(row.el), - outerHTML: (row.el.outerHTML || '').slice(0, 1000), - })), -}; diff --git a/app/amazon/scripts/patrol_delete/recommended_offer_percentage_rows.js b/app/amazon/scripts/patrol_delete/recommended_offer_percentage_rows.js deleted file mode 100644 index 32ec558..0000000 --- a/app/amazon/scripts/patrol_delete/recommended_offer_percentage_rows.js +++ /dev/null @@ -1,332 +0,0 @@ -function textOf(node) { - return (node && (node.innerText || node.textContent || '') || '').replace(/\s+/g, ' ').trim(); -} - -function attrsOf(el) { - const attrs = {}; - if (!el || !el.attributes) return attrs; - for (const attr of el.attributes) attrs[attr.name] = attr.value; - return attrs; -} - -function isVisible(el) { - if (!el || !el.getBoundingClientRect) return false; - const rect = el.getBoundingClientRect(); - const style = window.getComputedStyle(el); - return rect.width > 0 && rect.height > 0 && style.display !== 'none' && style.visibility !== 'hidden'; -} - -function walkRoots(root, rows, seen) { - if (!root || seen.has(root)) return; - seen.add(root); - - const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT); - let node = walker.currentNode; - while (node) { - if (node.nodeType === Node.ELEMENT_NODE && node.tagName) rows.push(node); - if (node.shadowRoot) walkRoots(node.shadowRoot, rows, seen); - node = walker.nextNode(); - } -} - -function allElements() { - const rows = []; - walkRoots(document, rows, new Set()); - return rows; -} - -function rowOf(el, index) { - const attrs = attrsOf(el); - const rect = el.getBoundingClientRect(); - return { - index, - tag: el.tagName.toLowerCase(), - raw_text: textOf(el), - label_text: attrs.label || attrs.title || attrs['aria-label'] || '', - percentage_text: attrs.value || attrs['data-value'] || '', - attrs, - visible: isVisible(el), - rect_left: rect.left, - rect_top: rect.top, - rect_width: rect.width, - rect_height: rect.height, - outerHTML: (el.outerHTML || '').slice(0, 1200), - }; -} - -const COUNTRIES = [ - { country: '欧洲', aliases: ['欧洲', 'Europe'] }, - { country: '英国', aliases: ['英国', 'UK', 'United Kingdom'] }, - { country: '德国', aliases: ['德国', 'Germany'] }, - { country: '法国', aliases: ['法国', 'France'] }, - { country: '西班牙', aliases: ['西班牙', 'Spain'] }, - { country: '意大利', aliases: ['意大利', 'Italy'] }, -]; - -function percentagesOf(text) { - return (text.match(/\d+(?:\.\d+)?\s*%/g) || []).map((item) => item.replace(/\s+/g, '')); -} - -function parentOrHost(el) { - if (!el) return null; - if (el.parentElement) return el.parentElement; - const root = el.getRootNode && el.getRootNode(); - return root && root.host ? root.host : null; -} - -function countryOfText(text) { - const normalized = (text || '').trim().toLowerCase(); - return COUNTRIES.find(({ aliases }) => aliases.some((alias) => normalized === alias.toLowerCase())) || null; -} - -function countCountries(text) { - return COUNTRIES.filter(({ aliases }) => aliases.some((alias) => new RegExp(`(^|\\s)${alias.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}(\\s|$)`, 'i').test(text))).length; -} - -function bestCountryRowText(el) { - const visited = new Set(); - let node = el; - for (let depth = 0; node && depth < 7; depth += 1, node = parentOrHost(node)) { - if (visited.has(node)) break; - visited.add(node); - const text = textOf(node); - if (!text || text.length > 500) continue; - const percentages = percentagesOf(text); - if (percentages.length >= 2 && countCountries(text) <= 1) return text; - } - - const parent = parentOrHost(el); - if (!parent || !parent.children) return ''; - - const children = Array.from(parent.children).filter((child) => isVisible(child) && textOf(child)); - const index = children.indexOf(el); - if (index < 0) return ''; - - const nearby = children.slice(Math.max(0, index - 1), Math.min(children.length, index + 5)).map((child) => textOf(child)); - const joined = nearby.join(' '); - return percentagesOf(joined).length >= 2 ? joined : ''; -} - -function directCountryRows(elements) { - const results = new Map(); - elements.forEach((el) => { - const match = countryOfText(textOf(el)); - if (!match || results.has(match.country)) return; - const text = bestCountryRowText(el); - const percentages = percentagesOf(text); - if (percentages.length < 2) return; - results.set(match.country, { - country: match.country, - ratio2DaysAgo: percentages[0], - ratio30DaysAgo: percentages[1], - raw_text: text, - source: 'rendered-country-row', - }); - }); - return Array.from(results.values()); -} - -function expandedCardOf(elements) { - return elements.find((el) => el.tagName && el.tagName.toLowerCase() === 'casino-card' && /\bcasino-expanded-card\b/.test(el.className || '')); -} - -function directRowsFromExpandedCard(expandedCard) { - if (!expandedCard) return []; - - const scoped = []; - walkRoots(expandedCard, scoped, new Set()); - - const countries = []; - const percentages = []; - const seen = new Set(); - - scoped - .filter((el) => isVisible(el)) - .forEach((el) => { - const text = textOf(el); - const title = (el.getAttribute && el.getAttribute('title')) || ''; - const aria = (el.getAttribute && (el.getAttribute('aria-label') || el.getAttribute('arialabel'))) || ''; - const candidate = (title || aria || text || '').replace(/\s+/g, ' ').trim(); - if (!candidate || candidate.length > 20) return; - - const rect = el.getBoundingClientRect(); - const area = rect.width * rect.height; - if (area <= 0 || area > 20000) return; - - const key = `${candidate}|${Math.round(rect.left)}|${Math.round(rect.top)}|${Math.round(rect.width)}|${Math.round(rect.height)}`; - if (seen.has(key)) return; - seen.add(key); - - const countryMatch = countryOfText(candidate); - if (countryMatch) { - countries.push({ - country: countryMatch.country, - x: rect.left, - y: rect.top + rect.height / 2, - h: rect.height, - area, - }); - return; - } - - if (/^\d+(?:\.\d+)?\s*%$/.test(candidate)) { - percentages.push({ - value: candidate.replace(/\s+/g, ''), - x: rect.left + rect.width / 2, - y: rect.top + rect.height / 2, - area, - }); - } - }); - - const dedupedCountries = []; - countries - .sort((a, b) => a.y - b.y || a.x - b.x || a.area - b.area) - .forEach((item) => { - const exists = dedupedCountries.some((row) => row.country === item.country && Math.abs(row.y - item.y) < 8); - if (!exists) dedupedCountries.push(item); - }); - - const results = dedupedCountries.map((row) => { - const sameRow = percentages - .filter((item) => item.x > row.x + 20 && Math.abs(item.y - row.y) <= Math.max(14, row.h)) - .sort((a, b) => a.x - b.x || a.y - b.y || a.area - b.area); - - const unique = []; - sameRow.forEach((item) => { - if (!unique.some((existing) => existing.value === item.value && Math.abs(existing.x - item.x) < 8)) { - unique.push(item); - } - }); - - return { - country: row.country, - ratio2DaysAgo: unique[0] ? unique[0].value : '', - ratio30DaysAgo: unique[1] ? unique[1].value : '', - source: 'expanded-card-geometry', - }; - }); - - return results.filter((item) => item.ratio2DaysAgo || item.ratio30DaysAgo); -} - -function scoreRegion(el) { - const text = textOf(el); - if (!/%/.test(text)) return 0; - - let score = 0; - if (/推荐报价百分比|推荐报价|featured offer percentage|featured offer|buy box/i.test(text)) score += 80; - if (/2\s*天前|30\s*天前|2\s*日前|30\s*日前|2\s*days?\s*ago|30\s*days?\s*ago/i.test(text)) score += 80; - if (/欧洲|英国|德国|法国|西班牙|意大利|Europe|UK|United Kingdom|Germany|France|Spain|Italy/i.test(text)) score += 40; - if (/%/.test(text)) score += 20; - if (isVisible(el)) score += 10; - if (text.length > 2500) score -= 40; - return score; -} - -function isRelevantRatioRow(row) { - const combined = `${row.raw_text} ${row.label_text} ${row.percentage_text}`; - const hasDayLabels = /2\s*天前|30\s*天前|2\s*日前|30\s*日前|2\s*days?\s*ago|30\s*days?\s*ago/i.test(combined); - const hasCountries = /欧洲|英国|德国|法国|西班牙|意大利|Europe|UK|United Kingdom|Germany|France|Spain|Italy/i.test(combined); - if (!/%|2\s*天前|30\s*天前|2\s*日前|30\s*日前|2\s*days?\s*ago|30\s*days?\s*ago/i.test(combined) && !hasCountries) return false; - if (row.raw_text.length > 800 && !hasDayLabels && !hasCountries) return false; - return true; -} - -function collectRelevantRows(sourceElements) { - const byText = new Map(); - const scoped = []; - sourceElements.forEach((root) => walkRoots(root, scoped, new Set())); - scoped - .filter((el) => isVisible(el)) - .forEach((el, index) => { - const row = rowOf(el, index); - if (!isRelevantRatioRow(row)) return; - const combined = `${row.raw_text} ${row.label_text} ${row.percentage_text}`; - const key = `${combined}|${Math.round(row.rect_left)}|${Math.round(row.rect_top)}|${Math.round(row.rect_width)}|${Math.round(row.rect_height)}`; - if (!byText.has(key)) byText.set(key, row); - }); - return Array.from(byText.values()); -} - -function scrollableElements(elements) { - return elements.filter((el) => { - if (!el || !el.getBoundingClientRect || !isVisible(el)) return false; - const style = window.getComputedStyle(el); - if (!/(auto|scroll)/i.test(`${style.overflowY} ${style.overflow}`)) return false; - return el.scrollHeight > el.clientHeight + 20; - }); -} - -function collectRowsAcrossScroll(sourceElements, visibleElements) { - const targets = scrollableElements(visibleElements); - if (document.scrollingElement) targets.push(document.scrollingElement); - - const byKey = new Map(); - const originals = targets.map((target) => ({ target, top: target.scrollTop })); - for (const target of targets) { - const maxTop = Math.max(0, target.scrollHeight - target.clientHeight); - const positions = [...new Set([0, Math.floor(maxTop / 2), maxTop])]; - for (const position of positions) { - target.scrollTop = position; - collectRelevantRows(sourceElements).forEach((row) => { - const combined = `${row.raw_text} ${row.label_text} ${row.percentage_text}`; - const key = `${combined}|${Math.round(row.rect_left)}|${Math.round(row.rect_top)}|${Math.round(row.rect_width)}|${Math.round(row.rect_height)}`; - if (!byKey.has(key)) byKey.set(key, row); - }); - } - } - originals.forEach(({ target, top }) => { - target.scrollTop = top; - }); - return Array.from(byKey.values()); -} - -const visible = allElements().filter((el) => isVisible(el)); -const expandedCard = expandedCardOf(visible); -const expandedDirectRows = directRowsFromExpandedCard(expandedCard); -const directRows = expandedDirectRows.length ? expandedDirectRows : directCountryRows(visible); -const regions = visible - .map((el, index) => { - const rect = el.getBoundingClientRect(); - return { el, index, score: scoreRegion(el), text: textOf(el), area: rect.width * rect.height }; - }) - .filter((row) => row.score > 0) - .sort((a, b) => { - if (b.score !== a.score) return b.score - a.score; - if (a.text.length !== b.text.length) return a.text.length - b.text.length; - return a.area - b.area; - }); - -const sourceElements = expandedCard ? [expandedCard] : (regions.length ? [regions[0].el] : visible); -const scoped = []; -sourceElements.forEach((root) => walkRoots(root, scoped, new Set())); - -const byText = new Map(); -collectRelevantRows(sourceElements) - .concat(collectRowsAcrossScroll(sourceElements, visible)) - .forEach((row) => { - const combined = `${row.raw_text} ${row.label_text} ${row.percentage_text}`; - const key = `${combined}|${Math.round(row.rect_left)}|${Math.round(row.rect_top)}|${Math.round(row.rect_width)}|${Math.round(row.rect_height)}`; - if (!byText.has(key)) byText.set(key, row); - }); - -return { - directRows, - region: regions.length - ? { - score: regions[0].score, - text: regions[0].text.slice(0, 2000), - outerHTML: (regions[0].el.outerHTML || '').slice(0, 3000), - } - : { - url: window.location.href, - title: document.title, - }, - rows: Array.from(byText.values()), - candidates: regions.slice(0, 20).map((row) => ({ - index: row.index, - score: row.score, - text: row.text.slice(0, 1000), - })), -}; diff --git a/app/amazon/similar_asin.py b/app/amazon/similar_asin.py deleted file mode 100644 index 1864542..0000000 --- a/app/amazon/similar_asin.py +++ /dev/null @@ -1,941 +0,0 @@ -# encoding utf-8 - -import json -from pathlib import Path -import base64 -import time -import re -import traceback -from datetime import datetime -from collections import defaultdict -import requests -from urllib.parse import quote -import os -from curl_cffi import requests as requests_frp - -from config import base_dir - - -from amazon.tool import show_notification,get_shop_info,remove_special_characters,split_currency_values -from amazon.amazon_base import TaskBase - -from amazon.chrome_base import ChromeAmzoneBase - -from config import runing_task, runing_shop,base_dir,DELETE_BRAND_API_BASE - -try: - from config import proxy_url as CONFIG_PROXY_URL, proxy_mode as CONFIG_PROXY_MODE -except ImportError: - CONFIG_PROXY_URL = None - CONFIG_PROXY_MODE = 1 - -# Forbidden 后 3 分钟内统一使用代理:记录代理生效截止时间与当前代理 -_FORBIDDEN_PROXY_UNTIL_Similar = 0.0 -_FORBIDDEN_PROXY_DICT_Similar = None -_FORBIDDEN_PROXY_MINUTES_Similar = 0.5 - - -class ChromeAmzone(ChromeAmzoneBase): - mark_name = "亚马逊相似ASIN" - - def wait_load_complete(self): - try: - for _ in range(3): - content_area = self.tab.eles('xpath://div[@class="ap-sbi-aside__main"]', timeout=20) - if len(content_area) > 0: - pass - - except Exception as e: - self.log(f"等待加载完成失败,{e},等待5秒") - time.sleep(5) - - def encode_custom(self,input_): - if not input_ or not isinstance(input_, str): - return "" - - transformed = "" - - # 第一个字符:字符编码 + 字符串长度 - transformed += chr((ord(input_[0]) + len(input_)) & 0xFFFF) - - # 后续字符:当前字符编码 + 前一个字符编码 - for i in range(1, len(input_)): - current_code = ord(input_[i]) - prev_code = ord(input_[i - 1]) - transformed += chr((current_code + prev_code) & 0xFFFF) - - # 对应 JavaScript 的 encodeURIComponent - encoded = quote(transformed, safe="-_.!~*'()") - - # 对应 replace(/[!'()*]/g, ...) - for ch in ["!", "'", "(", ")", "*"]: - encoded = encoded.replace(ch, "%" + format(ord(ch), "x")) - return encoded - - def image_to_base64(self,image_source: str) -> str: - """ - 将图片链接(URL 或本地文件路径)转换为 Base64 编码的字符串。 - """ - if image_source.startswith(('http://', 'https://')): - response = requests.get(image_source, timeout=10,headers={ - "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 Edg/142.0.0.0 18444" - }) - response.raise_for_status() # 非 2xx 状态码将抛出异常 - image_data = response.content - else: - path = Path(image_source) - if not path.is_file(): - raise ValueError(f"本地文件不存在: {image_source}") - with open(path, 'rb') as f: - image_data = f.read() - base64_str = base64.b64encode(image_data).decode('utf-8') - return base64_str - - def get_aliprice_data(self,page=1,title="",domain="",category="",imageBase64=""): - """ - "fishkeeper Quick Aquarium Siphon Pump Gravel Cleaner - 256GPH Adjustable Powerful Fish Tank Vacuum Gravel Cleaning Kit for Aquarium Water Changer, Sand Cleaner, Dirt Removal : Amazon.co.uk: Pet Supplies" - 标题 : - - """ - global _FORBIDDEN_PROXY_UNTIL_Similar, _FORBIDDEN_PROXY_DICT_Similar - - headers = { - "accept": "application/json, text/plain, */*", - "accept-language": "zh-CN,zh;q=0.9,en;q=0.8", - "browser": "chrome", - "cache-control": "no-cache", - "channel": "chrome_offline", - "content-type": "application/json;charset=UTF-8", - "ext-id": "10100", - "ext_id": "10100", - "origin": "chrome-extension://ephkdklmdkaakeleplfpahjphaokcllh", - "platform": "1688", - "pragma": "no-cache", - "priority": "u=1, i", - "sec-fetch-dest": "empty", - "sec-fetch-mode": "cors", - "sec-fetch-site": "none", - "sec-fetch-storage-access": "active", - "version": "3.7.4", - "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36" - } - cookie = { - "e-info": "[{\"e-name\":\"1688\",\"adid\":\"100\",\"version\":\"3.7.4\",\"ext_id\":\"10100\"}]", - "language": "chinese", - "province_code": "Guangdong", - "_ct": "czg", - "_e_ct": "czg", - "is_reto": "1", - "crossborder": "1", - "agent": "0", - "first_view": "1", - "currency": "USD", - "is_coo": "1", - "plugin": "chrome", - "plugin_ext": "100,129", - "m-info": "[{\"platform\":\"1688\",\"version\":\"3.7.4\",\"browser\":\"chrome\",\"m\":\"uni\",\"t\":1777902599578}]" - } - url = "https://api.aliprice.com/index.php/chrome/items/imageAnalysis" - itemTitle = f"{title} : {domain}: {category}" - - params = {"page": page, "size": 20, "website": "1688_lite2", "language": "zh-CN", "currency": "USD", "from": "", - "itemTitle": itemTitle, "domain": domain } - params['sign'] = self.encode_custom(json.dumps(params, ensure_ascii=False)) - data = { - "imageBase64" : imageBase64 - } - - proxies = None - - # 若 3 分钟内曾出现 Forbidden,则直接使用当时保存的代理 - now = time.time() - if now < _FORBIDDEN_PROXY_UNTIL_Similar and _FORBIDDEN_PROXY_DICT_Similar: - proxies = _FORBIDDEN_PROXY_DICT_Similar - print("处于 Forbidden 代理窗口内,直接使用代理", proxies) - - # 发送第一次请求 - try: - response = requests_frp.post(url, headers=headers, params=params, json=data, impersonate="chrome101", - cookies=cookie, proxies=proxies,verify=False) - response.encoding = "utf-8" - - # 检查响应状态码和数据有效性 - need_retry = False - if response.status_code != 200: - print(f"请求失败,状态码: {response.status_code}") - need_retry = True - else: - try: - result_data = response.json() - # 检查是否获取到有效数据 - if not result_data or not isinstance(result_data, dict): - print("返回数据为空或格式不正确") - need_retry = True - elif "Forbidden" in response.text or "Too Many Requests" in response.text: - print("返回Forbidden或Too Many Requests") - need_retry = True - except Exception as e: - print(f"解析响应JSON失败: {e}") - need_retry = True - - # 如果需要重试且配置了代理URL - # need_retry = True - if need_retry and CONFIG_PROXY_URL and not proxies: - try: - proxy_resp = requests.get(CONFIG_PROXY_URL, timeout=10) - print("代理请求结果->:", proxy_resp.text) - - # 模式 2:账号密码代理,接口返回 JSON - if CONFIG_PROXY_MODE == 2: - resp_json = proxy_resp.json() - proxy_list = resp_json.get("data", {}).get("list") or [] - first_item = proxy_list[0] if proxy_list else None - if first_item: - ip = first_item.get("ip") - port = first_item.get("port") - account = first_item.get("account") - password = first_item.get("password") - if ip and port and account and password: - auth_proxy = f"{account}:{password}@{ip}:{port}" - print("获取到账号密码代理:", auth_proxy) - proxies = { - "http": f"http://{auth_proxy}", - "https": f"http://{auth_proxy}", - } - # 默认模式 1:普通 IP:port 文本 - if CONFIG_PROXY_MODE != 2: - proxy_ip = (proxy_resp.text or "").strip() - if proxy_ip: - proxies = { - "http": f"http://{proxy_ip}", - "https": f"https://{proxy_ip}", - } - - if proxies: - print("使用代理重试请求") - response = requests_frp.post(url, headers=headers, params=params, json=data, - impersonate="chrome101", cookies=cookie, proxies=proxies) - response.encoding = "utf-8" - print("代理重试结果状态码:", response.status_code) - - # 记录 3 分钟内都使用该代理 - _FORBIDDEN_PROXY_UNTIL_Similar = now + _FORBIDDEN_PROXY_MINUTES_Similar * 60 - _FORBIDDEN_PROXY_DICT_Similar = proxies - - except Exception as e: - print("获取代理或重试失败:", e) - - # 返回最终结果 - result_data = response.json() - return result_data - - except Exception as e: - print(f"get_aliprice_data 请求异常: {e}") - return {} - - def _scrape_data(self): - """ - 抓取商品数据 - - Returns: - dict: 抓取到的数据 - """ - data = { - 'image_url': "", - 'title': "", - 'category' : '', - 'sku' : '', - 'success' : True - } - - try: - # 等待页面加载 - # time.sleep(3) - title_ele = self.tab.ele('xpath://h1[@id="title"]',timeout=30) - title = title_ele.text - data["title"] = title - imge_ele = self.tab.ele('xpath://div[@id="imgTagWrapperId"]//img',timeout=20) - - image_url = "" - min_image_url = "" - data_a_dynamic_image = imge_ele.attr("data-a-dynamic-image") - if data_a_dynamic_image: - dynamic_image_json = json.loads(data_a_dynamic_image) - self.log(f"图片信息:{dynamic_image_json}") - max_area = 0 - min_area = 0 - - for url, (width, height) in dynamic_image_json.items(): - area = width * height - if area > max_area: - max_area = area - image_url = url - if min_area == 0: - min_area = area - min_image_url = url - if area < min_area: - min_area = area - min_image_url = url - - if not image_url: - image_url = imge_ele.attr("src") - - if not min_image_url: - min_image_url = imge_ele.attr("src") - - - data["image_url"] = image_url - data["min_image_url"] = min_image_url - - # sku - sku_ele_ls = self.tab.eles('xpath://ul[@class="a-unordered-list a-vertical a-spacing-mini"]',timeout=20) - if len(sku_ele_ls) > 0: - data["sku"] = sku_ele_ls[0].text - category = self.tab.eles('xpath://div[@id="wayfinding-breadcrumbs_feature_div"]//span[@class="a-list-item"]//a[@class="a-link-normal a-color-tertiary"]',timeout=20) - if len(category) > 0: - data["category"] = category[0].text - return data - - except Exception as e: - print(f"抓取数据时出错: {traceback.format_exc()}") - data["success"] = False - return data - - def run(self, country, asin,total_page=2): - """ - 运行亚马逊详情采集任务 - Args: - country: 国家名称(如:英国、德国、法国、西班牙、意大利) - asin: 亚马逊商品ASIN码 - Returns: - dict: 包含采集到的数据 - """ - return_data = {} - try: - # 验证国家是否支持 - if country not in self.country_info: - error_msg = f"不支持的国家: {country},支持的国家有: {list(self.country_info.keys())}" - print(error_msg) - # show_notification(error_msg, "error") - return None - - # 获取国家配置 - country_config = self.country_info[country] - zip_code = country_config["zip_code"] - mark = country_config.get("mark") - - # 1. 根据国家和ASIN拼接链接 - base_url = country_config["url"] - # 提取域名部分 - domain = base_url.split("/dp/")[0] - # 拼接新的URL - product_url = f"{domain}/dp/{asin}" - self.log(f"正在访问: {product_url}") - - # 打开链接 - self.tab.get(product_url) - time.sleep(3) # 等待页面初步加载 - self.tab.wait.doc_loaded(timeout=30, raise_err=False) - - self.close_init_popup() - # 2. 切换国家/设置邮编 - self.log(f"正在检查并设置邮编: {zip_code},标识: {mark}") - self._set_zip_code(zip_code, mark) - - # self.tab.wait.doc_loaded(timeout=5, raise_err=False) - - # 3. 抓取数据 - self.log("正在抓取商品数据...") - data = self._scrape_data() - - return_data.update(data) - - # 判断是否采集标题出错 - new_size = "220,220" - pattern = r"\._(?:[A-Z]+)?(\d+)_\." - # replacement = f"._{new_size}_.jpg" - # 使用正则替换 - # image_new_url = re.sub(pattern, lambda m: replacement, data["image_url"]) - image_new_url = data["min_image_url"] - - print(image_new_url) - - iamge_base64 = self.image_to_base64(image_new_url) - - similar_data = [] - # 4、请求获取插件的数据 - if image_new_url: - for page_num in range(total_page): - resp_data = self.get_aliprice_data( - page=page_num+1, - title = data["title"], - domain=domain, - category=data["category"], - imageBase64 = iamge_base64 - ) - self.log(f"Aliprice 扩展数据获取:{str(resp_data)[0:200]}") - if len(resp_data.get("data",[])) > 0: - for i in resp_data.get("data"): - similar_data.append(i) - - data["similar_data"] = similar_data - - # 添加基本信息 - data['country'] = country - data['asin'] = asin - data['url'] = product_url - data['timestamp'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') - - print(f"数据抓取完成: {json.dumps(return_data)}") - return_data.update(data) - - return return_data - - except Exception as e: - error_msg = f"运行出错: {traceback.format_exc()}" - print(error_msg) - # show_notification(f"采集失败: {str(e)}", "error") - raise RuntimeError(f"{traceback.format_exc()}") - return return_data - - -class SimilarAsinTask(TaskBase): - mark_name = "相似ASIN采集" - - @staticmethod - def group_by_id_prefix(data): - """ - 根据每条数据的 id 字段进行分组: - - 如果 id 为 "2_1",则取 "_" 前面的 "2" 作为分组 key - - 如果 id 为 "1",则分组 key 就是 "1" - - 相同 key 的数据归为同一组 - - :param data: 原始列表数据 - :return: 二维列表,按 id 前缀分组 - """ - grouped = defaultdict(list) - - for item in data: - item_id = str(item.get("id", "")) - group_key = item_id.split("_")[0] - grouped[group_key].append(item) - - return list(grouped.values()) - - @staticmethod - def normalize_groups(data): - groups = data.get("groups") - if isinstance(groups, list) and len(groups) > 0: - return groups - - rows = data.get("rows") or data.get("items") or [] - if not isinstance(rows, list) or len(rows) == 0: - return [] - - normalized = [] - for items in SimilarAsinTask.group_by_id_prefix(rows): - first = items[0] if items else {} - item_id = str(first.get("id") or first.get("displayId") or "") - base_id = item_id.split("_")[0] if item_id else "" - normalized.append({ - "sourceFileKey": first.get("sourceFileKey", ""), - "sourceFilename": first.get("sourceFilename", ""), - "groupKey": first.get("groupKey") or base_id, - "baseId": first.get("baseId") or base_id, - "displayId": first.get("displayId") or item_id, - "items": items, - }) - return normalized - - def fetch_parsed_payload(self, task_id, user_id=1): - url = f"{DELETE_BRAND_API_BASE}/api/similar-asin/tasks/{task_id}/parsed-payload" - response = requests.get(url, params={"user_id": user_id}, timeout=300, verify=False) - response.raise_for_status() - payload = response.json() if response.text else {} - if isinstance(payload, dict) and payload.get("success"): - return payload.get("data") or {} - raise RuntimeError(f"获取货源查询解析载荷失败: {payload}") - - def _merge_parsed_payload(self, data, parsed_payload): - payload_rows = parsed_payload.get("allItems") or parsed_payload.get("items") or [] - merged = { - **data, - "groups": parsed_payload.get("groups") or [], - "rows": payload_rows, - } - if parsed_payload.get("aiPrompt"): - merged["prompt"] = parsed_payload.get("aiPrompt") - if parsed_payload.get("apiKey") and not merged.get("api_key"): - merged["api_key"] = parsed_payload.get("apiKey") - return merged - - def process_task(self, task_data: dict): - """处理审批任务主入口 - - Args: - task_data: 任务数据 - """ - try: - data = task_data.get("data", {}) - task_id = data.get("taskId") - parsed_payload = self.fetch_parsed_payload(task_id, data.get("user_id") or data.get("userId") or 1) - data = self._merge_parsed_payload(data, parsed_payload) - groups = self.normalize_groups(data) - print(groups) - - if not task_id: - self.log("任务ID为空,跳过", "WARNING") - return - - self.log(f"开始处理爬取任务 {task_id},{len(groups)} 个任务") - - if not groups: - self.log("appearance-patent groups/rows is empty, skip", "WARNING") - return - - runing_task[task_id] = { - "status": "running", - "start_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), - "total_shops": 1, - "processed_shops": 0, - "total_countries": len(groups) , - "processed_countries": 0, - "total_asins": 0, - "processed_asins": 0, - "success_count": 0, - "failed_count": 0, - "stop_requested": False - } - - # 检查是否收到暂停请求 - if task_id in runing_task and runing_task[task_id].get("stop_requested", False): - self.log(f"检测到任务 {task_id} 的暂停请求,停止处理", "WARNING") - runing_task[task_id]["status"] = "stopped" - return - max_retry = 3 - show_notification(f"开始爬取数据", "info") - chrome = ChromeAmzone() - try: - # 数据整理 - # new_items = self.group_by_id_prefix(items) - result = [] - for gp_index,gp in enumerate(groups): - items = gp.get("items", []) - group_item = [] - for index,value in enumerate(items): - print(value) - return_data = { - 'image_url': "", - 'title': "", - 'category' : '', - 'sku' : '', - 'success' : False, - 'similar_data' : [] - } - asin = value.get("asin") - country = value.get("country") - for _ in range(max_retry): - try: - return_data = chrome.run(country, asin,total_page=1) or {} - self.log(f"抓取结果->{return_data}") - break - except Exception as e: - # if "与页面的连接已断开" in str(e): - chrome = ChromeAmzone() - self.log(f"{asin}抓取数据报错,{e}") - # if not isinstance(return_data, dict): - # return_data = {} - # if return_data.get("image_url"): - # break - - group_item.append({ - "sourceFileKey": value.get("sourceFileKey",""), - "sourceFilename": value.get("sourceFilename",""), - "rowToken": value.get("rowToken",""), - "groupKey": value.get("groupKey",""), - "id": value.get("values",{}).get("id",""), - "asin": value.get("asin",""), - "sku" : return_data.get("sku",""), - "country": value.get("country",""), - "url": return_data.get("image_url",""), - "title": return_data.get("title",""), - "done": False, - "urls" : [i.get("ori_picture") for i in return_data.get("similar_data",[])[:16]] - }) - # task_id: int, chunkIndex:int,chunkTotal: int, country_code: str, asin: str, status: dict,error:str="", - # item_data:dict={}, - - - res = { - "sourceFileKey": gp.get("sourceFileKey"), - "sourceFilename": gp.get("sourceFilename"), - "groupKey": gp.get("groupKey"), - "baseId": gp.get("baseId"), - "displayId": gp.get("displayId"), - "items": group_item - } - - # print("================") - result.append(res) - # print("================") - is_done = gp_index == len(groups)-1 - if len(result) > 5 or is_done: - self.post_result(task_id=task_id,chunkIndex=gp_index+1,chunkTotal=len(groups), - asin=asin,item_data=result,is_done=is_done) - result = [] - - - if len(result) > 0: - is_done = True - self.post_result(task_id=task_id, chunkIndex=len(groups), chunkTotal=len(groups), - asin=asin, item_data=result, is_done=is_done) - - - # 更新已处理店铺数 - if task_id in runing_task: - runing_task[task_id]["processed_shops"] += 1 - except Exception as e: - self.log(f"处理店铺 {task_id} 失败: {str(e)}", "ERROR") - self.log(traceback.format_exc(), "ERROR") - - try: - chrome.close() - except Exception as e: - print("退出浏览器出错", e) - - # 更新任务状态 - if task_id in runing_task: - if runing_task[task_id].get("stop_requested", False): - runing_task[task_id]["status"] = "stopped" - self.log(f"任务 {task_id} 已被暂停!") - else: - runing_task[task_id]["status"] = "completed" - - self.log(f"任务 {task_id} 处理完成!") - - except Exception as e: - self.log(f"任务处理失败: {traceback.format_exc()}", "ERROR") - if task_id: - if task_id in runing_task: - runing_task[task_id]["status"] = "failed" - runing_task[task_id]["error"] = str(e) - - def post_result(self, task_id: int, chunkIndex:int,chunkTotal: int, asin: str, error:str="", - item_data:dict={}, - is_done: bool = False): - """回传处理结果到API - """ - - url = f"{DELETE_BRAND_API_BASE}/api/similar-asin/tasks/{task_id}/result" - - payload ={ - "submissionId": f"{task_id}", - "chunkIndex": chunkIndex, - "chunkTotal": chunkTotal, - "error": error, - "groups": item_data, - "done": is_done - } - - max_retries = 3 - for retry in range(max_retries): - try: - request_timeout = 300 if is_done else 30 - print("================【详情采集】=====================") - self.log(f"尝试回传结果 (第 {retry + 1}/{max_retries} 次)") - self.log(f"回传URL: {url}") - self.log(f"回传数据: {payload}") - response = requests.post( - url, - json=payload, - headers={"Content-Type": "application/json"}, - timeout=request_timeout, - verify=False - ) - self.log(f"回传结果: {response.text}") - data = response.json() if response.text else {} - if response.status_code == 200 and isinstance(data, dict) and data.get("success"): - self.log(f"结果回传成功: {asin} - {item_data}") - return - else: - self.log(f"结果回传失败,状态码: {response.status_code}", "WARNING") - print("=====================================") - - except Exception as e: - self.log(f"调用API异常: {str(e)}", "ERROR") - print("=====================================") - - # 如果还有重试机会,等待后继续 - if retry < max_retries - 1: - time.sleep(2) - - self.log(f"已达到最大重试次数,结果回传最终失败", "ERROR") - # raise RuntimeError("已达到最大重试次数,结果回传最终失败") - -if __name__ == '__main__': - spide = ChromeAmzone() - - resp = spide.run( - country="德国", asin="B0CJ8SNXXV", total_page=2 - ) - print(resp) -# task_data = { -# "type": "similar-asin-run", -# "ts": 1778038688824, -# "data": { -# "taskId": 6850, -# "api_key": "sk-EMcDFg36zCeWUtCbRzKUbrRZyNeC6M4KBhY6fAVcNP7GG4xI", -# "groups": [ -# { -# "sourceFileKey": "cdfa437df62b40a0bde5682a05c1f6a3", -# "sourceFilename": "17(1) - 副本1.xlsx", -# "groupKey": "similar-asin:6850", -# "baseId": "", -# "displayId": "1", -# "items": [ -# { -# "sourceFileKey": "cdfa437df62b40a0bde5682a05c1f6a3", -# "sourceFilename": "17(1) - 副本1.xlsx", -# "rowToken": "cdfa437df62b40a0bde5682a05c1f6a3::row::2", -# "groupKey": "cdfa437df62b40a0bde5682a05c1f6a3::1@2", -# "id": "1", -# "asin": "B0D792ND9V", -# "country": "英国", -# "price": "12.29", -# "url": "", -# "title": "", -# "target_urls": [] -# }, -# { -# "sourceFileKey": "cdfa437df62b40a0bde5682a05c1f6a3", -# "sourceFilename": "17(1) - 副本1.xlsx", -# "rowToken": "cdfa437df62b40a0bde5682a05c1f6a3::row::3", -# "groupKey": "cdfa437df62b40a0bde5682a05c1f6a3::2@3", -# "id": "2_1", -# "asin": "B0D14L34S7", -# "country": "英国", -# "price": "14.88", -# "url": "", -# "title": "", -# "target_urls": [] -# }, -# { -# "sourceFileKey": "cdfa437df62b40a0bde5682a05c1f6a3", -# "sourceFilename": "17(1) - 副本1.xlsx", -# "rowToken": "cdfa437df62b40a0bde5682a05c1f6a3::row::4", -# "groupKey": "cdfa437df62b40a0bde5682a05c1f6a3::2@3", -# "id": "2_2", -# "asin": "B0D14N8FJY", -# "country": "英国", -# "price": "15.36", -# "url": "", -# "title": "", -# "target_urls": [] -# }, -# { -# "sourceFileKey": "cdfa437df62b40a0bde5682a05c1f6a3", -# "sourceFilename": "17(1) - 副本1.xlsx", -# "rowToken": "cdfa437df62b40a0bde5682a05c1f6a3::row::5", -# "groupKey": "cdfa437df62b40a0bde5682a05c1f6a3::2@3", -# "id": "2_3", -# "asin": "B0D14NBL5D", -# "country": "英国", -# "price": "14.87", -# "url": "", -# "title": "", -# "target_urls": [] -# }, -# { -# "sourceFileKey": "cdfa437df62b40a0bde5682a05c1f6a3", -# "sourceFilename": "17(1) - 副本1.xlsx", -# "rowToken": "cdfa437df62b40a0bde5682a05c1f6a3::row::6", -# "groupKey": "cdfa437df62b40a0bde5682a05c1f6a3::2@3", -# "id": "2_4", -# "asin": "B0D14M5X4J", -# "country": "英国", -# "price": "14.41", -# "url": "", -# "title": "", -# "target_urls": [] -# }, -# { -# "sourceFileKey": "cdfa437df62b40a0bde5682a05c1f6a3", -# "sourceFilename": "17(1) - 副本1.xlsx", -# "rowToken": "cdfa437df62b40a0bde5682a05c1f6a3::row::7", -# "groupKey": "cdfa437df62b40a0bde5682a05c1f6a3::3@7", -# "id": "3_1", -# "asin": "B0CWQFZMGY", -# "country": "英国", -# "price": "17.05", -# "url": "", -# "title": "", -# "target_urls": [] -# }, -# { -# "sourceFileKey": "cdfa437df62b40a0bde5682a05c1f6a3", -# "sourceFilename": "17(1) - 副本1.xlsx", -# "rowToken": "cdfa437df62b40a0bde5682a05c1f6a3::row::8", -# "groupKey": "cdfa437df62b40a0bde5682a05c1f6a3::3@7", -# "id": "3_2", -# "asin": "B0CX8D68L3", -# "country": "英国", -# "price": "16.46", -# "url": "", -# "title": "", -# "target_urls": [] -# }, -# { -# "sourceFileKey": "cdfa437df62b40a0bde5682a05c1f6a3", -# "sourceFilename": "17(1) - 副本1.xlsx", -# "rowToken": "cdfa437df62b40a0bde5682a05c1f6a3::row::9", -# "groupKey": "cdfa437df62b40a0bde5682a05c1f6a3::4@9", -# "id": "4_1", -# "asin": "B0CX87XXWJ", -# "country": "英国", -# "price": "17.54", -# "url": "", -# "title": "", -# "target_urls": [] -# }, -# { -# "sourceFileKey": "cdfa437df62b40a0bde5682a05c1f6a3", -# "sourceFilename": "17(1) - 副本1.xlsx", -# "rowToken": "cdfa437df62b40a0bde5682a05c1f6a3::row::10", -# "groupKey": "cdfa437df62b40a0bde5682a05c1f6a3::5@10", -# "id": "5_1", -# "asin": "B0CR3PMR8L", -# "country": "英国", -# "price": "16.74", -# "url": "", -# "title": "", -# "target_urls": [] -# } -# ] -# } -# ], -# "rows": [ -# { -# "sourceFileKey": "cdfa437df62b40a0bde5682a05c1f6a3", -# "sourceFilename": "17(1) - 副本1.xlsx", -# "rowToken": "cdfa437df62b40a0bde5682a05c1f6a3::row::2", -# "groupKey": "cdfa437df62b40a0bde5682a05c1f6a3::1@2", -# "id": "1", -# "asin": "B0D792ND9V", -# "country": "英国", -# "price": "12.29", -# "url": "", -# "title": "", -# "target_urls": [] -# }, -# { -# "sourceFileKey": "cdfa437df62b40a0bde5682a05c1f6a3", -# "sourceFilename": "17(1) - 副本1.xlsx", -# "rowToken": "cdfa437df62b40a0bde5682a05c1f6a3::row::3", -# "groupKey": "cdfa437df62b40a0bde5682a05c1f6a3::2@3", -# "id": "2_1", -# "asin": "B0D14L34S7", -# "country": "英国", -# "price": "14.88", -# "url": "", -# "title": "", -# "target_urls": [] -# }, -# { -# "sourceFileKey": "cdfa437df62b40a0bde5682a05c1f6a3", -# "sourceFilename": "17(1) - 副本1.xlsx", -# "rowToken": "cdfa437df62b40a0bde5682a05c1f6a3::row::4", -# "groupKey": "cdfa437df62b40a0bde5682a05c1f6a3::2@3", -# "id": "2_2", -# "asin": "B0D14N8FJY", -# "country": "英国", -# "price": "15.36", -# "url": "", -# "title": "", -# "target_urls": [] -# }, -# { -# "sourceFileKey": "cdfa437df62b40a0bde5682a05c1f6a3", -# "sourceFilename": "17(1) - 副本1.xlsx", -# "rowToken": "cdfa437df62b40a0bde5682a05c1f6a3::row::5", -# "groupKey": "cdfa437df62b40a0bde5682a05c1f6a3::2@3", -# "id": "2_3", -# "asin": "B0D14NBL5D", -# "country": "英国", -# "price": "14.87", -# "url": "", -# "title": "", -# "target_urls": [] -# }, -# { -# "sourceFileKey": "cdfa437df62b40a0bde5682a05c1f6a3", -# "sourceFilename": "17(1) - 副本1.xlsx", -# "rowToken": "cdfa437df62b40a0bde5682a05c1f6a3::row::6", -# "groupKey": "cdfa437df62b40a0bde5682a05c1f6a3::2@3", -# "id": "2_4", -# "asin": "B0D14M5X4J", -# "country": "英国", -# "price": "14.41", -# "url": "", -# "title": "", -# "target_urls": [] -# }, -# { -# "sourceFileKey": "cdfa437df62b40a0bde5682a05c1f6a3", -# "sourceFilename": "17(1) - 副本1.xlsx", -# "rowToken": "cdfa437df62b40a0bde5682a05c1f6a3::row::7", -# "groupKey": "cdfa437df62b40a0bde5682a05c1f6a3::3@7", -# "id": "3_1", -# "asin": "B0CWQFZMGY", -# "country": "英国", -# "price": "17.05", -# "url": "", -# "title": "", -# "target_urls": [] -# }, -# { -# "sourceFileKey": "cdfa437df62b40a0bde5682a05c1f6a3", -# "sourceFilename": "17(1) - 副本1.xlsx", -# "rowToken": "cdfa437df62b40a0bde5682a05c1f6a3::row::8", -# "groupKey": "cdfa437df62b40a0bde5682a05c1f6a3::3@7", -# "id": "3_2", -# "asin": "B0CX8D68L3", -# "country": "英国", -# "price": "16.46", -# "url": "", -# "title": "", -# "target_urls": [] -# }, -# { -# "sourceFileKey": "cdfa437df62b40a0bde5682a05c1f6a3", -# "sourceFilename": "17(1) - 副本1.xlsx", -# "rowToken": "cdfa437df62b40a0bde5682a05c1f6a3::row::9", -# "groupKey": "cdfa437df62b40a0bde5682a05c1f6a3::4@9", -# "id": "4_1", -# "asin": "B0CX87XXWJ", -# "country": "英国", -# "price": "17.54", -# "url": "", -# "title": "", -# "target_urls": [] -# }, -# { -# "sourceFileKey": "cdfa437df62b40a0bde5682a05c1f6a3", -# "sourceFilename": "17(1) - 副本1.xlsx", -# "rowToken": "cdfa437df62b40a0bde5682a05c1f6a3::row::10", -# "groupKey": "cdfa437df62b40a0bde5682a05c1f6a3::5@10", -# "id": "5_1", -# "asin": "B0CR3PMR8L", -# "country": "英国", -# "price": "16.74", -# "url": "", -# "title": "", -# "target_urls": [] -# } -# ] -# } -# } -# sim_asin = SimilarAsinTask({}) -# sim_asin.process_task(task_data) - - - diff --git a/app/amazon/tool.py b/app/amazon/tool.py deleted file mode 100644 index 8031907..0000000 --- a/app/amazon/tool.py +++ /dev/null @@ -1,161 +0,0 @@ -# 导入 webview 用于前端通知 -try: - import webview -except ImportError: - webview = None - - -import requests -from urllib.parse import quote -import re - - -def show_notification(message: str, message_type: str = "error"): - """显示 pywebview 顶层通知(5秒后自动消失) - - Args: - message: 通知消息 - message_type: 消息类型 (success/warning/error/info) - """ - if webview and webview.windows: - try: - # 转义单引号,防止 JavaScript 语法错误 - safe_message = message.replace("'", "\\'").replace('"', '\\"').replace('\n', '\\n') - - # 设置通知样式颜色 - color_map = { - 'success': '#67C23A', - 'warning': '#E6A23C', - 'error': '#F56C6C', - 'info': '#909399' - } - bg_color = color_map.get(message_type, '#F56C6C') - - # 构建前端通知的 JavaScript 代码 - 创建原生 HTML 通知 - js_code = f""" - (function() {{ - // 移除已存在的通知 - var existingNotif = document.getElementById('pywebview-notification'); - if (existingNotif) {{ - existingNotif.remove(); - }} - - // 创建通知容器 - var notif = document.createElement('div'); - notif.id = 'pywebview-notification'; - notif.style.cssText = 'position: fixed; top: 20px; left: 50%; transform: translateX(-50%); ' + - 'background: {bg_color}; color: white; padding: 12px 20px; border-radius: 4px; ' + - 'box-shadow: 0 2px 12px rgba(0,0,0,0.3); z-index: 99999; font-size: 14px; ' + - 'max-width: 600px; word-wrap: break-word; display: flex; align-items: center; gap: 10px;'; - - // 添加消息内容 - var msgSpan = document.createElement('span'); - msgSpan.textContent = '{safe_message}'; - notif.appendChild(msgSpan); - - // 添加关闭按钮 - var closeBtn = document.createElement('span'); - closeBtn.innerHTML = '×'; - closeBtn.style.cssText = 'cursor: pointer; font-size: 18px; font-weight: bold; margin-left: 10px;'; - closeBtn.onclick = function() {{ notif.remove(); }}; - notif.appendChild(closeBtn); - - // 添加到页面 - document.body.appendChild(notif); - - // 5秒后自动消失 - setTimeout(function() {{ - if (notif && notif.parentNode) {{ - notif.style.transition = 'opacity 0.3s'; - notif.style.opacity = '0'; - setTimeout(function() {{ notif.remove(); }}, 300); - }} - }}, 5000); - }})(); - """ - # 在第一个窗口中执行 JavaScript - webview.windows[0].evaluate_js(js_code) - except Exception as e: - print(f"显示通知失败: {str(e)}") - - - - -def get_shop_info(shop_name: str, base_url: str = "http://8.136.19.173:18080") -> requests.Response: - """ - 调用商铺凭证接口 - :param shop_name: 商铺名称,将自动进行 URL 编码 - :param base_url: API 基础地址,默认从 curl 中提取 - :return: requests.Response 对象 - """ - url = f"{base_url}/api/admin/shop-manages/credential" - params = {"shopName": shop_name} - - headers = { - "Accept": "*/*", - "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", - "Cache-Control": "no-cache", - "Connection": "keep-alive", - "Pragma": "no-cache", - "Referer": "http://8.136.19.173:18080/doc.html", - "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36", - "X-Internal-Token": "59c6691199917a2095827b5188502029", - } - - response = requests.get( - url, - params=params, - headers=headers, - verify=False, - timeout=30 - ) - return response - - - -def remove_special_characters(text: str) -> str: - """ - 去除字符串中的特殊字符,只保留数字、小数点和负号。 - 例如:'£24.55' -> '24.55' - """ - # 匹配所有允许的字符:数字、小数点、负号 - # 注意:负号必须位于开头才合法,但这里只做字符保留,不做格式校验 - cleaned = re.sub(r'[^0-9.-]', '', text) - return cleaned - - -def split_currency_values(currency_str: str) -> tuple[float, float]: - """ - 将包含两个货币值的字符串拆分成两个浮点数。 - 参数: - currency_str (str): 格式如 "€22.64 + €0.00" 的字符串,中间以 '+' 分隔, - 每部分可包含任意货币符号或前缀/后缀。 - 返回: - tuple[float, float]: 两个数值,顺序与字符串中的出现顺序一致。 - 异常: - ValueError: 如果字符串不包含正好两个部分,或者任一部分中无法提取到数值。 - """ - # 按第一个 '+' 分割,最多分为两部分 - parts = currency_str.split('+', 1) - if len(parts) != 2: - raise ValueError("字符串必须包含两个由 '+' 分隔的部分") - - # 匹配整数或浮点数(可选负号) - number_pattern = r'-?\d+(?:\.\d+)?' - values = [] - - for part in parts: - # 去除首尾空格 - part = part.strip() - match = re.search(number_pattern, part) - if not match: - raise ValueError(f"无法从 '{part}' 中提取数值") - values.append(float(match.group())) - - return tuple(values) - - -if __name__ == '__main__': - cu_str = "€58.44 + €0.00 匹配" - res = split_currency_values(cu_str) - print(sum(res)) \ No newline at end of file diff --git a/app/app.py b/app/app.py deleted file mode 100644 index 5a53e64..0000000 --- a/app/app.py +++ /dev/null @@ -1,99 +0,0 @@ -""" -卖相AI - Flask 后端 -按功能拆分为蓝图:认证(auth)、主页面(main)、管理员(admin)、图片(image)、品牌(brand) -""" -import os -import logging -from datetime import datetime -from logging.handlers import RotatingFileHandler - -from flask import Flask -from flask_cors import CORS - -from app_common import init_db, BASE_DIR -from blueprints.auth import auth_bp -from blueprints.main import main_bp -from blueprints.admin import admin_bp -from blueprints.image import image_bp -from blueprints.brand import brand_bp -from blueprints.communication import communication_bp - -from config import cache_path, debug - - -def setup_flask_logging(app): - """配置Flask访问日志,输出到独立的日志文件""" - - api_cache_path = os.path.join(cache_path, "api_logs") - os.makedirs(api_cache_path, exist_ok=True) - - # 只在非debug模式下配置文件日志 - if not debug: - # 获取当前日期作为日志文件名的一部分 - today = datetime.now().strftime("%Y_%m_%d") - log_file = os.path.join(api_cache_path, f'api_{today}.log') - - # 创建文件处理器,使用RotatingFileHandler避免日志文件过大 - file_handler = RotatingFileHandler( - log_file, - maxBytes=10 * 1024 * 1024, # 10MB - backupCount=5, - encoding='utf-8' - ) - - # 设置日志格式 - formatter = logging.Formatter( - '[%(asctime)s] %(levelname)s in %(module)s: %(message)s', - datefmt='%Y-%m-%d %H:%M:%S' - ) - file_handler.setFormatter(formatter) - file_handler.setLevel(logging.INFO) - - # 配置Flask应用日志 - app.logger.addHandler(file_handler) - app.logger.setLevel(logging.INFO) - - # 配置Werkzeug日志(HTTP访问日志) - werkzeug_logger = logging.getLogger('werkzeug') - werkzeug_logger.addHandler(file_handler) - werkzeug_logger.setLevel(logging.INFO) - - print(f"API 日志已配置,输出到: {log_file}") - else: - print("Debug模式下,API 日志输出到控制台") - - -def create_app(): - app = Flask(__name__, template_folder=BASE_DIR, static_folder=BASE_DIR) - frontend_origin = os.environ.get('FRONTEND_ORIGIN', '*') - cors_origins = frontend_origin if frontend_origin != '*' else '*' - CORS( - app, - supports_credentials=True, - resources={r"/api/*": {"origins": cors_origins}, r"/login": {"origins": cors_origins}}, - ) - - # 注册蓝图(不设 url_prefix,保持原有 URL 路径不变,前端无需改动) - app.register_blueprint(auth_bp) - app.register_blueprint(main_bp) - app.register_blueprint(admin_bp) - app.register_blueprint(image_bp) - app.register_blueprint(brand_bp) - app.register_blueprint(communication_bp) - - # 配置Flask访问日志 - setup_flask_logging(app) - - return app - - -app = create_app() - - -def run_app(host='127.0.0.1', port=5123): - # init_db() - app.run(host=host, port=port, threaded=True, use_reloader=False) - - -if __name__ == '__main__': - run_app() diff --git a/app/app_common.py b/app/app_common.py deleted file mode 100644 index f42d3a5..0000000 --- a/app/app_common.py +++ /dev/null @@ -1,326 +0,0 @@ -""" -公共模块:数据库连接、初始化、JWT 鉴权装饰器、模板渲染 -供各蓝图复用 -""" -import os -import secrets -from datetime import timedelta -from functools import wraps - -import pymysql -from flask import request, redirect, url_for, jsonify, render_template, render_template_string, g - -from config import mysql_host, mysql_user, mysql_password, mysql_database -from jwt_util import parse_token, get_token_from_request - -BASE_DIR = os.path.dirname(os.path.abspath(__file__)) -STATIC_DIR = os.path.join(BASE_DIR, 'static') -ASSETS_DIR = os.path.join(BASE_DIR, 'assets') -WEB_SOURCE_DIR = os.path.join(BASE_DIR, 'web_source') -TEMPLATE_FALLBACK_DIRS = ( - WEB_SOURCE_DIR, - os.path.join(WEB_SOURCE_DIR, 'templates_backup'), -) - - -def get_db(): - return pymysql.connect( - host=mysql_host, - user=mysql_user, - password=mysql_password, - database=mysql_database, - charset='utf8mb4', - cursorclass=pymysql.cursors.DictCursor - ) - - -def _render_html(template_name: str, **context): - """读取 HTML 模板:若为加密文件则先解密,再渲染。未加密或解密失败时按明文渲染。""" - path = next( - (candidate for candidate in (os.path.join(base_path, template_name) for base_path in TEMPLATE_FALLBACK_DIRS) - if os.path.isfile(candidate)), - None, - ) - if path is None: - return render_template(template_name, **context) - with open(path, "rb") as f: - raw = f.read() - try: - from html_crypto import decrypt - content = decrypt(raw).decode("utf-8") - except Exception: - content = raw.decode("utf-8", errors="replace") - return render_template_string(content, **context) - - -def _render_html_new(template_name: str, **context): - """读取 HTML 模板:若为加密文件则先解密,再渲染。未加密或解密失败时按明文渲染。""" - path = next( - (candidate for candidate in (os.path.join(base_path, template_name) for base_path in TEMPLATE_FALLBACK_DIRS) - if os.path.isfile(candidate)), - None, - ) - if path is None: - return render_template(template_name, **context) - with open(path, "rb") as f: - raw = f.read() - try: - from html_crypto import decrypt - content = decrypt(raw).decode("utf-8") - except Exception: - content = raw.decode("utf-8", errors="replace") - return render_template_string(content, **context) - - - -def _resolve_jwt_user(): - """从 Authorization/cookie 解析 JWT,命中后写入 flask.g 缓存。无效返回 None。""" - cached = getattr(g, "_aiimage_user", None) - if cached is not None: - return cached or None - token = get_token_from_request() - payload = parse_token(token) if token else None - if not payload: - g._aiimage_user = False - return None - g._aiimage_user = payload - g.aiimage_user_id = payload.get("user_id") - g.aiimage_username = payload.get("username") or "" - g.aiimage_device_id = payload.get("device_id") or "" - return payload - - -def current_user_id(): - user = _resolve_jwt_user() - return user.get("user_id") if user else None - - -def current_username(): - user = _resolve_jwt_user() - return user.get("username") if user else "" - - -def _is_session_user_valid(): - """兼容旧调用:判断当前 JWT 用户是否仍存在于数据库。""" - uid = current_user_id() - if not uid: - return False - try: - conn = get_db() - with conn.cursor() as cur: - cur.execute("SELECT id FROM users WHERE id = %s", (uid,)) - row = cur.fetchone() - conn.close() - return bool(row) - except Exception: - return False - - -def _get_current_admin_role(): - """获取当前登录用户的管理角色:super_admin / admin / None(非管理员)""" - uid = current_user_id() - if not uid: - return None, None - try: - conn = get_db() - with conn.cursor() as cur: - cur.execute( - "SELECT id, username, is_admin, role, created_by_id FROM users WHERE id = %s", - (uid,) - ) - row = cur.fetchone() - conn.close() - if not row or not row.get('is_admin'): - return None, None - return row.get('role') or ('super_admin' if row.get('created_by_id') is None else 'admin'), row - except Exception: - return None, None - - -def _unauthorized_response(): - if request.headers.get('X-Requested-With') == 'XMLHttpRequest' \ - or request.path.startswith('/api/') \ - or 'application/json' in (request.headers.get('Accept') or ''): - return jsonify({'success': False, 'error': '未登录'}), 401 - return redirect(url_for('auth.login')) - - -def login_required(f): - @wraps(f) - def decorated(*args, **kwargs): - if not current_user_id(): - return _unauthorized_response() - return f(*args, **kwargs) - return decorated - - -def admin_required(f): - @wraps(f) - def decorated(*args, **kwargs): - uid = current_user_id() - if not uid: - return _unauthorized_response() - try: - conn = get_db() - with conn.cursor() as cur: - cur.execute("SELECT is_admin, role FROM users WHERE id = %s", (uid,)) - row = cur.fetchone() - conn.close() - if not row or not row.get('is_admin'): - if request.headers.get('X-Requested-With') == 'XMLHttpRequest' \ - or request.path.startswith('/api/') \ - or 'application/json' in (request.headers.get('Accept') or ''): - return jsonify({'success': False, 'error': '需要管理员权限'}), 403 - return redirect(url_for('main.home')) - except Exception as e: - if request.headers.get('X-Requested-With') == 'XMLHttpRequest' \ - or request.path.startswith('/api/'): - return jsonify({'success': False, 'error': str(e)}), 500 - return redirect(url_for('main.home')) - return f(*args, **kwargs) - return decorated - - -def init_db(): - """初始化数据库表,若不存在则创建""" - from werkzeug.security import generate_password_hash - conn = pymysql.connect( - host=mysql_host, - user=mysql_user, - password=mysql_password, - charset='utf8mb4' - ) - try: - with conn.cursor() as cur: - cur.execute(f"CREATE DATABASE IF NOT EXISTS `{mysql_database}` DEFAULT CHARSET utf8mb4") - cur.execute(f"USE `{mysql_database}`") - cur.execute(""" - CREATE TABLE IF NOT EXISTS users ( - id INT AUTO_INCREMENT PRIMARY KEY, - username VARCHAR(64) NOT NULL UNIQUE, - password_hash VARCHAR(256) NOT NULL, - is_admin TINYINT(1) DEFAULT 0, - created_at DATETIME DEFAULT CURRENT_TIMESTAMP - ) - """) - cur.execute(""" - CREATE TABLE IF NOT EXISTS image_history ( - id INT AUTO_INCREMENT PRIMARY KEY, - user_id INT NOT NULL, - created_at DATETIME DEFAULT CURRENT_TIMESTAMP, - panel_type VARCHAR(64) DEFAULT '', - original_urls JSON, - params JSON, - result_urls JSON, - long_image_url VARCHAR(1024) DEFAULT NULL, - INDEX idx_user_created (user_id, created_at DESC) - ) - """) - try: - cur.execute("ALTER TABLE image_history ADD COLUMN long_image_url VARCHAR(1024) DEFAULT NULL") - except Exception: - pass - try: - cur.execute("ALTER TABLE users ADD COLUMN machine VARCHAR(64) DEFAULT NULL") - except Exception: - pass - try: - cur.execute("ALTER TABLE users ADD COLUMN role VARCHAR(20) DEFAULT 'normal'") - except Exception: - pass - try: - cur.execute("ALTER TABLE users ADD COLUMN created_by_id INT NULL") - except Exception: - pass - cur.execute(""" - CREATE TABLE IF NOT EXISTS brand_crawl_tasks ( - id INT AUTO_INCREMENT PRIMARY KEY, - user_id INT NOT NULL, - file_paths JSON NOT NULL, - status VARCHAR(20) DEFAULT 'pending', - task_type TINYINT DEFAULT 1 COMMENT '1=立即执行,2=添加任务执行', - result_paths JSON NULL, - error_message TEXT NULL, - progress_current INT DEFAULT 0, - progress_total INT DEFAULT 0, - created_at DATETIME DEFAULT CURRENT_TIMESTAMP, - updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - INDEX idx_user_status (user_id, status) - ) - """) - try: - cur.execute("ALTER TABLE brand_crawl_tasks ADD COLUMN progress_current INT DEFAULT 0") - except Exception: - pass - try: - cur.execute("ALTER TABLE brand_crawl_tasks ADD COLUMN progress_total INT DEFAULT 0") - except Exception: - pass - try: - cur.execute("ALTER TABLE brand_crawl_tasks ADD COLUMN `desc` VARCHAR(500) NULL COMMENT '上传文件名描述'") - except Exception: - pass - try: - cur.execute("ALTER TABLE brand_crawl_tasks ADD COLUMN strategy VARCHAR(20) DEFAULT 'Terms' COMMENT '品牌匹配方式: Terms/Simple'") - except Exception: - pass - try: - cur.execute("ALTER TABLE brand_crawl_tasks ADD COLUMN task_type TINYINT DEFAULT 1 COMMENT '1=立即执行,2=添加任务执行'") - except Exception: - pass - cur.execute(""" - CREATE TABLE IF NOT EXISTS columns ( - id INT AUTO_INCREMENT PRIMARY KEY, - name VARCHAR(128) NOT NULL COMMENT '栏目名', - column_key VARCHAR(64) NOT NULL COMMENT '栏目标识', - created_at DATETIME DEFAULT CURRENT_TIMESTAMP, - UNIQUE KEY uk_column_key (column_key) - ) - """) - cur.execute(""" - CREATE TABLE IF NOT EXISTS user_column_permission ( - user_id INT NOT NULL, - column_id INT NOT NULL, - PRIMARY KEY (user_id, column_id), - FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, - FOREIGN KEY (column_id) REFERENCES columns(id) ON DELETE CASCADE - ) - """) - try: - cur.execute("UPDATE users SET role = 'normal' WHERE (role IS NULL OR role = '') AND (is_admin = 0 OR is_admin IS NULL)") - cur.execute("SELECT MIN(id) AS mid FROM users WHERE is_admin = 1") - row = cur.fetchone() - if row and row.get('mid'): - mid = row['mid'] - cur.execute("UPDATE users SET role = 'super_admin' WHERE id = %s", (mid,)) - cur.execute("UPDATE users SET role = 'admin' WHERE is_admin = 1 AND id != %s", (mid,)) - cur.execute("UPDATE users SET created_by_id = %s WHERE role = 'admin' AND (created_by_id IS NULL)", (mid,)) - except Exception: - pass - conn.commit() - finally: - conn.close() - _create_initial_admin() - - -def _create_initial_admin(): - """若没有任何管理员,则创建默认超级管理员(首次启动时,仅一个)""" - from werkzeug.security import generate_password_hash - try: - conn = get_db() - with conn.cursor() as cur: - cur.execute("SELECT id FROM users WHERE role = 'super_admin' LIMIT 1") - if cur.fetchone(): - conn.close() - return - admin_user = os.environ.get('ADMIN_USER', 'admin') - admin_pwd = os.environ.get('ADMIN_PASSWORD', 'admin123') - pwd_hash = generate_password_hash(admin_pwd, method='pbkdf2:sha256') - cur.execute( - "INSERT INTO users (username, password_hash, is_admin, role) VALUES (%s, %s, 1, 'super_admin')", - (admin_user, pwd_hash) - ) - conn.commit() - conn.close() - except Exception: - pass diff --git a/app/assets/appearance-patent-26DWDYwd.css b/app/assets/appearance-patent-26DWDYwd.css deleted file mode 100644 index 13af4ca..0000000 --- a/app/assets/appearance-patent-26DWDYwd.css +++ /dev/null @@ -1 +0,0 @@ -.module-page[data-v-aad32577]{min-height:100vh;background:#1a1a1a}.main-content[data-v-aad32577]{display:flex;height:calc(100vh - 56px);min-height:calc(100vh - 56px)}.left-panel[data-v-aad32577]{width:400px;background:#1e1e1e;padding:20px;overflow-y:auto;border-right:1px solid #2a2a2a}.right-panel[data-v-aad32577]{flex:1;min-width:0;background:#1a1a1a;display:flex;flex-direction:column}.section-title[data-v-aad32577],.subsection-title[data-v-aad32577]{font-size:13px;color:#bbb;margin-bottom:10px}.upload-zone[data-v-aad32577]{border:1px dashed #3a3a3a;border-radius:10px;padding:18px;background:#252525;margin-bottom:18px}.hint[data-v-aad32577],.loading-msg[data-v-aad32577],.files[data-v-aad32577],.muted[data-v-aad32577]{color:#888;font-size:12px;line-height:1.5}.link[data-v-aad32577]{color:#6ea8fe;text-decoration:none}.link[data-v-aad32577]:hover{color:#9fc5ff}.btns[data-v-aad32577],.run-row[data-v-aad32577]{display:flex;gap:10px;flex-wrap:wrap}.opt-btn[data-v-aad32577],.btn-run[data-v-aad32577],.btn-delete[data-v-aad32577],.download[data-v-aad32577]{border:none;cursor:pointer;border-radius:7px}.opt-btn[data-v-aad32577]{padding:8px 14px;color:#ccc;background:#2a2a2a;border:1px solid #3a3a3a}.btn-run[data-v-aad32577]{padding:10px 18px;color:#fff;background:#3498db;font-weight:600}.btn-queue[data-v-aad32577]{background:#27ae60}.btn-run[data-v-aad32577]:disabled{opacity:.55;cursor:not-allowed}.selected-files[data-v-aad32577]{margin-top:14px;color:#999;font-size:12px;word-break:break-all}.selected-files span[data-v-aad32577]{display:block;margin:4px 0}.prompt-card[data-v-aad32577],.secret-card[data-v-aad32577]{margin-bottom:18px}.secret-card[data-v-aad32577]{display:none}.prompt-input[data-v-aad32577]{width:100%;box-sizing:border-box;resize:vertical;min-height:180px;padding:10px 12px;border:1px solid #333;border-radius:8px;background:#202020;color:#d8d8d8;font-size:12px;line-height:1.6;outline:none}.secret-input[data-v-aad32577]{width:100%;box-sizing:border-box;height:38px;padding:0 12px;border:1px solid #333;border-radius:8px;background:#202020;color:#d8d8d8;font-size:12px;outline:none}.prompt-input[data-v-aad32577]:focus,.secret-input[data-v-aad32577]:focus{border-color:#3498db}.parse-card[data-v-aad32577],.queue-payload[data-v-aad32577]{margin-top:14px;padding:12px;border:1px solid #2a2a2a;border-radius:8px;background:#202020;color:#b8c1cc;font-size:12px}.queue-payload[data-v-aad32577]{max-height:220px;overflow:auto;color:#8fd3ff;white-space:pre-wrap}.panel-header[data-v-aad32577]{padding:16px 20px;border-bottom:1px solid #2a2a2a;font-size:15px;font-weight:600;color:#ddd}.task-list-wrap[data-v-aad32577]{flex:1;padding:16px 20px;overflow:auto}.clean-result-summary[data-v-aad32577]{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-bottom:16px}.summary-card[data-v-aad32577]{padding:14px 16px;border:1px solid #2a2a2a;border-radius:8px;background:#1e1e1e}.summary-card strong[data-v-aad32577]{display:block;margin-top:8px;color:#eaf4ff;font-size:22px}.summary-label[data-v-aad32577]{color:#8d8d8d;font-size:12px}.result-list-wrap[data-v-aad32577]{border:1px solid #2a2a2a;border-radius:8px;background:#1e1e1e;min-height:180px;margin:0 0 16px}.result-list-header[data-v-aad32577]{display:flex;justify-content:space-between;padding:12px 16px;border-bottom:1px solid #2a2a2a;color:#ddd;font-size:14px}.empty-tasks[data-v-aad32577]{color:#666;font-size:13px;padding:18px;text-align:center}.result-table[data-v-aad32577]{--el-table-bg-color: #222;--el-table-tr-bg-color: #222;--el-table-header-bg-color: #2a2a2a;--el-table-text-color: #ccc;--el-table-border-color: #333}.task-list[data-v-aad32577]{list-style:none;margin:0;padding:12px}.task-item[data-v-aad32577]{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:12px 14px;border:1px solid #2a2a2a;border-radius:8px;margin-bottom:8px;background:#222}.left[data-v-aad32577]{flex:1;min-width:0}.id[data-v-aad32577]{color:#e0e0e0;font-size:13px;font-weight:600}.task-right[data-v-aad32577]{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.status[data-v-aad32577]{padding:4px 10px;border-radius:6px;font-size:12px}.status.success[data-v-aad32577]{background:#2ecc712e;color:#2ecc71}.status.failed[data-v-aad32577]{background:#e74c3c2e;color:#ff6b6b}.status.running[data-v-aad32577]{background:#3498db2e;color:#3498db}.status.pending[data-v-aad32577]{background:#95a5a62e;color:#bdc3c7}.result-hint[data-v-aad32577]{margin-top:6px;color:#e0b96d}.file-progress[data-v-aad32577]{margin-top:8px;max-width:520px}.file-progress-meta[data-v-aad32577]{display:flex;justify-content:space-between;gap:12px;color:#d8c278;font-size:12px}.file-progress-track[data-v-aad32577]{margin-top:5px;height:8px;border-radius:999px;overflow:hidden;background:#303030;border:1px solid #3b3b3b}.file-progress-bar[data-v-aad32577]{height:100%;border-radius:inherit;background:linear-gradient(90deg,#4aa3ff,#f0c75e);transition:width .25s ease}.download[data-v-aad32577]{padding:6px 10px;color:#d6ecff;background:#3498db2e}.btn-delete[data-v-aad32577]{padding:6px 10px;color:#ff8f8f;background:#e74c3c1f}@media(max-width:1100px){.main-content[data-v-aad32577]{flex-direction:column;height:auto}.left-panel[data-v-aad32577]{width:100%;border-right:none;border-bottom:1px solid #2a2a2a}.clean-result-summary[data-v-aad32577]{grid-template-columns:repeat(2,minmax(0,1fr))}} diff --git a/app/assets/appearance-patent.js b/app/assets/appearance-patent.js deleted file mode 100644 index ccff732..0000000 --- a/app/assets/appearance-patent.js +++ /dev/null @@ -1 +0,0 @@ -import{d as qe,o as je,q as Oe,a as i,c,b as Ve,e as a,F as se,r as te,t as r,w as Qe,p as We,f as _,u as ke,n as Ye,g as v,h as j,i as O,E as p,_ as Xe,j as Ze,k as es}from"./pywebview-B8lwamDf.js";import{B as ss,w as ts,x as as,y as ns,v as Ie,z as ls,A as rs,C as os,s as us,D as is,E as cs,F as _e,G as ds}from"./java-modules-B9jblDzU.js";import{e as fs}from"./brand-DE-sObfq.js";import{c as ps}from"./categorized-timers-JPA-olTr.js";const vs={class:"page-shell module-page"},gs={class:"main-content"},hs={class:"left-panel"},ys={class:"upload-zone"},ks={class:"selected-files"},Is={key:0},_s={class:"prompt-card"},Ps={class:"run-row"},ws=["disabled"],Cs=["disabled"],Ss={key:0,class:"parse-card"},bs={key:1,class:"queue-payload"},ms={class:"right-panel"},Fs={class:"task-list-wrap"},Ns={class:"clean-result-summary"},Ts={class:"summary-card"},As={class:"summary-card"},Rs={class:"summary-card"},Es={class:"summary-card"},xs={class:"result-list-wrap"},Ds={key:0,class:"empty-tasks"},Us={key:1,class:"task-list clean-result-list"},$s={class:"left"},zs={class:"id"},Ms={class:"files"},Gs={class:"files"},Ls={class:"files"},Bs={class:"files"},Hs={key:0,class:"files result-hint"},Ks={key:1,class:"file-progress"},Js={class:"file-progress-meta"},qs={class:"file-progress-track"},js={class:"task-right"},Os={class:"status running"},Vs=["onClick"],Qs={class:"result-list-wrap"},Ws={key:0,class:"empty-tasks"},Ys={key:1,class:"task-list clean-result-list"},Xs={class:"left"},Zs={class:"id"},et={class:"files"},st={class:"files"},tt={class:"files"},at={key:0,class:"files"},nt={key:1,class:"files result-hint"},lt={key:2,class:"file-progress"},rt={class:"file-progress-meta"},ot={class:"file-progress-track"},ut={key:3,class:"files"},it={class:"task-right"},ct=["onClick"],dt=["onClick"],ft=3e3,pt=qe({__name:"BrandAppearancePatentTab",setup(gt){const U=v([]),N=v([]),P=v(null),T=v(null),$=v(""),z=v(!1),M=v(!1),C=v(""),f=v([]),u=v([]),h=v(null),V=v(!1);let A=null,ae=0,R=!1;const E=ps("appearance-patent"),x=v({pendingTaskCount:0,processedTaskCount:0,successTaskCount:0,failedTaskCount:0}),g=v([]),w=v({}),m=j(()=>P.value||T.value),Q=j(()=>{const e=P.value;return!e?.taskId||g.value.some(t=>t.taskId===e.taskId)?null:{taskId:e.taskId,sourceFilename:e.sourceFilename,rowCount:e.acceptedRows,taskStatus:"PENDING",success:!1}}),ne=j(()=>{const e=new Set([...f.value,...u.value]),s=g.value.filter(n=>{const l=k(n);return n.taskId!=null&&(e.has(n.taskId)||l==="RUNNING"||l==="PENDING")}).map(n=>re(n));for(const[n,l]of Object.entries(w.value)){const o=Number(n);!Number.isFinite(o)||o<=0||!e.has(o)&&k(l)!=="RUNNING"&&k(l)!=="PENDING"||s.some(d=>d.taskId===o)||s.push(re(l))}return Q.value?s.some(n=>n.taskId===Q.value?.taskId)?s:[Q.value,...s]:s}),le=j(()=>g.value.filter(e=>{const s=k(e);return s!=="RUNNING"&&s!=="PENDING"}));function re(e){if(e.taskId==null)return e;const s=w.value[e.taskId];return s?{...e,...s,sourceFilename:s.sourceFilename||e.sourceFilename,resultFilename:s.resultFilename||e.resultFilename,rowCount:s.rowCount??e.rowCount,createdAt:s.createdAt||e.createdAt}:e}function Pe(){return $.value.trim()}function we(){return $.value.trim()}function G(){return _e("appearance-patent").trim()}function oe(){return _e("appearance-patent-token").trim()}function Ce(){return typeof window<"u"&&window.localStorage.getItem("uid")||"0"}function W(){return`appearance-patent:tasks:${Ce()}`}function Se(e){return{taskId:e.taskId,totalRows:e.totalRows,acceptedRows:e.acceptedRows,groupCount:e.groupCount,droppedRows:e.droppedRows}}function S(){if(typeof window>"u")return;const e=Array.from(new Set([...f.value,...u.value]));e.length?window.localStorage.setItem(W(),JSON.stringify(e)):window.localStorage.removeItem(W())}function be(){if(!(typeof window>"u"))try{const e=window.localStorage.getItem(W()),s=e?JSON.parse(e):[];f.value=Array.isArray(s)?s.filter(t=>typeof t=="number"&&t>0):[]}catch{f.value=[]}}function L(e){if(!e)return"-";const s=new Date(e);if(Number.isNaN(s.getTime()))return e;const t=s.getFullYear(),n=String(s.getMonth()+1).padStart(2,"0"),l=String(s.getDate()).padStart(2,"0"),o=String(s.getHours()).padStart(2,"0"),d=String(s.getMinutes()).padStart(2,"0"),y=String(s.getSeconds()).padStart(2,"0");return`${t}-${n}-${l} ${o}:${d}:${y}`}async function ue(e){const s=O();if(!s?.upload_file_to_java)throw new Error("当前桌面端未提供文件上传能力");const t=[];for(const n of e){const l=typeof n=="string"?n:n.absolutePath,o=typeof n=="string"?void 0:n.relativePath,d=await s.upload_file_to_java(l,o);if(!d?.success||!d.data)throw new Error(d?.error||d?.message||`上传失败:${l}`);t.push(d.data)}return t}async function me(){const e=O();if(!e?.select_brand_xlsx_files||!e.upload_file_to_java){p.warning("当前环境不支持文件选择或上传");return}const s=await e.select_brand_xlsx_files();if(!s?.length)return;const t=await ue(s);N.value=t,U.value=t.map(n=>n.relativePath||n.originalFilename||n.fileKey),P.value=null,T.value=null,C.value=""}async function Fe(){const e=O();if(!e?.select_brand_folder){p.warning("当前环境不支持文件夹选择,请在本地客户端中打开");return}try{const s=await e.select_brand_folder();if(!s)return;const t=await fs(s);if(!t.success||!t.items?.length){p.warning(t.error||"该文件夹下没有可用的 xlsx 文件");return}const n=await ue(t.items);N.value=n,U.value=t.items.map(l=>l.relativePath||l.absolutePath),P.value=null,T.value=null,C.value="",p.success(`已选择文件夹内 ${t.items.length} 个 Excel 文件`)}catch(s){p.error(s instanceof Error?s.message:"选择失败")}}async function Ne(){if(!N.value.length){p.warning("请先选择 Excel");return}if(!G()){p.warning("请先在左上角设置中填写外观专利密钥");return}z.value=!0;try{const e=N.value.map(t=>({fileKey:t.fileKey,originalFilename:t.originalFilename,relativePath:t.relativePath})),s=await ts(e,Pe(),G(),oe());P.value=s,T.value=null,C.value="",p.success(`解析完成,共 ${s.groupCount||0} 组 / ${s.acceptedRows} 条`)}catch(e){p.error(e instanceof Error?e.message:"解析失败")}finally{z.value=!1}}async function Te(){const e=O(),s=P.value,t=s?.taskId;if(!t){p.warning("请先解析文件");return}if(!e?.enqueue_json){p.error("当前环境未启用 pywebview enqueue_json");return}if(!G()){p.warning("请先在左上角设置中填写外观专利密钥");return}M.value=!0;try{const l=(await as(t)).groups||[],o={type:"appearance-patent-run",ts:Date.now(),data:{taskId:t,prompt:we(),api_key:G(),patent_token:oe(),sourceFileCount:s.sourceFileCount||0,totalRows:s.totalRows||0,acceptedRows:s.acceptedRows||0,groupCount:s.groupCount||0,groups:l.map(y=>({sourceFileKey:y.sourceFileKey||"",sourceFilename:y.sourceFilename||"",groupKey:y.groupKey||"",baseId:y.baseId||"",displayId:y.displayId||"",items:(y.items||[]).map(I=>({sourceFileKey:I.sourceFileKey||"",sourceFilename:I.sourceFilename||"",rowToken:I.rowToken||"",groupKey:I.groupKey||"",id:I.displayId,asin:I.asin,country:I.country,sku:I.sku||"",url:I.url||"",title:I.title||""}))}))}};C.value=`任务 ${t} 已准备推送,共 ${l.length} 组`,await ns(t);const d=await e.enqueue_json(o);if(!d?.success){p.error(d?.error||"推送失败");return}T.value=Se(s),Re(t),Ae(),await B(),await H({force:!0}),p.success("已推送到 Python 队列")}finally{M.value=!1}}function Ae(){P.value=null,C.value=""}function Re(e){f.value.includes(e)||(f.value=[...f.value,e],S()),F()}function Y(e){if(f.value=f.value.filter(s=>s!==e),!u.value.includes(e)){const s={...w.value};delete s[e],w.value=s}S()}function Ee(e){u.value.includes(e)||(u.value=[...u.value,e],S()),F()}function X(e){if(u.value=u.value.filter(s=>s!==e),!f.value.includes(e)){const s={...w.value};delete s[e],w.value=s}S()}function F(){R||h.value==null&&xe(!0)}function ie(){h.value!=null&&(E.clearTimer("task-poll",h.value),h.value=null)}function xe(e=!1){if(R)return;if(h.value!=null){if(!e)return;E.clearTimer("task-poll",h.value),h.value=null}const s=async()=>{h.value=null,!R&&(!f.value.length&&!u.value.length||(await De(),!R&&h.value==null&&(f.value.length||u.value.length)&&(h.value=E.setTimeout("task-poll",s,Ie()))))};e?s():h.value=E.setTimeout("task-poll",s,Ie())}async function De(){if(V.value||!f.value.length&&!u.value.length){!f.value.length&&!u.value.length&&ie();return}V.value=!0;try{let e=!1,s=!1;const t=Array.from(new Set([...f.value,...u.value]));if(t.length){const n=await ds(t,{force:u.value.length>0});for(const l of n.items||[]){const o=l.task;if(!o?.id)continue;const d=l.items?.[0];if(d&&(w.value={...w.value,[o.id]:d},Ue(d)),(o.status==="SUCCESS"||o.status==="FAILED")&&(Y(o.id),e=!0,d&&b(d)?Ee(o.id):X(o.id)),d&&(o.status==="SUCCESS"||o.status==="FAILED")&&u.value.includes(o.id)){const y=(d.fileStatus||"").toUpperCase();(d.fileReady||y==="SUCCESS"||y==="FAILED")&&(X(o.id),e=!0,s=!0)}}n.missingTaskIds?.length&&(n.missingTaskIds.forEach(l=>{Y(l),X(l)}),s=!0,e=!0)}e&&await B(),s&&await H(),$e()}finally{V.value=!1}}function Ue(e){if(!e.taskId&&!e.resultId)return;const s=g.value.findIndex(t=>e.resultId!=null&&t.resultId===e.resultId||e.taskId!=null&&t.taskId===e.taskId);s>=0?g.value[s]={...g.value[s],...e}:g.value=[e,...g.value]}function $e(){if(!u.value.length)return;const e=[];for(const s of u.value){const t=g.value.find(o=>o.taskId===s);if(!t){e.push(s);continue}const n=(t.taskStatus||"").toUpperCase(),l=(t.fileStatus||"").toUpperCase();t.fileReady||l==="SUCCESS"||l==="FAILED"||(n==="SUCCESS"||n==="FAILED")&&e.push(s)}u.value=e,S(),u.value.length&&F()}function ze(){const e=g.value.filter(s=>s.taskId!=null&&b(s)).map(s=>s.taskId);u.value=Array.from(new Set(e)),S(),u.value.length&&F()}function Me(){const e=g.value.filter(s=>s.taskId!=null&&k(s)==="RUNNING").map(s=>s.taskId);e.length&&(f.value=Array.from(new Set([...f.value,...e])),S(),F())}async function B(){x.value=await ls()}async function H(e={}){const s=Date.now();if(!(!e.force&&g.value.length&&s-ae{g.value=Ge(g.value,t.items||[]),ae=Date.now()}).finally(()=>{A=null}),A)}function Ge(e,s){const t=new Map,n=new Map;for(const l of e||[])l.taskId!=null&&t.set(l.taskId,l),l.resultId!=null&&n.set(l.resultId,l);return(s||[]).map(l=>{const o=l.resultId!=null?n.get(l.resultId):l.taskId!=null?t.get(l.taskId):void 0;return Le(o,l)})}function Le(e,s){return!e||!((k(e)==="RUNNING"||b(e)||D(e))&&!D(s)&&!J(s))?s:{...s,fileJobId:s.fileJobId??e.fileJobId,fileStatus:s.fileStatus||e.fileStatus,fileError:s.fileError||e.fileError,fileReady:s.fileReady||e.fileReady,fileProgressPercent:Z(s.fileProgressPercent)?s.fileProgressPercent:e.fileProgressPercent,fileProgressCurrent:Z(s.fileProgressCurrent)?s.fileProgressCurrent:e.fileProgressCurrent,fileProgressTotal:Z(s.fileProgressTotal)?s.fileProgressTotal:e.fileProgressTotal,fileProgressMessage:(s.fileProgressMessage||"").trim()?s.fileProgressMessage:e.fileProgressMessage}}function Z(e){const s=Number(e);return Number.isFinite(s)&&s>0}function ce(e){const s=k(e);return s==="RUNNING"?"执行中":s==="PENDING"?"已解析待推送":b(e)?"结果生成中":ee(e)?"结果生成失败":de(e)||s==="SUCCESS"||e.success?"已完成":s==="FAILED"?"失败":"等待中"}function Be(e){const s=k(e);return s==="RUNNING"||b(e)?"running":de(e)?"success":ee(e)||s==="FAILED"?"failed":s==="SUCCESS"||e.success?"success":"pending"}function b(e){const s=k(e),t=(e.fileStatus||"").toUpperCase();return s!=="SUCCESS"&&s!=="FAILED"||J(e)||t==="FAILED"||t==="SUCCESS"?!1:s==="SUCCESS"||ge(e)}function k(e){return(e.taskStatus||"").toUpperCase()}function ee(e){return(e.fileStatus||"").toUpperCase()==="FAILED"}function K(e){if(ee(e))return e.fileError||"结果文件生成失败,请稍后重试或检查后端日志";if(D(e)||!b(e))return"";const s=(e.fileStatus||"").toUpperCase();return s==="RUNNING"?"任务已完成,正在等待 Coze 回流并组装结果文件,下载按钮稍后出现":s==="PENDING"?"任务已完成,结果文件已入队,正在等待后端开始处理":"任务已完成,正在生成结果文件,下载按钮稍后出现"}function J(e){return!!(e.resultId&&(e.fileReady||e.downloadUrl))}function de(e){return J(e)}function q(e){const s=Number(e.fileProgressPercent||0);return Number.isFinite(s)&&s>0?Math.max(0,Math.min(100,Math.round(s))):he(e)?ve(e)==="PENDING"?6:10:0}function fe(e,s){const t=(e.fileProgressMessage||"").trim();return t?He(t):s}function He(e){const s=e.match(/^Coze submitted (\d+) batches, completed (\d+), waiting for results$/);if(s)return`已提交 Coze ${s[1]} 批,已完成 ${s[2]} 批,等待结果回流`;const t=e.match(/^Coze completed (\d+) batches, waiting for remaining Python data$/);return t?`Coze 已完成 ${t[1]} 批,等待 Python 继续回传数据`:{"Receiving Python data, waiting for 50 rows before Coze":"正在接收 Python 数据,累计 50 条后提交 Coze","Submitting Coze":"正在提交 Coze","Coze submitted, waiting for result":"Coze 已提交,等待结果回流","Waiting for Python upload":"等待 Python 继续回传数据","Coze results ready, assembling xlsx":"Coze 结果已回流,正在组装 xlsx","Assembling xlsx":"正在组装 xlsx","Uploading result file":"正在上传结果文件","Result file generated":"结果文件已生成"}[e]||e}function D(e){return(k(e)==="RUNNING"||b(e))&&(pe(e)||he(e))}function pe(e){return Ke(e)||Number(e.fileProgressPercent||0)>0||!!(e.fileProgressMessage||"").trim()}function Ke(e){return(e.fileProgressTotal||0)>0}function ve(e){return(e.fileStatus||"").toUpperCase()}function ge(e){const s=ve(e);return e.fileJobId!=null||s==="PENDING"||s==="RUNNING"}function he(e){return ge(e)&&!pe(e)}async function Je(e){if(!e.resultId)return;const s=e.downloadUrl||os(e.resultId),t=e.resultFilename||`${e.sourceFilename||"appearance-patent"}.xlsx`,n=await us(s,t,`appearance-patent:${e.resultId}`);n.success?p.success(`已保存: ${n.path||t}`):n.error&&n.error!=="用户取消"&&p.error(n.error)}async function ye(e){try{e.taskStatus==="RUNNING"&&e.taskId?(await is(e.taskId),Y(e.taskId)):e.resultId&&await cs(e.resultId),await B(),await H({force:!0}),p.success("已删除")}catch(s){p.error(s instanceof Error?s.message:"删除失败")}}return je(async()=>{be(),await Promise.all([B().catch(()=>{}),H().catch(()=>{})]),Me(),ze(),(f.value.length||u.value.length)&&F()}),Oe(()=>{R=!0,ie(),E.clearScope()}),(e,s)=>(i(),c("div",vs,[Ve(ss,{active:"appearance-patent"}),a("div",gs,[a("aside",hs,[s[3]||(s[3]=a("div",{class:"section-title"},"上传文件",-1)),a("div",ys,[s[1]||(s[1]=a("div",{class:"hint"},"选择 Excel 后点击解析,后端会提取 id、ASIN、国家,并保留整数 id 与子数据的第一条。",-1)),a("div",{class:"btns"},[a("button",{type:"button",class:"opt-btn",onClick:me},"选择 Excel"),a("button",{type:"button",class:"opt-btn",onClick:Fe},"选择文件夹")]),a("div",ks,[U.value.length?(i(!0),c(se,{key:1},te(U.value,t=>(i(),c("span",{key:t},r(t),1))),128)):(i(),c("span",Is,"暂未选择文件"))])]),a("div",_s,[s[2]||(s[2]=a("div",{class:"section-title"},"新增条件要求",-1)),Qe(a("textarea",{"onUpdate:modelValue":s[0]||(s[0]=t=>$.value=t),class:"prompt-input",rows:"8",placeholder:"可选,留空则不向 Coze 传 prompt 字段;填写后将作为 prompt 透传"},null,512),[[We,$.value]])]),a("div",Ps,[a("button",{type:"button",class:"btn-run",disabled:z.value||!N.value.length,onClick:Ne},r(z.value?"解析中...":"解析并创建任务"),9,ws),a("button",{type:"button",class:"btn-run btn-queue",disabled:M.value||!P.value?.taskId,onClick:Te},r(M.value?"推送中...":"推送到 Python 队列"),9,Cs)]),s[4]||(s[4]=a("p",{class:"loading-msg"},"Python 回传字段按 asin、国家、url、标题提交;后端接收分片后累计 50 条调用 Coze,当前任务区展示 Coze 回流和结果组装进度。",-1)),m.value?(i(),c("div",Ss,[a("div",null,"任务 ID:"+r(m.value.taskId),1),a("div",null,"总行数:"+r(m.value.totalRows)+",有效:"+r(m.value.acceptedRows)+",分组:"+r(m.value.groupCount||0)+",过滤:"+r(m.value.droppedRows),1)])):_("",!0),C.value?(i(),c("pre",bs,r(C.value),1)):_("",!0)]),a("section",ms,[s[12]||(s[12]=a("div",{class:"panel-header"},"外观专利检测",-1)),a("div",Fs,[a("div",Ns,[a("div",Ts,[s[5]||(s[5]=a("span",{class:"summary-label"},"运行中任务",-1)),a("strong",null,r(x.value.pendingTaskCount),1)]),a("div",As,[s[6]||(s[6]=a("span",{class:"summary-label"},"已结束任务",-1)),a("strong",null,r(x.value.processedTaskCount),1)]),a("div",Rs,[s[7]||(s[7]=a("span",{class:"summary-label"},"成功任务",-1)),a("strong",null,r(x.value.successTaskCount),1)]),a("div",Es,[s[8]||(s[8]=a("span",{class:"summary-label"},"失败任务",-1)),a("strong",null,r(x.value.failedTaskCount),1)])]),s[11]||(s[11]=a("div",{class:"subsection-title"},"匹配任务",-1)),a("div",xs,[s[9]||(s[9]=a("div",{class:"result-list-header"},[a("span",null,"当前任务")],-1)),ne.value.length?(i(),c("ul",Us,[(i(!0),c(se,null,te(ne.value,t=>(i(),c("li",{key:`cur-${t.taskId}`,class:"task-item"},[a("div",$s,[a("span",zs,r(t.sourceFilename||"外观专利检测"),1),a("div",Ms,"任务 ID:"+r(t.taskId),1),a("div",Gs,"开始时间:"+r(L(t.startedAt||t.createdAt)),1),a("div",Ls,"结束时间:"+r(L(t.finishedAt)),1),a("div",Bs,"行数:"+r(t.rowCount??"-"),1),K(t)?(i(),c("div",Hs,r(K(t)),1)):_("",!0),D(t)?(i(),c("div",Ks,[a("div",Js,[a("span",null,r(fe(t,"处理中")),1),a("span",null,r(q(t))+"%",1)]),a("div",qs,[a("div",{class:"file-progress-bar",style:ke({width:`${q(t)}%`})},null,4)])])):_("",!0)]),a("div",js,[a("span",Os,r(ce(t)),1),a("button",{type:"button",class:"btn-delete",onClick:n=>ye(t)},"删除",8,Vs)])]))),128))])):(i(),c("div",Ds,"暂无当前任务"))]),a("div",Qs,[s[10]||(s[10]=a("div",{class:"result-list-header"},[a("span",null,"历史记录")],-1)),le.value.length?(i(),c("ul",Ys,[(i(!0),c(se,null,te(le.value,t=>(i(),c("li",{key:`his-${t.resultId}-${t.taskId}`,class:"task-item"},[a("div",Xs,[a("span",Zs,r(t.sourceFilename||"外观专利检测"),1),a("div",et,"任务 ID:"+r(t.taskId??"-"),1),a("div",st,"开始时间:"+r(L(t.startedAt||t.createdAt)),1),a("div",tt,"结束时间:"+r(L(t.finishedAt)),1),t.resultFilename?(i(),c("div",at,r(t.resultFilename||"下载结果"),1)):_("",!0),K(t)?(i(),c("div",nt,r(K(t)),1)):_("",!0),D(t)?(i(),c("div",lt,[a("div",rt,[a("span",null,r(fe(t,"结果生成中")),1),a("span",null,r(q(t))+"%",1)]),a("div",ot,[a("div",{class:"file-progress-bar",style:ke({width:`${q(t)}%`})},null,4)])])):_("",!0),t.error?(i(),c("div",ut,"错误:"+r(t.error),1)):_("",!0)]),a("div",it,[a("span",{class:Ye(["status",Be(t)])},r(ce(t)),3),J(t)?(i(),c("button",{key:0,type:"button",class:"download",onClick:n=>Je(t)},"下载",8,ct)):_("",!0),t.resultId?(i(),c("button",{key:1,type:"button",class:"btn-delete",onClick:n=>ye(t)},"删除",8,dt)):_("",!0)])]))),128))])):(i(),c("div",Ws,"暂无历史记录"))])])])])]))}}),vt=Xe(pt,[["__scopeId","data-v-aad32577"]]);Ze(vt).use(es).mount("#app"); diff --git a/app/assets/categorized-timers-JPA-olTr.js b/app/assets/categorized-timers-JPA-olTr.js deleted file mode 100644 index 63afccb..0000000 --- a/app/assets/categorized-timers-JPA-olTr.js +++ /dev/null @@ -1 +0,0 @@ -const r=new Map;function c(n){let t=r.get(n);return t||(t=new Map,r.set(n,t)),t}function u(n,t){const e=r.get(n);e&&(e.delete(t),e.size||r.delete(n))}function l(n,t,e){const i=window.setTimeout(()=>{u(n,i),t()},e);return c(n).set(i,{id:i,kind:"timeout",category:n}),i}function a(n,t,e){const i=window.setInterval(t,e);return c(n).set(i,{id:i,kind:"interval",category:n}),i}function f(n,t){if(t==null)return;const i=r.get(n)?.get(t);i?.kind==="interval"?window.clearInterval(t):window.clearTimeout(t),i?.cancel?.(),u(n,t)}function s(n){const t=r.get(n);if(t){for(const e of t.values())e.kind==="interval"?window.clearInterval(e.id):window.clearTimeout(e.id),e.cancel?.();r.delete(n)}}function d(n,t){return new Promise(e=>{const i=window.setTimeout(()=>{u(n,i),e()},t);c(n).set(i,{id:i,kind:"timeout",category:n,cancel:e})})}function m(n){const t=`${n}:`;for(const e of Array.from(r.keys()))(e===n||e.startsWith(t))&&s(e)}function w(n){const t=e=>`${n}:${e}`;return{setTimeout(e,i,o){return l(t(e),i,o)},setInterval(e,i,o){return a(t(e),i,o)},clearTimer(e,i){f(t(e),i)},clearCategory(e){s(t(e))},clearScope(){m(n)},sleep(e,i){return d(t(e),i)}}}export{w as c}; diff --git a/app/assets/collect-data-Cb4Clz6L.css b/app/assets/collect-data-Cb4Clz6L.css deleted file mode 100644 index fe013cd..0000000 --- a/app/assets/collect-data-Cb4Clz6L.css +++ /dev/null @@ -1 +0,0 @@ -.module-page[data-v-8eb7a5b8]{min-height:100vh;background:#1a1a1a}.main-content[data-v-8eb7a5b8]{display:flex;height:calc(100vh - 56px);min-height:calc(100vh - 56px)}.left-panel[data-v-8eb7a5b8]{width:400px;background:#1e1e1e;padding:20px;overflow-y:auto;border-right:1px solid #2a2a2a}.right-panel[data-v-8eb7a5b8]{flex:1;min-width:0;background:#1a1a1a;display:flex;flex-direction:column}.section-title[data-v-8eb7a5b8],.subsection-title[data-v-8eb7a5b8]{font-size:13px;color:#bbb;margin:12px 0 10px}.upload-zone[data-v-8eb7a5b8]{border:1px dashed #3a3a3a;border-radius:10px;padding:18px;background:#252525;margin-bottom:18px}.hint[data-v-8eb7a5b8],.loading-msg[data-v-8eb7a5b8],.files[data-v-8eb7a5b8],.muted[data-v-8eb7a5b8]{color:#888;font-size:12px;line-height:1.5}.btns[data-v-8eb7a5b8],.run-row[data-v-8eb7a5b8]{display:flex;gap:10px;flex-wrap:wrap}.opt-btn[data-v-8eb7a5b8],.btn-run[data-v-8eb7a5b8],.btn-delete[data-v-8eb7a5b8],.download[data-v-8eb7a5b8]{border:none;cursor:pointer;border-radius:7px}.opt-btn[data-v-8eb7a5b8]{padding:8px 14px;color:#ccc;background:#2a2a2a;border:1px solid #3a3a3a}.btn-run[data-v-8eb7a5b8]{padding:10px 18px;color:#fff;background:#3498db;font-weight:600}.btn-run.btn-queue[data-v-8eb7a5b8]{background:#27ae60}.btn-run[data-v-8eb7a5b8]:disabled{opacity:.55;cursor:not-allowed}.selected-files[data-v-8eb7a5b8]{margin-top:14px;color:#999;font-size:12px;word-break:break-all}.selected-files span[data-v-8eb7a5b8]{display:block;margin:4px 0}.selected-files .more-line[data-v-8eb7a5b8]{color:#777}.filter-zone[data-v-8eb7a5b8]{border:1px solid #2a2a2a;border-radius:8px;padding:12px;background:#252525;margin-bottom:14px;display:flex;flex-direction:column;gap:10px}.filter-row[data-v-8eb7a5b8]{display:flex;align-items:center;gap:10px}.filter-label[data-v-8eb7a5b8]{width:110px;color:#bbb;font-size:12px}.filter-input[data-v-8eb7a5b8]{flex:1;min-width:0;padding:6px 10px;background:#1e1e1e;border:1px solid #3a3a3a;border-radius:6px;color:#ddd;font-size:13px;outline:none}.filter-input[data-v-8eb7a5b8]:focus{border-color:#3498db}.range-inputs[data-v-8eb7a5b8]{flex:1;min-width:0;display:flex;align-items:center;gap:8px}.range-separator[data-v-8eb7a5b8]{color:#777;font-size:12px;white-space:nowrap}.filter-checks[data-v-8eb7a5b8]{display:flex;gap:16px}.filter-check-row[data-v-8eb7a5b8]{display:inline-flex;align-items:center;gap:6px;cursor:pointer;-webkit-user-select:none;user-select:none;color:#ccc;font-size:12px}.filter-check-input[data-v-8eb7a5b8]{width:16px;height:16px;accent-color:#409eff;cursor:pointer}.country-pref-hint[data-v-8eb7a5b8]{margin-top:-4px}.country-section-title[data-v-8eb7a5b8]{display:flex;align-items:center;justify-content:space-between;gap:12px}.country-pref-saving[data-v-8eb7a5b8]{color:#3498db;font-size:11px}.country-pref-radios[data-v-8eb7a5b8]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-bottom:14px}.country-check-row[data-v-8eb7a5b8]{display:inline-flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none;font-size:12px;color:#ccc;padding:8px 10px;border:1px solid #333;border-radius:8px;background:#252525}.country-check-row.selected[data-v-8eb7a5b8]{border-color:#409eff;background:#409eff1f;color:#e6f2ff}.country-check-input[data-v-8eb7a5b8]{width:16px;height:16px;accent-color:#409eff;cursor:pointer;flex-shrink:0}.country-check-text[data-v-8eb7a5b8]{line-height:1.3}.queue-debug-card[data-v-8eb7a5b8]{margin-top:14px;border:1px solid #2a2a2a;border-radius:8px;padding:10px 12px;background:#1f1f1f}.queue-debug-title[data-v-8eb7a5b8]{margin-top:0}.queue-debug-line[data-v-8eb7a5b8]{color:#9ad;font-size:12px}.queue-debug-payload[data-v-8eb7a5b8]{margin-top:8px;padding:8px 10px;background:#181818;border-radius:6px;color:#bbb;font-size:11px;overflow:auto;max-height:200px}.panel-header[data-v-8eb7a5b8]{padding:16px 20px;border-bottom:1px solid #2a2a2a;font-size:15px;font-weight:600;color:#ddd}.task-list-wrap[data-v-8eb7a5b8]{flex:1;padding:16px 20px;overflow:auto}.clean-result-summary[data-v-8eb7a5b8]{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-bottom:16px}.summary-card[data-v-8eb7a5b8]{padding:14px 16px;border:1px solid #2a2a2a;border-radius:8px;background:#1e1e1e}.summary-card strong[data-v-8eb7a5b8]{display:block;margin-top:8px;color:#eaf4ff;font-size:22px}.summary-label[data-v-8eb7a5b8]{color:#8d8d8d;font-size:12px}.result-list-wrap[data-v-8eb7a5b8]{border:1px solid #2a2a2a;border-radius:8px;background:#1e1e1e;min-height:180px;margin:0 0 16px}.result-list-header[data-v-8eb7a5b8]{display:flex;justify-content:space-between;padding:12px 16px;border-bottom:1px solid #2a2a2a;color:#ddd;font-size:14px}.empty-tasks[data-v-8eb7a5b8]{color:#666;font-size:13px;padding:18px;text-align:center}.task-list[data-v-8eb7a5b8]{list-style:none;margin:0;padding:12px}.task-item[data-v-8eb7a5b8]{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:12px 14px;border:1px solid #2a2a2a;border-radius:8px;margin-bottom:8px;background:#222}.left[data-v-8eb7a5b8]{flex:1;min-width:0}.id[data-v-8eb7a5b8]{color:#e0e0e0;font-size:13px;font-weight:600}.task-right[data-v-8eb7a5b8]{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.status[data-v-8eb7a5b8]{padding:4px 10px;border-radius:6px;font-size:12px}.status.success[data-v-8eb7a5b8]{background:#2ecc712e;color:#2ecc71}.status.failed[data-v-8eb7a5b8]{background:#e74c3c2e;color:#ff6b6b}.status.running[data-v-8eb7a5b8]{background:#3498db2e;color:#3498db}.status.pending[data-v-8eb7a5b8]{background:#95a5a62e;color:#bdc3c7}.btn-delete[data-v-8eb7a5b8]{padding:6px 10px;color:#ff8f8f;background:#e74c3c1f}@media(max-width:1100px){.main-content[data-v-8eb7a5b8]{flex-direction:column;height:auto}.left-panel[data-v-8eb7a5b8]{width:100%;border-right:none;border-bottom:1px solid #2a2a2a}.clean-result-summary[data-v-8eb7a5b8]{grid-template-columns:repeat(2,minmax(0,1fr))}} diff --git a/app/assets/collect-data.js b/app/assets/collect-data.js deleted file mode 100644 index 4bbaaf8..0000000 --- a/app/assets/collect-data.js +++ /dev/null @@ -1 +0,0 @@ -import{g as m,N as fe,O as oe,d as ve,o as pe,a as f,c as v,b as me,e as t,F as V,r as Y,t as l,f as B,w as z,p as ae,v as W,n as ne,P as ye,h as le,E as y,i as Q,_ as he,j as ke,k as ge}from"./pywebview-B8lwamDf.js";import{v as _e,B as be,aZ as we,a_ as Ce,a$ as Se,b0 as Ie,b1 as Te,b2 as Ne,b3 as Pe,b4 as xe,b5 as Ae}from"./java-modules-B9jblDzU.js";import{e as Ee}from"./brand-DE-sObfq.js";import{c as re}from"./categorized-timers-JPA-olTr.js";const Fe=u=>u==="SUCCESS"||u==="FAILED";function De(u){if(!u||typeof window>"u")return[];try{const k=window.localStorage.getItem(u);if(!k)return[];const g=JSON.parse(k);return Array.isArray(g)?g.filter(b=>typeof b=="number"&&b>0):[]}catch{return[]}}function Ue(u,k){if(!(!u||typeof window>"u"))try{k.length===0?window.localStorage.removeItem(u):window.localStorage.setItem(u,JSON.stringify(k))}catch{}}function $e(u){const k=re(`task-progress-loop:${u.scope}`),g=u.isTerminal??Fe,b=u.getIntervalMs??_e,d=m(De(u.storageKey)),_=m({}),o=m(!1);let c=null,S=!1;function R(){Ue(u.storageKey,d.value)}function O(n){!Number.isFinite(n)||n<=0||d.value.includes(n)||(d.value=[...d.value,n],R(),E(!0))}function D(n){if(d.value.includes(n)&&(d.value=d.value.filter(r=>r!==n),R(),_.value[n])){const r={..._.value};delete r[n],_.value=r}}function T(n){const r=Array.from(new Set(n.filter(M=>Number.isFinite(M)&&M>0)));d.value=r,R()}function w(n){const r=_.value[n];return!!r&&g(r)}async function N(){if(S)return;const n=d.value.filter(r=>r>0);if(n.length){o.value=!0;try{const M=(await u.fetchProgress(n))?.items||[],K=[],j={..._.value};for(const C of M){const F=u.extractTaskId(C);if(typeof F!="number"||F<=0)continue;const q=u.extractStatus(C)||"";try{u.onUpdate?.(F,C)}catch{}q&&(j[F]=q,g(q)&&K.push({taskId:F,detail:C,status:q}))}_.value=j;for(const C of K){D(C.taskId);try{await u.onTerminal?.(C.taskId,C.detail,C.status)}catch{}}}catch(r){u.onError?.(r)}finally{o.value=!1}}}function L(){c!=null&&(k.clearTimer("task-poll",c),c=null)}function A(n=!1){if(S||c!=null&&!n)return;L();const r=async()=>{if(c=null,!S&&d.value.length){if(o.value){c=k.setTimeout("task-poll",r,500);return}await N(),!S&&d.value.length>0&&(c=k.setTimeout("task-poll",r,b()))}};n?r():c=k.setTimeout("task-poll",r,b())}function E(n=!1){S||d.value.length&&(c!=null&&!n||A(n))}function U(){L()}fe(d,(n,r)=>{if(!S){if(!n.length){U();return}(!r||r.length===0)&&A(!0)}},{flush:"post"});let P=null;typeof document<"u"&&(P=()=>{document.visibilityState==="visible"&&d.value.length>0&&A(!0)},document.addEventListener("visibilitychange",P));function I(){S||(S=!0,U(),k.clearScope(),P&&typeof document<"u"&&(document.removeEventListener("visibilitychange",P),P=null))}return oe(()=>I()),d.value.length>0&&A(!0),{taskIds:d,taskStatuses:_,inFlight:o,add:O,remove:D,reset:T,ensure:E,stop:U,refreshOnce:N,isTerminal:w,dispose:I}}const Be={class:"page-shell module-page"},Re={class:"main-content"},Le={class:"left-panel"},Me={class:"upload-zone"},qe={class:"selected-files"},Oe={key:0,class:"more-line"},Ge={key:1},Ve={class:"filter-zone"},ze={class:"filter-row"},Ke={class:"range-inputs"},je={class:"filter-checks"},He={class:"filter-check-row"},Je={class:"filter-check-row"},Ye={class:"filter-check-row"},Qe={class:"section-title country-section-title"},Ze={key:0,class:"country-pref-saving"},We={class:"country-pref-radios"},Xe=["checked","onChange"],et={class:"country-check-text"},tt={class:"run-row"},st=["disabled"],at=["disabled"],nt={key:0,class:"queue-debug-card"},lt={class:"queue-debug-line"},ot={key:0,class:"queue-debug-payload"},rt={class:"right-panel"},it={class:"task-list-wrap"},ut={class:"clean-result-summary"},ct={class:"summary-card"},dt={class:"summary-card"},ft={class:"summary-card"},vt={class:"summary-card"},pt={class:"result-list-wrap"},mt={key:0,class:"empty-tasks"},yt={key:1,class:"task-list clean-result-list"},ht={class:"left"},kt={class:"id"},gt={class:"files"},_t={class:"files"},bt={class:"files"},wt={class:"files"},Ct={class:"files"},St={class:"task-right"},It={class:"status running"},Tt=["onClick"],Nt={class:"result-list-wrap"},Pt={key:0,class:"empty-tasks"},xt={key:1,class:"task-list clean-result-list"},At={class:"left"},Et={class:"id"},Ft={class:"files"},Dt={class:"files"},Ut={class:"files"},$t={class:"files"},Bt={class:"files"},Rt={key:0,class:"files"},Lt={key:1,class:"files"},Mt={class:"task-right"},qt=["onClick"],Ot="brand:collect-data:polling-task-ids",Gt=ve({__name:"BrandCollectDataTab",setup(u){const k=[{code:"DE",label:"德国"},{code:"UK",label:"英国"},{code:"FR",label:"法国"},{code:"IT",label:"意大利"},{code:"ES",label:"西班牙"}],g=m([]),b=m([]),d=m(!1),_=m(!1),o=ye({minAmount:null,maxAmount:null,rank:!1,fba:!1,fbm:!1}),c=m("DE"),S=le(()=>c.value?[c.value]:[]),R=m(!1),O=m(!1),D=re("collect-data-tab");let T=null;const w=m(null),N=m(null),L=m(""),A=m(""),E=m({pendingTaskCount:0,processedTaskCount:0,successTaskCount:0,failedTaskCount:0}),U=m([]),P=m([]),I=m({}),n=$e({scope:"collect-data-tab",storageKey:Ot,fetchProgress:a=>Ae(a),extractTaskId:a=>a.task?.id??null,extractStatus:a=>a.task?.status??"",onUpdate:(a,e)=>{const s=I.value[a];I.value={...I.value,[a]:s?{...s,task:{...s.task||{},...e.task||{}},items:e.items??s.items}:e}},onTerminal:async a=>{if(I.value[a]){const e={...I.value};delete e[a],I.value=e}await Promise.all([G(),H()])}}),r=le(()=>g.value.slice(0,8));function M(a){k.some(e=>e.code===a)&&c.value!==a&&(R.value=!0,c.value=a,K())}function K(){T!=null&&D.clearTimer("country-pref-save",T),T=D.setTimeout("country-pref-save",()=>{T=null,j()},450)}async function j(){if(c.value){O.value=!0;try{await we([c.value])}catch(a){y.error(a instanceof Error?a.message:"保存国家顺序失败")}finally{O.value=!1}}}async function C(){try{const a=await Ce();if(R.value)return;const e=a?.country_codes;Array.isArray(e)&&e.length&&(c.value=String(e[0]||"DE"))}catch{}}async function F(a){const e=Q();if(!e?.upload_file_to_java)throw new Error("当前桌面端未提供文件上传能力");const s=[];for(const p of a){const x=typeof p=="string"?p:p.absolutePath,$=typeof p=="string"?void 0:p.relativePath,i=await e.upload_file_to_java(x,$);if(!i?.success||!i.data)throw new Error(i?.error||i?.message||`上传失败:${x}`);s.push(i.data)}return s}async function q(){const a=Q();if(!a?.select_brand_xlsx_files||!a.upload_file_to_java){y.warning("当前环境不支持文件选择或上传");return}try{const e=await a.select_brand_xlsx_files();if(!e?.length)return;const s=await F(e);b.value=s,g.value=s.map(p=>p.relativePath||p.originalFilename||p.fileKey),w.value=null,N.value=null}catch(e){y.error(e instanceof Error?e.message:"文件选择失败")}}async function ie(){const a=Q();if(!a?.select_brand_folder){y.warning("当前环境不支持文件夹选择,请在本地客户端中打开");return}try{const e=await a.select_brand_folder();if(!e)return;const s=await Ee(e);if(!s.success||!s.items?.length){y.warning(s.error||"该文件夹下没有可用的 xlsx 文件");return}const p=await F(s.items);b.value=p,g.value=s.items.map(x=>x.relativePath||x.absolutePath),w.value=null,N.value=null,y.success(`已选择文件夹内 ${s.items.length} 个 Excel 文件`)}catch(e){y.error(e instanceof Error?e.message:"选择失败")}}function X(){const a=o.minAmount===null||o.minAmount===void 0||Number.isNaN(o.minAmount)?null:o.minAmount,e=o.maxAmount===null||o.maxAmount===void 0||Number.isNaN(o.maxAmount)?null:o.maxAmount;return{amount:e??a,minAmount:a,maxAmount:e,min_amount:a,max_amount:e,rank:!!o.rank,fba:!!o.fba,fbm:!!o.fbm,countryCodes:[...S.value],countryCode:c.value,country_code:c.value}}async function ue(){if(!b.value.length){y.warning("请先选择 Excel 文件");return}if(!c.value){y.warning("请选择采集国家");return}d.value=!0;try{const a=await Se({files:b.value.map(e=>({fileKey:e.fileKey,originalFilename:e.originalFilename,relativePath:e.relativePath})),task_type:"collect-data",filters:X()});N.value=a,w.value=a.taskId??null,a.taskId&&n.add(a.taskId),y.success(`提交成功:任务 ${a.taskNo||a.taskId},落库 ${a.acceptedRows??0} 行`),await Promise.all([G(),H()])}catch(a){y.error(a instanceof Error?a.message:"提交失败")}finally{d.value=!1}}async function ce(){if(!w.value){y.warning("请先提交采集任务");return}const a=Q();if(!a?.enqueue_json){y.warning("当前环境未提供 Python 队列能力");return}_.value=!0;try{await Ie(w.value);const e={type:"collect-data-run",ts:Date.now(),data:{taskId:w.value,taskNo:N.value?.taskNo,taskType:"collect-data",totalRows:N.value?.acceptedRows??0,pageSize:N.value?.pageSize??50,filters:X()}},s=await a.enqueue_json(e);if(!s?.success)throw new Error(s?.error||"入队失败");L.value=`已推送至 Python 队列(队列长度:${s.queue_size??"-"})`,A.value=JSON.stringify(e,null,2),w.value&&n.add(w.value),y.success("已推送到 Python 队列"),await G()}catch(e){y.error(e instanceof Error?e.message:"推送失败")}finally{_.value=!1}}function Z(a){if(!a)return"-";const e=new Date(a);if(Number.isNaN(e.getTime()))return a;const s=e.getFullYear(),p=String(e.getMonth()+1).padStart(2,"0"),x=String(e.getDate()).padStart(2,"0"),$=String(e.getHours()).padStart(2,"0"),i=String(e.getMinutes()).padStart(2,"0"),h=String(e.getSeconds()).padStart(2,"0");return`${s}-${p}-${x} ${$}:${i}:${h}`}function ee(a){return(a.taskStatus||"").toUpperCase()}function te(a){const e=ee(a);return e==="RUNNING"?"执行中":e==="PENDING"?"等待中":e==="SUCCESS"||a.success?"已完成":e==="FAILED"?"失败":"等待中"}function de(a){const e=ee(a);return e==="RUNNING"?"running":e==="FAILED"?"failed":e==="SUCCESS"||a.success?"success":"pending"}async function G(){try{E.value=await Te()}catch{}}async function H(){try{const e=(await Ne(50)).items||[],s=e.filter(i=>{const h=(i.taskStatus||"").toUpperCase();return h==="PENDING"||h==="RUNNING"});P.value=e.filter(i=>{const h=(i.taskStatus||"").toUpperCase();return h==="SUCCESS"||h==="FAILED"});const p=new Set;for(const i of s)i.taskId&&(p.add(i.taskId),n.add(i.taskId));for(const i of[...n.taskIds.value])e.some(J=>J.taskId===i)||n.remove(i);const x=new Set(s.map(i=>i.taskId).filter(i=>typeof i=="number")),$=[...s];for(const i of n.taskIds.value){if(x.has(i))continue;const h=I.value[i],J=h?.items?.[0];J?$.push(J):h?.task&&$.push({taskId:h.task.id,taskNo:h.task.taskNo,taskStatus:h.task.status,startedAt:h.task.createdAt,finishedAt:h.task.finishedAt,sourceFilename:"采集数据"})}U.value=$}catch{}}async function se(a){try{if(a.resultId)await Pe(a.resultId);else if(a.taskId)await xe(a.taskId);else return;a.taskId&&n.remove(a.taskId),y.success("已删除"),await Promise.all([G(),H()])}catch(e){y.error(e instanceof Error?e.message:"删除失败")}}return pe(()=>{C(),G(),H()}),oe(()=>{T!=null&&(D.clearTimer("country-pref-save",T),T=null),D.clearScope()}),(a,e)=>(f(),v("div",Be,[me(be,{active:"collect-data"}),t("div",Re,[t("aside",Le,[e[13]||(e[13]=t("div",{class:"section-title"},"上传文件",-1)),t("div",Me,[e[5]||(e[5]=t("div",{class:"hint"},"选择需要采集的 Excel 文件或文件夹(默认根目录:采集前数据.xlsx),后续将按下方筛选条件交给 Python 端进行数据采集。",-1)),t("div",{class:"btns"},[t("button",{type:"button",class:"opt-btn",onClick:q},"选择 Excel"),t("button",{type:"button",class:"opt-btn",onClick:ie},"选择文件夹")]),t("div",qe,[g.value.length?(f(),v(V,{key:0},[(f(!0),v(V,null,Y(r.value,s=>(f(),v("span",{key:s},l(s),1))),128)),g.value.length>r.value.length?(f(),v("span",Oe," 还有 "+l(g.value.length-r.value.length)+" 个文件未展开显示 ",1)):B("",!0)],64)):(f(),v("span",Ge,"暂未选择文件"))])]),e[14]||(e[14]=t("div",{class:"section-title"},"筛选条件",-1)),t("div",Ve,[t("div",ze,[e[7]||(e[7]=t("label",{class:"filter-label"},"金额区间",-1)),t("div",Ke,[z(t("input",{"onUpdate:modelValue":e[0]||(e[0]=s=>o.minAmount=s),type:"number",step:"0.01",min:"0",class:"filter-input",placeholder:"最低"},null,512),[[ae,o.minAmount,void 0,{number:!0}]]),e[6]||(e[6]=t("span",{class:"range-separator"},"至",-1)),z(t("input",{"onUpdate:modelValue":e[1]||(e[1]=s=>o.maxAmount=s),type:"number",step:"0.01",min:"0",class:"filter-input",placeholder:"最高"},null,512),[[ae,o.maxAmount,void 0,{number:!0}]])])]),t("div",je,[t("label",He,[z(t("input",{type:"checkbox",class:"filter-check-input","onUpdate:modelValue":e[2]||(e[2]=s=>o.rank=s)},null,512),[[W,o.rank]]),e[8]||(e[8]=t("span",{class:"filter-check-text"},"排名",-1))]),t("label",Je,[z(t("input",{type:"checkbox",class:"filter-check-input","onUpdate:modelValue":e[3]||(e[3]=s=>o.fba=s)},null,512),[[W,o.fba]]),e[9]||(e[9]=t("span",{class:"filter-check-text"},"FBA",-1))]),t("label",Ye,[z(t("input",{type:"checkbox",class:"filter-check-input","onUpdate:modelValue":e[4]||(e[4]=s=>o.fbm=s)},null,512),[[W,o.fbm]]),e[10]||(e[10]=t("span",{class:"filter-check-text"},"FBM",-1))])])]),t("div",Qe,[e[11]||(e[11]=t("span",null,"采集国家",-1)),O.value?(f(),v("span",Ze,"保存中…")):B("",!0)]),e[15]||(e[15]=t("p",{class:"hint country-pref-hint"}," 每次任务只采集一个国家,选择后会自动保存,下次进入默认使用该国家。 ",-1)),t("div",We,[(f(),v(V,null,Y(k,s=>t("label",{key:s.code,class:ne(["country-check-row",{selected:c.value===s.code}])},[t("input",{type:"radio",name:"collect-data-country",class:"country-check-input",checked:c.value===s.code,onChange:p=>M(s.code)},null,40,Xe),t("span",et,l(s.label)+"("+l(s.code)+")",1)],2)),64))]),t("div",tt,[t("button",{type:"button",class:"btn-run",disabled:d.value||!b.value.length,onClick:ue},l(d.value?"提交中...":"提交采集任务"),9,st),t("button",{type:"button",class:"btn-run btn-queue",disabled:_.value||!w.value,onClick:ce},l(_.value?"推送中...":"推送到 Python 队列"),9,at)]),e[16]||(e[16]=t("p",{class:"loading-msg"},"提交后由 Java 解析 Excel 并落库为待采集任务(PENDING);推送到 Python 队列将激活任务(RUNNING),Python 端按 50 条/页拉取明细执行采集。",-1)),L.value?(f(),v("div",nt,[e[12]||(e[12]=t("div",{class:"section-title queue-debug-title"},"推送结果",-1)),t("div",lt,l(L.value),1),A.value?(f(),v("pre",ot,l(A.value),1)):B("",!0)])):B("",!0)]),t("section",rt,[e[24]||(e[24]=t("div",{class:"panel-header"},"采集数据",-1)),t("div",it,[t("div",ut,[t("div",ct,[e[17]||(e[17]=t("span",{class:"summary-label"},"运行中任务",-1)),t("strong",null,l(E.value.pendingTaskCount),1)]),t("div",dt,[e[18]||(e[18]=t("span",{class:"summary-label"},"已结束任务",-1)),t("strong",null,l(E.value.processedTaskCount),1)]),t("div",ft,[e[19]||(e[19]=t("span",{class:"summary-label"},"成功任务",-1)),t("strong",null,l(E.value.successTaskCount),1)]),t("div",vt,[e[20]||(e[20]=t("span",{class:"summary-label"},"失败任务",-1)),t("strong",null,l(E.value.failedTaskCount),1)])]),e[23]||(e[23]=t("div",{class:"subsection-title"},"匹配任务",-1)),t("div",pt,[e[21]||(e[21]=t("div",{class:"result-list-header"},[t("span",null,"当前任务")],-1)),U.value.length?(f(),v("ul",yt,[(f(!0),v(V,null,Y(U.value,s=>(f(),v("li",{key:`cur-${s.taskId}`,class:"task-item"},[t("div",ht,[t("span",kt,l(s.sourceFilename||"采集数据"),1),t("div",gt,"任务 ID:"+l(s.taskId),1),t("div",_t,"开始时间:"+l(Z(s.startedAt||s.createdAt)),1),t("div",bt,"行数:"+l(s.rowCount??"-"),1),t("div",wt,"总数据去重过滤:"+l(s.dedupeFilteredCount??0),1),t("div",Ct,"不符合 ASIN 过滤:"+l(s.invalidFilteredCount??0),1)]),t("div",St,[t("span",It,l(te(s)),1),t("button",{type:"button",class:"btn-delete",onClick:p=>se(s)},"删除",8,Tt)])]))),128))])):(f(),v("div",mt,"暂无当前任务"))]),t("div",Nt,[e[22]||(e[22]=t("div",{class:"result-list-header"},[t("span",null,"历史记录")],-1)),P.value.length?(f(),v("ul",xt,[(f(!0),v(V,null,Y(P.value,s=>(f(),v("li",{key:`his-${s.resultId}-${s.taskId}`,class:"task-item"},[t("div",At,[t("span",Et,l(s.sourceFilename||"采集数据"),1),t("div",Ft,"任务 ID:"+l(s.taskId??"-"),1),t("div",Dt,"开始时间:"+l(Z(s.startedAt||s.createdAt)),1),t("div",Ut,"结束时间:"+l(Z(s.finishedAt)),1),t("div",$t,"总数据去重过滤:"+l(s.dedupeFilteredCount??0),1),t("div",Bt,"不符合 ASIN 过滤:"+l(s.invalidFilteredCount??0),1),s.resultFilename?(f(),v("div",Rt,l(s.resultFilename),1)):B("",!0),s.error?(f(),v("div",Lt,"错误:"+l(s.error),1)):B("",!0)]),t("div",Mt,[t("span",{class:ne(["status",de(s)])},l(te(s)),3),s.resultId?(f(),v("button",{key:0,type:"button",class:"btn-delete",onClick:p=>se(s)},"删除",8,qt)):B("",!0)])]))),128))])):(f(),v("div",Pt,"暂无历史记录"))])])])])]))}}),Vt=he(Gt,[["__scopeId","data-v-8eb7a5b8"]]);ke(Vt).use(ge).mount("#app"); diff --git a/app/assets/convert-6oxZNMye.css b/app/assets/convert-6oxZNMye.css deleted file mode 100644 index 6add8cd..0000000 --- a/app/assets/convert-6oxZNMye.css +++ /dev/null @@ -1 +0,0 @@ -.module-page[data-v-64f58715]{min-height:100vh;background:#1a1a1a}.main-content[data-v-64f58715]{display:flex;min-height:calc(100vh - 56px);height:calc(100vh - 56px)}.left-panel[data-v-64f58715]{width:380px;background:#1e1e1e;padding:20px;overflow-y:auto;border-right:1px solid #2a2a2a}.right-panel[data-v-64f58715]{flex:1;display:flex;flex-direction:column;min-width:0;background:#1a1a1a}.section-title[data-v-64f58715]{font-size:13px;color:#bbb;margin-bottom:10px}.upload-zone[data-v-64f58715]{border:1px dashed #3a3a3a;border-radius:10px;padding:24px;text-align:center;background:#252525;margin-bottom:20px;transition:all .2s ease}.upload-zone[data-v-64f58715]:hover{border-color:#3498db;background:#2a2a2a}.hint[data-v-64f58715]{color:#888;font-size:13px;margin-bottom:12px;line-height:1.5}.btns[data-v-64f58715]{display:flex;gap:10px;justify-content:center;flex-wrap:wrap}.opt-btn[data-v-64f58715],.btn-run[data-v-64f58715],.download[data-v-64f58715],.btn-delete[data-v-64f58715],.template-download-row[data-v-64f58715]{border:none;cursor:pointer;transition:all .2s ease}.opt-btn[data-v-64f58715]{padding:8px 16px;font-size:13px;color:#ccc;background:#2a2a2a;border:1px solid #3a3a3a;border-radius:6px}.opt-btn.small[data-v-64f58715]{padding:6px 10px;font-size:12px}.opt-btn[data-v-64f58715]:hover{color:#3498db;background:#333;border-color:#3498db}.opt-btn.danger[data-v-64f58715]:hover{color:#ff9f9f;border-color:#e74c3c80}.opt-btn[data-v-64f58715]:disabled{cursor:not-allowed;opacity:.55}.selected-files[data-v-64f58715]{margin-top:14px;font-size:12px;color:#888;max-height:112px;overflow-y:auto;text-align:left}.selected-files span[data-v-64f58715]{display:block;margin:4px 0;word-break:break-all}.more-line[data-v-64f58715]{color:#b8c1cc}.option-group[data-v-64f58715]{margin-bottom:20px}.radio-item[data-v-64f58715]{display:flex;align-items:flex-start;gap:10px;cursor:pointer;padding:10px 12px;border-radius:8px;background:#252525;border:1px solid #2a2a2a;margin-bottom:8px;transition:all .2s ease}.template-item-content[data-v-64f58715]{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%}.radio-item[data-v-64f58715]:hover,.radio-item.active[data-v-64f58715]{background:#2a2a2a;border-color:#3a3a3a}.radio-item input[data-v-64f58715]{margin-top:3px}.label[data-v-64f58715]{font-weight:500;color:#e0e0e0;font-size:13px}.desc[data-v-64f58715]{font-size:12px;color:#888;margin-top:2px;line-height:1.5;font-weight:400}.template-tag[data-v-64f58715]{margin-left:8px;padding:2px 8px;border-radius:999px;font-size:11px;color:#8fd0ff;background:#3498db24}.template-tag.muted[data-v-64f58715]{color:#b8b8b8;background:#ffffff14}.template-tag.custom[data-v-64f58715]{color:#90f0b3;background:#2ecc7124}.empty-option[data-v-64f58715]{padding:12px;border:1px dashed #3a3a3a;border-radius:8px;color:#777;font-size:12px}.template-actions[data-v-64f58715]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin-bottom:20px}.template-actions-hint[data-v-64f58715]{grid-column:1 / -1;font-size:12px;color:#888;line-height:1.5}.hidden-file-input[data-v-64f58715]{display:none}.template-download-list[data-v-64f58715]{display:grid;gap:10px;margin-bottom:20px}.template-download-row[data-v-64f58715]{width:100%;padding:14px 16px;background:linear-gradient(135deg,#252525,#1f2b1f);border:1px solid #2a3a2a;border-radius:10px;display:flex;align-items:center;gap:14px;text-align:left}.template-download-row[data-v-64f58715]:hover{border-color:#2e7d32;background:linear-gradient(135deg,#2a2a2a,#243324);box-shadow:0 4px 12px #2e7d3226}.template-download-icon[data-v-64f58715]{width:48px;height:48px;flex-shrink:0;border-radius:10px;background:linear-gradient(145deg,#1b5e20,#2e7d32,#388e3c);display:flex;align-items:center;justify-content:center;color:#fff;font-size:11px;font-weight:700;letter-spacing:.08em}.template-download-text[data-v-64f58715]{display:flex;flex-direction:column;min-width:0}.template-download-text .title[data-v-64f58715]{font-size:14px;color:#e0e0e0;font-weight:600}.template-download-text .hint[data-v-64f58715]{margin:2px 0 0;font-size:12px;color:#888}.run-row[data-v-64f58715]{display:flex;align-items:center;flex-wrap:wrap;gap:10px 12px;margin-top:16px}.btn-run[data-v-64f58715]{padding:10px 22px;background:#3498db;color:#fff;border-radius:8px;font-size:14px}.btn-run[data-v-64f58715]:hover{background:#2980b9}.btn-run[data-v-64f58715]:disabled{background:#555;color:#999;cursor:not-allowed}.loading-msg[data-v-64f58715]{color:#3498db;font-size:13px}.panel-header[data-v-64f58715]{padding:16px 20px;border-bottom:1px solid #2a2a2a;font-size:15px;font-weight:600;color:#ddd}.task-list-wrap[data-v-64f58715]{flex:1;overflow-y:auto;padding:16px}.task-list[data-v-64f58715]{list-style:none;margin:0;padding:0}.task-item[data-v-64f58715]{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 16px;border:1px solid #2a2a2a;border-radius:8px;margin-bottom:10px;background:#1e1e1e}.left[data-v-64f58715]{flex:1;min-width:0}.id[data-v-64f58715]{display:inline-block;font-weight:600;color:#e0e0e0;font-size:13px}.files[data-v-64f58715]{font-size:12px;color:#888;margin-top:4px}.task-right[data-v-64f58715]{display:flex;align-items:center;gap:12px;flex-wrap:wrap;justify-content:flex-end}.status[data-v-64f58715]{padding:4px 10px;border-radius:6px;font-size:12px;white-space:nowrap}.status.success[data-v-64f58715]{background:#2ecc712e;color:#2ecc71}.status.failed[data-v-64f58715]{background:#e74c3c2e;color:#ff6b6b}.download[data-v-64f58715]{padding:6px 10px;border-radius:6px;font-size:12px;background:#3498db2e;color:#69b6ff}.download[data-v-64f58715]:hover{background:#3498db47}.btn-delete[data-v-64f58715]{padding:6px 10px;border-radius:6px;font-size:12px;background:#e74c3c1f;color:#ff8f8f}.btn-delete[data-v-64f58715]:hover{background:#e74c3c38}.empty-tasks[data-v-64f58715]{color:#666;font-size:13px;padding:24px 8px}.clean-placeholder[data-v-64f58715]{max-height:none}.clean-result-summary[data-v-64f58715]{display:grid;grid-template-columns:repeat(3,minmax(0,220px));gap:16px;margin-bottom:18px}.summary-card[data-v-64f58715]{padding:16px 18px;border:1px solid #2a2a2a;border-radius:10px;background:#1e1e1e}.summary-card strong[data-v-64f58715]{display:block;margin-top:8px;font-size:24px;color:#eaf4ff}.summary-label[data-v-64f58715]{font-size:12px;color:#8d8d8d}.result-list-wrap[data-v-64f58715]{border:1px solid #2a2a2a;border-radius:10px;background:#1e1e1e;min-height:260px}.result-list-header[data-v-64f58715]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px;border-bottom:1px solid #2a2a2a;font-size:14px;color:#ddd}@media(max-width:1100px){.main-content[data-v-64f58715]{flex-direction:column;height:auto}.left-panel[data-v-64f58715]{width:100%;border-right:none;border-bottom:1px solid #2a2a2a}.right-panel[data-v-64f58715]{min-height:420px}.task-item[data-v-64f58715]{flex-direction:column;align-items:flex-start}.task-right[data-v-64f58715]{width:100%;justify-content:flex-start}.clean-result-summary[data-v-64f58715]{grid-template-columns:1fr}} diff --git a/app/assets/convert.js b/app/assets/convert.js deleted file mode 100644 index 913e282..0000000 --- a/app/assets/convert.js +++ /dev/null @@ -1 +0,0 @@ -import{d as H,o as j,a as n,c as o,b as A,e as s,F as w,r as x,t as i,f as _,n as P,w as K,l as M,m as z,g as u,h as E,i as F,E as r,_ as J,j as L,k as O}from"./pywebview-B8lwamDf.js";import{B as W,c as q,e as G,f as Q,h as X,i as Y,s as Z}from"./java-modules-B9jblDzU.js";import{e as ee}from"./brand-DE-sObfq.js";const se={class:"page-shell module-page"},te={class:"main-content"},ae={class:"left-panel"},le={class:"upload-zone"},ne={class:"selected-files clean-placeholder"},oe={key:0,class:"more-line"},re={key:1},ie={class:"option-group"},ce=["value"],ue={class:"template-item-content"},de={class:"label"},ve={key:0,class:"template-tag"},pe={key:1,class:"template-tag muted"},_e={key:2,class:"template-tag custom"},fe={class:"desc"},me={key:0,class:"empty-option"},he={class:"option-group"},ye={class:"radio-item active"},ge={class:"desc"},be={class:"run-row"},we=["disabled"],ke={class:"loading-msg"},Ce={class:"right-panel"},xe={class:"task-list-wrap"},Fe={class:"clean-result-summary"},Ie={class:"summary-card"},Pe={class:"summary-card"},Ee={class:"summary-card"},Te={class:"result-list-wrap"},Be={key:0,class:"empty-tasks"},$e={key:1,class:"task-list clean-result-list"},De={class:"left"},Ne=["title"],Re={key:0,class:"files"},Se={key:1,class:"files"},Ue={class:"task-right"},Ve=["onClick"],He=["onClick"],je=H({__name:"BrandConvertTab",setup(Ke){const v=u([]),g=u(""),f=u([]),m=u(!1),b=u([]),h=u({total:0,successCount:0,failedCount:0,items:[]}),d=u([]),c=u(""),k=E(()=>v.value.slice(0,8)),T=E(()=>d.value.find(a=>a.id===c.value)||null);async function I(a){const e=F();if(!e?.upload_file_to_java)throw new Error("当前桌面端未提供文件上传桥接能力");const t=[];for(const l of a){const p=typeof l=="string"?l:l.absolutePath,V=typeof l=="string"?void 0:l.relativePath,y=await e.upload_file_to_java(p,V);if(!y?.success||!y.data)throw new Error(y?.error||y?.message||`上传失败:${p}`);t.push(y.data)}return t}async function B(a){const e=await q();d.value=e||[];const t=d.value.find(p=>p.id===c.value);if(t){c.value=t.id;return}const l=d.value.find(p=>p.isDefault);if(l){c.value=l.id;return}c.value=d.value[0]?.id||""}async function $(a,e){v.value=a,g.value="",f.value=await I(a),r.success(e)}async function D(){const a=F();if(!a?.select_brand_xlsx_files){r.warning("当前环境不支持文件选择,请在本机客户端中打开");return}try{const e=await a.select_brand_xlsx_files();if(!e?.length)return;await $(e,`已选择 ${e.length} 个待转换文件`)}catch(e){r.error(e instanceof Error?e.message:"选择失败")}}async function N(){const a=F();if(!a?.select_brand_folder){r.warning("当前环境不支持文件夹选择,请在本机客户端中打开");return}try{const e=await a.select_brand_folder();if(!e)return;g.value=e.split(/[/\\]/).filter(Boolean).pop()||"";const t=await ee(e);if(t.success&&t.items?.length){v.value=t.items.map(l=>l.relativePath),f.value=await I(t.items),r.success(`已选择文件夹内 ${t.items.length} 个 xlsx 文件`);return}r.warning(t.error||"该文件夹下没有 xlsx 文件")}catch(e){r.error(e instanceof Error?e.message:"选择失败")}}async function R(){if(!f.value.length){r.warning("请先选择待转换 Excel 文件或文件夹");return}if(!c.value){r.warning("请先选择模板");return}try{m.value=!0;const a=await G({files:f.value.map(e=>({fileKey:e.fileKey,originalFilename:e.originalFilename,relativePath:e.relativePath})),templateId:c.value,archiveName:f.value.some(e=>!!e.relativePath)&&g.value?g.value:void 0});h.value=a,b.value=a.items||[],await C(),r.success("格式转换完成")}catch(a){r.error(a instanceof Error?a.message:"格式转换失败")}finally{m.value=!1}}async function C(){try{const a=await Q();b.value=a.items||[],h.value={total:a.items?.length||0,successCount:a.items?.filter(e=>e.success).length||0,failedCount:a.items?.filter(e=>!e.success).length||0,items:a.items||[]}}catch{}}async function S(a){try{await X(a),await C(),r.success("已删除")}catch(e){r.error(e instanceof Error?e.message:"删除失败")}}async function U(a){const e=a.downloadUrl||(a.resultId?Y(a.resultId):"");if(!e){r.warning("当前结果没有下载地址");return}const t=a.outputFilename||`${new Date().toISOString().slice(0,10).replace(/-/g,"")}.txt`,l=await Z(e,t,a.resultId?`convert:${a.resultId}`:void 0);l.success?r.success(`已保存:${l.path||t}`):l.error&&l.error!=="用户取消"&&r.error(l.error)}return j(()=>{B().catch(()=>{}),C().catch(()=>{})}),(a,e)=>(n(),o("div",se,[A(W,{active:"convert"}),s("div",te,[s("aside",ae,[e[5]||(e[5]=s("div",{class:"section-title"},"选择文件",-1)),s("div",le,[e[1]||(e[1]=s("div",{class:"hint"},"选择需要转换的 Excel 文件或文件夹,将按所选模板生成 txt 文件。",-1)),s("div",{class:"btns"},[s("button",{type:"button",class:"opt-btn",onClick:D},"选择 Excel 文件"),s("button",{type:"button",class:"opt-btn",onClick:N},"选择文件夹")]),s("div",ne,[v.value.length?(n(),o(w,{key:0},[(n(!0),o(w,null,x(k.value,t=>(n(),o("span",{key:t},i(t),1))),128)),v.value.length>k.value.length?(n(),o("span",oe," 还有 "+i(v.value.length-k.value.length)+" 个文件未展开显示 ",1)):_("",!0)],64)):(n(),o("span",re,"暂未选择待转换文件"))])]),e[6]||(e[6]=s("div",{class:"section-title"},"模板选择",-1)),s("div",ie,[(n(!0),o(w,null,x(d.value,t=>(n(),o("label",{key:t.id,class:P(["radio-item",{active:c.value===t.id}])},[K(s("input",{"onUpdate:modelValue":e[0]||(e[0]=l=>c.value=l),type:"radio",value:t.id,name:"convert-template"},null,8,ce),[[M,c.value]]),s("div",ue,[s("div",null,[s("span",de,[z(i(t.templateName)+" ",1),t.isDefault?(n(),o("span",ve,"默认")):t.builtIn?(n(),o("span",pe,"内置")):(n(),o("span",_e,"自定义"))]),s("div",fe,"输出文件:"+i(t.outputFilename),1)])])],2))),128)),d.value.length?_("",!0):(n(),o("div",me,"暂无可用模板"))]),e[7]||(e[7]=s("div",{class:"section-title"},"转换说明",-1)),s("div",he,[s("label",ye,[e[3]||(e[3]=s("input",{type:"checkbox",checked:"",disabled:""},null,-1)),s("div",null,[e[2]||(e[2]=s("span",{class:"label"},"按当前模板输出",-1)),s("div",ge,"当前模板:"+i(T.value?.templateName||"未加载模板"),1)])]),e[4]||(e[4]=s("label",{class:"radio-item active"},[s("input",{type:"checkbox",checked:"",disabled:""}),s("div",null,[s("span",{class:"label"},"SKU 使用雪花ID-序号"),s("div",{class:"desc"},"例如 1773816146796-1")])],-1))]),s("div",be,[s("button",{type:"button",class:"btn-run",disabled:m.value,onClick:R},i(m.value?"转换中...":"开始转换"),9,we),s("span",ke,i(m.value?"正在生成并上传结果,请稍候…":"选择文件后即可执行格式转换,结果会显示在右侧供下载"),1)])]),s("section",Ce,[e[12]||(e[12]=s("div",{class:"panel-header"},"转换结果",-1)),s("div",xe,[s("div",Fe,[s("div",Ie,[e[8]||(e[8]=s("span",{class:"summary-label"},"已处理文件",-1)),s("strong",null,i(h.value.total),1)]),s("div",Pe,[e[9]||(e[9]=s("span",{class:"summary-label"},"成功结果",-1)),s("strong",null,i(h.value.successCount),1)]),s("div",Ee,[e[10]||(e[10]=s("span",{class:"summary-label"},"失败文件",-1)),s("strong",null,i(h.value.failedCount),1)])]),s("div",Te,[e[11]||(e[11]=s("div",{class:"result-list-header"},[s("span",null,"生成的结果压缩包列表")],-1)),b.value.length===0?(n(),o("div",Be," 暂无转换结果,完成格式转换后会在这里展示结果压缩包 ")):(n(),o("ul",$e,[(n(!0),o(w,null,x(b.value,t=>(n(),o("li",{key:`${t.resultId||t.outputFilename||t.sourceFilename}`,class:"task-item"},[s("div",De,[s("span",{class:"id",title:t.sourceFilename},i(t.sourceFilename||"-"),9,Ne),t.outputFilename?(n(),o("div",Re,"压缩包文件:"+i(t.outputFilename),1)):_("",!0),t.error?(n(),o("div",Se,"错误信息:"+i(t.error),1)):_("",!0)]),s("div",Ue,[s("span",{class:P(["status",t.success?"success":"failed"])},i(t.success?"已完成":"失败"),3),t.success&&(t.downloadUrl||t.resultId)?(n(),o("button",{key:0,type:"button",class:"download",onClick:l=>U(t)}," 下载压缩包 ",8,Ve)):_("",!0),t.resultId?(n(),o("button",{key:1,type:"button",class:"btn-delete",onClick:l=>S(t.resultId)}," 删除 ",8,He)):_("",!0)])]))),128))]))])])])])]))}}),Ae=J(je,[["__scopeId","data-v-64f58715"]]);L(Ae).use(O).mount("#app"); diff --git a/app/assets/dedupe-DpfPYQDv.css b/app/assets/dedupe-DpfPYQDv.css deleted file mode 100644 index 2bc2c86..0000000 --- a/app/assets/dedupe-DpfPYQDv.css +++ /dev/null @@ -1 +0,0 @@ -.module-page[data-v-b83c7062]{min-height:100vh;background:#1a1a1a}.main-content[data-v-b83c7062]{display:flex;min-height:calc(100vh - 56px);height:calc(100vh - 56px)}.left-panel[data-v-b83c7062]{width:380px;background:#1e1e1e;padding:20px;overflow-y:auto;border-right:1px solid #2a2a2a}.right-panel[data-v-b83c7062]{flex:1;display:flex;flex-direction:column;min-width:0;background:#1a1a1a}.section-title[data-v-b83c7062]{font-size:13px;color:#bbb;margin-bottom:10px}.upload-zone[data-v-b83c7062]{border:1px dashed #3a3a3a;border-radius:10px;padding:24px;text-align:center;background:#252525;margin-bottom:20px;transition:all .2s ease}.upload-zone[data-v-b83c7062]:hover{border-color:#3498db;background:#2a2a2a}.hint[data-v-b83c7062]{color:#888;font-size:13px;margin-bottom:12px;line-height:1.5}.btns[data-v-b83c7062]{display:flex;gap:10px;justify-content:center;flex-wrap:wrap}.opt-btn[data-v-b83c7062],.btn-run[data-v-b83c7062],.download[data-v-b83c7062],.btn-delete[data-v-b83c7062]{border:none;cursor:pointer;transition:all .2s ease}.opt-btn[data-v-b83c7062]{padding:8px 16px;font-size:13px;color:#ccc;background:#2a2a2a;border:1px solid #3a3a3a;border-radius:6px}.opt-btn.small[data-v-b83c7062]{padding:6px 10px;font-size:12px}.opt-btn[data-v-b83c7062]:hover{color:#3498db;background:#333;border-color:#3498db}.selected-files[data-v-b83c7062]{margin-top:14px;font-size:12px;color:#888;max-height:112px;overflow-y:auto;text-align:left}.selected-files span[data-v-b83c7062]{display:block;margin:4px 0;word-break:break-all}.more-line[data-v-b83c7062]{color:#b8c1cc}.option-group[data-v-b83c7062]{margin-bottom:20px}.column-option-group[data-v-b83c7062]{padding:14px;border-radius:10px;background:#252525;border:1px solid #2a2a2a}.column-toolbar[data-v-b83c7062]{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:14px}.column-count[data-v-b83c7062]{font-size:12px;color:#a9b4bf}.column-actions[data-v-b83c7062]{display:flex;gap:8px}.column-grid[data-v-b83c7062]{display:grid;grid-template-columns:1fr;gap:8px;max-height:280px;overflow-y:auto}.empty-column-state[data-v-b83c7062]{padding:16px 12px;border-radius:8px;border:1px dashed #3a3a3a;background:#202020;color:#7f8790;font-size:12px;line-height:1.6}.column-item[data-v-b83c7062]{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:8px;border:1px solid #2f2f2f;background:#202020;cursor:pointer;transition:all .2s ease;font-size:13px;color:#d7d7d7}.column-item[data-v-b83c7062]:hover,.column-item.active[data-v-b83c7062]{border-color:#3b6f98;background:#26313a}.column-item input[data-v-b83c7062]{margin:0}.column-item span[data-v-b83c7062]{word-break:break-all}.radio-item[data-v-b83c7062]{display:flex;align-items:flex-start;gap:10px;cursor:pointer;padding:10px 12px;border-radius:8px;background:#252525;border:1px solid #2a2a2a;margin-bottom:8px;transition:all .2s ease}.radio-item[data-v-b83c7062]:hover,.radio-item.active[data-v-b83c7062]{background:#2a2a2a;border-color:#3a3a3a}.radio-item input[data-v-b83c7062]{margin-top:3px}.label[data-v-b83c7062]{font-weight:500;color:#e0e0e0;font-size:13px}.desc[data-v-b83c7062]{font-size:12px;color:#888;margin-top:2px;line-height:1.5;font-weight:400}.run-row[data-v-b83c7062]{display:flex;align-items:center;flex-wrap:wrap;gap:10px 12px;margin-top:16px}.btn-run[data-v-b83c7062]{padding:10px 22px;background:#3498db;color:#fff;border-radius:8px;font-size:14px}.btn-run[data-v-b83c7062]:hover{background:#2980b9}.btn-run[data-v-b83c7062]:disabled{background:#555;color:#999;cursor:not-allowed}.loading-msg[data-v-b83c7062]{color:#3498db;font-size:13px}.panel-header[data-v-b83c7062]{padding:16px 20px;border-bottom:1px solid #2a2a2a;font-size:15px;font-weight:600;color:#ddd}.task-list-wrap[data-v-b83c7062]{flex:1;overflow-y:auto;padding:16px}.task-list[data-v-b83c7062]{list-style:none;margin:0;padding:0}.task-item[data-v-b83c7062]{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 16px;border:1px solid #2a2a2a;border-radius:8px;margin-bottom:10px;background:#1e1e1e}.left[data-v-b83c7062]{flex:1;min-width:0}.id[data-v-b83c7062]{display:inline-block;font-weight:600;color:#e0e0e0;font-size:13px}.files[data-v-b83c7062]{font-size:12px;color:#888;margin-top:4px}.task-right[data-v-b83c7062]{display:flex;align-items:center;gap:12px;flex-wrap:wrap;justify-content:flex-end}.status[data-v-b83c7062]{padding:4px 10px;border-radius:6px;font-size:12px;white-space:nowrap}.status.success[data-v-b83c7062]{background:#2ecc712e;color:#2ecc71}.status.failed[data-v-b83c7062]{background:#e74c3c2e;color:#ff6b6b}.download[data-v-b83c7062]{padding:6px 10px;border-radius:6px;font-size:12px;background:#3498db2e;color:#69b6ff}.download[data-v-b83c7062]:hover{background:#3498db47}.btn-delete[data-v-b83c7062]{padding:6px 10px;border-radius:6px;font-size:12px;background:#e74c3c1f;color:#ff8f8f}.btn-delete[data-v-b83c7062]:hover{background:#e74c3c38}.empty-tasks[data-v-b83c7062]{color:#666;font-size:13px;padding:24px 8px}.clean-placeholder[data-v-b83c7062]{max-height:none}.clean-result-summary[data-v-b83c7062]{display:grid;grid-template-columns:repeat(3,minmax(0,220px));gap:16px;margin-bottom:18px}.summary-card[data-v-b83c7062]{padding:16px 18px;border:1px solid #2a2a2a;border-radius:10px;background:#1e1e1e}.summary-card strong[data-v-b83c7062]{display:block;margin-top:8px;font-size:24px;color:#eaf4ff}.summary-label[data-v-b83c7062]{font-size:12px;color:#8d8d8d}.result-list-wrap[data-v-b83c7062]{border:1px solid #2a2a2a;border-radius:10px;background:#1e1e1e;min-height:260px}.result-list-header[data-v-b83c7062]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px;border-bottom:1px solid #2a2a2a;font-size:14px;color:#ddd}@media(max-width:1100px){.main-content[data-v-b83c7062]{flex-direction:column;height:auto}.left-panel[data-v-b83c7062]{width:100%;border-right:none;border-bottom:1px solid #2a2a2a}.right-panel[data-v-b83c7062]{min-height:420px}.task-item[data-v-b83c7062]{flex-direction:column;align-items:flex-start}.task-right[data-v-b83c7062]{width:100%;justify-content:flex-start}.clean-result-summary[data-v-b83c7062]{grid-template-columns:1fr}} diff --git a/app/assets/dedupe.js b/app/assets/dedupe.js deleted file mode 100644 index 5042330..0000000 --- a/app/assets/dedupe.js +++ /dev/null @@ -1 +0,0 @@ -import{d as W,o as z,a as n,c as o,b as J,e as s,F as C,r as E,t as i,f as b,n as I,w as F,v as P,g as u,h as L,i as B,E as r,_ as O,j as q,k as G}from"./pywebview-B8lwamDf.js";import{B as Q,r as X,g as Y,d as Z,a as ee,s as se,b as te}from"./java-modules-B9jblDzU.js";import{e as le}from"./brand-DE-sObfq.js";const ae={class:"page-shell module-page"},ne={class:"main-content"},oe={class:"left-panel"},re={class:"upload-zone"},ie={class:"selected-files clean-placeholder"},ue={key:0,class:"more-line"},ce={key:1},de={class:"option-group column-option-group"},ve={class:"column-toolbar"},pe={class:"column-count"},fe={key:0,class:"column-grid"},_e=["value"],me={key:1,class:"empty-column-state"},he={class:"option-group"},ge={class:"run-row"},ye=["disabled"],be={class:"loading-msg"},we={class:"right-panel"},ke={class:"task-list-wrap"},Ce={class:"clean-result-summary"},Ie={class:"summary-card"},xe={class:"summary-card"},De={class:"summary-card"},Ee={class:"result-list-wrap"},Fe={key:0,class:"empty-tasks"},Pe={key:1,class:"task-list clean-result-list"},Be={class:"left"},Se=["title"],Ue={key:0,class:"files"},$e={key:1,class:"files"},Ne={class:"task-right"},Ae=["onClick"],He=["onClick"],Ke=W({__name:"BrandDedupeTab",setup(Ve){const p=u([]),c=u([]),f=u([]),w=u(""),d=u([]),S=u(!1),_=u(!0),m=u(!0),h=u(!1),k=u([]),g=u({total:0,successCount:0,failedCount:0,items:[]}),x=L(()=>f.value.slice(0,8));function N(){c.value=[...p.value]}function A(){c.value=[]}async function U(l){const e=B();if(!e?.upload_file_to_java)throw new Error("当前桌面端未提供文件上传桥接能力");const t=[];for(const a of l){const v=typeof a=="string"?a:a.absolutePath,j=typeof a=="string"?void 0:a.relativePath,y=await e.upload_file_to_java(v,j);if(!y?.success||!y.data)throw new Error(y?.error||y?.message||`上传失败:${v}`);t.push(y.data)}return t}async function $(l){const e=await te(l);if(!e.headers?.length){r.error("读取 Excel 表头失败"),p.value=[],c.value=[];return}const t=["id","ASIN","国家","价格","卖家名称"],a=[...t.filter(v=>e.headers?.includes(v)),...(e.headers||[]).filter(v=>!t.includes(v))];p.value=a,c.value=t.filter(v=>a.includes(v))}async function H(l,e){f.value=l,w.value="",d.value=await U(l),d.value.length>0&&await $(d.value[0].fileKey),r.success(e)}async function K(){const l=B();if(!l?.select_brand_xlsx_files){r.warning("当前环境不支持文件选择,请在本机客户端中打开");return}try{const e=await l.select_brand_xlsx_files();if(!e?.length)return;await H(e,`已选择 ${e.length} 个待清洗文件`)}catch(e){r.error(e instanceof Error?e.message:"选择失败")}}async function R(){const l=B();if(!l?.select_brand_folder){r.warning("当前环境不支持文件夹选择,请在本机客户端中打开");return}try{const e=await l.select_brand_folder();if(!e)return;w.value=e.split(/[/\\]/).filter(Boolean).pop()||"";const t=await le(e);if(t.success&&t.items?.length){f.value=t.items.map(a=>a.relativePath),d.value=await U(t.items),d.value.length>0&&await $(d.value[0].fileKey),r.success(`已选择文件夹内 ${t.items.length} 个 xlsx 文件`);return}r.warning(t.error||"该文件夹下没有 xlsx 文件")}catch(e){r.error(e instanceof Error?e.message:"选择失败")}}async function V(){if(!d.value.length){r.warning("请先选择待清洗 Excel 文件或文件夹");return}if(!c.value.length){r.warning("请至少选择一列保留列");return}if(!S.value&&!_.value&&!m.value){r.warning("请至少选择一种 ID 保留规则");return}try{h.value=!0;const l=await X({files:d.value.map(e=>({fileKey:e.fileKey,originalFilename:e.originalFilename,relativePath:e.relativePath})),selectedColumns:c.value,keepIntegerIds:S.value,keepUnderscoreIds:_.value,keepIntegerMainIdsWhenNoSubIds:m.value,archiveName:d.value.some(e=>!!e.relativePath)&&w.value?w.value:void 0});g.value=l,k.value=l.items||[],await D(),r.success("数据去重完成")}catch(l){r.error(l instanceof Error?l.message:"去重失败")}finally{h.value=!1}}async function D(){try{const l=await Y();k.value=l.items||[],g.value={total:l.items?.length||0,successCount:l.items?.filter(e=>e.success).length||0,failedCount:l.items?.filter(e=>!e.success).length||0,items:l.items||[]}}catch{}}async function M(l){try{await Z(l),await D(),r.success("已删除")}catch(e){r.error(e instanceof Error?e.message:"删除失败")}}async function T(l){const e=l.downloadUrl||(l.resultId?ee(l.resultId):"");if(!e){r.warning("当前结果没有下载地址");return}const t=l.outputFilename||`${new Date().toISOString().slice(0,10).replace(/-/g,"")}_cleaned.xlsx`,a=await se(e,t,l.resultId?`dedupe:${l.resultId}`:void 0);a.success?r.success(`已保存:${a.path||t}`):a.error&&a.error!=="用户取消"&&r.error(a.error)}return z(()=>{D().catch(()=>{})}),(l,e)=>(n(),o("div",ae,[J(Q,{active:"dedupe"}),s("div",ne,[s("aside",oe,[e[7]||(e[7]=s("div",{class:"section-title"},"选择文件",-1)),s("div",re,[e[3]||(e[3]=s("div",{class:"hint"},"选择需要清洗的 Excel 文件或文件夹,后续将按所选规则输出处理结果。",-1)),s("div",{class:"btns"},[s("button",{type:"button",class:"opt-btn",onClick:K},"选择 Excel 文件"),s("button",{type:"button",class:"opt-btn",onClick:R},"选择文件夹")]),s("div",ie,[f.value.length?(n(),o(C,{key:0},[(n(!0),o(C,null,E(x.value,t=>(n(),o("span",{key:t},i(t),1))),128)),f.value.length>x.value.length?(n(),o("span",ue," 还有 "+i(f.value.length-x.value.length)+" 个文件未展开显示 ",1)):b("",!0)],64)):(n(),o("span",ce,"暂未选择待清洗文件"))])]),e[8]||(e[8]=s("div",{class:"section-title"},"保留列设置",-1)),s("div",de,[s("div",ve,[s("span",pe,"已选择 "+i(c.value.length)+" / "+i(p.value.length)+" 列",1),s("div",{class:"column-actions"},[s("button",{type:"button",class:"opt-btn small",onClick:N},"全选"),s("button",{type:"button",class:"opt-btn small",onClick:A},"清空")])]),p.value.length?(n(),o("div",fe,[(n(!0),o(C,null,E(p.value,t=>(n(),o("label",{key:t,class:I(["column-item",{active:c.value.includes(t)}])},[F(s("input",{"onUpdate:modelValue":e[0]||(e[0]=a=>c.value=a),type:"checkbox",value:t},null,8,_e),[[P,c.value]]),s("span",null,i(t),1)],2))),128))])):(n(),o("div",me,"请选择 Excel 文件后读取表头并填充可保留列")),e[4]||(e[4]=s("div",{class:"desc"},"读取首个 Excel 文件的第一行作为表头,用于动态选择需要保留的列。",-1))]),e[9]||(e[9]=s("div",{class:"section-title"},"ID 保留规则",-1)),s("div",he,[s("label",{class:I(["radio-item",{active:_.value}])},[F(s("input",{"onUpdate:modelValue":e[1]||(e[1]=t=>_.value=t),type:"checkbox"},null,512),[[P,_.value]]),e[5]||(e[5]=s("div",null,[s("span",{class:"label"},"保留子链接"),s("div",{class:"desc"},"例如 1_1、2_3 这种带下划线的子项 ID")],-1))],2),s("label",{class:I(["radio-item",{active:m.value}])},[F(s("input",{"onUpdate:modelValue":e[2]||(e[2]=t=>m.value=t),type:"checkbox"},null,512),[[P,m.value]]),e[6]||(e[6]=s("div",null,[s("span",{class:"label"},"仅剩主链接无子链接"),s("div",{class:"desc"},"当某个主链接只有 13 这类主 ID、没有 13_1 这类对应子 ID 时,自动保留该主 ID")],-1))],2)]),s("div",ge,[s("button",{type:"button",class:"btn-run",disabled:h.value,onClick:V},i(h.value?"清洗中...":"开始清洗"),9,ye),s("span",be,i(h.value?"正在处理文件并上传结果,请稍候…":"选择文件、列和 ID 规则后即可执行清洗,结果会显示在右侧供下载"),1)])]),s("section",we,[e[14]||(e[14]=s("div",{class:"panel-header"},"去重结果",-1)),s("div",ke,[s("div",Ce,[s("div",Ie,[e[10]||(e[10]=s("span",{class:"summary-label"},"已处理文件",-1)),s("strong",null,i(g.value.total),1)]),s("div",xe,[e[11]||(e[11]=s("span",{class:"summary-label"},"成功结果",-1)),s("strong",null,i(g.value.successCount),1)]),s("div",De,[e[12]||(e[12]=s("span",{class:"summary-label"},"失败文件",-1)),s("strong",null,i(g.value.failedCount),1)])]),s("div",Ee,[e[13]||(e[13]=s("div",{class:"result-list-header"},[s("span",null,"处理后的 Excel 列表")],-1)),k.value.length===0?(n(),o("div",Fe," 暂无去重结果,完成数据去重后会在这里展示输出文件 ")):(n(),o("ul",Pe,[(n(!0),o(C,null,E(k.value,t=>(n(),o("li",{key:`${t.resultId||t.outputFilename||t.sourceFilename}`,class:"task-item"},[s("div",Be,[s("span",{class:"id",title:t.sourceFilename},i(t.sourceFilename||"-"),9,Se),t.outputFilename?(n(),o("div",Ue,"输出文件:"+i(t.outputFilename),1)):b("",!0),t.error?(n(),o("div",$e,"错误信息:"+i(t.error),1)):b("",!0)]),s("div",Ne,[s("span",{class:I(["status",t.success?"success":"failed"])},i(t.success?"已完成":"失败"),3),t.success&&(t.downloadUrl||t.resultId)?(n(),o("button",{key:0,type:"button",class:"download",onClick:a=>T(t)}," 下载文件 ",8,Ae)):b("",!0),t.resultId?(n(),o("button",{key:1,type:"button",class:"btn-delete",onClick:a=>M(t.resultId)}," 删除 ",8,He)):b("",!0)])]))),128))]))])])])])]))}}),Re=O(Ke,[["__scopeId","data-v-b83c7062"]]);q(Re).use(G).mount("#app"); diff --git a/app/assets/delete-brand-DZ3x5hOX.css b/app/assets/delete-brand-DZ3x5hOX.css deleted file mode 100644 index a318dfb..0000000 --- a/app/assets/delete-brand-DZ3x5hOX.css +++ /dev/null @@ -1 +0,0 @@ -.queue-debug-card[data-v-13de5e1b]{margin-top:18px;padding:14px;border:1px solid #2a2a2a;border-radius:10px;background:#202020}.queue-debug-title[data-v-13de5e1b]{margin-bottom:8px}.queue-debug-line[data-v-13de5e1b]{color:#b8c1cc;font-size:12px;line-height:1.6;margin-bottom:8px}.queue-debug-payload[data-v-13de5e1b]{margin:0;max-height:220px;overflow:auto;padding:10px;border-radius:8px;background:#141414;color:#8fd3ff;font-size:12px;line-height:1.5;white-space:pre-wrap;word-break:break-all}.module-page[data-v-13de5e1b]{min-height:100vh;background:#1a1a1a}.main-content[data-v-13de5e1b]{display:flex;min-height:calc(100vh - 56px);height:calc(100vh - 56px)}.left-panel[data-v-13de5e1b]{width:380px;background:#1e1e1e;padding:20px;overflow-y:auto;border-right:1px solid #2a2a2a}.right-panel[data-v-13de5e1b]{flex:1;display:flex;flex-direction:column;min-width:0;background:#1a1a1a}.section-title[data-v-13de5e1b]{font-size:13px;color:#bbb;margin-bottom:10px}.upload-zone[data-v-13de5e1b]{border:1px dashed #3a3a3a;border-radius:10px;padding:24px;text-align:center;background:#252525;margin-bottom:20px;transition:all .2s ease}.upload-zone[data-v-13de5e1b]:hover{border-color:#3498db;background:#2a2a2a}.hint[data-v-13de5e1b]{color:#888;font-size:13px;margin-bottom:12px;line-height:1.5}.btns[data-v-13de5e1b]{display:flex;gap:10px;justify-content:center;flex-wrap:wrap}.opt-btn[data-v-13de5e1b],.btn-run[data-v-13de5e1b],.download[data-v-13de5e1b],.btn-delete[data-v-13de5e1b]{border:none;cursor:pointer;transition:all .2s ease}.opt-btn[data-v-13de5e1b]{padding:8px 16px;font-size:13px;color:#ccc;background:#2a2a2a;border:1px solid #3a3a3a;border-radius:6px}.opt-btn[data-v-13de5e1b]:hover{color:#3498db;background:#333;border-color:#3498db}.selected-files[data-v-13de5e1b]{margin-top:14px;font-size:12px;color:#888;max-height:112px;overflow-y:auto;text-align:left}.selected-files span[data-v-13de5e1b]{display:block;margin:4px 0;word-break:break-all}.more-line[data-v-13de5e1b]{color:#b8c1cc}.split-selected-files[data-v-13de5e1b]{max-height:120px;min-height:72px;padding-right:4px}.option-group[data-v-13de5e1b]{margin-bottom:20px}.radio-item[data-v-13de5e1b]{display:flex;align-items:flex-start;gap:10px;cursor:pointer;padding:10px 12px;border-radius:8px;background:#252525;border:1px solid #2a2a2a;margin-bottom:8px;transition:all .2s ease}.radio-item[data-v-13de5e1b]:hover,.radio-item.active[data-v-13de5e1b]{background:#2a2a2a;border-color:#3a3a3a}.radio-item input[data-v-13de5e1b]{margin-top:3px}.label[data-v-13de5e1b]{font-weight:500;color:#e0e0e0;font-size:13px}.desc[data-v-13de5e1b]{font-size:12px;color:#888;margin-top:2px;line-height:1.5;font-weight:400}.run-row[data-v-13de5e1b]{display:flex;align-items:center;flex-wrap:wrap;gap:10px 12px;margin-top:16px}.btn-run[data-v-13de5e1b]{padding:10px 22px;background:#3498db;color:#fff;border-radius:8px;font-size:14px}.btn-run[data-v-13de5e1b]:hover{background:#2980b9}.btn-run[data-v-13de5e1b]:disabled{background:#555;color:#999;cursor:not-allowed}.loading-msg[data-v-13de5e1b]{color:#3498db;font-size:13px}.panel-header[data-v-13de5e1b]{padding:16px 20px;border-bottom:1px solid #2a2a2a;font-size:15px;font-weight:600;color:#ddd}.task-list-wrap[data-v-13de5e1b]{flex:1;overflow-y:auto;padding:16px}.task-list[data-v-13de5e1b]{list-style:none;margin:0;padding:0}.task-item[data-v-13de5e1b]{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 16px;border:1px solid #2a2a2a;border-radius:8px;margin-bottom:10px;background:#1e1e1e}.split-result-item[data-v-13de5e1b]{align-items:flex-start}.left[data-v-13de5e1b]{flex:1;min-width:0}.split-result-main[data-v-13de5e1b]{display:flex;flex-direction:column;gap:4px}.id[data-v-13de5e1b]{display:inline-block;font-weight:600;color:#e0e0e0;font-size:13px}.files[data-v-13de5e1b]{font-size:12px;color:#888;margin-top:4px}.time[data-v-13de5e1b]{font-size:12px;color:#666;margin-top:2px}.split-entry-list[data-v-13de5e1b]{line-height:1.6;word-break:break-all;max-width:100%}.delete-brand-preview[data-v-13de5e1b]{white-space:normal}.delete-brand-progress-block[data-v-13de5e1b]{margin-top:8px}.delete-brand-progress-header[data-v-13de5e1b]{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px;font-size:12px;color:#8fbfff}.delete-brand-progress-bar[data-v-13de5e1b]{width:100%;height:8px;border-radius:999px;background:#ffffff14;overflow:hidden}.delete-brand-progress-bar-fill[data-v-13de5e1b]{height:100%;border-radius:inherit;background:linear-gradient(90deg,#2d8cf0,#4db3ff);transition:width .3s ease}.delete-brand-progress[data-v-13de5e1b]{color:#69b6ff;line-height:1.6;white-space:normal;margin-top:6px}.task-right[data-v-13de5e1b]{display:flex;align-items:center;gap:12px;flex-wrap:wrap;justify-content:flex-end}.split-result-actions[data-v-13de5e1b]{flex-shrink:0;min-width:180px;justify-content:flex-end;align-self:center}.status[data-v-13de5e1b]{padding:4px 10px;border-radius:6px;font-size:12px;white-space:nowrap}.status.success[data-v-13de5e1b]{background:#2ecc712e;color:#2ecc71}.status.failed[data-v-13de5e1b]{background:#e74c3c2e;color:#ff6b6b}.status.running[data-v-13de5e1b]{background:#3498db2e;color:#3498db}.download[data-v-13de5e1b]{padding:6px 10px;border-radius:6px;font-size:12px;background:#3498db2e;color:#69b6ff}.download[data-v-13de5e1b]:hover{background:#3498db47}.btn-delete[data-v-13de5e1b]{padding:6px 10px;border-radius:6px;font-size:12px;background:#e74c3c1f;color:#ff8f8f}.btn-delete[data-v-13de5e1b]:hover{background:#e74c3c38}.empty-tasks[data-v-13de5e1b]{color:#666;font-size:13px;padding:24px 8px}.clean-placeholder[data-v-13de5e1b]{max-height:112px}.clean-result-summary[data-v-13de5e1b]{display:grid;grid-template-columns:repeat(3,minmax(0,220px));gap:16px;margin-bottom:18px}.summary-card[data-v-13de5e1b]{padding:16px 18px;border:1px solid #2a2a2a;border-radius:10px;background:#1e1e1e}.summary-card strong[data-v-13de5e1b]{display:block;margin-top:8px;font-size:24px;color:#eaf4ff}.summary-label[data-v-13de5e1b]{font-size:12px;color:#8d8d8d}.result-list-wrap[data-v-13de5e1b]{border:1px solid #2a2a2a;border-radius:10px;background:#1e1e1e;min-height:260px}.result-list-header[data-v-13de5e1b]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px;border-bottom:1px solid #2a2a2a;font-size:14px;color:#ddd}@media(max-width:1100px){.main-content[data-v-13de5e1b]{flex-direction:column;height:auto}.left-panel[data-v-13de5e1b]{width:100%;border-right:none;border-bottom:1px solid #2a2a2a}.right-panel[data-v-13de5e1b]{min-height:420px}.task-item[data-v-13de5e1b]{flex-direction:column;align-items:flex-start}.task-right[data-v-13de5e1b]{width:100%;justify-content:flex-start}.split-result-actions[data-v-13de5e1b]{min-width:0;align-self:flex-start}.clean-result-summary[data-v-13de5e1b]{grid-template-columns:1fr}} diff --git a/app/assets/delete-brand.js b/app/assets/delete-brand.js deleted file mode 100644 index 70200a0..0000000 --- a/app/assets/delete-brand.js +++ /dev/null @@ -1 +0,0 @@ -import{d as ns,o as ls,q as rs,a as d,c as f,b as os,e as r,F as z,r as ye,t as v,f as h,s as us,u as qe,n as Oe,g as y,h as V,i as ne,E as p,_ as is,j as cs,k as ds}from"./pywebview-B8lwamDf.js";import{B as fs,n as vs,o as hs,p as ps,q as _s,s as ys,t as gs,u as ms,v as ks}from"./java-modules-B9jblDzU.js";import{e as ws}from"./brand-DE-sObfq.js";import{c as Is}from"./categorized-timers-JPA-olTr.js";const bs={class:"page-shell module-page"},Ss={class:"main-content"},Ts={class:"left-panel"},Cs={class:"upload-zone"},Rs={class:"selected-files clean-placeholder split-selected-files"},Es={key:0,class:"more-line"},Ns={key:1},Fs={class:"run-row"},Ps=["disabled"],xs=["disabled"],$s={class:"loading-msg"},As={key:0,class:"queue-debug-card"},Ds={key:0,class:"queue-debug-line"},Ms={key:1,class:"queue-debug-payload"},Bs={class:"right-panel"},Us={class:"task-list-wrap"},Ls={class:"clean-result-summary"},qs={class:"summary-card"},Os={class:"summary-card"},Ks={class:"summary-card"},js={class:"result-list-wrap"},Gs={key:0,class:"empty-tasks"},Hs={key:0,class:"result-subsection"},Js={class:"task-list clean-result-list"},zs={class:"left split-result-main"},Vs=["title"],Qs={class:"files"},Xs={class:"files"},Ws={key:0,class:"files"},Ys={key:1,class:"files"},Zs={key:2,class:"files"},et={key:3,class:"time"},st={key:4,class:"delete-brand-progress-block"},tt={class:"delete-brand-progress-header"},at={class:"delete-brand-progress-bar"},nt={class:"files delete-brand-progress"},lt={key:5,class:"files split-entry-list delete-brand-preview"},rt={key:6,class:"files"},ot={class:"task-right split-result-actions"},ut=["onClick"],it=["onClick"],ct={key:1,class:"result-subsection"},dt={class:"task-list clean-result-list"},ft={class:"left split-result-main"},vt=["title"],ht={class:"files"},pt={class:"files"},_t={key:0,class:"files"},yt={key:1,class:"files"},gt={key:2,class:"time"},mt={key:3,class:"delete-brand-progress-block"},kt={class:"delete-brand-progress-header"},wt={class:"delete-brand-progress-bar"},It={class:"files delete-brand-progress"},bt={key:4,class:"files split-entry-list delete-brand-preview"},St={key:5,class:"files"},Tt={class:"task-right split-result-actions"},Ct=["onClick"],Rt=["onClick"],Et=ns({__name:"BrandDeleteBrandTab",setup(Ft){function D(){return`delete-brand:current-tasks:${typeof window<"u"&&window.localStorage.getItem("uid")||"0"}`}const M=y([]),Q=y([]),O=y(!1),ge=y([]),i=y([]),K=y([]),X=y({total:0,successCount:0,failedCount:0,items:[]}),b=y(""),S=y(""),m=y({}),T=y(null),le=y(!1),W=y(!1),R=y(!1),B=y(""),Y=y(!1),j=y(null),re=y(!1);let U=!1;const L=Is("delete-brand"),oe=V(()=>M.value.slice(0,10)),E=V(()=>{const e=[...i.value].sort((t,a)=>(a.createdAt||0)-(t.createdAt||0)),s=[];return e.forEach(t=>{s.push(...t.items)}),s});function Ke(){try{const e=typeof window<"u"?window.localStorage.getItem(D()):null;if(e){if(i.value=JSON.parse(e),i.value.length>0){const s=i.value[i.value.length-1];b.value=s.queuePushResult||"",S.value=s.queuePayloadText||""}}else i.value=[]}catch{i.value=[]}}function ue(e,s,t,a){if(!s?.length)return;const l=i.value.findIndex(c=>c.taskId===e),o=l>=0?i.value[l]:null,n=s.map(c=>{const _=o?.items.find(as=>q(as,c)),k=Array.isArray(c.countries)?c.countries:void 0,g=Array.isArray(_?.countries)?_?.countries:void 0,w=k&&k.length>0?k:g&&g.length>0?g:k??g,I=Array.isArray(c.previewRows)?c.previewRows:void 0,C=Array.isArray(_?.previewRows)?_?.previewRows:void 0,_e=I&&I.length>0?I:C&&C.length>0?C:I??C;return{...c,countries:w,previewRows:_e,_pushed:_?._pushed??c._pushed??!1,_completed:_?._completed??c._completed??!1}}),u={taskId:e,items:n,createdAt:o?.createdAt||Date.now(),queuePushResult:t??o?.queuePushResult,queuePayloadText:a??o?.queuePayloadText};l>=0?i.value[l]=u:i.value.push(u),typeof window<"u"&&window.localStorage.setItem(D(),JSON.stringify(i.value))}function me(e){const s=i.value.length;i.value=i.value.filter(t=>t.taskId!==e),i.value.length!==s&&typeof window<"u"&&window.localStorage.setItem(D(),JSON.stringify(i.value))}function ke(e){return e==="SUCCESS"||e==="FAILED"||e==="COMPLETED"}function je(e){if(!e?.length)return!1;const s=new Set;if(e.forEach(a=>{a.taskId&&ke(a.taskStatus)&&s.add(a.taskId)}),!s.size)return!1;const t=i.value.length;return i.value=i.value.filter(a=>!s.has(a.taskId)),i.value.length!==t?(ie(),!0):!1}const Z=V(()=>K.value.filter(e=>!E.value.some(s=>q(s,e)))),Ge=V(()=>E.value.length>0||Z.value.length>0),He=V(()=>E.value.filter(e=>Me(e)&&N(e)==="未入队"));function ie(){typeof window<"u"&&(i.value.length===0?window.localStorage.removeItem(D()):window.localStorage.setItem(D(),JSON.stringify(i.value)))}function P(e){return e?(i.value.find(t=>t.taskId===e)?.items.length||0)>1:!1}function ce(e){return e&&i.value.find(s=>s.taskId===e)||null}function q(e,s){return!e||!s?!1:e.resultId!=null&&s.resultId!=null?e.resultId===s.resultId:e.fileKey&&s.fileKey?e.fileKey===s.fileKey:e.sourceFilename===s.sourceFilename}function x(e,s){const t=ce(e);return t&&t.items.find(a=>q(a,s))||null}function we(e){if(!e)return!1;const s=ce(e);if(!s)return!1;let t=!1;const a=m.value[e]?.line_progress?.info,l=P(e);if(a?.file_name&&a.current_line!=null&&a.total_lines!=null&&a.total_lines>0&&a.current_line>=a.total_lines){const o=s.items.find(n=>n.sourceFilename===a.file_name);o&&!o._completed&&(o._completed=!0,t=!0)}if(!l){const o=m.value[e]?.task?.status;if((o==="SUCCESS"||o==="FAILED")&&s.items.length===1){const n=s.items[0];n&&!n._completed&&(n._completed=!0,t=!0)}}return t&&ie(),t}function Ie(e){return e&&m.value[e]?.task?.status||""}function ee(e){if(e.error)return e.error;if(e.matchStatus&&e.matchStatus!=="MATCHED")return e.matchMessage||"";const s=e.taskId;return s&&m.value[s]?.task?.errorMessage||""}function be(e){const s=e.taskId;if(!s)return!1;const t=m.value[s]?.line_progress,a=Ie(s),l=P(s),o=N(e);if(l){const n=x(s,e),u=J(e)===B.value,c=!!(t?.has_progress&&t?.info?.file_name===e.sourceFilename);return u||c||n?._pushed||(a==="RUNNING"||a==="PENDING"||!a)&&n?._completed?!0:{success:!1,retryable:!0}}return o==="本文件解析完毕"||o==="已被全局判定为终态"?!1:t?.has_progress||t?.info?!0:o==="已入队"||o==="处理中"}function Se(e){return e.map(s=>A(s)?{...s,matched:!0,_pushed:!1,_completed:!1}:{...s,matched:!1,openStoreUrl:void 0,error:s.error||void 0,_pushed:!1,_completed:!1})}function Te(e){return e.matchStatus==="INDEX_STALE"&&A(e)?`已匹配 ${e.shopId||""}(索引过期,可继续推送)`.trim():e.matchStatus==="MATCHED"||e.matched?`已匹配 ${e.shopId||""}`.trim():e.matchMessage?e.matchMessage:e.matchStatus==="CONFLICT"?"存在多个同名店铺,请人工确认":e.matchStatus==="PENDING"?"店铺索引暂未就绪":e.matchStatus?e.matchStatus:e.matched?`已匹配 ${e.shopId||""}`.trim():"待匹配"}function Je(){ge.value=[...E.value,...Z.value]}function $(){Je(),ze(ge.value)}function ze(e){X.value={total:e.length,successCount:e.filter(s=>s.success).length,failedCount:e.filter(s=>!s.success).length,items:e}}function de(e){const s=e.taskId;return s&&(m.value[s]?.fileProgress||[]).find(l=>l.fileKey&&e.fileKey?l.fileKey===e.fileKey:l.sourceFilename&&e.sourceFilename?l.sourceFilename===e.sourceFilename:!1)||null}function Ce(e){const s=e.taskId;if(!s)return"";const t=m.value[s],a=t?.line_progress?.info,l=de(e);if(P(s)){const u=x(s,e),c=t?.task?.status,_=!!(a?.file_name&&a.file_name===e.sourceFilename);let k=u?._completed?"COMPLETED":(u?._pushed,"PENDING"),g=0,w=Math.max(0,e.totalRows??l?.totalRows??0);c==="SUCCESS"||c==="FAILED"&&u?._completed?(k="COMPLETED",g=w):_?(k="RUNNING",g=Math.max(0,Math.min(w||Number.MAX_SAFE_INTEGER,a?.current_line??0)),!w&&a?.total_lines&&a.total_lines>0&&(w=a.total_lines)):u?._completed?(k="COMPLETED",g=w):u?._pushed&&(k="PENDING",g=0);const I=[];if(I.push(`文件状态:${k}`),I.push(`文件进度:${g}/${w}`),a?.finished_files!=null){const C=a.file_total&&a.file_total>0?`/${a.file_total}`:"";I.push(`已完成文件:${a.finished_files}${C}`)}return a?.phase&&I.push(`阶段:${a.phase}`),I.join("|")}if(l){const u=[],c=l.processedRows??0,_=l.totalRows??0;if(l.status&&u.push(`文件状态:${l.status}`),u.push(`文件进度:${c}/${_}`),a?.finished_files!=null){const k=a.file_total&&a.file_total>0?`/${a.file_total}`:"";u.push(`已完成文件:${a.finished_files}${k}`)}return a?.phase&&u.push(`阶段:${a.phase}`),u.join("|")}if(!t?.line_progress?.has_progress||!a){const u=t?.task?.status;return u?`任务状态:${u}`:""}const n=[];if(a.phase&&n.push(`阶段:${a.phase}`),a.file_index&&a.file_total&&n.push(`文件:${a.file_index}/${a.file_total}`),a.file_name&&n.push(`当前文件:${a.file_name}`),a.current_line!=null&&a.total_lines!=null&&n.push(`${P(s)?"当前文件进度":"进度"}:${a.current_line}/${a.total_lines}`),a.current_country&&n.push(`国家:${a.current_country}`),a.current_asin&&n.push(`ASIN:${a.current_asin}`),a.finished_files!=null){const u=a.file_total&&a.file_total>0?`/${a.file_total}`:"";n.push(`已完成文件:${a.finished_files}${u}`)}return n.join("|")}function se(e){const s=e.taskId;if(!s)return 0;const t=m.value[s]?.line_progress?.info;if(P(s)){const n=x(s,e);if(m.value[s]?.task?.status==="SUCCESS"||n?._completed)return 100;const c=Math.max(0,e.totalRows??de(e)?.totalRows??0);if(!!(t?.file_name&&t.file_name===e.sourceFilename)){if(t?.current_line!=null&&t?.total_lines&&t.total_lines>0)return Math.max(0,Math.min(100,Math.round(t.current_line/t.total_lines*100)));if(t?.current_line!=null&&c>0)return Math.max(0,Math.min(100,Math.round(t.current_line/c*100)))}return 0}const l=de(e);return l?Math.max(0,Math.min(100,l.percent??0)):t?t.current_line!=null&&t.total_lines&&t.total_lines>0?Math.max(0,Math.min(100,Math.round(t.current_line/t.total_lines*100))):t.finished_files!=null&&t.file_total&&t.file_total>0?Math.max(0,Math.min(100,Math.round(t.finished_files/t.file_total*100))):m.value[s]?.task?.status==="SUCCESS"?100:0:0}function Re(e){const s=m.value[e]?.task?.status;return ke(s)}function G(){const e=new Set;return i.value.forEach(s=>{s.items.some(t=>t._pushed)&&e.add(s.taskId)}),Array.from(e)}function N(e){const s=e.taskId;if(!s||!ce(s))return"";const a=x(s,e),l=Ie(s),o=m.value[s]?.line_progress,n=P(s);if(!n&&(l==="SUCCESS"||l==="FAILED"||e.taskStatus==="SUCCESS"||e.taskStatus==="FAILED"))return"已被全局判定为终态";if(te(e)||te(a)||a?._completed)return"本文件解析完毕";if(l==="RUNNING"&&o?.has_progress&&o?.info?.file_name===e.sourceFilename)return"处理中";if(n&&!a?._pushed&&!a?._completed)return"未入队";if(n&&l==="SUCCESS")return"本文件解析完毕";if(!n){const u=m.value[s];if(u?.items&&u.items.find(_=>q(_,e))&&l==="SUCCESS")return"本文件解析完毕"}return a?._pushed?"已入队":"未入队"}function Ee(e){return!!(e.downloadUrl||e.fileReady)}function te(e){if(!e)return!1;const s=String(e.fileStatus||"").toUpperCase();return!!(e.fileReady||e.downloadUrl||s==="SUCCESS"||s==="COMPLETED")}function F(e,s){return e??s}function Ve(e){const s=e?.task?.id;if(!s)return!1;const t=i.value.find(n=>n.taskId===s);if(!t)return{success:!1,retryable:!1};const a=e?.items||[];let l=!1;const o=t.items.map(n=>{const u=a.find(_e=>q(_e,n));if(!u)return n;const c=Array.isArray(u.countries)?u.countries:void 0,_=Array.isArray(n.countries)?n.countries:void 0,k=c&&c.length>0?c:_&&_.length>0?_:c??_,g=Array.isArray(u.previewRows)?u.previewRows:void 0,w=Array.isArray(n.previewRows)?n.previewRows:void 0,I=g&&g.length>0?g:w&&w.length>0?w:g??w,C={...n,...u,shopName:F(u.shopName,n.shopName),companyName:F(u.companyName,n.companyName),shopId:F(u.shopId,n.shopId),platform:F(u.platform,n.platform),openStoreUrl:F(u.openStoreUrl,n.openStoreUrl),matchStatus:F(u.matchStatus,n.matchStatus),matchMessage:F(u.matchMessage,n.matchMessage),matched:A(n)||A(u),countryCount:F(u.countryCount,n.countryCount),countries:k,previewRows:I,_pushed:n._pushed,_completed:n._completed||te(u)};return JSON.stringify(C)!==JSON.stringify(n)&&(l=!0),C});for(const n of a)o.some(u=>q(u,n))||(o.push({...n,_pushed:!1,_completed:te(n)}),l=!0);return JSON.stringify(o)!==JSON.stringify(t.items)&&(t.items=o,l=!0),l&&ie(),l}async function fe(e){const s=e||G();if(s.length)try{const t=await vs(s);re.value&&R.value&&(b.value="后端已恢复,继续执行当前任务并自动衔接后续任务..."),re.value=!1;let a=!1;for(const l of t.items||[]){const o=l?.task?.id;typeof o=="number"&&o>0&&(m.value[o]=l,Ve(l)&&(a=!0),we(o)&&(a=!0))}a&&$()}catch(t){const a=(t instanceof Error?t.message:String(t||"")).toLowerCase();["无法连接到后端服务","bad gateway","gateway timeout","network error","timeout","502","503","504"].some(o=>a.includes(o.toLowerCase()))&&R.value&&(re.value=!0,b.value="当前任务运行中,正在等待后端服务恢复...")}}function Qe(){return ks()}function ve(e=!1){if(U)return;if(T.value){if(!e)return;L.clearTimer("task-poll",T.value),T.value=null}const s=async()=>{if(T.value=null,U)return;if(le.value){ve();return}const t=G();if(!t.length)return;le.value=!0;let a=!1,l=!1;try{await fe(t),await Le();for(const o of t)Re(o)&&(me(o),a=!0,l=!0)}finally{le.value=!1}l?await H():a&&$(),!U&&G().length>0&&ve()};e?s():T.value=L.setTimeout("task-poll",s,Qe())}function he(e=!1){T.value&&!e||ve(e)}function ae(e){if(e.fileReady||e.downloadUrl)return{className:"success",text:"已完成"};const s=e.taskId?m.value[e.taskId]?.task?.status:null;return s==="SUCCESS"?{className:"success",text:"已完成"}:s==="FAILED"?{className:"failed",text:"失败"}:s==="RUNNING"?{className:"running",text:"执行中"}:e.taskStatus==="SUCCESS"?{className:"success",text:"已完成"}:e.taskStatus==="FAILED"?{className:"failed",text:"失败"}:e.taskStatus==="RUNNING"?{className:"running",text:"执行中"}:e.success?{className:"success",text:"已完成"}:{className:"failed",text:"失败"}}function Ne(){T.value&&(L.clearTimer("task-poll",T.value),T.value=null),pe()}async function Fe(e){const s=ne();if(!s?.upload_file_to_java)throw new Error("当前桌面端未提供文件上传桥接能力");const t=[];for(const a of e){const l=typeof a=="string"?a:a.absolutePath,o=typeof a=="string"?void 0:a.relativePath,n=await s.upload_file_to_java(l,o);if(!n?.success||!n.data)throw new Error(n?.error||n?.message||`上传失败:${l}`);t.push(n.data)}return t}async function Xe(){const e=ne();if(!e?.select_brand_xlsx_files){p.warning("当前环境不支持文件选择,请在本机客户端中打开");return}try{const s=await e.select_brand_xlsx_files();if(!s?.length)return;M.value=s,Q.value=await Fe(s),p.success(`已选择 ${s.length} 个删除品牌文件`)}catch(s){p.error(s instanceof Error?s.message:"选择失败")}}async function We(){const e=ne();if(!e?.select_brand_folder){p.warning("当前环境不支持文件夹选择,请在本机客户端中打开");return}try{const s=await e.select_brand_folder();if(!s)return;const t=await ws(s);if(!t.success||!t.items?.length){p.warning(t.error||"该文件夹下没有 xlsx 文件");return}M.value=t.items.map(a=>a.relativePath||a.absolutePath),Q.value=await Fe(t.items),p.success(`已选择文件夹内 ${t.items.length} 个 xlsx 文件`)}catch(s){p.error(s instanceof Error?s.message:"选择失败")}}async function Ye(){if(!Q.value.length){p.warning("请先选择待处理文件");return}try{O.value=!0;const e=await hs({files:Q.value.map(o=>({fileKey:o.fileKey,originalFilename:o.originalFilename,relativePath:o.relativePath}))}),s=Se(e.items||[]),t=s.some(o=>A(o)),a=s.some(o=>o.matchStatus==="INDEX_STALE"&&o.matched),l=s.some(o=>!A(o));b.value=t?"解析完成,可在左侧点击“推送到 Python 队列”开始串行处理":"解析完成,当前没有可推送的文件",S.value="",s.length&&s[0].taskId&&ue(s[0].taskId,s,b.value,S.value),$(),l?p.warning("部分文件尚未命中可用店铺索引,已保留状态信息,请等待后台刷新后重试。"):a?p.warning("部分文件命中的是过期索引,仍可推送到 Python 队列;后台刷新后会自动重新匹配。"):t?p.success("删除品牌解析完成,请在左侧推送到 Python 队列"):p.warning("当前没有可推送的文件,请先等待店铺索引刷新。"),await H()}catch(e){p.error(e instanceof Error?e.message:"执行失败")}finally{O.value=!1}}async function Pe(e){const s=e.taskId;if(!s){p.warning("未找到任务ID");return}const t=e.resultId?ps(e.resultId):_s(s),a=e.outputFilename||e.sourceFilename||`delete-brand_${s}.xlsx`,l=await ys(t,a,e.resultId?`delete-brand:${e.resultId}`:`delete-brand-task:${s}`);l.success?p.success(`已保存:${l.path||a}`):l.error&&l.error!=="用户取消"&&p.error(l.error)}async function H(){try{const e=await gs();K.value=Se(e.items||[]),je(K.value),$(),await fe(),he(!0)}catch(e){const s=(e instanceof Error?e.message:String(e||"")).toLowerCase();["无法连接到后端服务","bad gateway","gateway timeout","network error","timeout","502","503","504"].some(a=>s.includes(a.toLowerCase()))||console.error("loadHistory error:",e)}}function xe(e){i.value.forEach(t=>{t.items=t.items.filter(a=>a.resultId!==e)});const s=i.value.length;i.value=i.value.filter(t=>t.items.length>0),i.value.length!==s&&typeof window<"u"&&window.localStorage.setItem(D(),JSON.stringify(i.value)),K.value=K.value.filter(t=>t.resultId!==e),$(),G().length===0&&Ne()}async function $e(e){try{await ms(e),xe(e),await H(),p.success("已删除")}catch(s){const t=s instanceof Error?s.message:"删除失败";if(typeof t=="string"&&t.includes("记录不存在")){xe(e),p.success("已删除");return}p.error(t)}}function Ae(e){const s=e.slice(0,5).map(a=>`${a.country}:${a.asin}${a.status?`(${a.status})`:""}`);return e.length-s.length>0?`${s.join("、")} 等 ${e.length} 条`:s.join("、")}function Pt(e,s){}function pe(){j.value&&(L.clearTimer("auto-retry",j.value),j.value=null)}function Ze(e=3e3){U||(pe(),j.value=L.setTimeout("auto-retry",()=>{j.value=null,U||Le().catch(()=>{})},e))}function es(e){return e.includes("当前店铺正在执行中")}function De(){for(const e of i.value)for(const s of e.items){const t=N(s);if(t==="已入队"||t==="处理中")return!0}return!1}function J(e){return e.resultId!=null?`result:${e.resultId}`:`task:${e.taskId||0}:${e.sourceFilename||""}`}function A(e){return!!(e.matched||e.matchStatus==="MATCHED"||e.matchStatus==="INDEX_STALE"&&e.shopId)}function ss(e){return!!(e.shopName&&Array.isArray(e.countries)&&e.countries.length>0)}function Me(e){return!!(e.taskId&&(A(e)||ss(e)))}function Be(){return E.value.find(e=>!Me(e)||J(e)===B.value||x(e.taskId,e)?._completed?!1:N(e)==="未入队")}async function Ue(e,s){if(s?.auto&&De())return e.taskId,e.sourceFilename,{success:!1,retryable:!0};const t=ne(),a=e.taskId;if(!a)return{success:!1,retryable:!1};const l=i.value.find(c=>c.taskId===a);if(!l)return{success:!1,retryable:!1};if(!t?.enqueue_json)return p.error("当前环境未启用 pywebview enqueue_json(浏览器环境不会推送)"),{success:!1,retryable:!1};const o={type:"delete-brand-run",ts:Date.now(),data:{taskId:a,items:[e]}};S.value=JSON.stringify(o,null,2);const n=await t.enqueue_json(o);let u="";if(n?.success){u=`已推送文件 ${e.sourceFilename},当前队列长度:${n.queue_size??"-"}`;const c=x(a,e);return c&&(c._pushed=!0,c._completed=!1),B.value=J(e),ue(a,l.items,u,S.value),he(!0),b.value=u,{success:!0,retryable:!1}}else{const c=n?.error||"未知错误";if(u=`推送到 Python 队列失败:${c}`,b.value=u,ue(a,l.items,u,S.value),s?.auto&&es(c))return{success:!1,retryable:!0}}return b.value=u,{success:!1,retryable:!1}}async function ts(){const e=Be();if(!e){p.warning("当前没有可推送的文件");return}W.value=!0,R.value=!0,pe();const s=await Ue(e);if(W.value=!1,!s.success){R.value=!1,B.value="";return}p.success("已开始按顺序推送到 Python 队列")}async function Le(){if(!R.value||Y.value){R.value,Y.value;return}if(De())return;const e=B.value;if(e){const t=E.value.find(a=>J(a)===e);if(t){const a=t.taskId,l=P(a);l&&(we(a),N(t),void 0);const o=N(t);if(o==="已入队"||o==="处理中"){t.sourceFilename;return}if(l){const n=x(a,t);if(n&&!n._completed){t.sourceFilename,n._pushed,n._completed;return}}}}const s=Be();if(!s){B.value="",R.value=!1;return}Y.value=!0;try{s.taskId,s.sourceFilename,J(s);const t=await Ue(s,{auto:!0});if(!t.success){if(t.retryable){s.taskId,s.sourceFilename,Ze();return}s.taskId,s.sourceFilename,R.value=!1}}finally{Y.value=!1}}return ls(()=>{Ke();const e=G();e.length>0?fe(e).then(async()=>{let s=!1,t=!1;for(const a of e)Re(a)&&(me(a),s=!0,t=!0);t?await H():s&&$(),he(!0)}):$(),H().catch(()=>{})}),rs(()=>{U=!0,Ne(),L.clearScope()}),(e,s)=>(d(),f("div",bs,[os(fs,{active:"delete-brand"}),r("div",Ss,[r("aside",Ts,[s[2]||(s[2]=r("div",{class:"section-title"},"选择文件",-1)),r("div",Cs,[s[0]||(s[0]=r("div",{class:"hint"},"上传删除品牌 Excel;无论是直接上传文件还是上传文件夹批量导入,都会按每个 Excel 文件名作为店铺名。",-1)),r("div",{class:"btns"},[r("button",{type:"button",class:"opt-btn",onClick:Xe},"选择 Excel 文件"),r("button",{type:"button",class:"opt-btn",onClick:We},"选择文件夹")]),r("div",Rs,[M.value.length?(d(),f(z,{key:0},[(d(!0),f(z,null,ye(oe.value,t=>(d(),f("span",{key:t},v(t),1))),128)),M.value.length>oe.value.length?(d(),f("span",Es," 还有 "+v(M.value.length-oe.value.length)+" 个文件未展开显示 ",1)):h("",!0)],64)):(d(),f("span",Ns,"暂未选择删除品牌文件"))])]),s[3]||(s[3]=us('
执行说明
',2)),r("div",Fs,[r("button",{type:"button",class:"btn-run",disabled:O.value,onClick:Ye},v(O.value?"解析中...":"开始解析"),9,Ps),r("button",{type:"button",class:"btn-run btn-queue",disabled:W.value||!He.value.length,onClick:ts},v(W.value?"推送中...":"推送到 Python 队列"),9,xs),r("span",$s,v(O.value?"正在读取删除品牌数据,请稍候…":"解析后会在右侧展示按国家分组的去重结果"),1)]),b.value||S.value?(d(),f("div",As,[s[1]||(s[1]=r("div",{class:"section-title queue-debug-title"},"Python 队列推送结果",-1)),b.value?(d(),f("div",Ds,v(b.value),1)):h("",!0),S.value?(d(),f("pre",Ms,v(S.value),1)):h("",!0)])):h("",!0)]),r("section",Bs,[s[12]||(s[12]=r("div",{class:"panel-header"},"删除品牌结果",-1)),r("div",Us,[r("div",Ls,[r("div",qs,[s[4]||(s[4]=r("span",{class:"summary-label"},"已处理文件",-1)),r("strong",null,v(X.value.total),1)]),r("div",Os,[s[5]||(s[5]=r("span",{class:"summary-label"},"成功结果",-1)),r("strong",null,v(X.value.successCount),1)]),r("div",Ks,[s[6]||(s[6]=r("span",{class:"summary-label"},"失败文件",-1)),r("strong",null,v(X.value.failedCount),1)])]),r("div",js,[s[11]||(s[11]=r("div",{class:"result-list-header"},[r("span",null,"删除品牌结果列表")],-1)),Ge.value?(d(),f(z,{key:1},[E.value.length?(d(),f("div",Hs,[s[8]||(s[8]=r("div",{class:"result-subsection-title"},"当前任务",-1)),r("ul",Js,[(d(!0),f(z,null,ye(E.value,t=>(d(),f("li",{key:`current-${t.taskId||t.resultId||t.sourceFilename}`,class:"task-item split-result-item"},[r("div",zs,[r("span",{class:"id",title:t.sourceFilename},v(t.sourceFilename||"-"),9,Vs),r("div",Qs,"店铺名:"+v(t.shopName||"-"),1),r("div",Xs,"匹配结果:"+v(Te(t)),1),t.platform?(d(),f("div",Ws,"平台:"+v(t.platform),1)):h("",!0),N(t)?(d(),f("div",Ys,"队列状态:"+v(N(t)),1)):h("",!0),t.countryCount!==void 0&&t.matched?(d(),f("div",Zs,"国家数:"+v(t.countryCount),1)):h("",!0),t.totalRows!==void 0&&t.matched?(d(),f("div",et,"去重后 "+v(t.totalRows)+" 条 ",1)):h("",!0),be(t)?(d(),f("div",st,[r("div",tt,[s[7]||(s[7]=r("span",null,"任务进度",-1)),r("span",null,v(se(t))+"%",1)]),r("div",at,[r("div",{class:"delete-brand-progress-bar-fill",style:qe({width:`${se(t)}%`})},null,4)]),r("div",nt,v(Ce(t)),1)])):h("",!0),t.previewRows?.length?(d(),f("div",lt,v(Ae(t.previewRows)),1)):h("",!0),ee(t)?(d(),f("div",rt,"错误信息:"+v(ee(t)),1)):h("",!0)]),r("div",ot,[r("span",{class:Oe(["status",ae(t).className])},v(ae(t).text),3),Ee(t)?(d(),f("button",{key:0,type:"button",class:"download",onClick:a=>Pe(t)}," 下载 ",8,ut)):h("",!0),t.resultId?(d(),f("button",{key:1,type:"button",class:"btn-delete",onClick:a=>$e(t.resultId)}," 删除 ",8,it)):h("",!0)])]))),128))])])):h("",!0),Z.value.length?(d(),f("div",ct,[s[10]||(s[10]=r("div",{class:"result-subsection-title"},"历史记录",-1)),r("ul",dt,[(d(!0),f(z,null,ye(Z.value,t=>(d(),f("li",{key:`history-${t.taskId||t.resultId||t.sourceFilename}`,class:"task-item split-result-item"},[r("div",ft,[r("span",{class:"id",title:t.sourceFilename},v(t.sourceFilename||"-"),9,vt),r("div",ht,"店铺名:"+v(t.shopName||"-"),1),r("div",pt,"匹配结果:"+v(Te(t)),1),t.platform?(d(),f("div",_t,"平台:"+v(t.platform),1)):h("",!0),t.countryCount!==void 0&&t.matched?(d(),f("div",yt,"国家数:"+v(t.countryCount),1)):h("",!0),t.totalRows!==void 0&&t.matched?(d(),f("div",gt,"去重后 "+v(t.totalRows)+" 条 ",1)):h("",!0),be(t)?(d(),f("div",mt,[r("div",kt,[s[9]||(s[9]=r("span",null,"任务进度",-1)),r("span",null,v(se(t))+"%",1)]),r("div",wt,[r("div",{class:"delete-brand-progress-bar-fill",style:qe({width:`${se(t)}%`})},null,4)]),r("div",It,v(Ce(t)),1)])):h("",!0),t.previewRows?.length?(d(),f("div",bt,v(Ae(t.previewRows)),1)):h("",!0),ee(t)?(d(),f("div",St,"错误信息:"+v(ee(t)),1)):h("",!0)]),r("div",Tt,[r("span",{class:Oe(["status",ae(t).className])},v(ae(t).text),3),Ee(t)?(d(),f("button",{key:0,type:"button",class:"download",onClick:a=>Pe(t)}," 下载 ",8,Ct)):h("",!0),t.resultId?(d(),f("button",{key:1,type:"button",class:"btn-delete",onClick:a=>$e(t.resultId)}," 删除 ",8,Rt)):h("",!0)])]))),128))])])):h("",!0)],64)):(d(),f("div",Gs," 暂无删除品牌结果,完成解析后会在这里展示按国家分组的去重结果 "))])])])])]))}}),Nt=is(Et,[["__scopeId","data-v-13de5e1b"]]);cs(Nt).use(ds).mount("#app"); diff --git a/app/assets/el-input-Cxc-k42P.css b/app/assets/el-input-Cxc-k42P.css deleted file mode 100644 index b5a3e7f..0000000 --- a/app/assets/el-input-Cxc-k42P.css +++ /dev/null @@ -1 +0,0 @@ -.el-scrollbar{--el-scrollbar-opacity:.3;--el-scrollbar-bg-color:var(--el-text-color-secondary);--el-scrollbar-hover-opacity:.5;--el-scrollbar-hover-bg-color:var(--el-text-color-secondary);height:100%;position:relative;overflow:hidden}.el-scrollbar__wrap{height:100%;overflow:auto}.el-scrollbar__wrap--hidden-default{scrollbar-width:none}.el-scrollbar__wrap--hidden-default::-webkit-scrollbar{display:none}.el-scrollbar__thumb{cursor:pointer;border-radius:inherit;background-color:var(--el-scrollbar-bg-color,var(--el-text-color-secondary));width:0;height:0;transition:var(--el-transition-duration) background-color;opacity:var(--el-scrollbar-opacity,.3);display:block;position:relative}.el-scrollbar__thumb:hover{background-color:var(--el-scrollbar-hover-bg-color,var(--el-text-color-secondary));opacity:var(--el-scrollbar-hover-opacity,.5)}.el-scrollbar__bar{z-index:1;border-radius:4px;position:absolute;bottom:2px;right:2px}.el-scrollbar__bar.is-vertical{width:6px;top:2px}.el-scrollbar__bar.is-vertical>div{width:100%}.el-scrollbar__bar.is-horizontal{height:6px;left:2px}.el-scrollbar__bar.is-horizontal>div{height:100%}.el-scrollbar-fade-enter-active{transition:opacity .34s ease-out}.el-scrollbar-fade-leave-active{transition:opacity .12s ease-out}.el-scrollbar-fade-enter-from,.el-scrollbar-fade-leave-active{opacity:0}.el-popper{--el-popper-border-radius:var(--el-popover-border-radius,4px);--el-popper-bg-color-light:var(--el-bg-color-overlay);--el-popper-bg-color-dark:var(--el-text-color-primary);border-radius:var(--el-popper-border-radius);z-index:2000;overflow-wrap:break-word;word-break:normal;visibility:visible;min-width:10px;padding:5px 11px;font-size:12px;line-height:20px;position:absolute}.el-popper.is-dark{--el-fill-color-blank:var(--el-popper-bg-color-dark);color:var(--el-bg-color);background:var(--el-popper-bg-color-dark);border:1px solid var(--el-text-color-primary)}.el-popper.is-dark>.el-popper__arrow:before{border:1px solid var(--el-text-color-primary);background:var(--el-popper-bg-color-dark);right:0}.el-popper.is-light{--el-fill-color-blank:var(--el-popper-bg-color-light);background:var(--el-popper-bg-color-light);border:1px solid var(--el-border-color-light)}.el-popper.is-light>.el-popper__arrow:before{border:1px solid var(--el-border-color-light);background:var(--el-popper-bg-color-light);right:0}.el-popper.is-pure{padding:0}.el-popper__arrow{z-index:-1;width:10px;height:10px;position:absolute}.el-popper__arrow:before{z-index:-1;content:" ";background:var(--el-text-color-primary);box-sizing:border-box;width:10px;height:10px;position:absolute;transform:rotate(45deg)}.el-popper[data-popper-placement^=top]>.el-popper__arrow{bottom:-5px}.el-popper[data-popper-placement^=top]>.el-popper__arrow:before{border-bottom-right-radius:2px}.el-popper[data-popper-placement^=bottom]>.el-popper__arrow{top:-5px}.el-popper[data-popper-placement^=bottom]>.el-popper__arrow:before{border-top-left-radius:2px}.el-popper[data-popper-placement^=left]>.el-popper__arrow{right:-5px}.el-popper[data-popper-placement^=left]>.el-popper__arrow:before{border-top-right-radius:2px}.el-popper[data-popper-placement^=right]>.el-popper__arrow{left:-5px}.el-popper[data-popper-placement^=right]>.el-popper__arrow:before{border-bottom-left-radius:2px}.el-popper[data-popper-placement^=top]>.el-popper__arrow:before{border-top-color:#0000!important;border-left-color:#0000!important}.el-popper[data-popper-placement^=bottom]>.el-popper__arrow:before{border-bottom-color:#0000!important;border-right-color:#0000!important}.el-popper[data-popper-placement^=left]>.el-popper__arrow:before{border-bottom-color:#0000!important;border-left-color:#0000!important}.el-popper[data-popper-placement^=right]>.el-popper__arrow:before{border-top-color:#0000!important;border-right-color:#0000!important}.el-tag{--el-tag-font-size:12px;--el-tag-border-radius:4px;--el-tag-border-radius-rounded:9999px;background-color:var(--el-tag-bg-color);border-color:var(--el-tag-border-color);color:var(--el-tag-text-color);vertical-align:middle;height:24px;font-size:var(--el-tag-font-size);border-radius:var(--el-tag-border-radius);box-sizing:border-box;white-space:nowrap;--el-icon-size:14px;--el-tag-bg-color:var(--el-color-primary-light-9);--el-tag-border-color:var(--el-color-primary-light-8);--el-tag-hover-color:var(--el-color-primary);border-style:solid;border-width:1px;justify-content:center;align-items:center;padding:0 9px;line-height:1;display:inline-flex}.el-tag.el-tag--primary{--el-tag-bg-color:var(--el-color-primary-light-9);--el-tag-border-color:var(--el-color-primary-light-8);--el-tag-hover-color:var(--el-color-primary)}.el-tag.el-tag--success{--el-tag-bg-color:var(--el-color-success-light-9);--el-tag-border-color:var(--el-color-success-light-8);--el-tag-hover-color:var(--el-color-success)}.el-tag.el-tag--warning{--el-tag-bg-color:var(--el-color-warning-light-9);--el-tag-border-color:var(--el-color-warning-light-8);--el-tag-hover-color:var(--el-color-warning)}.el-tag.el-tag--danger{--el-tag-bg-color:var(--el-color-danger-light-9);--el-tag-border-color:var(--el-color-danger-light-8);--el-tag-hover-color:var(--el-color-danger)}.el-tag.el-tag--error{--el-tag-bg-color:var(--el-color-error-light-9);--el-tag-border-color:var(--el-color-error-light-8);--el-tag-hover-color:var(--el-color-error)}.el-tag.el-tag--info{--el-tag-bg-color:var(--el-color-info-light-9);--el-tag-border-color:var(--el-color-info-light-8);--el-tag-hover-color:var(--el-color-info)}.el-tag.is-hit{border-color:var(--el-color-primary)}.el-tag.is-round{border-radius:var(--el-tag-border-radius-rounded)}.el-tag .el-tag__close{color:var(--el-tag-text-color);flex-shrink:0}.el-tag .el-tag__close:hover{color:var(--el-color-white);background-color:var(--el-tag-hover-color)}.el-tag.el-tag--primary{--el-tag-text-color:var(--el-color-primary)}.el-tag.el-tag--success{--el-tag-text-color:var(--el-color-success)}.el-tag.el-tag--warning{--el-tag-text-color:var(--el-color-warning)}.el-tag.el-tag--danger{--el-tag-text-color:var(--el-color-danger)}.el-tag.el-tag--error{--el-tag-text-color:var(--el-color-error)}.el-tag.el-tag--info{--el-tag-text-color:var(--el-color-info)}.el-tag .el-icon{cursor:pointer;font-size:calc(var(--el-icon-size) - 2px);height:var(--el-icon-size);width:var(--el-icon-size);border-radius:50%;display:flex}.el-tag .el-tag__close{background-color:#0000;border:none;border-radius:50%;outline:none;margin-left:6px;padding:0;overflow:hidden}.el-tag .el-tag__close:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-tag--dark{--el-tag-text-color:var(--el-color-white);--el-tag-bg-color:var(--el-color-primary);--el-tag-border-color:var(--el-color-primary);--el-tag-hover-color:var(--el-color-primary-light-3)}.el-tag--dark.el-tag--primary{--el-tag-bg-color:var(--el-color-primary);--el-tag-border-color:var(--el-color-primary);--el-tag-hover-color:var(--el-color-primary-light-3)}.el-tag--dark.el-tag--success{--el-tag-bg-color:var(--el-color-success);--el-tag-border-color:var(--el-color-success);--el-tag-hover-color:var(--el-color-success-light-3)}.el-tag--dark.el-tag--warning{--el-tag-bg-color:var(--el-color-warning);--el-tag-border-color:var(--el-color-warning);--el-tag-hover-color:var(--el-color-warning-light-3)}.el-tag--dark.el-tag--danger{--el-tag-bg-color:var(--el-color-danger);--el-tag-border-color:var(--el-color-danger);--el-tag-hover-color:var(--el-color-danger-light-3)}.el-tag--dark.el-tag--error{--el-tag-bg-color:var(--el-color-error);--el-tag-border-color:var(--el-color-error);--el-tag-hover-color:var(--el-color-error-light-3)}.el-tag--dark.el-tag--info{--el-tag-bg-color:var(--el-color-info);--el-tag-border-color:var(--el-color-info);--el-tag-hover-color:var(--el-color-info-light-3)}.el-tag--dark.el-tag--primary,.el-tag--dark.el-tag--success,.el-tag--dark.el-tag--warning,.el-tag--dark.el-tag--danger,.el-tag--dark.el-tag--error,.el-tag--dark.el-tag--info{--el-tag-text-color:var(--el-color-white)}.el-tag--plain,.el-tag--plain.el-tag--primary{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-primary-light-5);--el-tag-hover-color:var(--el-color-primary)}.el-tag--plain.el-tag--success{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-success-light-5);--el-tag-hover-color:var(--el-color-success)}.el-tag--plain.el-tag--warning{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-warning-light-5);--el-tag-hover-color:var(--el-color-warning)}.el-tag--plain.el-tag--danger{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-danger-light-5);--el-tag-hover-color:var(--el-color-danger)}.el-tag--plain.el-tag--error{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-error-light-5);--el-tag-hover-color:var(--el-color-error)}.el-tag--plain.el-tag--info{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-info-light-5);--el-tag-hover-color:var(--el-color-info)}.el-tag.is-closable{padding-right:5px}.el-tag--large{--el-icon-size:16px;height:32px;padding:0 11px}.el-tag--large .el-tag__close{margin-left:8px}.el-tag--large.is-closable{padding-right:7px}.el-tag--small{--el-icon-size:12px;height:20px;padding:0 7px}.el-tag--small .el-tag__close{margin-left:4px}.el-tag--small.is-closable{padding-right:3px}.el-tag--small .el-icon-close{transform:scale(.8)}.el-tag.el-tag--primary.is-hit{border-color:var(--el-color-primary)}.el-tag.el-tag--success.is-hit{border-color:var(--el-color-success)}.el-tag.el-tag--warning.is-hit{border-color:var(--el-color-warning)}.el-tag.el-tag--danger.is-hit{border-color:var(--el-color-danger)}.el-tag.el-tag--error.is-hit{border-color:var(--el-color-error)}.el-tag.el-tag--info.is-hit{border-color:var(--el-color-info)}.el-checkbox{--el-checkbox-font-size:14px;--el-checkbox-font-weight:var(--el-font-weight-primary);--el-checkbox-text-color:var(--el-text-color-regular);--el-checkbox-input-height:14px;--el-checkbox-input-width:14px;--el-checkbox-border-radius:var(--el-border-radius-small);--el-checkbox-bg-color:var(--el-fill-color-blank);--el-checkbox-input-border:var(--el-border);--el-checkbox-disabled-border-color:var(--el-border-color);--el-checkbox-disabled-input-fill:var(--el-fill-color-light);--el-checkbox-disabled-icon-color:var(--el-text-color-placeholder);--el-checkbox-disabled-checked-input-fill:var(--el-border-color-extra-light);--el-checkbox-disabled-checked-input-border-color:var(--el-border-color);--el-checkbox-disabled-checked-icon-color:var(--el-text-color-placeholder);--el-checkbox-checked-text-color:var(--el-color-primary);--el-checkbox-checked-input-border-color:var(--el-color-primary);--el-checkbox-checked-bg-color:var(--el-color-primary);--el-checkbox-checked-icon-color:var(--el-color-white);--el-checkbox-input-border-color-hover:var(--el-color-primary);color:var(--el-checkbox-text-color);font-weight:var(--el-checkbox-font-weight);font-size:var(--el-font-size-base);cursor:pointer;white-space:nowrap;-webkit-user-select:none;user-select:none;height:var(--el-checkbox-height,32px);align-items:center;margin-right:30px;display:inline-flex;position:relative}.el-checkbox.is-disabled{cursor:not-allowed}.el-checkbox.is-bordered{border-radius:var(--el-border-radius-base);border:var(--el-border);box-sizing:border-box;padding:0 15px 0 9px}.el-checkbox.is-bordered.is-checked{border-color:var(--el-color-primary)}.el-checkbox.is-bordered.is-disabled{border-color:var(--el-border-color-lighter)}.el-checkbox.is-bordered.el-checkbox--large{border-radius:var(--el-border-radius-base);padding:0 19px 0 11px}.el-checkbox.is-bordered.el-checkbox--large .el-checkbox__label{font-size:var(--el-font-size-base)}.el-checkbox.is-bordered.el-checkbox--large .el-checkbox__inner{width:14px;height:14px}.el-checkbox.is-bordered.el-checkbox--small{border-radius:calc(var(--el-border-radius-base) - 1px);padding:0 11px 0 7px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label{font-size:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner{width:12px;height:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner:after{width:2px;height:6px}.el-checkbox input:focus-visible+.el-checkbox__inner{outline:2px solid var(--el-checkbox-input-border-color-hover);outline-offset:1px;border-radius:var(--el-checkbox-border-radius)}.el-checkbox__input{white-space:nowrap;cursor:pointer;outline:none;display:inline-flex;position:relative}.el-checkbox__input.is-disabled .el-checkbox__inner{background-color:var(--el-checkbox-disabled-input-fill);border-color:var(--el-checkbox-disabled-border-color);cursor:not-allowed}.el-checkbox__input.is-disabled .el-checkbox__inner:after{cursor:not-allowed;border-color:var(--el-checkbox-disabled-icon-color);will-change:transform}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{background-color:var(--el-checkbox-disabled-checked-input-fill);border-color:var(--el-checkbox-disabled-checked-input-border-color)}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner:after{border-color:var(--el-checkbox-disabled-checked-icon-color)}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner{background-color:var(--el-checkbox-disabled-checked-input-fill);border-color:var(--el-checkbox-disabled-checked-input-border-color)}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner:before{background-color:var(--el-checkbox-disabled-checked-icon-color);border-color:var(--el-checkbox-disabled-checked-icon-color)}.el-checkbox__input.is-disabled+span.el-checkbox__label{color:var(--el-disabled-text-color);cursor:not-allowed}.el-checkbox__input.is-checked .el-checkbox__inner{background-color:var(--el-checkbox-checked-bg-color);border-color:var(--el-checkbox-checked-input-border-color)}.el-checkbox__input.is-checked .el-checkbox__inner:after{border-color:var(--el-checkbox-checked-icon-color);transform:translate(-45%,-60%)rotate(45deg)scaleY(1)}.el-checkbox__input.is-checked+.el-checkbox__label{color:var(--el-checkbox-checked-text-color)}.el-checkbox__input.is-focus:not(.is-checked) .el-checkbox__original:not(:focus-visible){border-color:var(--el-checkbox-input-border-color-hover)}.el-checkbox__input.is-indeterminate .el-checkbox__inner{background-color:var(--el-checkbox-checked-bg-color);border-color:var(--el-checkbox-checked-input-border-color)}.el-checkbox__input.is-indeterminate .el-checkbox__inner:before{content:"";background-color:var(--el-checkbox-checked-icon-color);height:2px;display:block;position:absolute;top:5px;left:0;right:0;transform:scale(.5)}.el-checkbox__input.is-indeterminate .el-checkbox__inner:after{display:none}.el-checkbox__inner{border:var(--el-checkbox-input-border);border-radius:var(--el-checkbox-border-radius);box-sizing:border-box;width:var(--el-checkbox-input-width);height:var(--el-checkbox-input-height);background-color:var(--el-checkbox-bg-color);z-index:var(--el-index-normal);transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46),outline .25s cubic-bezier(.71,-.46,.29,1.46);display:inline-block;position:relative}.el-checkbox__inner:hover{border-color:var(--el-checkbox-input-border-color-hover)}.el-checkbox__inner:after{box-sizing:content-box;content:"";transform-origin:50%;border:1px solid #0000;border-top:0;border-left:0;width:3px;height:7px;transition:transform .15s ease-in 50ms;position:absolute;top:50%;left:50%;transform:translate(-45%,-60%)rotate(45deg)scaleY(0)}.el-checkbox__original{opacity:0;z-index:-1;outline:none;width:0;height:0;margin:0;position:absolute}.el-checkbox__label{line-height:1;font-size:var(--el-checkbox-font-size);padding-left:8px;display:inline-block}.el-checkbox.el-checkbox--large{height:40px}.el-checkbox.el-checkbox--large .el-checkbox__label{font-size:14px}.el-checkbox.el-checkbox--large .el-checkbox__inner{width:14px;height:14px}.el-checkbox.el-checkbox--small{height:24px}.el-checkbox.el-checkbox--small .el-checkbox__label{font-size:12px}.el-checkbox.el-checkbox--small .el-checkbox__inner{width:12px;height:12px}.el-checkbox.el-checkbox--small .el-checkbox__input.is-indeterminate .el-checkbox__inner:before{top:4px}.el-checkbox.el-checkbox--small .el-checkbox__inner:after{width:2px;height:6px}.el-checkbox:last-of-type{margin-right:0}.el-table{--el-table-border-color:var(--el-border-color-lighter);--el-table-border:1px solid var(--el-table-border-color);--el-table-text-color:var(--el-text-color-regular);--el-table-header-text-color:var(--el-text-color-secondary);--el-table-row-hover-bg-color:var(--el-fill-color-light);--el-table-current-row-bg-color:var(--el-color-primary-light-9);--el-table-header-bg-color:var(--el-fill-color-blank);--el-table-fixed-box-shadow:var(--el-box-shadow-light);--el-table-bg-color:var(--el-fill-color-blank);--el-table-tr-bg-color:var(--el-fill-color-blank);--el-table-expanded-cell-bg-color:var(--el-fill-color-blank);--el-table-fixed-left-column:inset 10px 0 10px -10px #00000026;--el-table-fixed-right-column:inset -10px 0 10px -10px #00000026;--el-table-index:var(--el-index-normal);box-sizing:border-box;background-color:var(--el-table-bg-color);width:100%;max-width:100%;height:-moz-fit-content;height:fit-content;font-size:var(--el-font-size-base);color:var(--el-table-text-color);position:relative;overflow:hidden}.el-table__inner-wrapper{flex-direction:column;height:100%;display:flex;position:relative}.el-table__inner-wrapper:before{height:1px;bottom:0;left:0}.el-table tbody:focus-visible{outline:none}.el-table.has-footer.el-table--scrollable-y tr:last-child td.el-table__cell,.el-table.has-footer.el-table--fluid-height tr:last-child td.el-table__cell{border-bottom-color:#0000}.el-table__empty-block{text-align:center;justify-content:center;align-items:center;width:100%;min-height:60px;display:flex;position:sticky;left:0}.el-table__empty-text{width:50%;color:var(--el-text-color-secondary);line-height:60px}.el-table__expand-column .cell{text-align:center;-webkit-user-select:none;user-select:none;padding:0}.el-table__expand-icon{cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--el-border-radius-base);transition:transform var(--el-transition-duration-fast) ease-in-out;background-color:#0000;border:none;outline:none;margin:0;padding:0}.el-table__expand-icon:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:-2px}.el-table__expand-icon{color:var(--el-text-color-regular);width:min(23px,100%);height:23px;font-size:12px;line-height:12px}.el-table__expand-icon.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-table__expand-icon--expanded{transform:rotate(90deg)}.el-table__expand-icon>.el-icon{font-size:12px}.el-table__expanded-cell{background-color:var(--el-table-expanded-cell-bg-color)}.el-table__expanded-cell[class*=cell]{padding:20px 50px}.el-table__expanded-cell:hover{background-color:#0000!important}.el-table__placeholder{width:20px;display:inline-block}.el-table__append-wrapper{overflow:hidden}.el-table--fit{border-bottom:0;border-right:0}.el-table--fit .el-table__cell.gutter{border-right-width:1px}.el-table--fit .el-table__inner-wrapper:before{width:100%}.el-table thead{color:var(--el-table-header-text-color)}.el-table thead th{font-weight:600}.el-table thead.is-group th.el-table__cell{background:var(--el-fill-color-light)}.el-table .el-table__cell{box-sizing:border-box;text-overflow:ellipsis;vertical-align:middle;text-align:left;min-width:0;z-index:var(--el-table-index);padding:8px 0;position:relative}.el-table .el-table__cell.is-center{text-align:center}.el-table .el-table__cell.is-right{text-align:right}.el-table .el-table__cell.gutter{border-bottom-width:0;border-right-width:0;width:15px;padding:0}.el-table .el-table__cell.is-hidden>*{visibility:hidden}.el-table .cell{box-sizing:border-box;text-overflow:ellipsis;white-space:normal;overflow-wrap:break-word;padding:0 12px;line-height:23px;overflow:hidden}.el-table .cell.el-tooltip{white-space:nowrap;min-width:50px}.el-table--large{font-size:var(--el-font-size-base)}.el-table--large .el-table__cell{padding:12px 0}.el-table--large .cell{padding:0 16px}.el-table--default{font-size:var(--el-font-size-base)}.el-table--default .el-table__cell{padding:8px 0}.el-table--default .cell{padding:0 12px}.el-table--small{font-size:var(--el-font-size-extra-small)}.el-table--small .el-table__cell{padding:4px 0}.el-table--small .cell{padding:0 8px}.el-table tr{background-color:var(--el-table-tr-bg-color)}.el-table tr input[type=checkbox]{margin:0}.el-table th.el-table__cell.is-leaf,.el-table td.el-table__cell{border-bottom:var(--el-table-border)}.el-table th.el-table__cell.is-sortable{cursor:pointer}.el-table th.el-table__cell{background-color:var(--el-table-header-bg-color)}.el-table th.el-table__cell>.cell.highlight{color:var(--el-color-primary)}.el-table th.el-table__cell.required>div:before{content:"";vertical-align:middle;background:#ff4d51;border-radius:50%;width:8px;height:8px;margin-right:5px;display:inline-block}.el-table td.el-table__cell div{box-sizing:border-box}.el-table td.el-table__cell.gutter{width:0}.el-table--border:after,.el-table--border:before,.el-table--border .el-table__inner-wrapper:after,.el-table__inner-wrapper:before{content:"";background-color:var(--el-table-border-color);z-index:calc(var(--el-table-index) + 2);position:absolute}.el-table--border .el-table__inner-wrapper:after{width:100%;height:1px;z-index:calc(var(--el-table-index) + 2);top:0;left:0}.el-table--border:before{width:1px;height:100%;top:-1px;left:0}.el-table--border:after{width:1px;height:100%;top:-1px;right:0}.el-table--border .el-table__inner-wrapper{border-bottom:none;border-right:none}.el-table--border .el-table__footer-wrapper{flex-shrink:0;position:relative}.el-table--border .el-table__cell{border-right:var(--el-table-border)}.el-table--border th.el-table__cell.gutter:last-of-type{border-bottom:var(--el-table-border);border-bottom-width:1px}.el-table--border th.el-table__cell{border-bottom:var(--el-table-border)}.el-table--hidden{visibility:hidden}.el-table__header-wrapper,.el-table__body-wrapper,.el-table__footer-wrapper{width:100%}.el-table__header-wrapper tr td.el-table-fixed-column--left,.el-table__header-wrapper tr td.el-table-fixed-column--right,.el-table__header-wrapper tr th.el-table-fixed-column--left,.el-table__header-wrapper tr th.el-table-fixed-column--right,.el-table__body-wrapper tr td.el-table-fixed-column--left,.el-table__body-wrapper tr td.el-table-fixed-column--right,.el-table__body-wrapper tr th.el-table-fixed-column--left,.el-table__body-wrapper tr th.el-table-fixed-column--right,.el-table__footer-wrapper tr td.el-table-fixed-column--left,.el-table__footer-wrapper tr td.el-table-fixed-column--right,.el-table__footer-wrapper tr th.el-table-fixed-column--left,.el-table__footer-wrapper tr th.el-table-fixed-column--right{background:inherit;z-index:calc(var(--el-table-index) + 1);position:sticky!important}.el-table__header-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-first-column:before{content:"";width:10px;box-shadow:none;touch-action:none;pointer-events:none;position:absolute;top:0;bottom:0;overflow:hidden}.el-table__header-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-first-column:before{left:-10px}.el-table__header-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-last-column:before{right:-10px}.el-table__header-wrapper tr td.el-table__fixed-right-patch,.el-table__header-wrapper tr th.el-table__fixed-right-patch,.el-table__body-wrapper tr td.el-table__fixed-right-patch,.el-table__body-wrapper tr th.el-table__fixed-right-patch,.el-table__footer-wrapper tr td.el-table__fixed-right-patch,.el-table__footer-wrapper tr th.el-table__fixed-right-patch{z-index:calc(var(--el-table-index) + 1);background:#fff;right:0;position:sticky!important}.el-table__header-wrapper{flex-shrink:0}.el-table__header-wrapper tr th.el-table-fixed-column--left,.el-table__header-wrapper tr th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table__header,.el-table__body,.el-table__footer{table-layout:fixed;border-collapse:separate}.el-table__header-wrapper{overflow:hidden}.el-table__header-wrapper tbody td.el-table__cell{background-color:var(--el-table-row-hover-bg-color);color:var(--el-table-text-color)}.el-table__footer-wrapper{flex-shrink:0;overflow:hidden}.el-table__footer-wrapper tfoot td.el-table__cell{background-color:var(--el-table-row-hover-bg-color);color:var(--el-table-text-color)}.el-table__header-wrapper .el-table-column--selection>.cell,.el-table__body-wrapper .el-table-column--selection>.cell{align-items:center;height:23px;display:inline-flex}.el-table__header-wrapper .el-table-column--selection .el-checkbox,.el-table__body-wrapper .el-table-column--selection .el-checkbox{height:unset}.el-table.is-scrolling-left .el-table-fixed-column--right.is-first-column:before{box-shadow:var(--el-table-fixed-right-column)}.el-table.is-scrolling-left.el-table--border .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:var(--el-table-border)}.el-table.is-scrolling-left th.el-table-fixed-column--left{background-color:var(--el-table-header-bg-color)}.el-table.is-scrolling-right .el-table-fixed-column--left.is-last-column:before{box-shadow:var(--el-table-fixed-left-column)}.el-table.is-scrolling-right .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:none}.el-table.is-scrolling-right th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table.is-scrolling-middle .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:none}.el-table.is-scrolling-middle .el-table-fixed-column--right.is-first-column:before{box-shadow:var(--el-table-fixed-right-column)}.el-table.is-scrolling-middle .el-table-fixed-column--left.is-last-column:before{box-shadow:var(--el-table-fixed-left-column)}.el-table.is-scrolling-none .el-table-fixed-column--left.is-first-column:before,.el-table.is-scrolling-none .el-table-fixed-column--left.is-last-column:before,.el-table.is-scrolling-none .el-table-fixed-column--right.is-first-column:before,.el-table.is-scrolling-none .el-table-fixed-column--right.is-last-column:before{box-shadow:none}.el-table.is-scrolling-none th.el-table-fixed-column--left,.el-table.is-scrolling-none th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table__body-wrapper{flex:1;position:relative;overflow:hidden}.el-table__body-wrapper .el-scrollbar__bar{z-index:calc(var(--el-table-index) + 2)}.el-table .caret-wrapper{cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--el-border-radius-base);transition:transform var(--el-transition-duration-fast) ease-in-out;background-color:#0000;border:none;outline:none;margin:0;padding:0}.el-table .caret-wrapper:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-table .caret-wrapper{vertical-align:middle;width:24px;height:14px;overflow:initial;flex-direction:column;align-items:center;display:inline-flex;position:relative}.el-table .sort-caret{border:5px solid #0000;width:0;height:0;position:absolute;left:7px}.el-table .sort-caret.ascending{border-bottom-color:var(--el-text-color-placeholder);top:-5px}.el-table .sort-caret.descending{border-top-color:var(--el-text-color-placeholder);bottom:-3px}.el-table .ascending .sort-caret.ascending{border-bottom-color:var(--el-color-primary)}.el-table .descending .sort-caret.descending{border-top-color:var(--el-color-primary)}.el-table .hidden-columns{visibility:hidden;z-index:-1;position:absolute}.el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell{background:var(--el-fill-color-lighter)}.el-table--striped .el-table__body tr.el-table__row--striped.current-row td.el-table__cell{background-color:var(--el-table-current-row-bg-color)}.el-table__body tr.hover-row>td.el-table__cell,.el-table__body tr.hover-row.current-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped.current-row>td.el-table__cell,.el-table__body tr>td.hover-cell{background-color:var(--el-table-row-hover-bg-color)}.el-table__body tr.current-row>td.el-table__cell{background-color:var(--el-table-current-row-bg-color)}.el-table.el-table--scrollable-y .el-table__body-header{z-index:calc(var(--el-table-index) + 2);position:sticky;top:0}.el-table.el-table--scrollable-y .el-table__body-footer{z-index:calc(var(--el-table-index) + 2);position:sticky;bottom:0}.el-table__column-resize-proxy{border-left:var(--el-table-border);width:0;z-index:calc(var(--el-table-index) + 9);position:absolute;top:0;bottom:0;left:200px}.el-table__column-filter-trigger{cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--el-border-radius-base);transition:transform var(--el-transition-duration-fast) ease-in-out;background-color:#0000;border:none;outline:none;margin:0;padding:0}.el-table__column-filter-trigger:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-table__column-filter-trigger{display:inline-block}.el-table__column-filter-trigger i{color:var(--el-color-info);vertical-align:middle;font-size:14px}.el-table__border-left-patch{width:1px;height:100%;z-index:calc(var(--el-table-index) + 2);background-color:var(--el-table-border-color);position:absolute;top:0;left:0}.el-table__border-bottom-patch{height:1px;z-index:calc(var(--el-table-index) + 2);background-color:var(--el-table-border-color);position:absolute;left:0}.el-table__border-right-patch{width:1px;height:100%;z-index:calc(var(--el-table-index) + 2);background-color:var(--el-table-border-color);position:absolute;top:0}.el-table--enable-row-transition .el-table__body td.el-table__cell{transition:background-color .25s}.el-table--enable-row-hover .el-table__body tr:hover>td.el-table__cell{background-color:var(--el-table-row-hover-bg-color)}.el-table [class*=el-table__row--level] .el-table__expand-icon{text-align:center;width:20px;display:inline-block}.el-table .el-table.el-table--border .el-table__cell{border-right:var(--el-table-border)}.el-table:not(.el-table--border) .el-table__cell{border-right:none}.el-table:not(.el-table--border)>.el-table__inner-wrapper:after{content:none}.el-table-column--selection .cell{padding-left:14px;padding-right:14px}.el-table-filter{border:solid 1px var(--el-border-color-lighter);box-shadow:var(--el-box-shadow-light);box-sizing:border-box;background-color:#fff;border-radius:2px}.el-table-filter__list{outline:none;min-width:100px;margin:0;padding:5px 0;list-style:none}.el-table-filter__list-item{cursor:pointer;line-height:36px;font-size:var(--el-font-size-base);outline:none;padding:0 10px}.el-table-filter__list-item:hover,.el-table-filter__list-item:focus{background-color:var(--el-color-primary-light-9);color:var(--el-color-primary)}.el-table-filter__list-item.is-active{background-color:var(--el-color-primary);color:#fff}.el-table-filter__multiple{outline:none}.el-table-filter__content{min-width:100px}.el-table-filter__bottom{border-top:1px solid var(--el-border-color-lighter);padding:8px}.el-table-filter__bottom button{cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--el-border-radius-base);transition:transform var(--el-transition-duration-fast) ease-in-out;background-color:#0000;border:none;outline:none;margin:0;padding:0}.el-table-filter__bottom button:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-table-filter__bottom button{color:var(--el-text-color-regular);font-size:var(--el-font-size-small);padding:0 3px}.el-table-filter__bottom button:hover{color:var(--el-color-primary)}.el-table-filter__bottom button.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-table-filter__wrap{max-height:280px}.el-table-filter__checkbox-group{padding:10px}.el-table-filter__checkbox-group label.el-checkbox{height:unset;align-items:center;margin-bottom:12px;margin-left:5px;margin-right:5px;display:flex}.el-table-filter__checkbox-group .el-checkbox:last-child{margin-bottom:0}.el-textarea{--el-input-text-color:var(--el-text-color-regular);--el-input-border:var(--el-border);--el-input-hover-border:var(--el-border-color-hover);--el-input-focus-border:var(--el-color-primary);--el-input-transparent-border:0 0 0 1px transparent inset;--el-input-border-color:var(--el-border-color);--el-input-border-radius:var(--el-border-radius-base);--el-input-bg-color:var(--el-fill-color-blank);--el-input-icon-color:var(--el-text-color-placeholder);--el-input-placeholder-color:var(--el-text-color-placeholder);--el-input-hover-border-color:var(--el-border-color-hover);--el-input-clear-hover-color:var(--el-text-color-secondary);--el-input-focus-border-color:var(--el-color-primary);--el-input-width:100%;vertical-align:bottom;width:100%;font-size:var(--el-font-size-base);display:inline-block;position:relative}.el-textarea__inner{resize:vertical;box-sizing:border-box;width:100%;line-height:1.5;font-size:inherit;color:var(--el-input-text-color,var(--el-text-color-regular));background-color:var(--el-input-bg-color,var(--el-fill-color-blank));-webkit-appearance:none;box-shadow:0 0 0 1px var(--el-input-border-color,var(--el-border-color)) inset;border-radius:var(--el-input-border-radius,var(--el-border-radius-base));transition:var(--el-transition-box-shadow);background-image:none;border:none;padding:5px 11px;font-family:inherit;display:block;position:relative}.el-textarea__inner.is-clearable{padding:5px 26px 5px 11px}.el-textarea__inner::placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-textarea__inner:hover{box-shadow:0 0 0 1px var(--el-input-hover-border-color) inset}.el-textarea__inner:focus{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset;outline:none}.el-textarea__clear{color:var(--el-input-icon-color);cursor:pointer;font-size:14px;position:absolute;top:15px;right:11px;transform:translateY(-50%)}.el-textarea__clear:hover{color:var(--el-input-clear-hover-color)}.el-textarea .el-input__count{color:var(--el-color-info);background:var(--el-fill-color-blank);font-size:12px;line-height:14px;position:absolute;bottom:5px;right:10px}.el-textarea .el-input__count.is-outside{top:100%;right:0;bottom:unset;background:0 0;padding-top:2px;line-height:1;position:absolute}.el-textarea.is-disabled .el-textarea__inner{box-shadow:0 0 0 1px var(--el-disabled-border-color) inset;background-color:var(--el-disabled-bg-color);color:var(--el-disabled-text-color);cursor:not-allowed}.el-textarea.is-disabled .el-textarea__inner::placeholder{color:var(--el-text-color-placeholder)}.el-textarea.is-exceed .el-textarea__inner{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-textarea.is-exceed .el-input__count{color:var(--el-color-danger)}.el-input{--el-input-text-color:var(--el-text-color-regular);--el-input-border:var(--el-border);--el-input-hover-border:var(--el-border-color-hover);--el-input-focus-border:var(--el-color-primary);--el-input-transparent-border:0 0 0 1px transparent inset;--el-input-border-color:var(--el-border-color);--el-input-border-radius:var(--el-border-radius-base);--el-input-bg-color:var(--el-fill-color-blank);--el-input-icon-color:var(--el-text-color-placeholder);--el-input-placeholder-color:var(--el-text-color-placeholder);--el-input-hover-border-color:var(--el-border-color-hover);--el-input-clear-hover-color:var(--el-text-color-secondary);--el-input-focus-border-color:var(--el-color-primary);--el-input-width:100%;--el-input-height:var(--el-component-size);font-size:var(--el-font-size-base);width:var(--el-input-width);line-height:var(--el-input-height);box-sizing:border-box;vertical-align:middle;display:inline-flex;position:relative}.el-input::-webkit-scrollbar{z-index:11;width:6px}.el-input::-webkit-scrollbar:horizontal{height:6px}.el-input::-webkit-scrollbar-thumb{background:var(--el-text-color-disabled);border-radius:5px;width:6px}.el-input::-webkit-scrollbar-corner{background:var(--el-fill-color-blank)}.el-input::-webkit-scrollbar-track{background:var(--el-fill-color-blank)}.el-input::-webkit-scrollbar-track-piece{background:var(--el-fill-color-blank);width:6px}.el-input .el-input__clear,.el-input .el-input__password{color:var(--el-input-icon-color);cursor:pointer;font-size:14px}.el-input .el-input__clear:hover,.el-input .el-input__password:hover{color:var(--el-input-clear-hover-color)}.el-input .el-input__count{height:100%;color:var(--el-color-info);align-items:center;font-size:12px;display:inline-flex}.el-input .el-input__count .el-input__count-inner{background:var(--el-fill-color-blank);line-height:initial;padding-left:8px;display:inline-block}.el-input .el-input__count.is-outside{height:unset;padding-top:2px;position:absolute;top:100%;right:0}.el-input .el-input__count.is-outside .el-input__count-inner{background:0 0;padding-left:0;line-height:1}.el-input__wrapper{background-color:var(--el-input-bg-color,var(--el-fill-color-blank));border-radius:var(--el-input-border-radius,var(--el-border-radius-base));cursor:text;transition:var(--el-transition-box-shadow);box-shadow:0 0 0 1px var(--el-input-border-color,var(--el-border-color)) inset;background-image:none;flex-grow:1;justify-content:center;align-items:center;padding:1px 11px;display:inline-flex;transform:translate(0)}.el-input__wrapper:hover{box-shadow:0 0 0 1px var(--el-input-hover-border-color) inset}.el-input__wrapper.is-focus{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset}.el-input{--el-input-inner-height:calc(var(--el-input-height,32px) - 2px)}.el-input__inner{-webkit-appearance:none;width:100%;color:var(--el-input-text-color,var(--el-text-color-regular));font-size:inherit;height:var(--el-input-inner-height);line-height:var(--el-input-inner-height);box-sizing:border-box;background:0 0;border:none;outline:none;flex-grow:1;padding:0}.el-input__inner:focus{outline:none}.el-input__inner::placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-input__inner[type=password]::-ms-reveal{display:none}.el-input__inner[type=number]{line-height:1}.el-input__prefix{white-space:nowrap;height:100%;line-height:var(--el-input-inner-height);text-align:center;color:var(--el-input-icon-color,var(--el-text-color-placeholder));transition:all var(--el-transition-duration);pointer-events:none;flex-wrap:nowrap;flex-shrink:0;display:inline-flex}.el-input__prefix-inner{pointer-events:all;justify-content:center;align-items:center;display:inline-flex}.el-input__prefix-inner>:last-child{margin-right:8px}.el-input__prefix-inner>:first-child,.el-input__prefix-inner>:first-child.el-input__icon{margin-left:0}.el-input__suffix{white-space:nowrap;height:100%;line-height:var(--el-input-inner-height);text-align:center;color:var(--el-input-icon-color,var(--el-text-color-placeholder));transition:all var(--el-transition-duration);pointer-events:none;flex-wrap:nowrap;flex-shrink:0;display:inline-flex}.el-input__suffix-inner{pointer-events:all;justify-content:center;align-items:center;display:inline-flex}.el-input__suffix-inner>:first-child{margin-left:8px}.el-input .el-input__icon{height:inherit;line-height:inherit;transition:all var(--el-transition-duration);justify-content:center;align-items:center;margin-left:8px;display:flex}.el-input__validateIcon{pointer-events:none}.el-input.is-active .el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-focus-color, ) inset}.el-input.is-disabled{cursor:not-allowed}.el-input.is-disabled .el-input__wrapper{background-color:var(--el-disabled-bg-color);cursor:not-allowed;box-shadow:0 0 0 1px var(--el-disabled-border-color) inset}.el-input.is-disabled .el-input__inner{color:var(--el-disabled-text-color);-webkit-text-fill-color:var(--el-disabled-text-color);cursor:not-allowed}.el-input.is-disabled .el-input__inner::placeholder{color:var(--el-text-color-placeholder)}.el-input.is-disabled .el-input__icon{cursor:not-allowed}.el-input.is-disabled .el-input__prefix-inner,.el-input.is-disabled .el-input__suffix-inner{pointer-events:none}.el-input.is-exceed .el-input__wrapper{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-input.is-exceed .el-input__suffix .el-input__count{color:var(--el-color-danger)}.el-input--large{--el-input-height:var(--el-component-size-large);font-size:14px}.el-input--large .el-input__wrapper{padding:1px 15px}.el-input--large{--el-input-inner-height:calc(var(--el-input-height,40px) - 2px)}.el-input--small{--el-input-height:var(--el-component-size-small);font-size:12px}.el-input--small .el-input__wrapper{padding:1px 7px}.el-input--small{--el-input-inner-height:calc(var(--el-input-height,24px) - 2px)}.el-input-group{align-items:stretch;width:100%;display:inline-flex}.el-input-group__append,.el-input-group__prepend{background-color:var(--el-fill-color-light);color:var(--el-color-info);border-radius:var(--el-input-border-radius);white-space:nowrap;justify-content:center;align-items:center;min-height:100%;padding:0 20px;display:inline-flex;position:relative}.el-input-group__append:focus,.el-input-group__prepend:focus{outline:none}.el-input-group__append .el-select,.el-input-group__append .el-button,.el-input-group__prepend .el-select,.el-input-group__prepend .el-button{flex:1;margin:0 -20px;display:inline-block}.el-input-group__append button.el-button,.el-input-group__append button.el-button:hover,.el-input-group__append div.el-select .el-select__wrapper,.el-input-group__append div.el-select:hover .el-select__wrapper,.el-input-group__prepend button.el-button,.el-input-group__prepend button.el-button:hover,.el-input-group__prepend div.el-select .el-select__wrapper,.el-input-group__prepend div.el-select:hover .el-select__wrapper{color:inherit;background-color:#0000;border-color:#0000}.el-input-group__append .el-button,.el-input-group__append .el-input,.el-input-group__prepend .el-button,.el-input-group__prepend .el-input{font-size:inherit}.el-input-group__prepend{box-shadow:1px 0 0 0 var(--el-input-border-color) inset,0 1px 0 0 var(--el-input-border-color) inset,0 -1px 0 0 var(--el-input-border-color) inset;border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.el-input-group__append{box-shadow:0 1px 0 0 var(--el-input-border-color) inset,0 -1px 0 0 var(--el-input-border-color) inset,-1px 0 0 0 var(--el-input-border-color) inset;border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.el-input-group--prepend>.el-input__wrapper{border-top-left-radius:0;border-bottom-left-radius:0}.el-input-group--prepend .el-input-group__prepend .el-select .el-select__wrapper{box-shadow:1px 0 0 0 var(--el-input-border-color) inset,0 1px 0 0 var(--el-input-border-color) inset,0 -1px 0 0 var(--el-input-border-color) inset;border-top-right-radius:0;border-bottom-right-radius:0}.el-input-group--append>.el-input__wrapper{border-top-right-radius:0;border-bottom-right-radius:0}.el-input-group--append .el-input-group__append .el-select .el-select__wrapper{box-shadow:0 1px 0 0 var(--el-input-border-color) inset,0 -1px 0 0 var(--el-input-border-color) inset,-1px 0 0 0 var(--el-input-border-color) inset;border-top-left-radius:0;border-bottom-left-radius:0}.el-input-hidden{display:none!important} diff --git a/app/assets/image-video-uN8PfarH.css b/app/assets/image-video-uN8PfarH.css deleted file mode 100644 index 22119b7..0000000 --- a/app/assets/image-video-uN8PfarH.css +++ /dev/null @@ -1 +0,0 @@ -.image-video-page[data-v-e41486d3]{min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px;color:#333;font-family:Microsoft YaHei,PingFang SC,Hiragino Sans GB,sans-serif;background:linear-gradient(#ffffff80,#ffffff80),url(/static/bg.jpg) center/cover no-repeat,#eef3f7}.page-header[data-v-e41486d3]{position:absolute;top:0;left:0;right:0;height:56px;display:flex;align-items:center;justify-content:space-between;padding:0 24px;background:#ffffff80}.header-title[data-v-e41486d3]{color:#333;font-size:18px;font-weight:600}.back-link[data-v-e41486d3]{color:#555;font-size:14px;text-decoration:none}.back-link[data-v-e41486d3]:hover{color:#667eea}.entrances[data-v-e41486d3]{display:flex;gap:32px;flex-wrap:wrap;justify-content:center}.entrance-btn[data-v-e41486d3]{width:160px;height:100px;display:flex;align-items:center;justify-content:center;color:#333;background:#c5c1c1;border:4px solid #b8d4e3;border-radius:12px;cursor:pointer;font:inherit;font-size:18px;font-weight:600;text-decoration:none;transition:all .2s}.entrance-btn[data-v-e41486d3]:hover:not(:disabled){background:#f8fbfd;box-shadow:0 4px 12px #00000014}.entrance-btn[data-v-e41486d3]:disabled{cursor:wait;opacity:.72}.toast[data-v-e41486d3]{position:fixed;bottom:40px;left:50%;padding:12px 24px;max-width:min(420px,calc(100vw - 48px));color:#fff;background:#000000bf;border-radius:8px;font-size:14px;text-align:center;opacity:0;pointer-events:none;transform:translate(-50%);transition:opacity .3s}.toast.show[data-v-e41486d3]{opacity:1}.toast.error[data-v-e41486d3]{background:#b02a37eb}@media(max-width:640px){.image-video-page[data-v-e41486d3]{padding:88px 24px 40px}.entrances[data-v-e41486d3]{width:100%;gap:18px}.entrance-btn[data-v-e41486d3]{width:100%;max-width:220px}} diff --git a/app/assets/image-video.js b/app/assets/image-video.js deleted file mode 100644 index d9abfc0..0000000 --- a/app/assets/image-video.js +++ /dev/null @@ -1 +0,0 @@ -import{d as p,a as m,c as f,e as a,t as _,n as v,g as l,i as b,_ as g,j as y,k as h}from"./pywebview-B8lwamDf.js";const w={class:"image-video-page"},k={class:"entrances","aria-label":"图生视频入口"},C=["disabled"],T=p({__name:"ImageVideoPage",setup(I){const o=l(!1),n=l(""),i=l("normal");let r;function s(t,e="normal"){n.value=t,i.value=e,r&&window.clearTimeout(r),r=window.setTimeout(()=>{n.value=""},2200)}function u(t){s(`${t}暂未开通,敬请期待`)}async function c(){const t=b();if(!t?.launch_yaoayanui){s("当前环境不支持拉起桌面端","error");return}o.value=!0;try{const e=await t.launch_yaoayanui();if(e?.success){s("已发送启动请求");return}s(e?.error||"启动失败","error")}catch(e){s(e instanceof Error?e.message:String(e),"error")}finally{o.value=!1}}return(t,e)=>(m(),f("div",w,[e[2]||(e[2]=a("header",{class:"page-header"},[a("span",{class:"header-title"},"数富AI"),a("a",{class:"back-link",href:"/home"},"返回首页")],-1)),a("main",k,[a("button",{type:"button",class:"entrance-btn",disabled:o.value,onClick:c}," 数字人 ",8,C),a("button",{type:"button",class:"entrance-btn",onClick:e[0]||(e[0]=d=>u("带货视频"))}," 带货视频 "),a("button",{type:"button",class:"entrance-btn",onClick:e[1]||(e[1]=d=>u("混剪"))}," 混剪 ")]),a("div",{class:v(["toast",{show:!!n.value,error:i.value==="error"}])},_(n.value),3)]))}}),B=g(T,[["__scopeId","data-v-e41486d3"]]);y(B).use(h).mount("#app"); diff --git a/app/assets/listingFilters-BpGOU_pJ.js b/app/assets/listingFilters-BpGOU_pJ.js deleted file mode 100644 index c303fe5..0000000 --- a/app/assets/listingFilters-BpGOU_pJ.js +++ /dev/null @@ -1 +0,0 @@ -const e=[{value:"SearchSuppressed",label:"在搜索结果中禁止显示"},{value:"ApprovalRequired",label:"需要批准"},{value:"Active",label:"在售"},{value:"DetailPageRemoved",label:"详情页面已删除"}];export{e as L}; diff --git a/app/assets/listingFilters-CK58rX4v.css b/app/assets/listingFilters-CK58rX4v.css deleted file mode 100644 index ee76fbe..0000000 --- a/app/assets/listingFilters-CK58rX4v.css +++ /dev/null @@ -1 +0,0 @@ -.el-select-dropdown.is-multiple .el-select-dropdown__item.is-selected:after{content:"";background-position:50%;background-repeat:no-repeat;background-color:var(--el-color-primary);-webkit-mask:url("data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E") 0 0/100% 100% no-repeat;mask:url("data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E") 0 0/100% 100% no-repeat;border-top:none;border-right:none;width:12px;height:12px;position:absolute;top:50%;right:20px;transform:translateY(-50%);-webkit-mask:url("data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E") 0 0/100% 100% no-repeat}.el-select-dropdown{z-index:calc(var(--el-index-top) + 1);border-radius:var(--el-border-radius-base);box-sizing:border-box}.el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list{padding:0}.el-select-dropdown__loading,.el-select-dropdown__empty{text-align:center;color:var(--el-text-color-secondary);font-size:var(--el-select-font-size);margin:0;padding:10px 0}.el-select-dropdown__wrap{max-height:274px}.el-select-dropdown__list{box-sizing:border-box;margin:0;padding:6px 0;list-style:none}.el-select-dropdown__list.el-vl__window{margin:6px 0;padding:0}.el-select-dropdown__header{border-bottom:1px solid var(--el-border-color-light);padding:10px}.el-select-dropdown__footer{border-top:1px solid var(--el-border-color-light);padding:10px}.el-select-dropdown__item{font-size:var(--el-font-size-base);white-space:nowrap;text-overflow:ellipsis;color:var(--el-text-color-regular);box-sizing:border-box;cursor:pointer;height:34px;padding:0 32px 0 20px;line-height:34px;position:relative;overflow:hidden}.el-select-dropdown__item.is-hovering{background-color:var(--el-fill-color-light)}.el-select-dropdown__item.is-selected{color:var(--el-color-primary);font-weight:700}.el-select-dropdown__item.is-disabled{color:var(--el-text-color-placeholder);cursor:not-allowed;background-color:unset}.el-select-dropdown.is-multiple .el-select-dropdown__item.is-selected:after{content:"";background-position:50%;background-repeat:no-repeat;background-color:var(--el-color-primary);-webkit-mask:url("data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E") 0 0/100% 100% no-repeat;mask:url("data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E") 0 0/100% 100% no-repeat;border-top:none;border-right:none;width:12px;height:12px;position:absolute;top:50%;right:20px;transform:translateY(-50%);-webkit-mask:url("data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E") 0 0/100% 100% no-repeat}.el-select-dropdown.is-multiple .el-select-dropdown__item.is-disabled:after{background-color:var(--el-text-color-placeholder)}.el-select-group{margin:0;padding:0}.el-select-group__wrap{margin:0;padding:0;list-style:none;position:relative}.el-select-group__title{box-sizing:border-box;color:var(--el-color-info);text-overflow:ellipsis;white-space:nowrap;padding:0 20px;font-size:12px;line-height:34px;overflow:hidden}.el-select-group .el-select-dropdown__item{padding-left:20px}.el-select{--el-select-border-color-hover:var(--el-border-color-hover);--el-select-disabled-color:var(--el-disabled-text-color);--el-select-disabled-border:var(--el-disabled-border-color);--el-select-font-size:var(--el-font-size-base);--el-select-close-hover-color:var(--el-text-color-secondary);--el-select-input-color:var(--el-text-color-placeholder);--el-select-multiple-input-color:var(--el-text-color-regular);--el-select-input-focus-border-color:var(--el-color-primary);--el-select-input-font-size:14px;--el-select-width:100%;vertical-align:middle;width:var(--el-select-width);display:inline-block;position:relative}.el-select__wrapper{box-sizing:border-box;cursor:pointer;text-align:left;border-radius:var(--el-border-radius-base);background-color:var(--el-fill-color-blank);min-height:32px;transition:var(--el-transition-duration);box-shadow:0 0 0 1px var(--el-border-color) inset;align-items:center;gap:6px;padding:4px 12px;font-size:14px;line-height:24px;display:flex;position:relative;transform:translate(0)}.el-select__wrapper.is-filterable{cursor:text}.el-select__wrapper.is-focused{box-shadow:0 0 0 1px var(--el-color-primary) inset}.el-select__wrapper.is-hovering:not(.is-focused){box-shadow:0 0 0 1px var(--el-border-color-hover) inset}.el-select__wrapper.is-disabled{cursor:not-allowed;background-color:var(--el-fill-color-light);color:var(--el-text-color-placeholder);box-shadow:0 0 0 1px var(--el-select-disabled-border) inset}.el-select__wrapper.is-disabled:hover{box-shadow:0 0 0 1px var(--el-select-disabled-border) inset}.el-select__wrapper.is-disabled.is-focus{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset}.el-select__wrapper.is-disabled .el-select__selected-item{color:var(--el-select-disabled-color)}.el-select__wrapper.is-disabled .el-select__caret,.el-select__wrapper.is-disabled .el-tag,.el-select__wrapper.is-disabled input{cursor:not-allowed}.el-select__wrapper.is-disabled .el-select__prefix,.el-select__wrapper.is-disabled .el-select__suffix{pointer-events:none}.el-select__prefix,.el-select__suffix{color:var(--el-input-icon-color,var(--el-text-color-placeholder));flex-shrink:0;align-items:center;gap:6px;display:flex}.el-select__caret{color:var(--el-select-input-color);font-size:var(--el-select-input-font-size);transition:var(--el-transition-duration);cursor:pointer;transform:rotate(0)}.el-select__caret.is-reverse{transform:rotate(180deg)}.el-select__clear{cursor:pointer}.el-select__clear:hover{color:var(--el-select-close-hover-color)}.el-select__selection{flex-wrap:wrap;flex:1;align-items:center;gap:6px;min-width:0;display:flex;position:relative}.el-select__selection.is-near{margin-left:-8px}.el-select__selection .el-tag{cursor:pointer;border-color:#0000}.el-select__selection .el-tag.el-tag--plain{border-color:var(--el-tag-border-color)}.el-select__selection .el-tag .el-tag__content{min-width:0}.el-select__selected-item{-webkit-user-select:none;user-select:none;flex-wrap:wrap;display:flex}.el-select__tags-text{text-overflow:ellipsis;white-space:nowrap;line-height:normal;display:block;overflow:hidden}.el-select__placeholder{z-index:-1;text-overflow:ellipsis;white-space:nowrap;width:100%;color:var(--el-input-text-color,var(--el-text-color-regular));display:block;position:absolute;top:50%;overflow:hidden;transform:translateY(-50%)}.el-select__placeholder.is-transparent{-webkit-user-select:none;user-select:none;color:var(--el-text-color-placeholder)}.el-select__popper.el-popper{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light);box-shadow:var(--el-box-shadow-light)}.el-select__popper.el-popper .el-popper__arrow:before{border:1px solid var(--el-border-color-light)}.el-select__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-top-color:#0000;border-left-color:#0000}.el-select__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:#0000;border-right-color:#0000}.el-select__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-bottom-color:#0000;border-left-color:#0000}.el-select__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-top-color:#0000;border-right-color:#0000}.el-select__input-wrapper{flex:1}.el-select__input-wrapper.is-hidden{opacity:0;z-index:-1;position:absolute}.el-select__input{color:var(--el-select-multiple-input-color);font-size:inherit;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#0000;border:none;outline:none;width:100%;height:24px;padding:0;font-family:inherit}.el-select__input-calculator{visibility:hidden;white-space:pre;max-width:100%;position:absolute;top:0;left:0;overflow:hidden}.el-select--large .el-select__wrapper{gap:6px;min-height:40px;padding:8px 16px;font-size:14px;line-height:24px}.el-select--large .el-select__selection{gap:6px}.el-select--large .el-select__selection.is-near{margin-left:-8px}.el-select--large .el-select__prefix,.el-select--large .el-select__suffix{gap:6px}.el-select--large .el-select__input{height:24px}.el-select--small .el-select__wrapper{gap:4px;min-height:24px;padding:2px 8px;font-size:12px;line-height:20px}.el-select--small .el-select__selection{gap:4px}.el-select--small .el-select__selection.is-near{margin-left:-6px}.el-select--small .el-select__prefix,.el-select--small .el-select__suffix{gap:4px}.el-select--small .el-select__input{height:20px} diff --git a/app/assets/patrol-delete-Cqhg2qXm.css b/app/assets/patrol-delete-Cqhg2qXm.css deleted file mode 100644 index 6b7301f..0000000 --- a/app/assets/patrol-delete-Cqhg2qXm.css +++ /dev/null @@ -1 +0,0 @@ -.module-page[data-v-09e791f5]{min-height:100vh;background:#1a1a1a}.main-content[data-v-09e791f5]{display:flex;min-height:calc(100vh - 56px);height:calc(100vh - 56px)}.left-panel[data-v-09e791f5]{width:400px;background:#1e1e1e;padding:20px;overflow-y:auto;border-right:1px solid #2a2a2a}.right-panel[data-v-09e791f5]{flex:1;display:flex;flex-direction:column;min-width:0;background:#1a1a1a}.section-title[data-v-09e791f5]{font-size:13px;color:#bbb;margin-bottom:10px}.condition-title[data-v-09e791f5]{display:flex;align-items:center;justify-content:space-between;gap:10px}.condition-title-hint[data-v-09e791f5]{flex:1;min-width:0;color:#d6a95a;font-size:12px;text-align:right;line-height:1.35}.input-zone[data-v-09e791f5]{border:1px dashed #3a3a3a;border-radius:10px;padding:16px;background:#252525;margin-bottom:20px}.hint[data-v-09e791f5]{color:#888;font-size:12px;margin-bottom:12px;line-height:1.5;text-align:left}.input-row[data-v-09e791f5]{display:flex;gap:10px;align-items:center}.input-row[data-v-09e791f5] .el-input{flex:1}.opt-btn[data-v-09e791f5]{padding:8px 12px;font-size:12px;color:#ccc;background:#2a2a2a;border:1px solid #3a3a3a;border-radius:6px;cursor:pointer;white-space:nowrap}.opt-btn[data-v-09e791f5]:hover:not(:disabled){color:#3498db;border-color:#3498db}.opt-btn[data-v-09e791f5]:disabled{opacity:.6;cursor:not-allowed}.empty-candidates[data-v-09e791f5]{color:#666;font-size:13px;padding:16px;border:1px dashed #333;border-radius:8px;margin-bottom:16px}.candidate-table-scroll[data-v-09e791f5]{max-height:320px;overflow:auto;margin-bottom:18px;border-radius:8px;border:1px solid #2a2a2a}.candidate-table[data-v-09e791f5]{--el-table-bg-color: #252525;--el-table-tr-bg-color: #252525;--el-table-header-bg-color: #2a2a2a;--el-table-text-color: #ccc;--el-table-border-color: #333}.condition-panel[data-v-09e791f5]{margin-bottom:18px;border:1px solid #2a2a2a;border-radius:8px;background:#222;padding:12px}.condition-input-row[data-v-09e791f5]{display:flex;gap:10px;align-items:center;margin-bottom:10px}.condition-input-row[data-v-09e791f5] .el-input{flex:1}.empty-conditions[data-v-09e791f5]{color:#666;font-size:12px;padding:10px 4px}.condition-list[data-v-09e791f5]{list-style:none;margin:0;padding:0;max-height:150px;overflow:auto;display:flex;flex-direction:column;gap:8px}.condition-item[data-v-09e791f5]{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:8px 6px;border-bottom:1px solid #303030}.condition-item[data-v-09e791f5]:last-child{border-bottom:none}.condition-check[data-v-09e791f5]{display:flex;align-items:center;gap:8px;min-width:0;color:#cfd6df;font-size:12px;cursor:pointer}.condition-check input[data-v-09e791f5]{width:16px;height:16px;margin:0;flex:0 0 auto}.condition-check span[data-v-09e791f5]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.link-danger[data-v-09e791f5]{background:none;border:none;color:#e74c3c;cursor:pointer;font-size:12px;padding:0}.link-danger[data-v-09e791f5]:hover{text-decoration:underline}.run-row[data-v-09e791f5]{display:flex;flex-wrap:wrap;gap:10px;margin-top:8px}.btn-run[data-v-09e791f5]{padding:10px 18px;font-size:14px;font-weight:600;color:#fff;background:#3498db;border:none;border-radius:8px;cursor:pointer}.btn-run[data-v-09e791f5]:hover:not(:disabled){background:#2980b9}.btn-run[data-v-09e791f5]:disabled{opacity:.55;cursor:not-allowed}.btn-queue[data-v-09e791f5]{background:#27ae60}.btn-queue[data-v-09e791f5]:hover:not(:disabled){background:#219a52}.loading-msg[data-v-09e791f5]{margin-top:12px;font-size:12px;color:#777;line-height:1.5}.queue-debug-card[data-v-09e791f5]{margin-top:18px;padding:14px;border:1px solid #2a2a2a;border-radius:10px;background:#202020}.queue-debug-title[data-v-09e791f5]{margin-bottom:8px}.queue-debug-line[data-v-09e791f5]{color:#b8c1cc;font-size:12px;line-height:1.6;margin-bottom:8px}.queue-debug-payload[data-v-09e791f5]{margin:0;max-height:220px;overflow:auto;padding:10px;border-radius:8px;background:#141414;color:#8fd3ff;font-size:11px;line-height:1.5;white-space:pre-wrap;word-break:break-all}.panel-header[data-v-09e791f5]{padding:16px 20px;font-size:15px;font-weight:600;color:#e0e0e0;border-bottom:1px solid #2a2a2a}.task-list-wrap[data-v-09e791f5]{flex:1;padding:16px 20px;overflow:auto}.clean-result-summary[data-v-09e791f5]{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-bottom:16px}.summary-card[data-v-09e791f5]{padding:14px 16px;border:1px solid #2a2a2a;border-radius:10px;background:#1e1e1e}.summary-card strong[data-v-09e791f5]{display:block;margin-top:8px;font-size:22px;color:#eaf4ff}.summary-label[data-v-09e791f5]{font-size:12px;color:#8d8d8d}.subsection-title[data-v-09e791f5]{font-size:13px;color:#999;margin:8px 0 10px}.empty-tasks[data-v-09e791f5]{color:#666;font-size:13px;padding:16px;text-align:center}.empty-tasks.narrow[data-v-09e791f5]{padding:12px 8px}.match-table[data-v-09e791f5]{margin-bottom:18px}.match-table[data-v-09e791f5] .el-table__body tr:hover>td.el-table__cell,.match-table[data-v-09e791f5] .el-table__body tr.hover-row>td.el-table__cell,.match-table[data-v-09e791f5] .el-table__body tr.current-row>td.el-table__cell{background-color:var(--el-table-tr-bg-color, #222)!important}.result-table[data-v-09e791f5]{--el-table-bg-color: #222;--el-table-tr-bg-color: #222;--el-table-header-bg-color: #2a2a2a;--el-table-text-color: #ccc;--el-table-border-color: #333}.ok[data-v-09e791f5]{color:#27ae60}.fail[data-v-09e791f5]{color:#e67e22}.result-list-wrap[data-v-09e791f5]{border:1px solid #2a2a2a;border-radius:10px;background:#1e1e1e;min-height:220px;margin-top:8px}.result-list-header[data-v-09e791f5]{padding:12px 16px;border-bottom:1px solid #2a2a2a;font-size:14px;color:#ddd}.result-subsection[data-v-09e791f5]{padding:12px 12px 4px}.result-subsection-title[data-v-09e791f5]{font-size:12px;color:#888;margin-bottom:8px}.task-list[data-v-09e791f5]{list-style:none;margin:0;padding:0}.task-item[data-v-09e791f5]{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:12px 14px;border:1px solid #2a2a2a;border-radius:8px;margin-bottom:8px;background:#222}.left[data-v-09e791f5]{flex:1;min-width:0}.split-result-main[data-v-09e791f5]{display:flex;flex-direction:column;gap:4px}.id[data-v-09e791f5]{font-weight:600;color:#e0e0e0;font-size:13px}.files[data-v-09e791f5]{font-size:12px;color:#888}.task-right[data-v-09e791f5]{display:flex;align-items:center;gap:8px;flex-wrap:wrap;justify-content:flex-end}.status[data-v-09e791f5]{padding:4px 10px;border-radius:6px;font-size:12px;white-space:nowrap}.status.success[data-v-09e791f5]{background:#2ecc712e;color:#2ecc71}.status.failed[data-v-09e791f5]{background:#e74c3c2e;color:#ff6b6b}.status.running[data-v-09e791f5]{background:#3498db2e;color:#3498db}.archive[data-v-09e791f5]{padding:6px 10px;border-radius:6px;font-size:12px;background:#3498db2e;color:#69b6ff;border:none;cursor:pointer}.archive[data-v-09e791f5]:hover{background:#3498db47}.btn-delete[data-v-09e791f5]{padding:6px 10px;border-radius:6px;font-size:12px;background:#e74c3c1f;color:#ff8f8f;border:none;cursor:pointer}.btn-delete[data-v-09e791f5]:hover{background:#e74c3c38}@media(max-width:1100px){.main-content[data-v-09e791f5]{flex-direction:column;height:auto}.left-panel[data-v-09e791f5]{width:100%;border-right:none;border-bottom:1px solid #2a2a2a}.clean-result-summary[data-v-09e791f5]{grid-template-columns:repeat(2,minmax(0,1fr))}} diff --git a/app/assets/patrol-delete.js b/app/assets/patrol-delete.js deleted file mode 100644 index f06bb99..0000000 --- a/app/assets/patrol-delete.js +++ /dev/null @@ -1 +0,0 @@ -import{d as ie,o as ue,q as ce,a as i,c as u,b as m,e as a,x as Mt,y as de,t as r,z as I,A as fe,B as pe,F as W,r as ut,w as he,v as me,f as v,G as ve,n as ct,m as At,g as p,h as M,E as d,i as ye,_ as _e,K as we,j as ke,k as ge}from"./pywebview-B8lwamDf.js";import{z as Se}from"./zh-cn-CqyuNHRW.js";import{B as Ie,ay as be,az as Te,aA as Ce,aB as Ee,aC as De,aD as Pe,aE as Ne,aF as $e,aG as Re,aH as Me,aI as Ae,aJ as Le,s as Be,aK as qe,aL as xe,v as X,aM as Fe}from"./java-modules-B9jblDzU.js";/* empty css */import{c as Ue}from"./categorized-timers-JPA-olTr.js";const He={class:"page-shell module-page"},Oe={class:"main-content"},Ve={class:"left-panel"},Ke={class:"input-zone"},Qe={class:"input-row"},ze=["disabled"],Ge={key:0,class:"empty-candidates"},Je={key:1,class:"candidate-table-scroll"},je=["onClick"],We={class:"condition-panel"},Xe={class:"condition-input-row"},Ye=["disabled"],Ze={key:0,class:"empty-conditions"},ts={key:1,class:"condition-list"},es={class:"condition-check"},ss=["value"],as=["title"],ns=["onClick"],os={class:"run-row"},ls=["disabled"],rs=["disabled"],is={key:2,class:"queue-debug-card"},us={class:"queue-debug-line"},cs={key:0,class:"queue-debug-payload"},ds={class:"right-panel"},fs={class:"task-list-wrap"},ps={class:"clean-result-summary"},hs={class:"summary-card"},ms={class:"summary-card"},vs={class:"summary-card"},ys={class:"summary-card"},_s={key:0,class:"empty-tasks narrow"},ws=["onClick"],ks={class:"result-list-wrap"},gs={key:0,class:"empty-tasks"},Ss={key:0,class:"result-subsection"},Is={class:"task-list"},bs={class:"left split-result-main"},Ts=["title"],Cs={class:"files"},Es={key:0,class:"files"},Ds={key:1,class:"files"},Ps={key:2,class:"files"},Ns={class:"files"},$s={class:"files"},Rs={key:3,class:"files"},Ms={class:"task-right"},As=["onClick"],Ls={key:1,class:"result-subsection"},Bs={class:"task-list"},qs={class:"left split-result-main"},xs=["title"],Fs={class:"files"},Us={key:0,class:"files"},Hs={key:1,class:"files"},Os={key:2,class:"files"},Vs={class:"files"},Ks={key:3,class:"files"},Qs={class:"files"},zs={key:4,class:"files"},Gs={class:"task-right"},Js=["onClick"],js=["onClick"],Lt=30,Ws=ie({__name:"BrandPatrolDeleteTab",setup(Ys){const dt=["德国","英国","法国","意大利","西班牙"],A=p(""),L=p(""),Y=p([]),B=p([]),D=p([]),_=p([]),w=p([]),g=p([]),P=p({candidateCount:0,processedTaskCount:0,successTaskCount:0,failedTaskCount:0}),q=p(!1),x=p(!1),F=p(!1),U=p(!1),y=p(""),Z=p(""),h=p(null),H=p(!1);let b=null;const T=Ue("patrol-delete"),tt=M(()=>w.value.filter(t=>t.matched)),ft=M(()=>Vt(g.value)),O=M(()=>ft.value.filter(t=>!kt(t.taskStatus))),et=M(()=>ft.value.filter(t=>kt(t.taskStatus))),V=M(()=>H.value||!!h.value);function st(){return typeof window<"u"&&window.localStorage.getItem("uid")||"0"}function pt(){return`patrol-delete:matched:${st()}`}function ht(){return`patrol-delete:queue-state:${st()}`}function N(t){return`${(t.shopName||"").trim()}::${t.shopId||""}`}function K(t){return`${t.taskId??0}:${t.resultId??0}`}function mt(t){return`task:${t.taskId??t.resultId??0}`}let k=!1;function vt(t){return k?Promise.resolve():T.sleep("queue-wait",t)}function Bt(){T.clearCategory("queue-wait")}function yt(t){const e=t instanceof Error?t.message.toLowerCase():String(t||"").toLowerCase();return e.includes("network error")||e.includes("failed to fetch")||e.includes("timeout")||e.includes("503")||e.includes("502")||e.includes("504")||e.includes("500")||e.includes("load failed")}async function qt(t,e,o=20){let n=0;for(;;){if(k)throw new Error("component disposed");try{return await t()}catch(l){if(!yt(l)||n>=o-1)throw l;n+=1,e?.(n,o),await vt(X())}}}function xt(t,e){return`patrol-delete:${t}:${e||"shop"}:${Date.now()}`}function at(t){if(!t)return"-";const e=new Date(t);if(Number.isNaN(e.getTime()))return t;const o=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),l=String(e.getDate()).padStart(2,"0"),s=String(e.getHours()).padStart(2,"0"),f=String(e.getMinutes()).padStart(2,"0"),c=String(e.getSeconds()).padStart(2,"0");return`${o}-${n}-${l} ${s}:${f}:${c}`}function Ft(t){const e=(t||"").trim();return{MATCHED:"已匹配",PENDING:"待匹配",CONFLICT:"需人工确认",INDEX_STALE:"索引过期"}[e]||e||"-"}function Ut(t){const e=(t.matchMessage||"").trim();return e||(t.matched&&t.matchStatus==="MATCHED"?"索引已命中,可推送到 Python 队列":t.matched?"已命中索引,请结合状态列确认":"未命中或未就绪,请检查店铺名")}function Ht(){return dt.map(t=>({country:t,rows:[{status:"全部",quantity:"",deleteQuantity:"",processStatus:""}]}))}function Ot(){return dt.map(t=>({country:t,ratio:""}))}function _t(t){const e=t.countrySections||[],o=t.cartRatios||[],n=Math.max(...e.map(l=>l.rows.length),1);return Array.from({length:n},(l,s)=>({shopName:s===0?t.shopName:"",countries:e.map(f=>{const c=f.rows[s];return{country:f.country,status:c?.status||"",quantity:c?.quantity||"",deleteQuantity:c?.deleteQuantity||"",processStatus:c?.processStatus||""}}),cartRatios:s===0?o.map(f=>({country:f.country,ratio:f.ratio})):[]}))}function wt(t){return`${new Set([...(t.countrySections||[]).map(o=>o.country).filter(Boolean),...(t.cartRatios||[]).map(o=>o.country).filter(Boolean)]).size||0} 个国家,含状态数据和购物车比例`}function S(t){return Array.from(new Set(t.map(e=>e==null?"":String(e).trim()).filter(Boolean))).join("、")}function Vt(t){const e=new Map;for(const o of t||[]){const n=String(o.taskId??`result:${o.resultId??Math.random()}`),l=e.get(n)||[];l.push(o),e.set(n,l)}return Array.from(e.values()).map(o=>{const n=o.find(s=>It(s))||o.find(s=>s.taskStatus)||o[0],l=S(o.map(s=>s.error));return{...n,shopName:S(o.map(s=>s.shopName))||n.shopName,shopId:S(o.map(s=>s.shopId))||n.shopId,error:l||n.error,__groupItems:o}})}function C(t){return t.__groupItems||[t]}function Q(t){return S(C(t).map(e=>e.shopName))||"-"}function z(t){return S(C(t).map(e=>e.resultId))}function G(t){return S(C(t).map(e=>e.shopId))}function J(t){return S(C(t).map(e=>e.error))}function kt(t){return t==="SUCCESS"||t==="FAILED"||t==="COMPLETED"}function gt(t){return t==="SUCCESS"||t==="COMPLETED"?"已完成":t==="FAILED"?"失败":"执行中"}function St(t){return t==="SUCCESS"||t==="COMPLETED"?"success":t==="FAILED"?"failed":"running"}function It(t){return C(t).some(e=>!!(e.resultId&&(e.fileReady||e.downloadUrl)))}function bt(){typeof window>"u"||window.localStorage.setItem(pt(),JSON.stringify(w.value))}function Kt(){try{const t=typeof window<"u"?window.localStorage.getItem(pt()):null;w.value=t?JSON.parse(t):[]}catch{w.value=[]}}function nt(){if(typeof window>"u")return;const t={activeTaskId:h.value};window.localStorage.setItem(ht(),JSON.stringify(t))}function Qt(){try{const t=typeof window<"u"?window.localStorage.getItem(ht()):null;if(!t)return;const e=JSON.parse(t);h.value=e.activeTaskId??null}catch{h.value=null}}function E(){h.value=null,nt()}function zt(t){const e=t instanceof Error?t.message:String(t||"");return/记录不存在|任务不存在|不存在|已删除|not\s*found|404/i.test(e)}function ot(t){const e=N(t);w.value=w.value.filter(o=>N(o)!==e),bt()}function Tt(t){g.value=g.value.filter(e=>!(t.resultId!=null&&e.resultId===t.resultId||t.taskId!=null&&e.taskId===t.taskId))}async function $(){Y.value=await be()}async function lt(){D.value=await Te();const t=new Set(D.value.map(e=>e.id));_.value=_.value.filter(e=>t.has(e))}async function R(){P.value=await Ce()}async function rt(){const t=await Ee();g.value=t.items||[]}async function j(){await Promise.all([R(),rt()])}function Ct(t){if(!t.length)return;const e=new Map(t.map(n=>[K(n),n])),o=g.value.map(n=>{const l=e.get(K(n));return l?{...n,...l,countrySections:l.countrySections||n.countrySections||[],cartRatios:l.cartRatios||n.cartRatios||[]}:n});for(const n of t){const l=K(n);o.some(s=>K(s)===l)||o.push(n)}g.value=o}function Gt(t){Ct(t)}async function Et(t){const e=Array.from(new Set((t&&t.length?t:O.value.map(n=>n.taskId??0)).filter(n=>Number.isFinite(n)&&n>0)));if(!e.length)return[];const o=await Fe(e);return Ct(o.items||[]),(o.missingTaskIds||[]).length&&await rt(),o.missingTaskIds||[]}function Jt(){if(it(),k||!V.value)return;const t=async()=>{b=null,!(k||!V.value)&&(await Et(),!k&&V.value&&(b=T.setTimeout("history-poll",t,X()*2)))};b=T.setTimeout("history-poll",t,X()*2)}function it(){b&&(T.clearTimer("history-poll",b),b=null)}function jt(t){B.value=t}async function Dt(){const t=A.value.trim();if(!t){d.warning("请输入店铺名");return}q.value=!0;try{await De(t),A.value="",await Promise.all([$(),R()]),d.success("已加入备选区")}catch(e){d.error(e instanceof Error?e.message:"添加失败")}finally{q.value=!1}}async function Pt(){const t=L.value.trim();if(!t){d.warning("请输入删除条件");return}x.value=!0;try{const e=await Pe(t);L.value="",await lt(),e?.id&&!_.value.includes(e.id)&&(_.value=[..._.value,e.id]),d.success("删除条件已保存")}catch(e){d.error(e instanceof Error?e.message:"保存失败")}finally{x.value=!1}}async function Wt(t){try{await Ne(t),_.value=_.value.filter(e=>e!==t),await lt(),d.success("删除条件已删除")}catch(e){d.error(e instanceof Error?e.message:"删除失败")}}async function Xt(t){try{await $e(t),B.value=B.value.filter(e=>e.id!==t),await Promise.all([$(),R()]),d.success("已删除")}catch(e){d.error(e instanceof Error?e.message:"删除失败")}}function Yt(t,e){const o=new Map;for(const n of t)o.set(N(n),n);for(const n of e)o.set(N(n),n);return Array.from(o.values())}async function Zt(){const t=B.value.map(e=>e.shop_name).filter(Boolean);if(!t.length){d.warning("请先勾选备选区店铺");return}F.value=!0;try{const e=await Re(t);w.value=Yt(w.value,e.items||[]),bt(),d.success(`本次返回 ${e.items?.length||0} 条匹配结果`)}catch(e){d.error(e instanceof Error?e.message:"匹配失败")}finally{F.value=!1}}function te(t){ot(t),d.success("已从匹配结果移除")}function ee(t){return{shopName:t.shopName,matched:t.matched,shopId:t.shopId,platform:t.platform,companyName:t.companyName,matchStatus:t.matchStatus,matchMessage:t.matchMessage,countrySections:Ht(),cartRatios:Ot()}}function se(){const t=new Set(_.value);return D.value.filter(e=>t.has(e.id)).map(e=>({id:e.id,conditionText:e.conditionText}))}function ae(t,e){const o=e[0],n=se();return{type:"patrol-delete-run",ts:Date.now(),data:{taskId:t,user_id:Number(st())||0,source:"frontend-vue-patrol-delete",delete_conditions:n,deleteConditions:n,items:e.map(l=>({shopName:l.shopName,shopId:l.shopId,platform:l.platform,companyName:l.companyName,matched:l.matched,matchStatus:l.matchStatus,matchMessage:l.matchMessage,countrySections:l.countrySections||[],cartRatios:l.cartRatios||[]})),template_rows:o?_t(o):[],shop_template_rows:e.map(l=>({shopName:l.shopName,shopId:l.shopId,templateRows:_t(l)})),country_sections:o?.countrySections||[],cart_ratios:o?.cartRatios||[]}}}function ne(t){return g.value.find(e=>e.taskId===t)}async function Nt(t){let e=0;for(;;){if(k)return"STOPPED";if(h.value!==t)return"DELETED";try{if((await Et([t])).includes(t))return E(),"DELETED";if(h.value!==t)return"DELETED";e>0&&(y.value=`任务 ${t} 后端已恢复,继续等待执行结果...`),e=0;const l=ne(t)?.taskStatus||"";if(l==="SUCCESS"||l==="FAILED"||l==="COMPLETED")return l}catch(o){if(!yt(o))throw o;if(e+=1,e>=Lt)throw new Error(`任务 ${t} 等待后端恢复超时,请稍后刷新查看状态`);y.value=`任务 ${t} 执行中,正在等待后端服务恢复(${e}/${Lt})...`}await vt(X())}}async function $t(){if(!(k||H.value)){H.value=!0,U.value=!0,Jt();try{const t=ye();if(!t?.enqueue_json)throw new Error("当前客户端未提供 enqueue_json");if(h.value){const c=await Nt(h.value);y.value=c==="DELETED"?"任务已删除":`任务 ${h.value} ${c==="SUCCESS"?"已完成":"执行失败"}`,E();return}const e=tt.value;if(!e.length){d.warning("请先匹配可用店铺");return}const o=await qt(()=>Me(e.map(ee)),(c,re)=>{y.value=`后端服务暂时不可用,正在重试创建任务(${c}/${re})...`}),n=o.items||[];if(!o.taskId||!n.length||n.some(c=>!c.taskId||!c.resultId))throw new Error("后端未返回有效任务标识");h.value=o.taskId,nt(),Gt(n),R();const l=ae(o.taskId,n);Z.value=JSON.stringify(l,null,2);const s=await t.enqueue_json(l);if(!s?.success){await Ae(o.taskId,{shops:n.map(c=>({shopName:c.shopName||"",error:s?.error||`任务 ${o.taskId} 推送失败`,countrySections:c.countrySections||[],cartRatios:c.cartRatios||[],shopDone:!0,submissionId:xt(o.taskId,c.shopName),chunkIndex:1,chunkTotal:1}))});for(const c of e)ot(c);await j(),y.value=`任务 ${o.taskId} 推送失败`,E();return}for(const c of e)ot(c);y.value=`任务 ${o.taskId} 已入队,共 ${n.length} 个店铺,等待执行完成`;const f=await Nt(o.taskId);y.value=`任务 ${o.taskId} ${f==="SUCCESS"?"已完成":f==="DELETED"?"已删除":"执行失败"}`,E(),await j(),d.success("巡店删除任务已完成")}catch(t){if(k)return;const e=t instanceof Error?t.message:"队列执行失败";y.value=e,d.error(e),await j()}finally{H.value=!1,U.value=!1,it(),nt()}}}async function oe(){const t=tt.value;if(!t.length){d.warning("请先匹配可用店铺");return}y.value=`开始创建任务,共 ${t.length} 个店铺`,await $t()}async function le(t){const e=C(t).find(s=>!!(s.resultId&&(s.fileReady||s.downloadUrl)));if(!e?.resultId)return;const o=Le(e.resultId),n=e.outputFilename||`${t.shopName||"patrol-delete-result"}.xlsx`,l=await Be(o,n,`patrol-delete:${e.resultId}`);l.success?d.success(`已保存: ${l.path||n}`):l.error&&l.error!=="用户取消"&&d.error(l.error)}async function Rt(t){try{if(t.taskId)await qe(t.taskId),h.value===t.taskId&&E();else if(t.resultId)await xe(t.resultId);else throw new Error("缺少可删除的任务标识");Tt(t),await Promise.allSettled([$(),j()]),d.success("已删除")}catch(e){if(zt(e)){t.taskId&&h.value===t.taskId&&E(),Tt(t),await $(),d.success("后端记录已不存在,已同步移除本地记录");return}d.error(e instanceof Error?e.message:"删除失败")}}return ue(async()=>{Kt(),Qt(),await Promise.all([$(),lt(),R(),rt()]),h.value&&(y.value=h.value!=null?`检测到未完成任务,继续等待任务 ${h.value} 完成`:"",$t())}),ce(()=>{k=!0,it(),Bt(),T.clearScope()}),(t,e)=>{const o=de,n=fe,l=pe;return i(),u("div",He,[m(Ie,{active:"patrol-delete"}),a("div",Oe,[a("aside",Ve,[e[5]||(e[5]=a("div",{class:"section-title"},"店铺输入",-1)),a("div",Ke,[e[3]||(e[3]=a("div",{class:"hint"}," 左侧负责录入店铺并加入备选区,点击“匹配店铺”只会生成匹配结果;确认后需手动点击“推送到 Python 队列”才会创建并执行任务。 ",-1)),a("div",Qe,[m(o,{modelValue:A.value,"onUpdate:modelValue":e[0]||(e[0]=s=>A.value=s),clearable:"",placeholder:"请输入店铺名后回车或点击添加",onKeyup:Mt(Dt,["enter"])},null,8,["modelValue"]),a("button",{type:"button",class:"opt-btn",disabled:q.value,onClick:Dt},r(q.value?"添加中...":"添加"),9,ze)])]),e[6]||(e[6]=a("div",{class:"section-title"},"备选区",-1)),Y.value.length?(i(),u("div",Je,[m(l,{data:Y.value,"row-key":"id",height:"260",class:"candidate-table",onSelectionChange:jt},{default:I(()=>[m(n,{type:"selection",width:"42"}),m(n,{prop:"shop_name",label:"店铺名","min-width":"140","show-overflow-tooltip":""}),m(n,{label:"操作",width:"72",align:"center"},{default:I(({row:s})=>[a("button",{type:"button",class:"link-danger",onClick:f=>Xt(s.id)}," 删除 ",8,je)]),_:1})]),_:1},8,["data"])])):(i(),u("div",Ge," 暂无备选店铺,请先输入并添加 ")),e[7]||(e[7]=a("div",{class:"section-title condition-title"},[a("span",null,"删除条件"),a("span",{class:"condition-title-hint"}," 注意删除条件的描述需要和页面描述一致 ")],-1)),a("div",We,[a("div",Xe,[m(o,{modelValue:L.value,"onUpdate:modelValue":e[1]||(e[1]=s=>L.value=s),clearable:"",placeholder:"请输入删除条件",onKeyup:Mt(Pt,["enter"])},null,8,["modelValue"]),a("button",{type:"button",class:"opt-btn",disabled:x.value,onClick:Pt},r(x.value?"保存中...":"保存"),9,Ye)]),D.value.length?(i(),u("ul",ts,[(i(!0),u(W,null,ut(D.value,s=>(i(),u("li",{key:s.id,class:"condition-item"},[a("label",es,[he(a("input",{"onUpdate:modelValue":e[2]||(e[2]=f=>_.value=f),type:"checkbox",value:s.id},null,8,ss),[[me,_.value]]),a("span",{title:s.conditionText},r(s.conditionText),9,as)]),a("button",{type:"button",class:"link-danger",onClick:f=>Wt(s.id)}," 删除 ",8,ns)]))),128))])):(i(),u("div",Ze," 暂无删除条件,保存后可在推送任务时多选携带。 "))]),a("div",os,[a("button",{type:"button",class:"btn-run",disabled:F.value||V.value,onClick:Zt},r(F.value?"匹配中...":"匹配店铺"),9,ls),a("button",{type:"button",class:"btn-run btn-queue",disabled:U.value||!tt.value.length,onClick:oe},r(U.value?"任务执行中...":"推送到 Python 队列"),9,rs)]),e[8]||(e[8]=a("p",{class:"loading-msg"}," 当前页面会把匹配结果合并为一个巡店删除任务推送;多个店铺会在同一个任务和同一个结果文件中汇总。 ",-1)),y.value?(i(),u("div",is,[e[4]||(e[4]=a("div",{class:"section-title queue-debug-title"},"队列状态",-1)),a("div",us,r(y.value),1),Z.value?(i(),u("pre",cs,r(Z.value),1)):v("",!0)])):v("",!0)]),a("section",ds,[e[17]||(e[17]=a("div",{class:"panel-header"},"匹配与任务",-1)),a("div",fs,[a("div",ps,[a("div",hs,[e[9]||(e[9]=a("span",{class:"summary-label"},"备选店铺",-1)),a("strong",null,r(P.value.candidateCount),1)]),a("div",ms,[e[10]||(e[10]=a("span",{class:"summary-label"},"已处理任务",-1)),a("strong",null,r(P.value.processedTaskCount),1)]),a("div",vs,[e[11]||(e[11]=a("span",{class:"summary-label"},"成功任务",-1)),a("strong",null,r(P.value.successTaskCount),1)]),a("div",ys,[e[12]||(e[12]=a("span",{class:"summary-label"},"失败任务",-1)),a("strong",null,r(P.value.failedTaskCount),1)])]),e[16]||(e[16]=a("div",{class:"subsection-title"},"匹配结果",-1)),w.value.length?(i(),ve(l,{key:1,data:w.value,"row-key":N,"highlight-current-row":!1,class:"result-table match-table"},{default:I(()=>[m(n,{prop:"shopName",label:"店铺名","min-width":"120"}),m(n,{label:"匹配",width:"72",align:"center"},{default:I(({row:s})=>[a("span",{class:ct(s.matched?"ok":"fail")},r(s.matched?"是":"否"),3)]),_:1}),m(n,{prop:"shopId",label:"店铺 ID","min-width":"120","show-overflow-tooltip":""}),m(n,{prop:"platform",label:"平台",width:"88","show-overflow-tooltip":""}),m(n,{prop:"companyName",label:"公司","min-width":"120","show-overflow-tooltip":""}),m(n,{label:"状态",width:"110","show-overflow-tooltip":""},{default:I(({row:s})=>[At(r(Ft(s.matchStatus)),1)]),_:1}),m(n,{label:"说明","min-width":"180","show-overflow-tooltip":""},{default:I(({row:s})=>[At(r(Ut(s)),1)]),_:1}),m(n,{label:"操作",width:"72",align:"center"},{default:I(({row:s})=>[a("button",{type:"button",class:"link-danger",onClick:f=>te(s)}," 删除 ",8,ws)]),_:1})]),_:1},8,["data"])):(i(),u("div",_s," 完成“匹配店铺”后,这里会展示匹配结果。 ")),a("div",ks,[e[15]||(e[15]=a("div",{class:"result-list-header"},[a("span",null,"任务记录")],-1)),!O.value.length&&!et.value.length?(i(),u("div",gs," 暂无任务记录。推送到 Python 队列后,这里会展示当前任务和历史任务。 ")):(i(),u(W,{key:1},[O.value.length?(i(),u("div",Ss,[e[13]||(e[13]=a("div",{class:"result-subsection-title"},"当前任务",-1)),a("ul",Is,[(i(!0),u(W,null,ut(O.value,s=>(i(),u("li",{key:mt(s),class:"task-item"},[a("div",bs,[a("span",{class:"id",title:Q(s)},r(Q(s)),9,Ts),a("div",Cs,"任务 ID: "+r(s.taskId??"-"),1),z(s)?(i(),u("div",Es," 结果 ID: "+r(z(s)),1)):v("",!0),G(s)?(i(),u("div",Ds," 店铺 ID: "+r(G(s)),1)):v("",!0),s.platform?(i(),u("div",Ps," 平台: "+r(s.platform),1)):v("",!0),a("div",Ns," 创建时间: "+r(at(s.createdAt)),1),a("div",$s," 模板: "+r(wt(s)),1),J(s)?(i(),u("div",Rs," 错误: "+r(J(s)),1)):v("",!0)]),a("div",Ms,[a("span",{class:ct(["status",St(s.taskStatus)])},r(gt(s.taskStatus)),3),a("button",{type:"button",class:"btn-delete",onClick:f=>Rt(s)}," 删除 ",8,As)])]))),128))])])):v("",!0),et.value.length?(i(),u("div",Ls,[e[14]||(e[14]=a("div",{class:"result-subsection-title"},"历史任务",-1)),a("ul",Bs,[(i(!0),u(W,null,ut(et.value,s=>(i(),u("li",{key:mt(s),class:"task-item"},[a("div",qs,[a("span",{class:"id",title:Q(s)},r(Q(s)),9,xs),a("div",Fs,"任务 ID: "+r(s.taskId??"-"),1),z(s)?(i(),u("div",Us," 结果 ID: "+r(z(s)),1)):v("",!0),G(s)?(i(),u("div",Hs," 店铺 ID: "+r(G(s)),1)):v("",!0),s.platform?(i(),u("div",Os," 平台: "+r(s.platform),1)):v("",!0),a("div",Vs," 创建时间: "+r(at(s.createdAt)),1),s.finishedAt?(i(),u("div",Ks," 完成时间: "+r(at(s.finishedAt)),1)):v("",!0),a("div",Qs," 模板: "+r(wt(s)),1),J(s)?(i(),u("div",zs," 错误: "+r(J(s)),1)):v("",!0)]),a("div",Gs,[a("span",{class:ct(["status",St(s.taskStatus)])},r(gt(s.taskStatus)),3),It(s)?(i(),u("button",{key:0,type:"button",class:"archive",onClick:f=>le(s)}," 下载结果 ",8,Js)):v("",!0),a("button",{type:"button",class:"btn-delete",onClick:f=>Rt(s)}," 删除 ",8,js)])]))),128))])])):v("",!0)],64))])])])])])}}}),Xs=_e(Ws,[["__scopeId","data-v-09e791f5"]]);we.locale("zh-cn");ke(Xs).use(ge,{locale:Se}).mount("#app"); diff --git a/app/assets/price-track-BsA0AIfw.css b/app/assets/price-track-BsA0AIfw.css deleted file mode 100644 index dfa2b0b..0000000 --- a/app/assets/price-track-BsA0AIfw.css +++ /dev/null @@ -1 +0,0 @@ -.el-input-number{vertical-align:middle;width:150px;line-height:30px;display:inline-flex;position:relative}.el-input-number .el-input__wrapper{padding-left:42px;padding-right:42px}.el-input-number .el-input__inner{-webkit-appearance:none;-moz-appearance:textfield;text-align:center;line-height:1}.el-input-number .el-input__inner::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.el-input-number .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-input-number.is-left .el-input__inner{text-align:left}.el-input-number.is-right .el-input__inner{text-align:right}.el-input-number.is-center .el-input__inner{text-align:center}.el-input-number__increase,.el-input-number__decrease{z-index:1;background:var(--el-fill-color-light);width:32px;height:auto;color:var(--el-text-color-regular);cursor:pointer;-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;font-size:13px;display:flex;position:absolute;top:1px;bottom:1px}.el-input-number__increase:hover,.el-input-number__decrease:hover{color:var(--el-color-primary)}.el-input-number__increase:hover~.el-input:not(.is-disabled) .el-input__wrapper,.el-input-number__decrease:hover~.el-input:not(.is-disabled) .el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-focus-border-color,var(--el-color-primary)) inset}.el-input-number__increase.is-disabled,.el-input-number__decrease.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-input-number__increase{border-radius:0 var(--el-border-radius-base) var(--el-border-radius-base) 0;border-left:var(--el-border);right:1px}.el-input-number__decrease{border-radius:var(--el-border-radius-base) 0 0 var(--el-border-radius-base);border-right:var(--el-border);left:1px}.el-input-number.is-disabled .el-input-number__increase,.el-input-number.is-disabled .el-input-number__decrease{border-color:var(--el-disabled-border-color);color:var(--el-disabled-border-color)}.el-input-number.is-disabled .el-input-number__increase:hover,.el-input-number.is-disabled .el-input-number__decrease:hover{color:var(--el-disabled-border-color);cursor:not-allowed}.el-input-number--large{width:180px;line-height:38px}.el-input-number--large .el-input-number__increase,.el-input-number--large .el-input-number__decrease{width:40px;font-size:14px}.el-input-number--large.is-controls-right .el-input--large .el-input__wrapper{padding-right:47px}.el-input-number--large .el-input--large .el-input__wrapper{padding-left:47px;padding-right:47px}.el-input-number--small{width:120px;line-height:22px}.el-input-number--small .el-input-number__increase,.el-input-number--small .el-input-number__decrease{width:24px;font-size:12px}.el-input-number--small.is-controls-right .el-input--small .el-input__wrapper{padding-right:31px}.el-input-number--small .el-input--small .el-input__wrapper{padding-left:31px;padding-right:31px}.el-input-number--small .el-input-number__increase [class*=el-icon],.el-input-number--small .el-input-number__decrease [class*=el-icon]{transform:scale(.9)}.el-input-number.is-without-controls .el-input__wrapper{padding-left:15px;padding-right:15px}.el-input-number.is-controls-right .el-input__wrapper{padding-left:15px;padding-right:42px}.el-input-number.is-controls-right .el-input-number__increase,.el-input-number.is-controls-right .el-input-number__decrease{--el-input-number-controls-height:15px;height:var(--el-input-number-controls-height);line-height:var(--el-input-number-controls-height)}.el-input-number.is-controls-right .el-input-number__increase [class*=el-icon],.el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon]{transform:scale(.8)}.el-input-number.is-controls-right .el-input-number__increase{border-radius:0 var(--el-border-radius-base) 0 0;border-bottom:var(--el-border);bottom:auto;left:auto}.el-input-number.is-controls-right .el-input-number__decrease{border-right:none;border-left:var(--el-border);border-radius:0 0 var(--el-border-radius-base) 0;top:auto;left:auto;right:1px}.el-input-number.is-controls-right[class*=large] [class*=increase],.el-input-number.is-controls-right[class*=large] [class*=decrease]{--el-input-number-controls-height:19px}.el-input-number.is-controls-right[class*=small] [class*=increase],.el-input-number.is-controls-right[class*=small] [class*=decrease]{--el-input-number-controls-height:11px}.module-page[data-v-c91dd406]{min-height:100vh;background:#1a1a1a}.main-content[data-v-c91dd406]{display:flex;min-height:calc(100vh - 56px);height:calc(100vh - 56px)}.left-panel[data-v-c91dd406]{width:400px;background:#1e1e1e;padding:20px;overflow-y:auto;border-right:1px solid #2a2a2a}.right-panel[data-v-c91dd406]{flex:1;display:flex;flex-direction:column;min-width:0;background:#1a1a1a}.section-title[data-v-c91dd406]{font-size:13px;color:#bbb;margin-bottom:10px}.upload-zone[data-v-c91dd406]{border:1px dashed #3a3a3a;border-radius:10px;padding:16px;background:#252525;margin-bottom:20px}.hint[data-v-c91dd406]{color:#888;font-size:12px;margin-bottom:12px;line-height:1.5;text-align:left}.btns[data-v-c91dd406]{display:flex;gap:10px;margin-bottom:10px}.selected-files[data-v-c91dd406]{margin-top:8px;font-size:12px;display:flex;flex-direction:column;gap:4px}.clean-placeholder[data-v-c91dd406]{color:#666;font-size:12px;display:flex;flex-direction:column;gap:4px}.selected-files span[data-v-c91dd406]:not(.more-line){color:#aaa}.more-line[data-v-c91dd406],.text-muted[data-v-c91dd406]{color:#777;font-style:italic}.mode-zone[data-v-c91dd406]{border:1px dashed #3a3a3a;border-radius:10px;padding:14px 16px;background:#252525;margin-bottom:20px;display:flex;flex-direction:column;gap:10px}.mode-check-row[data-v-c91dd406]{display:flex;align-items:flex-start;gap:10px;cursor:pointer;-webkit-user-select:none;user-select:none;font-size:13px}.mode-check-input[data-v-c91dd406]{width:18px;height:18px;accent-color:#409eff;cursor:pointer;flex-shrink:0;margin-top:2px}.mode-check-text[data-v-c91dd406]{color:#ddd;font-weight:600}.mode-hint-inline[data-v-c91dd406]{color:#888;font-size:12px}.loop-round-input[data-v-c91dd406]{display:flex;align-items:center;gap:10px;margin-top:4px}.loop-round-input[data-v-c91dd406] .el-input-number{width:160px}.loop-round-input[data-v-c91dd406] .el-input__wrapper{background-color:#2a2a2a;box-shadow:0 0 0 1px #3a3a3a inset}.tag-badge[data-v-c91dd406]{display:inline-block;padding:2px 8px;border-radius:4px;font-size:11px;font-weight:500;margin-left:6px;vertical-align:middle;background:#3498db33;color:#69b6ff}.mode-status-bar[data-v-c91dd406]{display:flex;align-items:center;gap:8px;padding:10px 14px;border-radius:8px;background:#2ecc7114;border:1px solid rgba(46,204,113,.2);margin-bottom:14px}.mode-status-dot[data-v-c91dd406]{width:8px;height:8px;border-radius:50%;flex-shrink:0}.mode-status-dot.active[data-v-c91dd406]{background:#27ae60;box-shadow:0 0 6px #2ecc7180}.mode-status-text[data-v-c91dd406]{font-size:12px;color:#aaa}.input-zone[data-v-c91dd406]{border:1px dashed #3a3a3a;border-radius:10px;padding:16px;background:#252525;margin-bottom:20px}.input-row[data-v-c91dd406]{display:flex;gap:10px;align-items:center}.input-row[data-v-c91dd406] .el-input{flex:1}.opt-btn[data-v-c91dd406]{padding:8px 14px;font-size:13px;color:#ccc;background:#2a2a2a;border:1px solid #3a3a3a;border-radius:6px;cursor:pointer;white-space:nowrap}.opt-btn[data-v-c91dd406]:hover:not(:disabled){color:#3498db;border-color:#3498db}.opt-btn[data-v-c91dd406]:disabled{opacity:.6;cursor:not-allowed}.country-pref-hint[data-v-c91dd406]{margin-top:-4px}.country-pref-checks[data-v-c91dd406]{display:flex;flex-wrap:wrap;gap:10px 16px;margin-bottom:12px}.country-check-row[data-v-c91dd406]{display:inline-flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none;font-size:12px;color:#ccc}.country-check-input[data-v-c91dd406]{width:16px;height:16px;accent-color:#409eff;cursor:pointer;flex-shrink:0}.country-check-text[data-v-c91dd406]{line-height:1.3}.country-order-panel[data-v-c91dd406]{border:1px solid #333;border-radius:8px;padding:10px 12px;background:#252525;margin-bottom:14px}.country-order-caption[data-v-c91dd406]{font-size:11px;color:#777;margin-bottom:8px}.country-order-list[data-v-c91dd406]{display:flex;flex-direction:column;gap:6px}.country-drag-row[data-v-c91dd406]{display:flex;align-items:center;gap:10px;padding:8px 10px;background:#2c2c2c;border-radius:6px;border:1px solid #3a3a3a;cursor:grab;-webkit-user-select:none;user-select:none}.country-drag-row.dragging[data-v-c91dd406]{opacity:.55;border-color:#3498db}.drag-handle[data-v-c91dd406]{color:#666;font-size:12px;letter-spacing:-2px}.country-drag-label[data-v-c91dd406]{font-size:12px;color:#ccc}.country-pref-status[data-v-c91dd406]{font-size:11px;color:#888;margin-bottom:10px}.listing-filter-hint[data-v-c91dd406]{margin-top:-4px}.listing-filter-row[data-v-c91dd406]{margin-bottom:16px}.listing-filter-select[data-v-c91dd406]{width:100%}.listing-filter-row[data-v-c91dd406] .el-select__wrapper{background-color:#2a2a2a;box-shadow:0 0 0 1px #3a3a3a inset}.listing-filter-row[data-v-c91dd406] .el-select__placeholder,.listing-filter-row[data-v-c91dd406] .el-select__selected-item{color:#ccc}.empty-candidates[data-v-c91dd406]{color:#666;font-size:13px;padding:16px;border:1px dashed #333;border-radius:8px;margin-bottom:16px}.candidate-table-scroll[data-v-c91dd406]{max-height:240px;overflow:auto;margin-bottom:16px;border-radius:8px;border:1px solid #2a2a2a}.candidate-table[data-v-c91dd406]{--el-table-bg-color: #252525;--el-table-tr-bg-color: #252525;--el-table-header-bg-color: #2a2a2a;--el-table-text-color: #ccc;--el-table-border-color: #333}.link-danger[data-v-c91dd406]{background:none;border:none;color:#e74c3c;cursor:pointer;font-size:12px;padding:0}.link-danger[data-v-c91dd406]:hover{text-decoration:underline}.run-row[data-v-c91dd406]{display:flex;flex-wrap:wrap;gap:10px;margin-top:8px}.btn-run[data-v-c91dd406]{padding:10px 18px;font-size:14px;font-weight:600;color:#fff;background:#3498db;border:none;border-radius:8px;cursor:pointer}.btn-run[data-v-c91dd406]:hover:not(:disabled){background:#2980b9}.btn-run[data-v-c91dd406]:disabled{opacity:.55;cursor:not-allowed}.btn-queue[data-v-c91dd406]{background:#27ae60}.btn-queue[data-v-c91dd406]:hover:not(:disabled){background:#219a52}.loading-msg[data-v-c91dd406]{margin-top:12px;font-size:12px;color:#777;line-height:1.5}.loop-status-card[data-v-c91dd406]{margin-top:14px;padding:12px 14px;border-radius:10px;border:1px solid #2f3d2f;background:#27ae6014}.loop-status-line[data-v-c91dd406]{font-size:12px;color:#d6e6d8;line-height:1.6}.loop-error[data-v-c91dd406]{color:#ff8a80}.loop-stop-btn[data-v-c91dd406]{margin-top:10px}.loading-msg code[data-v-c91dd406]{font-size:11px;color:#8fd3ff}.queue-debug-card[data-v-c91dd406]{margin-top:18px;padding:14px;border:1px solid #2a2a2a;border-radius:10px;background:#202020}.queue-debug-title[data-v-c91dd406]{margin-bottom:8px}.queue-debug-line[data-v-c91dd406]{color:#b8c1cc;font-size:12px;line-height:1.6;margin-bottom:8px}.queue-debug-payload[data-v-c91dd406]{margin:0;max-height:220px;overflow:auto;padding:10px;border-radius:8px;background:#141414;color:#8fd3ff;font-size:11px;line-height:1.5;white-space:pre-wrap;word-break:break-all}.panel-header[data-v-c91dd406]{padding:16px 20px;font-size:15px;font-weight:600;color:#e0e0e0;border-bottom:1px solid #2a2a2a}.task-list-wrap[data-v-c91dd406]{flex:1;padding:16px 20px;overflow:auto}.pr-summary[data-v-c91dd406]{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-bottom:16px}.summary-card[data-v-c91dd406]{padding:14px 16px;border:1px solid #2a2a2a;border-radius:10px;background:#1e1e1e}.summary-card strong[data-v-c91dd406]{display:block;margin-top:8px;font-size:22px;color:#eaf4ff}.summary-label[data-v-c91dd406]{font-size:12px;color:#8d8d8d}.subsection-title[data-v-c91dd406]{font-size:13px;color:#999;margin:8px 0 10px}.empty-tasks[data-v-c91dd406]{color:#666;font-size:13px;padding:16px;text-align:center}.empty-tasks.narrow[data-v-c91dd406]{padding:12px 8px}.match-table[data-v-c91dd406]{margin-bottom:18px}.result-table[data-v-c91dd406]{--el-table-bg-color: #222;--el-table-tr-bg-color: #222;--el-table-header-bg-color: #2a2a2a;--el-table-text-color: #ccc;--el-table-border-color: #333}.ok[data-v-c91dd406]{color:#27ae60}.fail[data-v-c91dd406]{color:#e67e22}.result-list-wrap[data-v-c91dd406]{border:1px solid #2a2a2a;border-radius:10px;background:#1e1e1e;min-height:200px;margin-top:8px}.result-list-header[data-v-c91dd406]{padding:12px 16px;border-bottom:1px solid #2a2a2a;font-size:14px;color:#ddd}.result-subsection[data-v-c91dd406]{padding:12px 12px 4px}.result-subsection-title[data-v-c91dd406]{font-size:12px;color:#888;margin-bottom:8px}.task-list[data-v-c91dd406]{list-style:none;margin:0;padding:0}.task-item[data-v-c91dd406]{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:12px 14px;border:1px solid #2a2a2a;border-radius:8px;margin-bottom:8px;background:#222}.split-result-main[data-v-c91dd406]{display:flex;flex-direction:column;gap:4px}.id[data-v-c91dd406]{font-weight:600;color:#e0e0e0;font-size:13px}.files[data-v-c91dd406]{font-size:12px;color:#888}.task-right[data-v-c91dd406]{display:flex;align-items:center;gap:8px;flex-wrap:wrap;justify-content:flex-end}.status[data-v-c91dd406]{padding:4px 10px;border-radius:6px;font-size:12px;white-space:nowrap}.status.success[data-v-c91dd406]{background:#2ecc712e;color:#2ecc71}.status.failed[data-v-c91dd406]{background:#e74c3c2e;color:#ff6b6b}.status.running[data-v-c91dd406]{background:#3498db2e;color:#3498db}.download[data-v-c91dd406]{padding:6px 10px;border-radius:6px;font-size:12px;background:#3498db2e;color:#69b6ff;border:none;cursor:pointer}.download[data-v-c91dd406]:hover{background:#3498db47}.btn-delete[data-v-c91dd406]{padding:6px 10px;border-radius:6px;font-size:12px;background:#e74c3c1f;color:#ff8f8f;border:none;cursor:pointer}.btn-delete[data-v-c91dd406]:hover{background:#e74c3c38}@media(max-width:1100px){.main-content[data-v-c91dd406]{flex-direction:column;height:auto}.left-panel[data-v-c91dd406]{width:100%;border-right:none;border-bottom:1px solid #2a2a2a}.pr-summary[data-v-c91dd406]{grid-template-columns:repeat(2,minmax(0,1fr))}} diff --git a/app/assets/price-track.js b/app/assets/price-track.js deleted file mode 100644 index 2f7334e..0000000 --- a/app/assets/price-track.js +++ /dev/null @@ -1 +0,0 @@ -import{d as es,o as ts,q as ss,a as i,c,b as C,e as n,w as ct,l as dt,L as as,f as y,F as $,m as ve,r as fe,t as v,x as ns,y as os,z as H,A as ls,B as rs,C as vt,n as _e,G as us,g as f,h as O,i as pe,E as r,_ as is,j as cs,k as ds}from"./pywebview-B8lwamDf.js";import{B as vs,af as fs,ag as ps,ah as ms,ai as hs,aj as ys,ak as ks,al as gs,am as ws,an as _s,ao as ft,ap as Is,aq as bs,ar as Ss,as as Cs,at as Ts,v as Ns,au as Es,s as Ps,av as As,aw as Rs,ax as pt}from"./java-modules-B9jblDzU.js";/* empty css */import{e as xs}from"./brand-DE-sObfq.js";import{c as Ls}from"./categorized-timers-JPA-olTr.js";const Ds={class:"page-shell module-page"},Ms={class:"main-content"},$s={class:"left-panel"},Fs={class:"mode-zone"},Us={class:"mode-check-row"},Bs=["checked"],qs={class:"mode-check-row"},Os=["checked"],js={class:"mode-zone"},Js={class:"mode-check-row"},Ks={class:"mode-check-row"},Ws={key:0,class:"loop-round-input"},zs={class:"upload-zone"},Gs={class:"selected-files clean-placeholder"},Hs={key:1,class:"text-muted"},Vs={class:"input-zone"},Qs={class:"input-row"},Xs=["disabled"],Ys={key:0,class:"empty-candidates"},Zs={key:1,class:"candidate-table-scroll"},ea=["onClick"],ta={class:"country-pref-checks"},sa=["checked","disabled","onChange"],aa={class:"country-check-text"},na={key:0,class:"country-order-panel"},oa={class:"country-order-list"},la=["onDragstart","onDrop"],ra={class:"country-drag-label"},ua={key:1,class:"country-pref-status"},ia={key:3,class:"mode-status-bar"},ca={class:"run-row"},da=["disabled"],va=["disabled"],fa={key:4,class:"loop-status-card"},pa={class:"loop-status-line"},ma={class:"loop-status-line"},ha={class:"loop-status-line"},ya={class:"loop-status-line"},ka={key:0,class:"loop-status-line loop-error"},ga=["disabled"],wa={key:5,class:"queue-debug-card"},_a={class:"queue-debug-line"},Ia={key:0,class:"queue-debug-payload"},ba={class:"right-panel"},Sa={class:"task-list-wrap"},Ca={class:"clean-result-summary pr-summary"},Ta={class:"summary-card"},Na={class:"summary-card"},Ea={class:"summary-card"},Pa={class:"summary-card"},Aa={key:0,class:"empty-tasks narrow"},Ra=["onClick"],xa={class:"result-list-wrap"},La={key:0,class:"empty-tasks"},Da={key:0,class:"result-subsection"},Ma={class:"task-list clean-result-list"},$a={class:"left split-result-main"},Fa={key:0,class:"files"},Ua=["title"],Ba={class:"files"},qa={key:1,class:"files"},Oa={key:2,class:"files"},ja={class:"task-right split-result-actions"},Ja=["onClick"],Ka=["onClick"],Wa={key:1,class:"result-subsection"},za={class:"task-list clean-result-list"},Ga={class:"left split-result-main"},Ha={key:0,class:"files"},Va=["title"],Qa={class:"files"},Xa={key:1,class:"files"},Ya={key:2,class:"files"},Za={class:"task-right split-result-actions"},en=["onClick"],tn=["onClick"],sn=es({__name:"BrandPriceTrackTab",setup(nn){const Ie=[{code:"DE",label:"德国"},{code:"UK",label:"英国"},{code:"FR",label:"法国"},{code:"IT",label:"意大利"},{code:"ES",label:"西班牙"}],te=f(""),be=f([]),Oe=f([]),b=f([]),me=f(!1),he=f(!1),j=f(!1),Se=f(!1),je=f(!1),p=f(""),V=f(""),Ce=f({}),J=f("FINITE"),ye=f(1),m=f(null),k=f(null),Te=f(!1),se=f(!1),A=f(!0),S=f(!1),R=f([]),ae=f([]),Ne=O(()=>A.value||S.value),mt=O(()=>{const e=k.value?.status||"";return e==="SUCCESS"||e==="FAILED"||e==="STOPPED"}),Ee=O(()=>!!m.value&&!mt.value),ht=O(()=>{const e=k.value;if(!e)return"";const t=e.currentRound||1;if(e.executionMode==="INFINITE")return`第 ${t} 轮(无限)`;const s=Math.max(1,e.targetRounds||ye.value||1);return`第 ${t}/${s} 轮`}),g=f(["DE","UK","FR","IT","ES"]),ne=f(null),Pe=f(!1),Je=f(!1);let Q=null;const oe=f({candidateCount:0,processedTaskCount:0,successTaskCount:0,failedTaskCount:0}),K=f([]),w=f([]),N=f({}),_=f({}),L=f(null),Ae=f(!1);let I=!1;const x=Ls("price-track");function X(e){return I?Promise.resolve():x.sleep("queue-wait",e)}function yt(){x.clearCategory("queue-wait")}function le(){return typeof window<"u"&&window.localStorage.getItem("uid")||"0"}function Ke(){return`price-track:tasks:${le()}`}function We(){return`price-track:task-status:${le()}`}function ze(){return`price-track:tasks-batch-snapshot:${le()}`}function Ge(){return`price-track:matched-items:${le()}`}function He(){return`price-track:active-loop:${le()}`}function re(e,t,s){if(!(typeof window>"u"))try{s?window.localStorage.removeItem(e):window.localStorage.setItem(e,JSON.stringify(t))}catch{}}function kt(){try{const e=typeof window<"u"?window.localStorage.getItem(Ke()):null;if(!e){w.value=[];return}const t=JSON.parse(e);w.value=Array.isArray(t)?t.filter(s=>typeof s=="number"&&s>0):[]}catch{w.value=[]}}function Ve(){re(Ke(),w.value,w.value.length===0)}function gt(){try{const e=typeof window<"u"?window.localStorage.getItem(We()):null;if(!e)return;const t=JSON.parse(e),s={};for(const[o,l]of Object.entries(t)){const u=Number(o);u>0&&typeof l=="string"&&(s[u]=l)}N.value=s}catch{}}function ue(){re(We(),N.value,Object.keys(N.value).length===0)}function wt(){try{const e=typeof window<"u"?window.localStorage.getItem(ze()):null;if(!e)return;const t=JSON.parse(e),s={};for(const[o,l]of Object.entries(t)){const u=Number(o);u>0&&l&&typeof l=="object"&&(s[u]=l)}_.value=s}catch{}}function ie(){re(ze(),_.value,Object.keys(_.value).length===0)}function _t(){try{const e=typeof window<"u"?window.localStorage.getItem(Ge()):null;if(!e)return;const t=JSON.parse(e);Array.isArray(t)&&(b.value=t)}catch{}}function ke(){re(Ge(),b.value,b.value.length===0)}function It(){try{const e=typeof window<"u"?window.localStorage.getItem(He()):null;if(!e){m.value=null;return}const t=Number(JSON.parse(e));m.value=Number.isFinite(t)&&t>0?t:null}catch{m.value=null}}function Y(){re(He(),m.value,!m.value)}async function bt(){const e=pe();if(e?.select_files){const t=await e.select_files({filters:[{name:"Excel/CSV",extensions:"xlsx,xls,csv"}],multiple:!0});t?.paths?.length&&(R.value=t.paths,ae.value=await Re(t.paths),r.success(`已选择 ${t.paths.length} 个ASIN文件`));return}if(e?.select_brand_xlsx_files){const t=await e.select_brand_xlsx_files();if(!t?.length)return;R.value=t,ae.value=await Re(t),r.success(`已选择 ${t.length} 个ASIN文件`);return}r.warning("当前环境不支持文件选择,请在本地客户端中打开")}async function St(){const e=pe();if(!e?.select_brand_folder){r.warning("当前环境不支持文件夹选择,请在本地客户端中打开");return}try{const t=await e.select_brand_folder();if(!t)return;const s=await xs(t);if(!s.success||!s.items?.length){r.warning(s.error||"该文件夹下没有可用的 xlsx 文件");return}R.value=s.items.map(o=>o.relativePath||o.absolutePath),ae.value=await Re(s.items),r.success(`已选择文件夹内 ${s.items.length} 个ASIN文件`)}catch(t){r.error(t instanceof Error?t.message:"选择失败")}}async function Re(e){const t=pe();if(!t?.upload_file_to_java)return[];const s=[];for(const o of e){const l=typeof o=="string"?o:o.absolutePath,u=typeof o=="string"?void 0:o.relativePath,a=await t.upload_file_to_java(l,u);if(!a?.success||!a.data)throw new Error(a?.error||a?.message||`上传失败:${l}`);s.push(a.data)}return s}function xe(){return ae.value.length?ae.value.map(e=>e.localPath).filter(e=>!!e):R.value}function ge(){return S.value?Ie.map(e=>e.code):[...g.value]}function Le(e){A.value=e==="status",S.value=e==="asin"}function Qe(e){return Ie.find(s=>s.code===e)?.label??e}const Ct=O(()=>{const e=g.value,t=new Set(e),s=e.map(l=>({code:l,label:Qe(l)})),o=Ie.filter(l=>!t.has(l.code)).map(l=>({code:l.code,label:l.label}));return[...s,...o]});function Tt(e){return g.value.includes(e)}function Xe(e){return g.value.length===1&&g.value[0]===e}function Nt(e,t){const s=t.target;if(s){if(!s.checked&&Xe(e)){s.checked=!0,r.warning("至少保留 1 个国家");return}Et(e,s.checked)}}function Et(e,t){if(Je.value=!0,t)g.value.includes(e)||(g.value=[...g.value,e]);else{if(g.value.length<=1){r.warning("至少保留 1 个国家");return}g.value=g.value.filter(s=>s!==e)}Ye()}function Pt(e){ne.value=e}function At(){ne.value=null}function Rt(e){const t=ne.value;if(ne.value=null,t==null||t===e)return;Je.value=!0;const s=[...g.value],[o]=s.splice(t,1);s.splice(e,0,o),g.value=s,Ye()}function Ye(){Q&&x.clearTimer("preference-save",Q),Q=x.setTimeout("preference-save",()=>{Q=null,xt()},450)}async function xt(){if(!(g.value.length<1)){Pe.value=!0;try{await fs(g.value)}catch(e){r.error(e instanceof Error?e.message:"保存国家顺序失败")}finally{Pe.value=!1}}}async function Lt(){try{const e=await ps();e?.countryCodes?.length&&(g.value=[...e.countryCodes])}catch{}}async function De(){try{be.value=await ms()}catch(e){r.error(e instanceof Error?e.message:"加载备选失败")}}async function D(){try{oe.value=await hs()}catch{}}async function F(){try{const e=await ys();K.value=e.items||[]}catch{K.value=[]}}function U(){for(const e of[...w.value])!K.value.some(s=>s.taskId===e)&&!_.value[e]&&z(e)}function Dt(e){Oe.value=e||[]}async function Ze(){const e=te.value.trim();if(!e){r.warning("请输入店铺名称");return}me.value=!0;try{await ks(e),te.value="",await De(),r.success("已加入备选")}catch(t){r.error(t instanceof Error?t.message:"保存失败")}finally{me.value=!1}}async function Mt(e){try{await gs(e.id),await De(),b.value=[],ke(),r.success("已删除")}catch(t){r.error(t instanceof Error?t.message:"删除失败")}}function $t(){const e=new Set,t=te.value.trim();t&&e.add(t);for(const s of Oe.value)s?.shopName?.trim()&&e.add(s.shopName.trim());if(S.value)for(const s of R.value){const o=(s||"").trim();if(!o)continue;const u=(o.split(/[/\\]/).filter(Boolean).pop()||"").replace(/\.[^.]+$/,"").trim();u&&e.add(u)}return[...e]}async function Ft(){const e=$t();if(!e.length){r.warning("请勾选备选店铺,或在输入框中填写店名");return}if(S.value&&!R.value.length){r.warning("请先选择 ASIN 文件");return}he.value=!0;try{const t=await ws(e,{asinFiles:S.value?xe():[],countryCodes:ge()}),s=t.items||[];Ce.value=t.asinRowsByCountry||{};const o=new Map(b.value.map(l=>[(l.shopName||"").trim(),l]));for(const l of s)o.set((l.shopName||"").trim(),l);b.value=[...o.values()],ke(),je.value&&Kt(),r.success(`匹配 ${s.length} 个店铺`)}catch(t){r.error(t instanceof Error?t.message:"匹配失败")}finally{he.value=!1}}function Ut(e){const t=(e||"").trim();return{MATCHED:"已匹配",PENDING:"待匹配",CONFLICT:"需人工确认",INDEX_STALE:"索引过期"}[t]||t||"—"}function Bt(e){const t=(e.matchMessage||"").trim();return t||(e.matched&&e.matchStatus==="MATCHED"?"紫鸟索引已命中,可推送队列":e.matched?"已关联索引,请结合状态列查看是否可推送":"未命中或未就绪,请检查店铺名与索引刷新")}function Me(e){return`${(e.shopName||"").trim()}${e.shopId??""}`}function et(e){const t=e instanceof Error?e.message:String(e||"");return/记录不存在|不存在|已删除|not\s*found|404/i.test(t)}function qt(){const e=A.value&&!S.value;return{enabled:e,mode:e?"DELETE_WHEN_PRICE_BELOW_MINIMUM":"NONE",deleteWhenPriceBelowMinimum:e,compareField:"price",thresholdField:"minimumPrice",target:"skip_asin",source:"frontend-price-track"}}function W(e){if(!e.length)return;const t=new Set(e.map(o=>Me(o))),s=new Set(e.map(o=>(o.shopName||"").trim()).filter(o=>!!o));b.value=b.value.filter(o=>{const l=Me(o),u=(o.shopName||"").trim();return!t.has(l)&&(!u||!s.has(u))}),ke()}function Ot(e){K.value=K.value.filter(t=>!(e.resultId!=null&&t.resultId===e.resultId||e.taskId!=null&&t.taskId===e.taskId))}async function jt(e){const t=[...b.value];W([e]);const s=(e.shopName||"").trim();if(!s){r.success("已从匹配结果中移除");return}try{(await _s(s))?.removed&&(await F(),await D(),U()),r.success("已从匹配结果中移除")}catch(o){if(et(o)){await F(),await D(),U(),r.success("后端记录已不存在,已同步移除本地记录");return}b.value=t,ke(),r.error(o instanceof Error?o.message:"同步后端失败")}}function tt(e,t){const s=e.items?.[0],o=(t.shopName||"").trim(),l=t.skipAsins||e.skipAsinsByCountry||{},u=e.skipAsinDetailsByCountry||{},a=e.minimumPriceByCountryAndAsin||{},d=qt(),T=s?.resultId??null,q=s?.loopRunId??null,ee=s?.roundIndex??null,h=s?.taskStatus||"RUNNING",M=s?.success??!1,E=s?.error||null,P=s?.outputFilename||null,G=s?.downloadUrl||null;return{type:"price-track-run",ts:Date.now(),data:{task_id:e.taskId,result_id:T,shop_name:o,shop_id:t.shopId??null,platform:t.platform||"",company_name:t.companyName||"",shop_mall_name:t.shopMallName||"",matched:!!t.matched,match_status:t.matchStatus||"",match_message:t.matchMessage||null,success:M,error:E,output_filename:P,download_url:G,task_status:h,loop_run_id:q,round_index:ee,country_codes:ge(),mode:A.value?"status":"asin",skip_asins:l,skip_asins_by_country:l,skip_asin_details_by_country:u,minimum_price_by_country_and_asin:a,skip_asin_delete_policy:d,delete_skip_asin_when_price_below_minimum:d.deleteWhenPriceBelowMinimum,deleteSkipAsinWhenPriceBelowMinimum:d.deleteWhenPriceBelowMinimum,asin_rows_by_country:Object.keys(Ce.value).length?Ce.value:e.asinRowsByCountry||{},taskId:e.taskId,resultId:T,shopName:o,shopId:t.shopId??null,platformName:t.platform||"",companyName:t.companyName||"",shopMallName:t.shopMallName||"",matchStatus:t.matchStatus||"",matchMessage:t.matchMessage||null,outputFilename:P,downloadUrl:G,taskStatus:h,loopRunId:q,roundIndex:ee}}}async function st(e){let t=0;const s=30;for(;;){if(I)return"STOPPED";try{const o=await pt([e]);if(t>0&&(p.value=`任务 ${e} 后端已恢复,继续等待执行结果...`),t=0,(o.missingTaskIds||[]).includes(e))return z(e),await F(),await D(),U(),"FAILED";const l=(o.items||[]).find(a=>a.task?.id===e),u=l?.task?.status||"";if(l){const a=_.value[e];_.value={..._.value,[e]:a?{...a,task:{...a.task||{},...l.task||{}}}:l},ie()}if(u&&(N.value={...N.value,[e]:u},ue()),u==="SUCCESS"||u==="FAILED")return z(e),await F(),await D(),U(),u}catch(o){const l=(o instanceof Error?o.message:String(o||"")).toLowerCase();if(!["无法连接到后端服务","bad gateway","gateway timeout","network error","timeout","502","503","504"].some(a=>l.includes(a.toLowerCase())))throw o;if(t+=1,t>=s)throw new Error(`任务 ${e} 等待后端恢复超时,请稍后手动刷新查看状态`);p.value=`任务 ${e} 运行中,正在等待后端服务恢复(${t}/${s})...`,(t===1||t%5===0)&&r.warning(`任务 ${e} 运行中,后端服务暂时不可用,正在自动重试`),await X(B());continue}await X(B())}}function Jt(){return b.value.find(e=>e.matched)}async function Kt(){if(I||Se.value)return;if(!Ne.value){r.warning("请至少选择一个跟价模式");return}if(S.value&&!R.value.length){r.warning("请先选择 ASIN 文件");return}const e=pe();if(!e?.enqueue_json){r.error("当前环境未启用 pywebview enqueue_json");return}if(!b.value.filter(l=>l.matched).length){r.warning("无可用匹配店铺");return}Se.value=!0,j.value=!0,V.value="";let s=0,o=0;try{let l=0;for(;!I&&je.value;){const u=Jt();if(!u)break;l+=1;try{let a=0;const d=await(async()=>{for(;;){if(I)throw new Error("component disposed");try{return await ft({userId:0,statusMode:A.value,asinMode:S.value,items:[u],asinFiles:xe(),countryCodes:ge()})}catch(h){const M=(h instanceof Error?h.message:String(h||"")).toLowerCase(),E=["无法连接到后端服务","bad gateway","gateway timeout","network error","timeout","502","503","504"].some(P=>M.includes(P.toLowerCase()));if(a+=1,!E||a>=10)throw h;p.value="后端服务暂时不可用,正在重试创建任务("+a+"/10)...",await X(B())}}})();_.value={..._.value,[d.taskId]:{task:{id:d.taskId,status:"RUNNING"},items:d.items}},N.value={...N.value,[d.taskId]:"RUNNING"},ie(),ue();const T=tt(d,u);V.value=JSON.stringify(T,null,2);const q=await e.enqueue_json(T);if(!q?.success){o+=1,p.value="任务 "+d.taskId+" 推送失败,已自动继续下一条:"+(q?.error||"未知错误"),r.error(p.value),W([u]);continue}if(we(d.taskId),Z(!0),W([u]),p.value="任务 "+d.taskId+" 已入队,等待执行完成",await st(d.taskId)!=="SUCCESS"){o+=1,p.value="任务 "+d.taskId+" 执行失败,已自动继续下一条",r.error(p.value);continue}s+=1,p.value="任务 "+d.taskId+" 已完成"}catch(a){if(I)break;o+=1,p.value="第 "+l+" 条任务处理失败,已自动继续下一条:"+(a instanceof Error?a.message:"未知错误"),r.error(p.value),W([u]);continue}}(s>0||o>0)&&r.success("店铺任务推送已完成:成功 "+s+" 条,失败 "+o+" 条")}catch(l){if(I)return;p.value=l instanceof Error?l.message:"推送异常",r.error(p.value)}finally{Se.value=!1,j.value=!1}}function ce(e){k.value=e,m.value=e?.id??null,Y()}function de(){if(!k.value)return;const e=k.value.status||"";(e==="SUCCESS"||e==="FAILED"||e==="STOPPED")&&(k.value=null,m.value=null,Y())}async function $e(){if(!m.value)return null;try{const e=await Is(m.value);return ce(e),de(),k.value}catch(e){const t=(e instanceof Error?e.message:String(e||"")).toLowerCase();return["无法连接到后端服务","bad gateway","gateway timeout","network error","timeout","502","503","504"].some(o=>t.includes(o.toLowerCase()))?k.value:(k.value=null,m.value=null,Y(),null)}}function Wt(e){_.value={..._.value,[e.taskId]:{task:{id:e.taskId,status:"RUNNING"},items:e.items}},N.value={...N.value,[e.taskId]:"RUNNING"},ie(),ue()}async function zt(){if(!(!m.value||se.value)){se.value=!0;try{const e=await bs(m.value);ce(e),de(),r.success(e.status==="STOPPED"?"循环已停止":"已请求停止,当前子任务完成后将收尾")}catch(e){r.error(e instanceof Error?e.message:"停止循环失败")}finally{se.value=!1}}}async function Fe(e){if(I||Te.value||(e&&m.value!==e&&(m.value=e,Y()),!m.value))return;const t=pe();if(!t?.enqueue_json)throw new Error("当前环境未启用 pywebview enqueue_json");Te.value=!0;try{for(;!I&&m.value;){const s=await $e();if(!s||s.status==="SUCCESS"||s.status==="FAILED"||s.status==="STOPPED")break;if(s.activeTaskId){const h=s.activeTaskId;we(h),Z(!0);const M=await st(h);let E=0;const P=await(async()=>{for(;;){if(I)throw new Error("component disposed");try{return await Ss(s.id,h)}catch(G){const Xt=(G instanceof Error?G.message:String(G||"")).toLowerCase(),Yt=["无法连接到后端服务","bad gateway","gateway timeout","network error","timeout","502","503","504"].some(Zt=>Xt.includes(Zt.toLowerCase()));if(E+=1,!Yt||E>=10)throw G;p.value=`循环任务 ${s.id} 等待后端恢复后确认子任务完成(${E}/10)...`,await X(B())}}})();if(ce(P),await F(),await D(),U(),de(),M!=="SUCCESS")throw new Error(P.errorMessage||`任务 ${s.activeTaskId} 执行失败`);continue}let o=0;const l=await(async()=>{for(;;){if(I)throw new Error("component disposed");try{return await Cs(s.id)}catch(h){const M=(h instanceof Error?h.message:String(h||"")).toLowerCase(),E=["无法连接到后端服务","bad gateway","gateway timeout","network error","timeout","502","503","504"].some(P=>M.includes(P.toLowerCase()));if(o+=1,!E||o>=10)throw h;p.value=`循环任务 ${s.id} 等待后端恢复后继续派发(${o}/10)...`,await X(B())}}})();if(ce(l.loopRun||s),!l.childTaskRequest){de();break}const u=l.childTaskRequest,a=u.items?.[0];if(!a)throw new Error("循环任务缺少待执行店铺");let d=0;const T=await(async()=>{for(;;){if(I)throw new Error("component disposed");try{return await ft(u)}catch(h){const M=(h instanceof Error?h.message:String(h||"")).toLowerCase(),E=["无法连接到后端服务","bad gateway","gateway timeout","network error","timeout","502","503","504"].some(P=>M.includes(P.toLowerCase()));if(d+=1,!E||d>=10)throw h;p.value=`循环任务 ${s.id} 等待后端恢复后重试创建子任务(${d}/10)...`,await X(B())}}})();Wt(T);const q=tt(T,a);V.value=JSON.stringify(q,null,2);const ee=await t.enqueue_json(q);if(!ee?.success)throw new Error(ee?.error||`任务 ${T.taskId} 推送失败`);we(T.taskId),Z(!0),W([a]),p.value=`循环任务 ${s.id} 第 ${l.childTaskRequest.roundIndex||1} 轮已推送:${a.shopName||T.taskId}`}}finally{Te.value=!1}}async function Gt(){if(Ee.value){try{await Fe(m.value||void 0)}catch(t){t instanceof Error&&/子任务不存在|循环任务不存在|404/.test(t.message)&&(k.value=null,m.value=null,Y());const s=t instanceof Error?t.message:"循环执行失败";p.value=s,r.error(s)}return}if(!Ne.value){r.warning("请至少选择一个跟价模式");return}if(S.value&&!R.value.length){r.warning("请先选择 ASIN 文件");return}const e=b.value.filter(t=>t.matched);if(!e.length){r.warning("请先匹配可用店铺");return}j.value=!0,V.value="";try{const t=await Ts({userId:0,statusMode:A.value,asinMode:S.value,items:e,asinFiles:xe(),countryCodes:ge(),executionMode:J.value,targetRounds:J.value==="FINITE"?Math.max(1,Number(ye.value)||1):void 0});ce(t),p.value=`循环任务 ${t.id} 已创建`,await Fe(t.id),de(),m.value||r.success("跟价循环已启动")}catch(t){const s=t instanceof Error?t.message:"启动循环失败";p.value=s,r.error(s)}finally{j.value=!1}}function B(){return Ns()}async function Ht(){const e=w.value.filter(t=>t>0);if(e.length)try{const t=await pt(e);let s=!1;const o={..._.value};for(const l of t.missingTaskIds||[])z(l),delete o[l];for(const l of t.items||[]){const u=l.task?.id,a=l.task?.status;if(typeof u!="number"||u<=0)continue;const d=o[u];o[u]=d?{...d,task:{...d.task||{},...l.task||{}}}:l,a&&(N.value[u]=a,(a==="SUCCESS"||a==="FAILED")&&(z(u),s=!0))}_.value=o,ie(),ue(),await F(),U(),s&&await D()}catch{}}function Z(e=!1){if(I)return;if(L.value){if(!e)return;x.clearTimer("task-poll",L.value),L.value=null}const t=async()=>{if(L.value=null,!I){if(Ae.value){Z();return}if(w.value.length){Ae.value=!0;try{await Ht()}finally{Ae.value=!1}!I&&w.value.length>0&&(L.value=x.setTimeout("task-poll",t,B()))}}};e?t():L.value=x.setTimeout("task-poll",t,B())}function Vt(){L.value&&(x.clearTimer("task-poll",L.value),L.value=null)}function we(e){w.value.includes(e)||(w.value=[...w.value,e],Ve())}function z(e){if(w.value=w.value.filter(t=>t!==e),Ve(),delete N.value[e],ue(),_.value[e]){const t={..._.value};delete t[e],_.value=t,ie()}}const Ue=O(()=>{const e=K.value.filter(s=>s.taskId&&w.value.includes(s.taskId)&&!nt(s.taskId)),t=new Set(e.map(s=>s.taskId).filter(s=>typeof s=="number"));for(const s of w.value){if(t.has(s))continue;const o=_.value[s]?.items?.[0];o&&e.push(o)}return e}),Be=O(()=>K.value.filter(e=>!e.taskId||!w.value.includes(e.taskId)||nt(e.taskId))),Qt=O(()=>Ue.value.length>0||Be.value.length>0);function at(e){return e&&(N.value[e]||_.value[e]?.task?.status)||""}function nt(e){const t=at(e);return t==="SUCCESS"||t==="FAILED"}function qe(e){const t=e.taskId;return t?at(t)||e.taskStatus||"":e.taskStatus||""}function ot(e){const t=qe(e);return t==="SUCCESS"?"已完成":t==="FAILED"?"失败":t==="RUNNING"?"执行中":e.success?"已完成":"等待中"}function lt(e){const t=qe(e);return t==="SUCCESS"||e.success?"success":t==="FAILED"?"failed":"running"}function rt(e){return!e.resultId||!e.fileReady&&!e.downloadUrl?!1:qe(e)==="SUCCESS"||e.success===!0}async function ut(e){if(!e.resultId)return;const t=e.outputFilename||`${e.shopName||"result"}.xlsx`,s=Es(e.resultId),o=await Ps(s,t,`price-track:${e.resultId}`);o.success?r.success(`已保存:${o.path||t}`):o.error&&o.error!=="用户取消"&&r.error(o.error)}async function it(e){try{e.resultId!=null?await As(e.resultId):e.taskId!=null&&await Rs(e.taskId),k.value&&(e.loopRunId!=null&&e.loopRunId===k.value.id||e.taskId!=null&&e.taskId===k.value.activeTaskId)&&await $e(),e.taskId!=null&&z(e.taskId),W([e]),await F(),await D(),U(),r.success("已删除")}catch(t){if(et(t)){e.taskId!=null&&z(e.taskId),W([e]),Ot(e),await D(),U(),r.success("后端记录已不存在,已同步移除本地记录");return}r.error(t instanceof Error?t.message:"删除失败")}}return ts(()=>{!A.value&&!S.value&&Le("status"),kt(),gt(),wt(),_t(),It(),De().catch(()=>{}),Lt().catch(()=>{}),F().catch(()=>{}),D().catch(()=>{}),w.value.length&&Z(!0),m.value&&$e().then(e=>{e?.activeTaskId&&(we(e.activeTaskId),Z(!0)),e&&e.status!=="SUCCESS"&&e.status!=="FAILED"&&e.status!=="STOPPED"&&Fe(e.id)}).catch(()=>{m.value=null,Y()})}),ss(()=>{I=!0,Vt(),yt(),x.clearScope(),Q&&x.clearTimer("preference-save",Q)}),(e,t)=>{const s=as,o=os,l=ls,u=rs;return i(),c("div",Ds,[C(vs,{active:"pricing"}),n("div",Ms,[n("aside",$s,[t[27]||(t[27]=n("div",{class:"section-title"},"跟价模式",-1)),n("div",Fs,[n("label",Us,[n("input",{type:"radio",name:"price-track-mode",class:"mode-check-input",checked:A.value,onChange:t[0]||(t[0]=a=>Le("status"))},null,40,Bs),t[7]||(t[7]=n("span",{class:"mode-check-text"},"按商品状态(全量)",-1)),t[8]||(t[8]=n("span",{class:"mode-hint-inline"},"— 获取店铺所有在售ASIN跑跟价",-1))]),n("label",qs,[n("input",{type:"radio",name:"price-track-mode",class:"mode-check-input",checked:S.value,onChange:t[1]||(t[1]=a=>Le("asin"))},null,40,Os),t[9]||(t[9]=n("span",{class:"mode-check-text"},"按指定ASIN文档(自定义)",-1)),t[10]||(t[10]=n("span",{class:"mode-hint-inline"},"— 上传ASIN表格,按文档内ASIN跑跟价",-1))])]),t[28]||(t[28]=n("div",{class:"section-title"},"执行配置",-1)),n("div",js,[n("label",Js,[ct(n("input",{"onUpdate:modelValue":t[2]||(t[2]=a=>J.value=a),type:"radio",class:"mode-check-input",value:"FINITE"},null,512),[[dt,J.value]]),t[11]||(t[11]=n("span",{class:"mode-check-text"},"执行固定轮次",-1)),t[12]||(t[12]=n("span",{class:"mode-hint-inline"},"按整批店铺重复执行指定次数",-1))]),n("label",Ks,[ct(n("input",{"onUpdate:modelValue":t[3]||(t[3]=a=>J.value=a),type:"radio",class:"mode-check-input",value:"INFINITE"},null,512),[[dt,J.value]]),t[13]||(t[13]=n("span",{class:"mode-check-text"},"无限执行",-1)),t[14]||(t[14]=n("span",{class:"mode-hint-inline"},"上一轮全部成功后立即开始下一轮",-1))]),J.value==="FINITE"?(i(),c("div",Ws,[t[15]||(t[15]=n("span",{class:"hint"},"轮次",-1)),C(s,{modelValue:ye.value,"onUpdate:modelValue":t[4]||(t[4]=a=>ye.value=a),min:1,max:9999,disabled:Ee.value||j.value},null,8,["modelValue","disabled"])])):y("",!0)]),S.value?(i(),c($,{key:0},[t[17]||(t[17]=n("div",{class:"section-title"},[ve("ASIN文档 "),n("span",{class:"tag-badge"},"自定义模式")],-1)),n("div",zs,[t[16]||(t[16]=n("div",{class:"hint"},"上传包含ASIN的表格文件,按文档内的ASIN进行跟价。",-1)),n("div",{class:"btns"},[n("button",{type:"button",class:"opt-btn",onClick:bt},"选择ASIN文件"),n("button",{type:"button",class:"opt-btn",onClick:St},"选择文件夹")]),n("div",Gs,[R.value.length?(i(!0),c($,{key:0},fe(R.value,(a,d)=>(i(),c("span",{key:d},v(a),1))),128)):(i(),c("span",Hs,"暂未选择"))])])],64)):y("",!0),A.value?(i(),c($,{key:1},[t[19]||(t[19]=n("div",{class:"section-title"},"店铺名称",-1)),n("div",Vs,[t[18]||(t[18]=n("div",{class:"hint"},"输入店铺名后点「确认」加入下方备选区。可同时配合上方模式使用。",-1)),n("div",Qs,[C(o,{modelValue:te.value,"onUpdate:modelValue":t[5]||(t[5]=a=>te.value=a),clearable:"",placeholder:"请输入店铺名称",onKeyup:ns(Ze,["enter"])},null,8,["modelValue"]),n("button",{type:"button",class:"opt-btn",disabled:me.value,onClick:Ze},v(me.value?"保存中…":"确认"),9,Xs)])]),t[20]||(t[20]=n("div",{class:"section-title"},"备选店铺",-1)),be.value.length?(i(),c("div",Zs,[C(u,{data:be.value,"row-key":"id",height:"160",class:"candidate-table",onSelectionChange:Dt},{default:H(()=>[C(l,{type:"selection",width:"42"}),C(l,{prop:"shopName",label:"店铺名","min-width":"120","show-overflow-tooltip":""}),C(l,{label:"操作",width:"72",align:"center"},{default:H(({row:a})=>[n("button",{type:"button",class:"link-danger",onClick:d=>Mt(a)},"删除",8,ea)]),_:1})]),_:1},8,["data"])])):(i(),c("div",Ys,"暂无备选店铺,请先输入并确认"))],64)):y("",!0),S.value?y("",!0):(i(),c($,{key:2},[t[23]||(t[23]=n("div",{class:"section-title"},"处理国家与顺序",-1)),t[24]||(t[24]=n("p",{class:"hint country-pref-hint"}," 勾选需要处理的站点;拖拽调整顺序。设置会按当前登录用户保存。 ",-1)),n("div",ta,[(i(!0),c($,null,fe(Ct.value,a=>(i(),c("label",{key:a.code,class:"country-check-row"},[n("input",{type:"checkbox",class:"country-check-input",checked:Tt(a.code),disabled:Xe(a.code),onChange:d=>Nt(a.code,d)},null,40,sa),n("span",aa,v(a.label)+"("+v(a.code)+")",1)]))),128))]),g.value.length?(i(),c("div",na,[t[22]||(t[22]=n("div",{class:"country-order-caption"},"已选顺序(拖拽 ⋮⋮ 调整)",-1)),n("div",oa,[(i(!0),c($,null,fe(g.value,(a,d)=>(i(),c("div",{key:a,class:_e(["country-drag-row",{dragging:ne.value===d}]),draggable:"true",onDragstart:T=>Pt(d),onDragend:At,onDragover:t[6]||(t[6]=vt(()=>{},["prevent"])),onDrop:vt(T=>Rt(d),["prevent"])},[t[21]||(t[21]=n("span",{class:"drag-handle",title:"拖动排序"},"⋮⋮",-1)),n("span",ra,v(Qe(a))+"("+v(a)+")",1)],42,la))),128))])])):y("",!0),Pe.value?(i(),c("div",ua,"保存中…")):y("",!0)],64)),A.value?(i(),c("div",ia,[...t[25]||(t[25]=[n("span",{class:"mode-status-dot active"},null,-1),n("span",{class:"mode-status-text"},"商品状态模式:将在售(Active)ASIN纳入跟价,跳过ASIN由后台配置的店铺维度数据提供",-1)])])):y("",!0),n("div",ca,[n("button",{type:"button",class:"btn-run",disabled:he.value,onClick:Ft},v(he.value?"匹配中…":"匹配店铺"),9,da),n("button",{type:"button",class:"btn-run btn-queue",disabled:j.value||!Ne.value,onClick:Gt},v(j.value?"推送中…":"推送到 Python 队列"),9,va)]),t[29]||(t[29]=n("p",{class:"loading-msg"},[ve("上传ASIN文档和多选店铺"),n("strong",null,"可同时生效"),ve(",跟价结果合并输出。全量和自定义的区别仅在于ASIN来源不同。")],-1)),k.value?(i(),c("div",fa,[n("div",pa,"循环任务 ID:"+v(k.value.id),1),n("div",ma,"状态:"+v(k.value.status||"-"),1),n("div",ha,"进度:"+v(ht.value),1),n("div",ya,"当前店铺:"+v((k.value.currentShopIndex||0)+1)+"/"+v(k.value.totalShopCount||0),1),k.value.errorMessage?(i(),c("div",ka,v(k.value.errorMessage),1)):y("",!0),n("button",{type:"button",class:"opt-btn loop-stop-btn",disabled:!Ee.value||se.value,onClick:zt},v(se.value?"停止中...":"停止循环"),9,ga)])):y("",!0),p.value?(i(),c("div",wa,[t[26]||(t[26]=n("div",{class:"section-title queue-debug-title"},"推送结果",-1)),n("div",_a,v(p.value),1),V.value?(i(),c("pre",Ia,v(V.value),1)):y("",!0)])):y("",!0)]),n("section",ba,[t[38]||(t[38]=n("div",{class:"panel-header"},"匹配与任务",-1)),n("div",Sa,[n("div",Ca,[n("div",Ta,[t[30]||(t[30]=n("span",{class:"summary-label"},"备选店铺数",-1)),n("strong",null,v(oe.value.candidateCount),1)]),n("div",Na,[t[31]||(t[31]=n("span",{class:"summary-label"},"已结束任务",-1)),n("strong",null,v(oe.value.processedTaskCount),1)]),n("div",Ea,[t[32]||(t[32]=n("span",{class:"summary-label"},"成功任务",-1)),n("strong",null,v(oe.value.successTaskCount),1)]),n("div",Pa,[t[33]||(t[33]=n("span",{class:"summary-label"},"失败任务",-1)),n("strong",null,v(oe.value.failedTaskCount),1)])]),t[37]||(t[37]=n("div",{class:"subsection-title"},"匹配结果",-1)),b.value.length?(i(),us(u,{key:1,data:b.value,"row-key":Me,"highlight-current-row":!1,class:"result-table match-table"},{default:H(()=>[C(l,{prop:"shopName",label:"店铺名","min-width":"100"}),C(l,{label:"匹配",width:"72",align:"center"},{default:H(({row:a})=>[n("span",{class:_e(a.matched?"ok":"fail")},v(a.matched?"是":"否"),3)]),_:1}),C(l,{prop:"shopId",label:"店铺ID","min-width":"120","show-overflow-tooltip":""}),C(l,{prop:"platform",label:"平台",width:"88","show-overflow-tooltip":""}),C(l,{prop:"companyName",label:"公司","min-width":"100","show-overflow-tooltip":""}),C(l,{label:"状态",width:"100","show-overflow-tooltip":""},{default:H(({row:a})=>[ve(v(Ut(a.matchStatus)),1)]),_:1}),C(l,{label:"说明","min-width":"140","show-overflow-tooltip":""},{default:H(({row:a})=>[ve(v(Bt(a)),1)]),_:1}),C(l,{label:"操作",width:"72",align:"center"},{default:H(({row:a})=>[n("button",{type:"button",class:"link-danger",onClick:d=>jt(a)},"删除",8,Ra)]),_:1})]),_:1},8,["data"])):(i(),c("div",Aa,"完成「匹配店铺」后,在此展示紫鸟索引匹配结果,供核对后再推送队列。")),n("div",xa,[t[36]||(t[36]=n("div",{class:"result-list-header"},[n("span",null,"处理记录")],-1)),Qt.value?(i(),c($,{key:1},[Ue.value.length?(i(),c("div",Da,[t[34]||(t[34]=n("div",{class:"result-subsection-title"},"当前任务",-1)),n("ul",Ma,[(i(!0),c($,null,fe(Ue.value,a=>(i(),c("li",{key:`cur-${a.resultId}-${a.taskId}`,class:"task-item split-result-item"},[n("div",$a,[a.roundIndex?(i(),c("div",Fa,"轮次:第 "+v(a.roundIndex)+" 轮",1)):y("",!0),n("span",{class:"id",title:a.shopName||""},v(a.shopName||"-"),9,Ua),n("div",Ba,"任务 ID:"+v(a.taskId??"-"),1),a.platform?(i(),c("div",qa,"平台:"+v(a.platform),1)):y("",!0),a.error?(i(),c("div",Oa,"错误:"+v(a.error),1)):y("",!0)]),n("div",ja,[n("span",{class:_e(["status",lt(a)])},v(ot(a)),3),rt(a)?(i(),c("button",{key:0,type:"button",class:"download",onClick:d=>ut(a)}," 下载 ",8,Ja)):y("",!0),n("button",{type:"button",class:"btn-delete",onClick:d=>it(a)},"删除",8,Ka)])]))),128))])])):y("",!0),Be.value.length?(i(),c("div",Wa,[t[35]||(t[35]=n("div",{class:"result-subsection-title"},"历史记录",-1)),n("ul",za,[(i(!0),c($,null,fe(Be.value,a=>(i(),c("li",{key:`his-${a.resultId}-${a.taskId}`,class:"task-item split-result-item"},[n("div",Ga,[a.roundIndex?(i(),c("div",Ha,"轮次:第 "+v(a.roundIndex)+" 轮",1)):y("",!0),n("span",{class:"id",title:a.shopName||""},v(a.shopName||"-"),9,Va),n("div",Qa,"任务 ID:"+v(a.taskId??"-"),1),a.outputFilename?(i(),c("div",Xa,"文件:"+v(a.outputFilename),1)):y("",!0),a.error?(i(),c("div",Ya,"错误:"+v(a.error),1)):y("",!0)]),n("div",Za,[n("span",{class:_e(["status",lt(a)])},v(ot(a)),3),rt(a)?(i(),c("button",{key:0,type:"button",class:"download",onClick:d=>ut(a)}," 下载 ",8,en)):y("",!0),n("button",{type:"button",class:"btn-delete",onClick:d=>it(a)},"删除",8,tn)])]))),128))])])):y("",!0)],64)):(i(),c("div",La,"暂无处理记录。推送队列并等待 Python 回传后,将在此显示下载链接。"))])])])])])}}}),an=is(sn,[["__scopeId","data-v-c91dd406"]]);cs(an).use(ds).mount("#app"); diff --git a/app/assets/product-risk-BQIMXTON.css b/app/assets/product-risk-BQIMXTON.css deleted file mode 100644 index 74f5674..0000000 --- a/app/assets/product-risk-BQIMXTON.css +++ /dev/null @@ -1 +0,0 @@ -.module-page[data-v-7520aec4]{min-height:100vh;background:#1a1a1a}.main-content[data-v-7520aec4]{display:flex;min-height:calc(100vh - 56px);height:calc(100vh - 56px)}.left-panel[data-v-7520aec4]{width:400px;background:#1e1e1e;padding:20px;overflow-y:auto;border-right:1px solid #2a2a2a}.right-panel[data-v-7520aec4]{flex:1;display:flex;flex-direction:column;min-width:0;background:#1a1a1a}.section-title[data-v-7520aec4]{font-size:13px;color:#bbb;margin-bottom:10px}.input-zone[data-v-7520aec4]{border:1px dashed #3a3a3a;border-radius:10px;padding:16px;background:#252525;margin-bottom:20px}.hint[data-v-7520aec4]{color:#888;font-size:12px;margin-bottom:12px;line-height:1.5;text-align:left}.country-pref-hint[data-v-7520aec4]{margin-top:-4px}.country-pref-checks[data-v-7520aec4]{display:flex;flex-wrap:wrap;gap:10px 16px;margin-bottom:12px}.country-check-row[data-v-7520aec4]{display:inline-flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none;font-size:12px;color:#ccc}.country-check-input[data-v-7520aec4]{width:16px;height:16px;accent-color:#409eff;cursor:pointer;flex-shrink:0}.country-check-text[data-v-7520aec4]{line-height:1.3}.country-order-panel[data-v-7520aec4]{border:1px solid #333;border-radius:8px;padding:10px 12px;background:#252525;margin-bottom:14px}.country-order-caption[data-v-7520aec4]{font-size:11px;color:#777;margin-bottom:8px}.country-order-list[data-v-7520aec4]{display:flex;flex-direction:column;gap:6px}.country-drag-row[data-v-7520aec4]{display:flex;align-items:center;gap:10px;padding:8px 10px;background:#2c2c2c;border-radius:6px;border:1px solid #3a3a3a;cursor:grab;-webkit-user-select:none;user-select:none}.country-drag-row.dragging[data-v-7520aec4]{opacity:.55;border-color:#3498db}.drag-handle[data-v-7520aec4]{color:#666;font-size:12px;letter-spacing:-2px}.country-drag-label[data-v-7520aec4]{font-size:12px;color:#ccc}.country-pref-status[data-v-7520aec4]{font-size:11px;color:#888;margin-bottom:10px}.listing-filter-hint[data-v-7520aec4]{margin-top:-4px}.listing-filter-row[data-v-7520aec4]{margin-bottom:16px}.listing-filter-select[data-v-7520aec4]{width:100%}.listing-filter-row[data-v-7520aec4] .el-select__wrapper{background-color:#2a2a2a;box-shadow:0 0 0 1px #3a3a3a inset}.listing-filter-row[data-v-7520aec4] .el-select__placeholder,.listing-filter-row[data-v-7520aec4] .el-select__selected-item{color:#ccc}.input-row[data-v-7520aec4]{display:flex;gap:10px;align-items:center}.input-row[data-v-7520aec4] .el-input{flex:1}.opt-btn[data-v-7520aec4]{padding:8px 14px;font-size:13px;color:#ccc;background:#2a2a2a;border:1px solid #3a3a3a;border-radius:6px;cursor:pointer;white-space:nowrap}.opt-btn[data-v-7520aec4]:hover:not(:disabled){color:#3498db;border-color:#3498db}.opt-btn[data-v-7520aec4]:disabled{opacity:.6;cursor:not-allowed}.empty-candidates[data-v-7520aec4]{color:#666;font-size:13px;padding:16px;border:1px dashed #333;border-radius:8px;margin-bottom:16px}.candidate-table-scroll[data-v-7520aec4]{max-height:280px;overflow:auto;margin-bottom:16px;border-radius:8px;border:1px solid #2a2a2a}.candidate-table[data-v-7520aec4]{--el-table-bg-color: #252525;--el-table-tr-bg-color: #252525;--el-table-header-bg-color: #2a2a2a;--el-table-text-color: #ccc;--el-table-border-color: #333}.link-danger[data-v-7520aec4]{background:none;border:none;color:#e74c3c;cursor:pointer;font-size:12px;padding:0}.link-danger[data-v-7520aec4]:hover{text-decoration:underline}.run-row[data-v-7520aec4]{display:flex;flex-wrap:wrap;gap:10px;margin-top:8px}.btn-run[data-v-7520aec4]{padding:10px 18px;font-size:14px;font-weight:600;color:#fff;background:#3498db;border:none;border-radius:8px;cursor:pointer}.btn-run[data-v-7520aec4]:hover:not(:disabled){background:#2980b9}.btn-run[data-v-7520aec4]:disabled{opacity:.55;cursor:not-allowed}.btn-queue[data-v-7520aec4]{background:#27ae60}.btn-queue[data-v-7520aec4]:hover:not(:disabled){background:#219a52}.loading-msg[data-v-7520aec4]{margin-top:12px;font-size:12px;color:#777;line-height:1.5}.loading-msg code[data-v-7520aec4]{font-size:11px;color:#8fd3ff}.queue-debug-card[data-v-7520aec4]{margin-top:18px;padding:14px;border:1px solid #2a2a2a;border-radius:10px;background:#202020}.queue-debug-title[data-v-7520aec4]{margin-bottom:8px}.queue-debug-line[data-v-7520aec4]{color:#b8c1cc;font-size:12px;line-height:1.6;margin-bottom:8px}.queue-debug-payload[data-v-7520aec4]{margin:0;max-height:220px;overflow:auto;padding:10px;border-radius:8px;background:#141414;color:#8fd3ff;font-size:11px;line-height:1.5;white-space:pre-wrap;word-break:break-all}.panel-header[data-v-7520aec4]{padding:16px 20px;font-size:15px;font-weight:600;color:#e0e0e0;border-bottom:1px solid #2a2a2a}.task-list-wrap[data-v-7520aec4]{flex:1;padding:16px 20px;overflow:auto}.clean-result-summary[data-v-7520aec4]{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-bottom:16px}.summary-card[data-v-7520aec4]{padding:14px 16px;border:1px solid #2a2a2a;border-radius:10px;background:#1e1e1e}.summary-card strong[data-v-7520aec4]{display:block;margin-top:8px;font-size:22px;color:#eaf4ff}.summary-label[data-v-7520aec4]{font-size:12px;color:#8d8d8d}.subsection-title[data-v-7520aec4]{font-size:13px;color:#999;margin:8px 0 10px}.empty-tasks[data-v-7520aec4]{color:#666;font-size:13px;padding:16px;text-align:center}.empty-tasks.narrow[data-v-7520aec4]{padding:12px 8px}.match-table[data-v-7520aec4]{margin-bottom:18px}.match-table[data-v-7520aec4] .el-table__body tr:hover>td.el-table__cell,.match-table[data-v-7520aec4] .el-table__body tr.hover-row>td.el-table__cell,.match-table[data-v-7520aec4] .el-table__body tr.current-row>td.el-table__cell{background-color:var(--el-table-tr-bg-color, #222)!important}.result-table[data-v-7520aec4]{--el-table-bg-color: #222;--el-table-tr-bg-color: #222;--el-table-header-bg-color: #2a2a2a;--el-table-text-color: #ccc;--el-table-border-color: #333}.ok[data-v-7520aec4]{color:#27ae60}.fail[data-v-7520aec4]{color:#e67e22}.result-list-wrap[data-v-7520aec4]{border:1px solid #2a2a2a;border-radius:10px;background:#1e1e1e;min-height:200px;margin-top:8px}.result-list-header[data-v-7520aec4]{padding:12px 16px;border-bottom:1px solid #2a2a2a;font-size:14px;color:#ddd}.result-subsection[data-v-7520aec4]{padding:12px 12px 4px}.result-subsection-title[data-v-7520aec4]{font-size:12px;color:#888;margin-bottom:8px}.task-list[data-v-7520aec4]{list-style:none;margin:0;padding:0}.task-item[data-v-7520aec4]{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:12px 14px;border:1px solid #2a2a2a;border-radius:8px;margin-bottom:8px;background:#222}.left[data-v-7520aec4]{flex:1;min-width:0}.split-result-main[data-v-7520aec4]{display:flex;flex-direction:column;gap:4px}.id[data-v-7520aec4]{font-weight:600;color:#e0e0e0;font-size:13px}.files[data-v-7520aec4]{font-size:12px;color:#888}.task-right[data-v-7520aec4]{display:flex;align-items:center;gap:8px;flex-wrap:wrap;justify-content:flex-end}.status[data-v-7520aec4]{padding:4px 10px;border-radius:6px;font-size:12px;white-space:nowrap}.status.success[data-v-7520aec4]{background:#2ecc712e;color:#2ecc71}.status.failed[data-v-7520aec4]{background:#e74c3c2e;color:#ff6b6b}.status.running[data-v-7520aec4]{background:#3498db2e;color:#3498db}.download[data-v-7520aec4]{padding:6px 10px;border-radius:6px;font-size:12px;background:#3498db2e;color:#69b6ff;border:none;cursor:pointer}.download[data-v-7520aec4]:hover{background:#3498db47}.btn-delete[data-v-7520aec4]{padding:6px 10px;border-radius:6px;font-size:12px;background:#e74c3c1f;color:#ff8f8f;border:none;cursor:pointer}.btn-delete[data-v-7520aec4]:hover{background:#e74c3c38}@media(max-width:1100px){.main-content[data-v-7520aec4]{flex-direction:column;height:auto}.left-panel[data-v-7520aec4]{width:100%;border-right:none;border-bottom:1px solid #2a2a2a}.clean-result-summary[data-v-7520aec4]{grid-template-columns:repeat(2,minmax(0,1fr))}} diff --git a/app/assets/product-risk.js b/app/assets/product-risk.js deleted file mode 100644 index 403f087..0000000 --- a/app/assets/product-risk.js +++ /dev/null @@ -1 +0,0 @@ -import{d as mt,o as wt,q as _t,a as c,c as d,b as m,e as n,x as bt,y as St,t as f,z as P,A as Ct,B as It,m as M,F as U,r as J,C as Ae,n as Z,f as _,D as Tt,G as Be,H as Pt,I as Et,g as v,h as ee,E as u,i as qe,_ as Nt,j as Rt,k as Dt}from"./pywebview-B8lwamDf.js";import{B as $t,P as Ft,Q as Mt,R as Ut,S as Ot,T as Lt,U as At,V as Bt,W as qt,X as xe,Y as xt,Z as jt,_ as Vt,$ as Kt,s as Ht,a0 as Jt,v as Qt}from"./java-modules-B9jblDzU.js";/* empty css */import{L as Gt}from"./listingFilters-BpGOU_pJ.js";import{c as zt}from"./categorized-timers-JPA-olTr.js";const Wt={class:"page-shell module-page"},Xt={class:"main-content"},Yt={class:"left-panel"},Zt={class:"input-zone"},es={class:"input-row"},ts=["disabled"],ss={key:0,class:"empty-candidates"},as={key:1,class:"candidate-table-scroll"},ns=["onClick"],os={class:"country-pref-checks"},ls=["checked","disabled","onChange"],rs={class:"country-check-text"},us={key:2,class:"country-order-panel"},is={class:"country-order-list"},cs=["onDragstart","onDrop"],ds={class:"country-drag-label"},fs={key:3,class:"country-pref-status"},vs={class:"listing-filter-row"},ps={class:"run-row"},hs=["disabled"],ys=["disabled"],ks={key:4,class:"queue-debug-card"},gs={class:"queue-debug-line"},ms={key:0,class:"queue-debug-payload"},ws={class:"right-panel"},_s={class:"task-list-wrap"},bs={class:"clean-result-summary pr-summary"},Ss={class:"summary-card"},Cs={class:"summary-card"},Is={class:"summary-card"},Ts={class:"summary-card"},Ps={key:0,class:"empty-tasks narrow"},Es=["onClick"],Ns={class:"result-list-wrap"},Rs={key:0,class:"empty-tasks"},Ds={key:0,class:"result-subsection"},$s={class:"task-list clean-result-list"},Fs={class:"left split-result-main"},Ms=["title"],Us={class:"files"},Os={key:0,class:"files"},Ls={key:1,class:"files"},As={class:"task-right split-result-actions"},Bs=["onClick"],qs=["onClick"],xs={key:1,class:"result-subsection"},js={class:"task-list clean-result-list"},Vs={class:"left split-result-main"},Ks=["title"],Hs={class:"files"},Js={key:0,class:"files"},Qs={key:1,class:"files"},Gs={class:"task-right split-result-actions"},zs=["onClick"],Ws=["onClick"],Xs=mt({__name:"BrandProductRiskTab",setup(Zs){const O=v(""),te=v([]),fe=v([]),p=v([]),Q=v(!1),G=v(!1),z=v(!1),se=v(!1),ve=v(!1),y=v(""),L=v(""),pe=[{code:"DE",label:"德国"},{code:"UK",label:"英国"},{code:"FR",label:"法国"},{code:"IT",label:"意大利"},{code:"ES",label:"西班牙"}],h=v(["DE","UK","FR","IT","ES"]),D=v("SearchSuppressed"),A=v(null),ae=v(!1),ne=v(!1);let $=null;function he(e){return pe.find(s=>s.code===e)?.label??e}const je=ee(()=>{const e=h.value,t=new Set(e),s=e.map(l=>({code:l,label:he(l)})),o=pe.filter(l=>!t.has(l.code)).map(l=>({code:l.code,label:l.label}));return[...s,...o]});function Ve(e){return h.value.includes(e)}function ye(e){return h.value.length===1&&h.value[0]===e}function Ke(e,t){const s=t.target;if(s){if(!s.checked&&ye(e)){s.checked=!0,u.warning("至少保留 1 个国家");return}He(e,s.checked)}}function He(e,t){if(ne.value=!0,t)h.value.includes(e)||(h.value=[...h.value,e]);else{if(h.value.length<=1){u.warning("至少保留 1 个国家");return}h.value=h.value.filter(s=>s!==e)}ke()}function Je(e){A.value=e}function Qe(){A.value=null}function Ge(e){const t=A.value;if(A.value=null,t==null||t===e)return;ne.value=!0;const s=[...h.value],[o]=s.splice(t,1);s.splice(e,0,o),h.value=s,ke()}function ke(){$&&C.clearTimer("preference-save",$),$=C.setTimeout("preference-save",()=>{$=null,ze()},450)}async function ze(){if(!(h.value.length<1)){ae.value=!0;try{await Ft(h.value)}catch(e){u.error(e instanceof Error?e.message:"保存国家顺序失败")}finally{ae.value=!1}}}async function We(){try{const e=await Mt();if(ne.value)return;e?.country_codes?.length&&(h.value=[...e.country_codes])}catch{}}const B=v({candidateCount:0,processedTaskCount:0,successTaskCount:0,failedTaskCount:0}),E=v([]),k=v([]),N=v({}),g=v({}),S=v(null),oe=v(!1);let b=!1;const C=zt("product-risk");function W(){return typeof window<"u"&&window.localStorage.getItem("uid")||"0"}function ge(){return`product-risk:tasks:${W()}`}function me(){return`product-risk:task-status:${W()}`}function we(){return`product-risk:tasks-batch-snapshot:${W()}`}function _e(){return`product-risk:matched-items:${W()}`}function X(e,t,s){if(!(typeof window>"u"))try{s?window.localStorage.removeItem(e):window.localStorage.setItem(e,JSON.stringify(t))}catch{}}function Xe(){try{const e=typeof window<"u"?window.localStorage.getItem(me()):null;if(!e)return;const t=JSON.parse(e),s={};for(const[o,l]of Object.entries(t)){const r=Number(o);r>0&&typeof l=="string"&&(s[r]=l)}N.value=s}catch{}}function le(){X(me(),N.value,Object.keys(N.value).length===0)}function Ye(){try{const e=typeof window<"u"?window.localStorage.getItem(we()):null;if(!e)return;const t=JSON.parse(e),s={};for(const[o,l]of Object.entries(t)){const r=Number(o);r>0&&l&&typeof l=="object"&&(s[r]=l)}g.value=s}catch{}}function q(){X(we(),g.value,Object.keys(g.value).length===0)}function Ze(){try{const e=typeof window<"u"?window.localStorage.getItem(_e()):null;if(!e)return;const t=JSON.parse(e);Array.isArray(t)&&(p.value=t)}catch{}}function x(){X(_e(),p.value,p.value.length===0)}function j(e){const t=(e.shopName||"").trim(),s=e.shopId??"";return`${t}${s}`}function be(e){const t=e instanceof Error?e.message:String(e||"");return/记录不存在|任务不存在|不存在|已删除|not\s*found|404/i.test(t)}function F(e){if(!e.length)return;const t=new Set(e.map(s=>j(s)));p.value=p.value.filter(s=>!t.has(j(s))),x()}function et(e){E.value=E.value.filter(t=>!(e.resultId!=null&&t.resultId===e.resultId||e.taskId!=null&&t.taskId===e.taskId))}async function tt(e){const t=j(e),s=[...p.value];p.value=p.value.filter(l=>j(l)!==t),x();const o=(e.shopName||"").trim();if(!o){u.success("已从匹配结果中移除");return}try{(await Ut(o))?.removed&&(await T(),await I(),V()),u.success("已从匹配结果中移除")}catch(l){if(be(l)){await T(),await I(),V(),u.success("后端记录已不存在,已同步移除本地记录");return}p.value=s,x(),u.error(l instanceof Error?l.message:"同步后端失败")}}function V(){for(const e of[...k.value])E.value.some(s=>s.taskId===e)||R(e)}async function Se(e){try{if(e.resultId!=null&&e.resultId>0)await Ot(e.resultId);else if(e.taskId!=null&&e.taskId>0)await Lt(e.taskId);else{u.warning("无法删除:缺少记录标识");return}e.taskId!=null&&e.taskId>0&&R(e.taskId),F([e]),await T(),await I(),V(),u.success("已删除")}catch(t){if(be(t)){e.taskId!=null&&e.taskId>0&&R(e.taskId),F([e]),et(e),await I(),V(),u.success("后端记录已不存在,已同步移除本地记录");return}u.error(t instanceof Error?t.message:"删除失败")}}function st(){try{const e=typeof window<"u"?window.localStorage.getItem(ge()):null;if(!e){k.value=[];return}const t=JSON.parse(e);k.value=Array.isArray(t)?t.filter(s=>typeof s=="number"):[]}catch{k.value=[]}}function Ce(){X(ge(),k.value,k.value.length===0)}function Ie(e){k.value.includes(e)||(k.value=[...k.value,e],Ce())}function R(e){if(k.value=k.value.filter(t=>t!==e),Ce(),delete N.value[e],le(),g.value[e]){const t={...g.value};delete t[e],g.value=t,q()}}function at(e){fe.value=e||[]}async function I(){try{B.value=await At()}catch{}}async function re(){try{te.value=await Bt(),await I()}catch(e){u.error(e instanceof Error?e.message:"加载备选失败")}}async function T(){try{E.value=(await qt()).items||[]}catch{E.value=[]}}function Te(e){return e&&N.value[e]||""}function Pe(e){const t=Te(e);return t==="SUCCESS"||t==="FAILED"}const ue=ee(()=>{const e=E.value.filter(s=>s.taskId&&k.value.includes(s.taskId)&&!Pe(s.taskId)),t=new Set(e.map(s=>s.taskId).filter(s=>typeof s=="number"));for(const s of k.value){if(t.has(s))continue;const r=(g.value[s]?.items||[])[0];r&&e.push(r)}return e}),ie=ee(()=>E.value.filter(e=>!e.taskId||!k.value.includes(e.taskId)||Pe(e.taskId))),nt=ee(()=>ue.value.length>0||ie.value.length>0),ot=["无法连接到后端服务","bad gateway","gateway timeout","network error","timeout","502","503","504"];function ce(e){return b?Promise.resolve():C.sleep("queue-wait",e)}function lt(){C.clearCategory("queue-wait")}function Ee(e){const t=(e instanceof Error?e.message:String(e||"")).toLowerCase();return ot.some(s=>t.includes(s.toLowerCase()))}async function Ne(e,t=10){let s=0;for(;;){if(b)throw new Error("component disposed");try{return await Jt(e)}catch(o){if(s+=1,!Ee(o)||s>=t)throw o;y.value=`后端服务暂时不可用,正在重试创建任务(${s}/${t})...`,await ce(K())}}}async function Re(){const e=k.value.filter(t=>t>0);if(e.length)try{const t=await xe(e);let s=!1;const o={...g.value};for(const l of t.items||[]){const r=l.task?.id,i=l.task?.status;if(typeof r=="number"&&r>0){const a=o[r];o[r]=a?{...a,task:{...a.task||{},...l.task||{}}}:l,i&&(N.value[r]=i,(i==="SUCCESS"||i==="FAILED")&&(R(r),s=!0))}}g.value=o,q(),le(),s&&(await T(),await I())}catch{}}function K(){return Qt()}function De(e=!1){if(S.value){if(!e)return;C.clearTimer("task-poll",S.value),S.value=null}const t=async()=>{if(S.value=null,!b){if(oe.value){De();return}if(k.value.length){oe.value=!0;try{await Re()}finally{oe.value=!1}!b&&k.value.length>0&&(S.value=C.setTimeout("task-poll",t,K()))}}};b||(e?t():S.value=C.setTimeout("task-poll",t,K()))}function H(e=!1){S.value&&!e||De(e)}function rt(){S.value&&(C.clearTimer("task-poll",S.value),S.value=null)}async function $e(e){let t=0;const s=30;for(;;){if(b)return"STOPPED";try{const o=await xe([e]);t>0&&(y.value=`任务 ${e} 后端已恢复,继续等待执行结果...`),t=0;const l=(o.items||[]).find(i=>i.task?.id===e),r=l?.task?.status||"";if(l){const i=g.value[e];g.value={...g.value,[e]:i?{...i,task:{...i.task||{},...l.task||{}}}:l},q()}if(r&&(N.value[e]=r,le()),r==="SUCCESS"||r==="FAILED")return R(e),await T(),await I(),r}catch(o){if(!Ee(o))throw o;if(t+=1,t>=s)throw new Error(`任务 ${e} 等待后端恢复超时,请稍后手动刷新查看状态`);y.value=`任务 ${e} 运行中,正在等待后端服务恢复(${t}/${s})...`,(t===1||t%5===0)&&u.warning(`任务 ${e} 运行中,后端服务暂时不可用,正在自动重试`),await ce(K());continue}await ce(K())}}async function Fe(){const e=O.value.trim();if(!e){u.warning("请输入店铺名称");return}Q.value=!0;try{await xt(e),O.value="",await re(),u.success("已加入备选")}catch(t){u.error(t instanceof Error?t.message:"保存失败")}finally{Q.value=!1}}async function ut(e){try{await jt(e.id),await re(),p.value=[],x(),u.success("已删除")}catch(t){u.error(t instanceof Error?t.message:"删除失败")}}function it(){const e=new Set,t=O.value.trim();t&&e.add(t);for(const s of fe.value)s?.shop_name?.trim()&&e.add(s.shop_name.trim());return[...e]}function ct(e,t){const s=new Map;for(const r of t){const i=(r.shopName||"").trim();i&&s.set(i,r)}const o=new Set,l=[];for(const r of e){const i=(r.shopName||"").trim();i&&s.has(i)?(l.push(s.get(i)),o.add(i)):l.push(r)}for(const r of t){const i=(r.shopName||"").trim();if(!i){l.push(r);continue}o.has(i)||(l.push(r),o.add(i))}return l}async function dt(){const e=it();if(!e.length){u.warning("请勾选备选店铺,或在输入框中填写店名(可与勾选合并)");return}G.value=!0;try{const s=(await Vt(e)).items||[];p.value=ct(p.value,s),x(),s.length?u.success(`本次匹配 ${s.length} 个店铺名,表格共 ${p.value.length} 条`):u.warning("未返回匹配结果")}catch(t){u.error(t instanceof Error?t.message:"匹配失败")}finally{G.value=!1}}function de(e){const t=e.taskId;return t?Te(t)||e.taskStatus||"":e.taskStatus||""}function Me(e){const t=de(e);return t==="SUCCESS"?"已完成":t==="FAILED"?"失败":t==="RUNNING"?"执行中":e.success?"已完成":"等待中"}function Ue(e){const t=de(e);return t==="SUCCESS"||e.success?"success":t==="FAILED"?"failed":"running"}function Oe(e){return!e.resultId||!e.fileReady&&!e.downloadUrl?!1:de(e)==="SUCCESS"||e.success===!0}async function Le(e){if(!e.resultId)return;const t=Kt(e.resultId),s=e.outputFilename||`${e.shopName||"result"}.zip`,o=await Ht(t,s,`product-risk:${e.resultId}`);o.success?u.success(`已保存:${o.path||s}`):o.error&&o.error!=="用户取消"&&u.error(o.error)}function ft(e){const t=(e||"").trim();return{MATCHED:"已匹配",PENDING:"待匹配",CONFLICT:"需人工确认",INDEX_STALE:"索引过期"}[t]||t||"—"}function vt(e){const t=(e.matchMessage||"").trim();return t||(e.matched&&e.matchStatus==="MATCHED"?"紫鸟索引已命中,可推送队列;打开店铺地址由 Python 侧处理":e.matched?"已关联索引,请结合状态列查看是否可推送":"未命中或未就绪,请检查店铺名与索引刷新")}async function pt(){ve.value=!0,await gt()}function ht(){return p.value.find(e=>e.matched)}function yt(){return D.value==="SearchSuppressed"||D.value==="DetailPageRemoved"}async function kt(e){const t=qe();if(!t?.enqueue_json){u.error("当前环境未启用 pywebview enqueue_json");return}const s=await Ne(e),o=s.taskId;g.value={...g.value,[o]:{task:{id:o,status:"RUNNING"},items:s.items}},q(),Ie(o),H(!0);const l={type:"product-risk-resolve-run",ts:Date.now(),data:{taskId:o,items:e,country_codes:[...h.value],risk_listing_filter:D.value}};L.value=JSON.stringify(l,null,2);const r=await t.enqueue_json(l);if(!r?.success)throw R(o),new Error("任务 "+o+" 推送失败:"+(r?.error||"未知错误"));F(e),y.value="任务 "+o+" 已入队,共 "+e.length+" 个店铺,等待执行完成...";const i=await $e(o);if(y.value="任务 "+o+(i==="SUCCESS"?" 已完成":" 执行失败"),i!=="SUCCESS")throw new Error(y.value)}async function gt(){if(b||se.value)return;if(!p.value.length){u.warning("请先匹配店铺");return}const e=qe();if(!e?.enqueue_json){u.error("当前环境未启用 pywebview enqueue_json");return}const t=p.value.filter(l=>l.matched);if(!t.length){u.warning("没有已匹配的店铺可推送");return}se.value=!0,z.value=!0,L.value="";let s=0,o=0;try{if(yt()){await kt(t),u.success("店铺推送已完成:成功 "+t.length+" 条,失败 0 条"),await T(),H(!0);return}let l=0;for(;!b&&ve.value;){const r=ht();if(!r)break;l+=1;try{const i=await Ne([r]),a=i.taskId;g.value={...g.value,[a]:{task:{id:a,status:"RUNNING"},items:i.items}},q(),Ie(a),H(!0);const w={type:"product-risk-resolve-run",ts:Date.now(),data:{taskId:a,items:[r],country_codes:[...h.value],risk_listing_filter:D.value}};L.value=JSON.stringify(w,null,2);const Y=await e.enqueue_json(w);if(!Y?.success){R(a),o+=1,y.value="第 "+l+" 条推送失败:"+(Y?.error||"未知错误")+",已自动继续下一条",u.error(y.value),F([r]);continue}if(F([r]),y.value="任务 "+a+" 已入队,等待执行完成...",await $e(a)!=="SUCCESS"){o+=1,y.value="任务 "+a+" 执行失败,已自动继续下一条",u.error(y.value);continue}s+=1,y.value="任务 "+a+" 已完成"}catch(i){if(b)break;o+=1,y.value="第 "+l+" 条任务处理失败,已自动继续下一条:"+(i instanceof Error?i.message:"未知错误"),u.error(y.value),F([r]);continue}}(s>0||o>0)&&u.success("店铺推送已完成:成功 "+s+" 条,失败 "+o+" 条"),await T(),H(!0)}catch(l){if(b)return;y.value=l instanceof Error?l.message:"推送异常",u.error(y.value)}finally{se.value=!1,z.value=!1}}return wt(()=>{st(),Xe(),Ye(),Ze(),re().catch(()=>{}),We().catch(()=>{}),T().then(()=>(V(),Re())).catch(()=>{}),I().catch(()=>{}),k.value.length&&H(!0)}),_t(()=>{b=!0,rt(),lt(),C.clearScope(),$&&C.clearTimer("preference-save",$)}),(e,t)=>{const s=St,o=Ct,l=It,r=Pt,i=Et;return c(),d("div",Wt,[m($t,{active:"product-risk"}),n("div",Xt,[n("aside",Yt,[t[7]||(t[7]=n("div",{class:"section-title"},"店铺名称",-1)),n("div",Zt,[t[3]||(t[3]=n("div",{class:"hint"},"输入店铺名后点「确认」加入下方备选区(按当前登录用户保存)。仅索引可命中的店铺可入库。勾选备选后点「匹配店铺」,再「推送到 Python 队列」。",-1)),n("div",es,[m(s,{modelValue:O.value,"onUpdate:modelValue":t[0]||(t[0]=a=>O.value=a),clearable:"",placeholder:"请输入店铺名称",onKeyup:bt(Fe,["enter"])},null,8,["modelValue"]),n("button",{type:"button",class:"opt-btn",disabled:Q.value,onClick:Fe},f(Q.value?"保存中…":"确认"),9,ts)])]),t[8]||(t[8]=n("div",{class:"section-title"},"备选区域",-1)),te.value.length?(c(),d("div",as,[m(l,{data:te.value,"row-key":"id",height:"240",class:"candidate-table",onSelectionChange:at},{default:P(()=>[m(o,{type:"selection",width:"42"}),m(o,{prop:"shop_name",label:"店铺名","min-width":"120","show-overflow-tooltip":""}),m(o,{label:"操作",width:"72",align:"center"},{default:P(({row:a})=>[n("button",{type:"button",class:"link-danger",onClick:w=>ut(a)},"删除",8,ns)]),_:1})]),_:1},8,["data"])])):(c(),d("div",ss,"暂无备选店铺,请先输入并确认")),t[9]||(t[9]=n("div",{class:"section-title"},"处理国家与顺序",-1)),t[10]||(t[10]=n("p",{class:"hint country-pref-hint"},[M(" 勾选需要处理的站点(可只选 2~3 国);上方勾选区"),n("strong",null,"先按已选顺序"),M("排列,其余未选国家排在后面。拖拽下方列表调整顺序后会与上方同步。设置会按当前登录用户保存。 ")],-1)),n("div",os,[(c(!0),d(U,null,J(je.value,a=>(c(),d("label",{key:a.code,class:"country-check-row"},[n("input",{type:"checkbox",class:"country-check-input",checked:Ve(a.code),disabled:ye(a.code),onChange:w=>Ke(a.code,w)},null,40,ls),n("span",rs,f(a.label)+"("+f(a.code)+")",1)]))),128))]),h.value.length?(c(),d("div",us,[t[5]||(t[5]=n("div",{class:"country-order-caption"},"已选顺序(拖拽 ⋮⋮ 调整)",-1)),n("div",is,[(c(!0),d(U,null,J(h.value,(a,w)=>(c(),d("div",{key:a,class:Z(["country-drag-row",{dragging:A.value===w}]),draggable:"true",onDragstart:Y=>Je(w),onDragend:Qe,onDragover:t[1]||(t[1]=Ae(()=>{},["prevent"])),onDrop:Ae(Y=>Ge(w),["prevent"])},[t[4]||(t[4]=n("span",{class:"drag-handle",title:"拖动排序"},"⋮⋮",-1)),n("span",ds,f(he(a))+"("+f(a)+")",1)],42,cs))),128))])])):_("",!0),ae.value?(c(),d("div",fs,"保存中…")):_("",!0),t[11]||(t[11]=n("div",{class:"section-title"},"商品列表筛选",-1)),t[12]||(t[12]=n("p",{class:"hint listing-filter-hint"},"与「推送到 Python 队列」一并下发,供 Python 区分处理场景。",-1)),n("div",vs,[m(i,{modelValue:D.value,"onUpdate:modelValue":t[2]||(t[2]=a=>D.value=a),class:"listing-filter-select",teleported:"",placeholder:"选择筛选类型"},{default:P(()=>[(c(!0),d(U,null,J(Tt(Gt),a=>(c(),Be(r,{key:a.value,label:a.label,value:a.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),n("div",ps,[n("button",{type:"button",class:"btn-run",disabled:G.value,onClick:dt},f(G.value?"匹配中…":"匹配店铺"),9,hs),n("button",{type:"button",class:"btn-run btn-queue",disabled:z.value||!p.value.length,onClick:pt},f(z.value?"推送中…":"推送到 Python 队列"),9,ys)]),t[13]||(t[13]=n("p",{class:"loading-msg"},[M("在搜索结果中禁止显示、详情页面已删除会把匹配店铺合并为一个任务入队,避免同时打开多个紫鸟窗口;其它筛选仍按店铺逐条入队。Python 每处理完一店可 POST "),n("code",null,"/api/product-risk-resolve/tasks/{taskId}/result"),M("(可多次,每次可只含已完成的店铺);全部完成后任务结束。前端轮询任务状态。 ")],-1)),y.value?(c(),d("div",ks,[t[6]||(t[6]=n("div",{class:"section-title queue-debug-title"},"推送结果",-1)),n("div",gs,f(y.value),1),L.value?(c(),d("pre",ms,f(L.value),1)):_("",!0)])):_("",!0)]),n("section",ws,[t[22]||(t[22]=n("div",{class:"panel-header"},"匹配与任务",-1)),n("div",_s,[n("div",bs,[n("div",Ss,[t[14]||(t[14]=n("span",{class:"summary-label"},"备选店铺数",-1)),n("strong",null,f(B.value.candidateCount),1)]),n("div",Cs,[t[15]||(t[15]=n("span",{class:"summary-label"},"已结束任务",-1)),n("strong",null,f(B.value.processedTaskCount),1)]),n("div",Is,[t[16]||(t[16]=n("span",{class:"summary-label"},"成功任务",-1)),n("strong",null,f(B.value.successTaskCount),1)]),n("div",Ts,[t[17]||(t[17]=n("span",{class:"summary-label"},"失败任务",-1)),n("strong",null,f(B.value.failedTaskCount),1)])]),t[21]||(t[21]=n("div",{class:"subsection-title"},"匹配结果",-1)),p.value.length?(c(),Be(l,{key:1,data:p.value,"row-key":j,"highlight-current-row":!1,class:"result-table match-table"},{default:P(()=>[m(o,{prop:"shopName",label:"店铺名","min-width":"100"}),m(o,{label:"匹配",width:"72",align:"center"},{default:P(({row:a})=>[n("span",{class:Z(a.matched?"ok":"fail")},f(a.matched?"是":"否"),3)]),_:1}),m(o,{prop:"shopId",label:"店铺ID","min-width":"120","show-overflow-tooltip":""}),m(o,{prop:"platform",label:"平台",width:"88","show-overflow-tooltip":""}),m(o,{prop:"companyName",label:"公司","min-width":"100","show-overflow-tooltip":""}),m(o,{label:"状态",width:"100","show-overflow-tooltip":""},{default:P(({row:a})=>[M(f(ft(a.matchStatus)),1)]),_:1}),m(o,{label:"说明","min-width":"140","show-overflow-tooltip":""},{default:P(({row:a})=>[M(f(vt(a)),1)]),_:1}),m(o,{label:"操作",width:"72",align:"center"},{default:P(({row:a})=>[n("button",{type:"button",class:"link-danger",onClick:w=>tt(a)},"删除",8,Es)]),_:1})]),_:1},8,["data"])):(c(),d("div",Ps,"完成「匹配店铺」后,在此展示紫鸟索引匹配结果,供核对后再推送队列。")),n("div",Ns,[t[20]||(t[20]=n("div",{class:"result-list-header"},[n("span",null,"处理记录")],-1)),nt.value?(c(),d(U,{key:1},[ue.value.length?(c(),d("div",Ds,[t[18]||(t[18]=n("div",{class:"result-subsection-title"},"当前任务",-1)),n("ul",$s,[(c(!0),d(U,null,J(ue.value,a=>(c(),d("li",{key:`cur-${a.resultId}-${a.taskId}`,class:"task-item split-result-item"},[n("div",Fs,[n("span",{class:"id",title:a.shopName||""},f(a.shopName||"-"),9,Ms),n("div",Us,"任务 ID:"+f(a.taskId??"-"),1),a.platform?(c(),d("div",Os,"平台:"+f(a.platform),1)):_("",!0),a.error?(c(),d("div",Ls,"错误:"+f(a.error),1)):_("",!0)]),n("div",As,[n("span",{class:Z(["status",Ue(a)])},f(Me(a)),3),Oe(a)?(c(),d("button",{key:0,type:"button",class:"download",onClick:w=>Le(a)}," 下载 ",8,Bs)):_("",!0),n("button",{type:"button",class:"btn-delete",onClick:w=>Se(a)},"删除",8,qs)])]))),128))])])):_("",!0),ie.value.length?(c(),d("div",xs,[t[19]||(t[19]=n("div",{class:"result-subsection-title"},"历史记录",-1)),n("ul",js,[(c(!0),d(U,null,J(ie.value,a=>(c(),d("li",{key:`his-${a.resultId}-${a.taskId}`,class:"task-item split-result-item"},[n("div",Vs,[n("span",{class:"id",title:a.shopName||""},f(a.shopName||"-"),9,Ks),n("div",Hs,"任务 ID:"+f(a.taskId??"-"),1),a.outputFilename?(c(),d("div",Js,"文件:"+f(a.outputFilename),1)):_("",!0),a.error?(c(),d("div",Qs,"错误:"+f(a.error),1)):_("",!0)]),n("div",Gs,[n("span",{class:Z(["status",Ue(a)])},f(Me(a)),3),Oe(a)?(c(),d("button",{key:0,type:"button",class:"download",onClick:w=>Le(a)}," 下载 ",8,zs)):_("",!0),n("button",{type:"button",class:"btn-delete",onClick:w=>Se(a)},"删除",8,Ws)])]))),128))])])):_("",!0)],64)):(c(),d("div",Rs,"暂无处理记录。推送队列并等待 Python 回传后,将在此显示下载链接。"))])])])])])}}}),Ys=Nt(Xs,[["__scopeId","data-v-7520aec4"]]);Rt(Ys).use(Dt).mount("#app"); diff --git a/app/assets/pywebview-B8lwamDf.js b/app/assets/pywebview-B8lwamDf.js deleted file mode 100644 index 74cc428..0000000 --- a/app/assets/pywebview-B8lwamDf.js +++ /dev/null @@ -1,50 +0,0 @@ -(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))a(o);new MutationObserver(o=>{for(const l of o)if(l.type==="childList")for(const s of l.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&a(s)}).observe(document,{childList:!0,subtree:!0});function n(o){const l={};return o.integrity&&(l.integrity=o.integrity),o.referrerPolicy&&(l.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?l.credentials="include":o.crossOrigin==="anonymous"?l.credentials="omit":l.credentials="same-origin",l}function a(o){if(o.ep)return;o.ep=!0;const l=n(o);fetch(o.href,l)}})();function Xp(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const nn={},Ms=[],Pt=()=>{},t0=()=>!1,Wc=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Zp=e=>e.startsWith("onUpdate:"),kn=Object.assign,Jp=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},X2=Object.prototype.hasOwnProperty,Tt=(e,t)=>X2.call(e,t),ye=Array.isArray,Ps=e=>Ei(e)==="[object Map]",jc=e=>Ei(e)==="[object Set]",wl=e=>Ei(e)==="[object Date]",Be=e=>typeof e=="function",_e=e=>typeof e=="string",Da=e=>typeof e=="symbol",et=e=>e!==null&&typeof e=="object",Jl=e=>(et(e)||Be(e))&&Be(e.then)&&Be(e.catch),n0=Object.prototype.toString,Ei=e=>n0.call(e),Z2=e=>Ei(e).slice(8,-1),qr=e=>Ei(e)==="[object Object]",Yc=e=>_e(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Pr=Xp(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Uc=e=>{const t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},J2=/-\w/g,Nn=Uc(e=>e.replace(J2,t=>t.slice(1).toUpperCase())),Q2=/\B([A-Z])/g,Go=Uc(e=>e.replace(Q2,"-$1").toLowerCase()),xi=Uc(e=>e.charAt(0).toUpperCase()+e.slice(1)),Rr=Uc(e=>e?`on${xi(e)}`:""),so=(e,t)=>!Object.is(e,t),Iu=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:a,value:n})},Qp=e=>{const t=parseFloat(e);return isNaN(t)?e:t},eE=e=>{const t=_e(e)?Number(e):NaN;return isNaN(t)?e:t};let um;const qc=()=>um||(um=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function He(e){if(ye(e)){const t={};for(let n=0;n{if(n){const a=n.split(nE);a.length>1&&(t[a[0].trim()]=a[1].trim())}}),t}function T(e){let t="";if(_e(e))t=e;else if(ye(e))for(let n=0;nQl(n,t))}const s0=e=>!!(e&&e.__v_isRef===!0),ke=e=>_e(e)?e:e==null?"":ye(e)||et(e)&&(e.toString===n0||!Be(e.toString))?s0(e)?ke(e.value):JSON.stringify(e,r0,2):String(e),r0=(e,t)=>s0(t)?r0(e,t.value):Ps(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[a,o],l)=>(n[Fd(a,l)+" =>"]=o,n),{})}:jc(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Fd(n))}:Da(t)?Fd(t):et(t)&&!ye(t)&&!qr(t)?String(t):t,Fd=(e,t="")=>{var n;return Da(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};let Vn;class i0{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.__v_skip=!0,this.parent=Vn,!t&&Vn&&(this.index=(Vn.scopes||(Vn.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0&&--this._on===0&&(Vn=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,a;for(n=0,a=this.effects.length;n0)return;if(_r){let t=_r;for(_r=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Ar;){let t=Ar;for(Ar=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(a){e||(e=a)}t=n}}if(e)throw e}function v0(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function h0(e){let t,n=e.depsTail,a=n;for(;a;){const o=a.prevDep;a.version===-1?(a===n&&(n=o),nv(a),uE(a)):t=a,a.dep.activeLink=a.prevActiveLink,a.prevActiveLink=void 0,a=o}e.deps=t,e.depsTail=n}function Nf(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(m0(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function m0(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Gr)||(e.globalVersion=Gr,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Nf(e))))return;e.flags|=2;const t=e.dep,n=ln,a=Ra;ln=e,Ra=!0;try{v0(e);const o=e.fn(e._value);(t.version===0||so(o,e._value))&&(e.flags|=128,e._value=o,t.version++)}catch(o){throw t.version++,o}finally{ln=n,Ra=a,h0(e),e.flags&=-3}}function nv(e,t=!1){const{dep:n,prevSub:a,nextSub:o}=e;if(a&&(a.nextSub=o,e.prevSub=void 0),o&&(o.prevSub=a,e.nextSub=void 0),n.subs===e&&(n.subs=a,!a&&n.computed)){n.computed.flags&=-5;for(let l=n.computed.deps;l;l=l.nextDep)nv(l,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function uE(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let Ra=!0;const g0=[];function zo(){g0.push(Ra),Ra=!1}function Ho(){const e=g0.pop();Ra=e===void 0?!0:e}function cm(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=ln;ln=void 0;try{t()}finally{ln=n}}}let Gr=0;class cE{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class av{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!ln||!Ra||ln===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==ln)n=this.activeLink=new cE(ln,this),ln.deps?(n.prevDep=ln.depsTail,ln.depsTail.nextDep=n,ln.depsTail=n):ln.deps=ln.depsTail=n,b0(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const a=n.nextDep;a.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=a),n.prevDep=ln.depsTail,n.nextDep=void 0,ln.depsTail.nextDep=n,ln.depsTail=n,ln.deps===n&&(ln.deps=a)}return n}trigger(t){this.version++,Gr++,this.notify(t)}notify(t){ev();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{tv()}}}function b0(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let a=t.deps;a;a=a.nextDep)b0(a)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const sc=new WeakMap,Ul=Symbol(""),Mf=Symbol(""),Xr=Symbol("");function zn(e,t,n){if(Ra&&ln){let a=sc.get(e);a||sc.set(e,a=new Map);let o=a.get(n);o||(a.set(n,o=new av),o.map=a,o.key=n),o.track()}}function Mo(e,t,n,a,o,l){const s=sc.get(e);if(!s){Gr++;return}const r=u=>{u&&u.trigger()};if(ev(),t==="clear")s.forEach(r);else{const u=ye(e),c=u&&Yc(n);if(u&&n==="length"){const d=Number(a);s.forEach((f,h)=>{(h==="length"||h===Xr||!Da(h)&&h>=d)&&r(f)})}else switch((n!==void 0||s.has(void 0))&&r(s.get(n)),c&&r(s.get(Xr)),t){case"add":u?c&&r(s.get("length")):(r(s.get(Ul)),Ps(e)&&r(s.get(Mf)));break;case"delete":u||(r(s.get(Ul)),Ps(e)&&r(s.get(Mf)));break;case"set":Ps(e)&&r(s.get(Ul));break}}tv()}function dE(e,t){const n=sc.get(e);return n&&n.get(t)}function gs(e){const t=Ht(e);return t===e?t:(zn(t,"iterate",Xr),ma(e)?t:t.map(Ba))}function Gc(e){return zn(e=Ht(e),"iterate",Xr),e}function oo(e,t){return Ko(e)?Ks(ql(e)?Ba(t):t):Ba(t)}const fE={__proto__:null,[Symbol.iterator](){return Hd(this,Symbol.iterator,e=>oo(this,e))},concat(...e){return gs(this).concat(...e.map(t=>ye(t)?gs(t):t))},entries(){return Hd(this,"entries",e=>(e[1]=oo(this,e[1]),e))},every(e,t){return $o(this,"every",e,t,void 0,arguments)},filter(e,t){return $o(this,"filter",e,t,n=>n.map(a=>oo(this,a)),arguments)},find(e,t){return $o(this,"find",e,t,n=>oo(this,n),arguments)},findIndex(e,t){return $o(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return $o(this,"findLast",e,t,n=>oo(this,n),arguments)},findLastIndex(e,t){return $o(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return $o(this,"forEach",e,t,void 0,arguments)},includes(...e){return Kd(this,"includes",e)},indexOf(...e){return Kd(this,"indexOf",e)},join(e){return gs(this).join(e)},lastIndexOf(...e){return Kd(this,"lastIndexOf",e)},map(e,t){return $o(this,"map",e,t,void 0,arguments)},pop(){return br(this,"pop")},push(...e){return br(this,"push",e)},reduce(e,...t){return dm(this,"reduce",e,t)},reduceRight(e,...t){return dm(this,"reduceRight",e,t)},shift(){return br(this,"shift")},some(e,t){return $o(this,"some",e,t,void 0,arguments)},splice(...e){return br(this,"splice",e)},toReversed(){return gs(this).toReversed()},toSorted(e){return gs(this).toSorted(e)},toSpliced(...e){return gs(this).toSpliced(...e)},unshift(...e){return br(this,"unshift",e)},values(){return Hd(this,"values",e=>oo(this,e))}};function Hd(e,t,n){const a=Gc(e),o=a[t]();return a!==e&&!ma(e)&&(o._next=o.next,o.next=()=>{const l=o._next();return l.done||(l.value=n(l.value)),l}),o}const pE=Array.prototype;function $o(e,t,n,a,o,l){const s=Gc(e),r=s!==e&&!ma(e),u=s[t];if(u!==pE[t]){const f=u.apply(e,l);return r?Ba(f):f}let c=n;s!==e&&(r?c=function(f,h){return n.call(this,oo(e,f),h,e)}:n.length>2&&(c=function(f,h){return n.call(this,f,h,e)}));const d=u.call(s,c,a);return r&&o?o(d):d}function dm(e,t,n,a){const o=Gc(e),l=o!==e&&!ma(e);let s=n,r=!1;o!==e&&(l?(r=a.length===0,s=function(c,d,f){return r&&(r=!1,c=oo(e,c)),n.call(this,c,oo(e,d),f,e)}):n.length>3&&(s=function(c,d,f){return n.call(this,c,d,f,e)}));const u=o[t](s,...a);return r?oo(e,u):u}function Kd(e,t,n){const a=Ht(e);zn(a,"iterate",Xr);const o=a[t](...n);return(o===-1||o===!1)&&Xc(n[0])?(n[0]=Ht(n[0]),a[t](...n)):o}function br(e,t,n=[]){zo(),ev();const a=Ht(e)[t].apply(e,n);return tv(),Ho(),a}const vE=Xp("__proto__,__v_isRef,__isVue"),y0=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Da));function hE(e){Da(e)||(e=String(e));const t=Ht(this);return zn(t,"has",e),t.hasOwnProperty(e)}class w0{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,a){if(n==="__v_skip")return t.__v_skip;const o=this._isReadonly,l=this._isShallow;if(n==="__v_isReactive")return!o;if(n==="__v_isReadonly")return o;if(n==="__v_isShallow")return l;if(n==="__v_raw")return a===(o?l?xE:E0:l?k0:S0).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(a)?t:void 0;const s=ye(t);if(!o){let u;if(s&&(u=fE[n]))return u;if(n==="hasOwnProperty")return hE}const r=Reflect.get(t,n,Yt(t)?t:a);if((Da(n)?y0.has(n):vE(n))||(o||zn(t,"get",n),l))return r;if(Yt(r)){const u=s&&Yc(n)?r:r.value;return o&&et(u)?es(u):u}return et(r)?o?es(r):Nt(r):r}}class C0 extends w0{constructor(t=!1){super(!1,t)}set(t,n,a,o){let l=t[n];const s=ye(t)&&Yc(n);if(!this._isShallow){const c=Ko(l);if(!ma(a)&&!Ko(a)&&(l=Ht(l),a=Ht(a)),!s&&Yt(l)&&!Yt(a))return c||(l.value=a),!0}const r=s?Number(n)e,lu=e=>Reflect.getPrototypeOf(e);function wE(e,t,n){return function(...a){const o=this.__v_raw,l=Ht(o),s=Ps(l),r=e==="entries"||e===Symbol.iterator&&s,u=e==="keys"&&s,c=o[e](...a),d=n?Pf:t?Ks:Ba;return!t&&zn(l,"iterate",u?Mf:Ul),kn(Object.create(c),{next(){const{value:f,done:h}=c.next();return h?{value:f,done:h}:{value:r?[d(f[0]),d(f[1])]:d(f),done:h}}})}}function su(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function CE(e,t){const n={get(o){const l=this.__v_raw,s=Ht(l),r=Ht(o);e||(so(o,r)&&zn(s,"get",o),zn(s,"get",r));const{has:u}=lu(s),c=t?Pf:e?Ks:Ba;if(u.call(s,o))return c(l.get(o));if(u.call(s,r))return c(l.get(r));l!==s&&l.get(o)},get size(){const o=this.__v_raw;return!e&&zn(Ht(o),"iterate",Ul),o.size},has(o){const l=this.__v_raw,s=Ht(l),r=Ht(o);return e||(so(o,r)&&zn(s,"has",o),zn(s,"has",r)),o===r?l.has(o):l.has(o)||l.has(r)},forEach(o,l){const s=this,r=s.__v_raw,u=Ht(r),c=t?Pf:e?Ks:Ba;return!e&&zn(u,"iterate",Ul),r.forEach((d,f)=>o.call(l,c(d),c(f),s))}};return kn(n,e?{add:su("add"),set:su("set"),delete:su("delete"),clear:su("clear")}:{add(o){const l=Ht(this),s=lu(l),r=Ht(o),u=!t&&!ma(o)&&!Ko(o)?r:o;return s.has.call(l,u)||so(o,u)&&s.has.call(l,o)||so(r,u)&&s.has.call(l,r)||(l.add(u),Mo(l,"add",u,u)),this},set(o,l){!t&&!ma(l)&&!Ko(l)&&(l=Ht(l));const s=Ht(this),{has:r,get:u}=lu(s);let c=r.call(s,o);c||(o=Ht(o),c=r.call(s,o));const d=u.call(s,o);return s.set(o,l),c?so(l,d)&&Mo(s,"set",o,l):Mo(s,"add",o,l),this},delete(o){const l=Ht(this),{has:s,get:r}=lu(l);let u=s.call(l,o);u||(o=Ht(o),u=s.call(l,o)),r&&r.call(l,o);const c=l.delete(o);return u&&Mo(l,"delete",o,void 0),c},clear(){const o=Ht(this),l=o.size!==0,s=o.clear();return l&&Mo(o,"clear",void 0,void 0),s}}),["keys","values","entries",Symbol.iterator].forEach(o=>{n[o]=wE(o,e,t)}),n}function ov(e,t){const n=CE(e,t);return(a,o,l)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?a:Reflect.get(Tt(n,o)&&o in a?n:a,o,l)}const SE={get:ov(!1,!1)},kE={get:ov(!1,!0)},EE={get:ov(!0,!1)};const S0=new WeakMap,k0=new WeakMap,E0=new WeakMap,xE=new WeakMap;function TE(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function $E(e){return e.__v_skip||!Object.isExtensible(e)?0:TE(Z2(e))}function Nt(e){return Ko(e)?e:sv(e,!1,gE,SE,S0)}function lv(e){return sv(e,!1,yE,kE,k0)}function es(e){return sv(e,!0,bE,EE,E0)}function sv(e,t,n,a,o){if(!et(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const l=$E(e);if(l===0)return e;const s=o.get(e);if(s)return s;const r=new Proxy(e,l===2?a:n);return o.set(e,r),r}function ql(e){return Ko(e)?ql(e.__v_raw):!!(e&&e.__v_isReactive)}function Ko(e){return!!(e&&e.__v_isReadonly)}function ma(e){return!!(e&&e.__v_isShallow)}function Xc(e){return e?!!e.__v_raw:!1}function Ht(e){const t=e&&e.__v_raw;return t?Ht(t):e}function uo(e){return!Tt(e,"__v_skip")&&Object.isExtensible(e)&&a0(e,"__v_skip",!0),e}const Ba=e=>et(e)?Nt(e):e,Ks=e=>et(e)?es(e):e;function Yt(e){return e?e.__v_isRef===!0:!1}function R(e){return x0(e,!1)}function jt(e){return x0(e,!0)}function x0(e,t){return Yt(e)?e:new OE(e,t)}class OE{constructor(t,n){this.dep=new av,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:Ht(t),this._value=n?t:Ba(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,a=this.__v_isShallow||ma(t)||Ko(t);t=a?t:Ht(t),so(t,n)&&(this._rawValue=t,this._value=a?t:Ba(t),this.dep.trigger())}}function Nu(e){e.dep&&e.dep.trigger()}function i(e){return Yt(e)?e.value:e}function fm(e){return Be(e)?e():i(e)}const IE={get:(e,t,n)=>t==="__v_raw"?e:i(Reflect.get(e,t,n)),set:(e,t,n,a)=>{const o=e[t];return Yt(o)&&!Yt(n)?(o.value=n,!0):Reflect.set(e,t,n,a)}};function T0(e){return ql(e)?e:new Proxy(e,IE)}function En(e){const t=ye(e)?new Array(e.length):{};for(const n in e)t[n]=$0(e,n);return t}class NE{constructor(t,n,a){this._object=t,this._key=n,this._defaultValue=a,this.__v_isRef=!0,this._value=void 0,this._raw=Ht(t);let o=!0,l=t;if(!ye(t)||!Yc(String(n)))do o=!Xc(l)||ma(l);while(o&&(l=l.__v_raw));this._shallow=o}get value(){let t=this._object[this._key];return this._shallow&&(t=i(t)),this._value=t===void 0?this._defaultValue:t}set value(t){if(this._shallow&&Yt(this._raw[this._key])){const n=this._object[this._key];if(Yt(n)){n.value=t;return}}this._object[this._key]=t}get dep(){return dE(this._raw,this._key)}}class ME{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function _t(e,t,n){return Yt(e)?e:Be(e)?new ME(e):et(e)&&arguments.length>1?$0(e,t,n):R(e)}function $0(e,t,n){return new NE(e,t,n)}class PE{constructor(t,n,a){this.fn=t,this.setter=n,this._value=void 0,this.dep=new av(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Gr-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=a}notify(){if(this.flags|=16,!(this.flags&8)&&ln!==this)return p0(this,!0),!0}get value(){const t=this.dep.track();return m0(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function RE(e,t,n=!1){let a,o;return Be(e)?a=e:(a=e.get,o=e.set),new PE(a,o,n)}const ru={},rc=new WeakMap;let _l;function AE(e,t=!1,n=_l){if(n){let a=rc.get(n);a||rc.set(n,a=[]),a.push(e)}}function _E(e,t,n=nn){const{immediate:a,deep:o,once:l,scheduler:s,augmentJob:r,call:u}=n,c=C=>o?C:ma(C)||o===!1||o===0?Po(C,1):Po(C);let d,f,h,g,v=!1,p=!1;if(Yt(e)?(f=()=>e.value,v=ma(e)):ql(e)?(f=()=>c(e),v=!0):ye(e)?(p=!0,v=e.some(C=>ql(C)||ma(C)),f=()=>e.map(C=>{if(Yt(C))return C.value;if(ql(C))return c(C);if(Be(C))return u?u(C,2):C()})):Be(e)?t?f=u?()=>u(e,2):e:f=()=>{if(h){zo();try{h()}finally{Ho()}}const C=_l;_l=d;try{return u?u(e,3,[g]):e(g)}finally{_l=C}}:f=Pt,t&&o){const C=f,S=o===!0?1/0:o;f=()=>Po(C(),S)}const m=u0(),b=()=>{d.stop(),m&&m.active&&Jp(m.effects,d)};if(l&&t){const C=t;t=(...S)=>{C(...S),b()}}let k=p?new Array(e.length).fill(ru):ru;const w=C=>{if(!(!(d.flags&1)||!d.dirty&&!C))if(t){const S=d.run();if(o||v||(p?S.some((E,O)=>so(E,k[O])):so(S,k))){h&&h();const E=_l;_l=d;try{const O=[S,k===ru?void 0:p&&k[0]===ru?[]:k,g];k=S,u?u(t,3,O):t(...O)}finally{_l=E}}}else d.run()};return r&&r(w),d=new d0(f),d.scheduler=s?()=>s(w,!1):w,g=C=>AE(C,!1,d),h=d.onStop=()=>{const C=rc.get(d);if(C){if(u)u(C,4);else for(const S of C)S();rc.delete(d)}},t?a?w(!0):k=d.run():s?s(w.bind(null,!0),!0):d.run(),b.pause=d.pause.bind(d),b.resume=d.resume.bind(d),b.stop=b,b}function Po(e,t=1/0,n){if(t<=0||!et(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,Yt(e))Po(e.value,t,n);else if(ye(e))for(let a=0;a{Po(a,t,n)});else if(qr(e)){for(const a in e)Po(e[a],t,n);for(const a of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,a)&&Po(e[a],t,n)}return e}function Ti(e,t,n,a){try{return a?e(...a):e()}catch(o){Zc(o,t,n)}}function Va(e,t,n,a){if(Be(e)){const o=Ti(e,t,n,a);return o&&Jl(o)&&o.catch(l=>{Zc(l,t,n)}),o}if(ye(e)){const o=[];for(let l=0;l>>1,o=Zn[a],l=Zr(o);l=Zr(n)?Zn.push(e):Zn.splice(DE(t),0,e),e.flags|=1,I0()}}function I0(){ic||(ic=O0.then(M0))}function BE(e){ye(e)?Rs.push(...e):cl&&e.id===-1?cl.splice(xs+1,0,e):e.flags&1||(Rs.push(e),e.flags|=1),I0()}function pm(e,t,n=no+1){for(;nZr(n)-Zr(a));if(Rs.length=0,cl){cl.push(...t);return}for(cl=t,xs=0;xse.id==null?e.flags&2?-1:1/0:e.id;function M0(e){try{for(no=0;no{a._d&&fc(-1);const l=uc(t);let s;try{s=e(...o)}finally{uc(l),a._d&&fc(1)}return s};return a._n=!0,a._c=!0,a._d=!0,a}function st(e,t){if(An===null)return e;const n=nd(An),a=e.dirs||(e.dirs=[]);for(let o=0;o1)return n&&Be(t)?t.call(a&&a.proxy):t}}const VE=Symbol.for("v-scx"),FE=()=>Re(VE);function ia(e,t){return iv(e,null,t)}function re(e,t,n){return iv(e,t,n)}function iv(e,t,n=nn){const{immediate:a,deep:o,flush:l,once:s}=n,r=kn({},n),u=t&&a||!t&&l!=="post";let c;if(ei){if(l==="sync"){const g=FE();c=g.__watcherHandles||(g.__watcherHandles=[])}else if(!u){const g=()=>{};return g.stop=Pt,g.resume=Pt,g.pause=Pt,g}}const d=Hn;r.call=(g,v,p)=>Va(g,d,v,p);let f=!1;l==="post"?r.scheduler=g=>{Bn(g,d&&d.suspense)}:l!=="sync"&&(f=!0,r.scheduler=(g,v)=>{v?g():rv(g)}),r.augmentJob=g=>{t&&(g.flags|=4),f&&(g.flags|=2,d&&(g.id=d.uid,g.i=d))};const h=_E(e,t,r);return ei&&(c?c.push(h):u&&h()),h}function zE(e,t,n){const a=this.proxy,o=_e(e)?e.includes(".")?R0(a,e):()=>a[e]:e.bind(a,a);let l;Be(t)?l=t:(l=t.handler,n=t);const s=Oi(this),r=iv(o,l.bind(a),n);return s(),r}function R0(e,t){const n=t.split(".");return()=>{let a=e;for(let o=0;oe.__isTeleport,Lr=e=>e&&(e.disabled||e.disabled===""),vm=e=>e&&(e.defer||e.defer===""),hm=e=>typeof SVGElement<"u"&&e instanceof SVGElement,mm=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,Rf=(e,t)=>{const n=e&&e.to;return _e(n)?t?t(n):null:n},L0={name:"Teleport",__isTeleport:!0,process(e,t,n,a,o,l,s,r,u,c){const{mc:d,pc:f,pbc:h,o:{insert:g,querySelector:v,createText:p,createComment:m}}=c,b=Lr(t.props);let{shapeFlag:k,children:w,dynamicChildren:C}=t;if(e==null){const S=t.el=p(""),E=t.anchor=p("");g(S,n,a),g(E,n,a);const O=(N,I)=>{k&16&&d(w,N,I,o,l,s,r,u)},$=()=>{const N=t.target=Rf(t.props,v),I=Af(N,t,p,g);N&&(s!=="svg"&&hm(N)?s="svg":s!=="mathml"&&mm(N)&&(s="mathml"),o&&o.isCE&&(o.ce._teleportTargets||(o.ce._teleportTargets=new Set)).add(N),b||(O(N,I),Mu(t,!1)))};b&&(O(n,E),Mu(t,!0)),vm(t.props)?(t.el.__isMounted=!1,Bn(()=>{$(),delete t.el.__isMounted},l)):$()}else{if(vm(t.props)&&e.el.__isMounted===!1){Bn(()=>{L0.process(e,t,n,a,o,l,s,r,u,c)},l);return}t.el=e.el,t.targetStart=e.targetStart;const S=t.anchor=e.anchor,E=t.target=e.target,O=t.targetAnchor=e.targetAnchor,$=Lr(e.props),N=$?n:E,I=$?S:O;if(s==="svg"||hm(E)?s="svg":(s==="mathml"||mm(E))&&(s="mathml"),C?(h(e.dynamicChildren,C,N,o,l,s,r),gv(e,t,!0)):u||f(e,t,N,I,o,l,s,r,!1),b)$?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):iu(t,n,S,c,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const _=t.target=Rf(t.props,v);_&&iu(t,_,null,c,0)}else $&&iu(t,E,O,c,1);Mu(t,b)}},remove(e,t,n,{um:a,o:{remove:o}},l){const{shapeFlag:s,children:r,anchor:u,targetStart:c,targetAnchor:d,target:f,props:h}=e;if(f&&(o(c),o(d)),l&&o(u),s&16){const g=l||!Lr(h);for(let v=0;v{e.isMounted=!0}),Rt(()=>{e.isUnmounting=!0}),e}const wa=[Function,Array],B0={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:wa,onEnter:wa,onAfterEnter:wa,onEnterCancelled:wa,onBeforeLeave:wa,onLeave:wa,onAfterLeave:wa,onLeaveCancelled:wa,onBeforeAppear:wa,onAppear:wa,onAfterAppear:wa,onAppearCancelled:wa},V0=e=>{const t=e.subTree;return t.component?V0(t.component):t},WE={name:"BaseTransition",props:B0,setup(e,{slots:t}){const n=it(),a=D0();return()=>{const o=t.default&&uv(t.default(),!0);if(!o||!o.length)return;const l=F0(o),s=Ht(e),{mode:r}=s;if(a.isLeaving)return Wd(l);const u=gm(l);if(!u)return Wd(l);let c=Jr(u,s,a,n,f=>c=f);u.type!==un&&ts(u,c);let d=n.subTree&&gm(n.subTree);if(d&&d.type!==un&&!Dl(d,u)&&V0(n).type!==un){let f=Jr(d,s,a,n);if(ts(d,f),r==="out-in"&&u.type!==un)return a.isLeaving=!0,f.afterLeave=()=>{a.isLeaving=!1,n.job.flags&8||n.update(),delete f.afterLeave,d=void 0},Wd(l);r==="in-out"&&u.type!==un?f.delayLeave=(h,g,v)=>{const p=z0(a,d);p[String(d.key)]=d,h[ao]=()=>{g(),h[ao]=void 0,delete c.delayedLeave,d=void 0},c.delayedLeave=()=>{v(),delete c.delayedLeave,d=void 0}}:d=void 0}else d&&(d=void 0);return l}}};function F0(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==un){t=n;break}}return t}const jE=WE;function z0(e,t){const{leavingVNodes:n}=e;let a=n.get(t.type);return a||(a=Object.create(null),n.set(t.type,a)),a}function Jr(e,t,n,a,o){const{appear:l,mode:s,persisted:r=!1,onBeforeEnter:u,onEnter:c,onAfterEnter:d,onEnterCancelled:f,onBeforeLeave:h,onLeave:g,onAfterLeave:v,onLeaveCancelled:p,onBeforeAppear:m,onAppear:b,onAfterAppear:k,onAppearCancelled:w}=t,C=String(e.key),S=z0(n,e),E=(N,I)=>{N&&Va(N,a,9,I)},O=(N,I)=>{const _=I[1];E(N,I),ye(N)?N.every(A=>A.length<=1)&&_():N.length<=1&&_()},$={mode:s,persisted:r,beforeEnter(N){let I=u;if(!n.isMounted)if(l)I=m||u;else return;N[ao]&&N[ao](!0);const _=S[C];_&&Dl(e,_)&&_.el[ao]&&_.el[ao](),E(I,[N])},enter(N){if(S[C]===e)return;let I=c,_=d,A=f;if(!n.isMounted)if(l)I=b||c,_=k||d,A=w||f;else return;let F=!1;N[yr]=Y=>{F||(F=!0,Y?E(A,[N]):E(_,[N]),$.delayedLeave&&$.delayedLeave(),N[yr]=void 0)};const K=N[yr].bind(null,!1);I?O(I,[N,K]):K()},leave(N,I){const _=String(e.key);if(N[yr]&&N[yr](!0),n.isUnmounting)return I();E(h,[N]);let A=!1;N[ao]=K=>{A||(A=!0,I(),K?E(p,[N]):E(v,[N]),N[ao]=void 0,S[_]===e&&delete S[_])};const F=N[ao].bind(null,!1);S[_]=e,g?O(g,[N,F]):F()},clone(N){const I=Jr(N,t,n,a,o);return o&&o(I),I}};return $}function Wd(e){if(Jc(e))return e=mo(e),e.children=null,e}function gm(e){if(!Jc(e))return _0(e.type)&&e.children?F0(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&Be(n.default))return n.default()}}function ts(e,t){e.shapeFlag&6&&e.component?(e.transition=t,ts(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function uv(e,t=!1,n){let a=[],o=0;for(let l=0;l1)for(let l=0;lDr(p,t&&(ye(t)?t[m]:t),n,a,o));return}if(As(a)&&!o){a.shapeFlag&512&&a.type.__asyncResolved&&a.component.subTree.component&&Dr(e,t,n,a.component.subTree);return}const l=a.shapeFlag&4?nd(a.component):a.el,s=o?null:l,{i:r,r:u}=e,c=t&&t.r,d=r.refs===nn?r.refs={}:r.refs,f=r.setupState,h=Ht(f),g=f===nn?t0:p=>bm(d,p)?!1:Tt(h,p),v=(p,m)=>!(m&&bm(d,m));if(c!=null&&c!==u){if(ym(t),_e(c))d[c]=null,g(c)&&(f[c]=null);else if(Yt(c)){const p=t;v(c,p.k)&&(c.value=null),p.k&&(d[p.k]=null)}}if(Be(u))Ti(u,r,12,[s,d]);else{const p=_e(u),m=Yt(u);if(p||m){const b=()=>{if(e.f){const k=p?g(u)?f[u]:d[u]:v()||!e.k?u.value:d[e.k];if(o)ye(k)&&Jp(k,l);else if(ye(k))k.includes(l)||k.push(l);else if(p)d[u]=[l],g(u)&&(f[u]=d[u]);else{const w=[l];v(u,e.k)&&(u.value=w),e.k&&(d[e.k]=w)}}else p?(d[u]=s,g(u)&&(f[u]=s)):m&&(v(u,e.k)&&(u.value=s),e.k&&(d[e.k]=s))};if(s){const k=()=>{b(),cc.delete(e)};k.id=-1,cc.set(e,k),Bn(k,n)}else ym(e),b()}}}function ym(e){const t=cc.get(e);t&&(t.flags|=8,cc.delete(e))}qc().requestIdleCallback;qc().cancelIdleCallback;const As=e=>!!e.type.__asyncLoader,Jc=e=>e.type.__isKeepAlive;function $i(e,t){K0(e,"a",t)}function cv(e,t){K0(e,"da",t)}function K0(e,t,n=Hn){const a=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Qc(t,a,n),n){let o=n.parent;for(;o&&o.parent;)Jc(o.parent.vnode)&&YE(a,t,n,o),o=o.parent}}function YE(e,t,n,a){const o=Qc(t,e,a,!0);rr(()=>{Jp(a[t],o)},n)}function Qc(e,t,n=Hn,a=!1){if(n){const o=n[e]||(n[e]=[]),l=t.__weh||(t.__weh=(...s)=>{zo();const r=Oi(n),u=Va(t,n,e,s);return r(),Ho(),u});return a?o.unshift(l):o.push(l),l}}const Xo=e=>(t,n=Hn)=>{(!ei||e==="sp")&&Qc(e,(...a)=>t(...a),n)},ed=Xo("bm"),ct=Xo("m"),dv=Xo("bu"),Ya=Xo("u"),Rt=Xo("bum"),rr=Xo("um"),UE=Xo("sp"),qE=Xo("rtg"),GE=Xo("rtc");function XE(e,t=Hn){Qc("ec",e,t)}const fv="components",ZE="directives";function $t(e,t){return vv(fv,e,!0,t)||e}const W0=Symbol.for("v-ndc");function ot(e){return _e(e)?vv(fv,e,!1)||e:e||W0}function pv(e){return vv(ZE,e)}function vv(e,t,n=!0,a=!1){const o=An||Hn;if(o){const l=o.type;if(e===fv){const r=Rx(l,!1);if(r&&(r===t||r===Nn(t)||r===xi(Nn(t))))return l}const s=wm(o[e]||l[e],t)||wm(o.appContext[e],t);return!s&&a?l:s}}function wm(e,t){return e&&(e[t]||e[Nn(t)]||e[xi(Nn(t))])}function ht(e,t,n,a){let o;const l=n,s=ye(e);if(s||_e(e)){const r=s&&ql(e);let u=!1,c=!1;r&&(u=!ma(e),c=Ko(e),e=Gc(e)),o=new Array(e.length);for(let d=0,f=e.length;dt(r,u,void 0,l));else{const r=Object.keys(e);o=new Array(r.length);for(let u=0,c=r.length;u{const l=a.fn(...o);return l&&(l.key=a.key),l}:a.fn)}return e}function ee(e,t,n={},a,o){if(An.ce||An.parent&&As(An.parent)&&An.parent.ce){const c=Object.keys(n).length>0;return t!=="default"&&(n.name=t),x(),oe(Fe,null,[U("slot",n,a&&a())],c?-2:64)}let l=e[t];l&&l._c&&(l._d=!1),x();const s=l&&j0(l(n)),r=n.key||s&&s.key,u=oe(Fe,{key:(r&&!Da(r)?r:`_${t}`)+(!s&&a?"_fb":"")},s||(a?a():[]),s&&e._===1?64:-2);return u.scopeId&&(u.slotScopeIds=[u.scopeId+"-s"]),l&&l._c&&(l._d=!0),u}function j0(e){return e.some(t=>zt(t)?!(t.type===un||t.type===Fe&&!j0(t.children)):!0)?e:null}function JE(e,t){const n={};for(const a in e)n[Rr(a)]=e[a];return n}const _f=e=>e?dw(e)?nd(e):_f(e.parent):null,Br=kn(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>_f(e.parent),$root:e=>_f(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>q0(e),$forceUpdate:e=>e.f||(e.f=()=>{rv(e.update)}),$nextTick:e=>e.n||(e.n=Oe.bind(e.proxy)),$watch:e=>zE.bind(e)}),jd=(e,t)=>e!==nn&&!e.__isScriptSetup&&Tt(e,t),QE={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:a,data:o,props:l,accessCache:s,type:r,appContext:u}=e;if(t[0]!=="$"){const h=s[t];if(h!==void 0)switch(h){case 1:return a[t];case 2:return o[t];case 4:return n[t];case 3:return l[t]}else{if(jd(a,t))return s[t]=1,a[t];if(o!==nn&&Tt(o,t))return s[t]=2,o[t];if(Tt(l,t))return s[t]=3,l[t];if(n!==nn&&Tt(n,t))return s[t]=4,n[t];Lf&&(s[t]=0)}}const c=Br[t];let d,f;if(c)return t==="$attrs"&&zn(e.attrs,"get",""),c(e);if((d=r.__cssModules)&&(d=d[t]))return d;if(n!==nn&&Tt(n,t))return s[t]=4,n[t];if(f=u.config.globalProperties,Tt(f,t))return f[t]},set({_:e},t,n){const{data:a,setupState:o,ctx:l}=e;return jd(o,t)?(o[t]=n,!0):a!==nn&&Tt(a,t)?(a[t]=n,!0):Tt(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(l[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:a,appContext:o,props:l,type:s}},r){let u;return!!(n[r]||e!==nn&&r[0]!=="$"&&Tt(e,r)||jd(t,r)||Tt(l,r)||Tt(a,r)||Tt(Br,r)||Tt(o.config.globalProperties,r)||(u=s.__cssModules)&&u[r])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Tt(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function sn(){return Y0().slots}function Zo(){return Y0().attrs}function Y0(e){const t=it();return t.setupContext||(t.setupContext=pw(t))}function Cm(e){return ye(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Lf=!0;function ex(e){const t=q0(e),n=e.proxy,a=e.ctx;Lf=!1,t.beforeCreate&&Sm(t.beforeCreate,e,"bc");const{data:o,computed:l,methods:s,watch:r,provide:u,inject:c,created:d,beforeMount:f,mounted:h,beforeUpdate:g,updated:v,activated:p,deactivated:m,beforeDestroy:b,beforeUnmount:k,destroyed:w,unmounted:C,render:S,renderTracked:E,renderTriggered:O,errorCaptured:$,serverPrefetch:N,expose:I,inheritAttrs:_,components:A,directives:F,filters:K}=t;if(c&&tx(c,a,null),s)for(const P in s){const M=s[P];Be(M)&&(a[P]=M.bind(n))}if(o){const P=o.call(n,n);et(P)&&(e.data=Nt(P))}if(Lf=!0,l)for(const P in l){const M=l[P],L=Be(M)?M.bind(n,n):Be(M.get)?M.get.bind(n,n):Pt,D=!Be(M)&&Be(M.set)?M.set.bind(n):Pt,V=y({get:L,set:D});Object.defineProperty(a,P,{enumerable:!0,configurable:!0,get:()=>V.value,set:G=>V.value=G})}if(r)for(const P in r)U0(r[P],a,n,P);if(u){const P=Be(u)?u.call(n):u;Reflect.ownKeys(P).forEach(M=>{gt(M,P[M])})}d&&Sm(d,e,"c");function W(P,M){ye(M)?M.forEach(L=>P(L.bind(n))):M&&P(M.bind(n))}if(W(ed,f),W(ct,h),W(dv,g),W(Ya,v),W($i,p),W(cv,m),W(XE,$),W(GE,E),W(qE,O),W(Rt,k),W(rr,C),W(UE,N),ye(I))if(I.length){const P=e.exposed||(e.exposed={});I.forEach(M=>{Object.defineProperty(P,M,{get:()=>n[M],set:L=>n[M]=L,enumerable:!0})})}else e.exposed||(e.exposed={});S&&e.render===Pt&&(e.render=S),_!=null&&(e.inheritAttrs=_),A&&(e.components=A),F&&(e.directives=F),N&&H0(e)}function tx(e,t,n=Pt){ye(e)&&(e=Df(e));for(const a in e){const o=e[a];let l;et(o)?"default"in o?l=Re(o.from||a,o.default,!0):l=Re(o.from||a):l=Re(o),Yt(l)?Object.defineProperty(t,a,{enumerable:!0,configurable:!0,get:()=>l.value,set:s=>l.value=s}):t[a]=l}}function Sm(e,t,n){Va(ye(e)?e.map(a=>a.bind(t.proxy)):e.bind(t.proxy),t,n)}function U0(e,t,n,a){let o=a.includes(".")?R0(n,a):()=>n[a];if(_e(e)){const l=t[e];Be(l)&&re(o,l)}else if(Be(e))re(o,e.bind(n));else if(et(e))if(ye(e))e.forEach(l=>U0(l,t,n,a));else{const l=Be(e.handler)?e.handler.bind(n):t[e.handler];Be(l)&&re(o,l,e)}}function q0(e){const t=e.type,{mixins:n,extends:a}=t,{mixins:o,optionsCache:l,config:{optionMergeStrategies:s}}=e.appContext,r=l.get(t);let u;return r?u=r:!o.length&&!n&&!a?u=t:(u={},o.length&&o.forEach(c=>dc(u,c,s,!0)),dc(u,t,s)),et(t)&&l.set(t,u),u}function dc(e,t,n,a=!1){const{mixins:o,extends:l}=t;l&&dc(e,l,n,!0),o&&o.forEach(s=>dc(e,s,n,!0));for(const s in t)if(!(a&&s==="expose")){const r=nx[s]||n&&n[s];e[s]=r?r(e[s],t[s]):t[s]}return e}const nx={data:km,props:Em,emits:Em,methods:Or,computed:Or,beforeCreate:Xn,created:Xn,beforeMount:Xn,mounted:Xn,beforeUpdate:Xn,updated:Xn,beforeDestroy:Xn,beforeUnmount:Xn,destroyed:Xn,unmounted:Xn,activated:Xn,deactivated:Xn,errorCaptured:Xn,serverPrefetch:Xn,components:Or,directives:Or,watch:ox,provide:km,inject:ax};function km(e,t){return t?e?function(){return kn(Be(e)?e.call(this,this):e,Be(t)?t.call(this,this):t)}:t:e}function ax(e,t){return Or(Df(e),Df(t))}function Df(e){if(ye(e)){const t={};for(let n=0;nt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Nn(t)}Modifiers`]||e[`${Go(t)}Modifiers`];function ix(e,t,...n){if(e.isUnmounted)return;const a=e.vnode.props||nn;let o=n;const l=t.startsWith("update:"),s=l&&rx(a,t.slice(7));s&&(s.trim&&(o=n.map(d=>_e(d)?d.trim():d)),s.number&&(o=n.map(Qp)));let r,u=a[r=Rr(t)]||a[r=Rr(Nn(t))];!u&&l&&(u=a[r=Rr(Go(t))]),u&&Va(u,e,6,o);const c=a[r+"Once"];if(c){if(!e.emitted)e.emitted={};else if(e.emitted[r])return;e.emitted[r]=!0,Va(c,e,6,o)}}const ux=new WeakMap;function X0(e,t,n=!1){const a=n?ux:t.emitsCache,o=a.get(e);if(o!==void 0)return o;const l=e.emits;let s={},r=!1;if(!Be(e)){const u=c=>{const d=X0(c,t,!0);d&&(r=!0,kn(s,d))};!n&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}return!l&&!r?(et(e)&&a.set(e,null),null):(ye(l)?l.forEach(u=>s[u]=null):kn(s,l),et(e)&&a.set(e,s),s)}function td(e,t){return!e||!Wc(t)?!1:(t=t.slice(2).replace(/Once$/,""),Tt(e,t[0].toLowerCase()+t.slice(1))||Tt(e,Go(t))||Tt(e,t))}function xm(e){const{type:t,vnode:n,proxy:a,withProxy:o,propsOptions:[l],slots:s,attrs:r,emit:u,render:c,renderCache:d,props:f,data:h,setupState:g,ctx:v,inheritAttrs:p}=e,m=uc(e);let b,k;try{if(n.shapeFlag&4){const C=o||a,S=C;b=lo(c.call(S,C,d,f,g,h,v)),k=r}else{const C=t;b=lo(C.length>1?C(f,{attrs:r,slots:s,emit:u}):C(f,null)),k=t.props?r:cx(r)}}catch(C){Vr.length=0,Zc(C,e,1),b=U(un)}let w=b;if(k&&p!==!1){const C=Object.keys(k),{shapeFlag:S}=w;C.length&&S&7&&(l&&C.some(Zp)&&(k=dx(k,l)),w=mo(w,k,!1,!0))}return n.dirs&&(w=mo(w,null,!1,!0),w.dirs=w.dirs?w.dirs.concat(n.dirs):n.dirs),n.transition&&ts(w,n.transition),b=w,uc(m),b}const cx=e=>{let t;for(const n in e)(n==="class"||n==="style"||Wc(n))&&((t||(t={}))[n]=e[n]);return t},dx=(e,t)=>{const n={};for(const a in e)(!Zp(a)||!(a.slice(9)in t))&&(n[a]=e[a]);return n};function fx(e,t,n){const{props:a,children:o,component:l}=e,{props:s,children:r,patchFlag:u}=t,c=l.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&u>=0){if(u&1024)return!0;if(u&16)return a?Tm(a,s,c):!!s;if(u&8){const d=t.dynamicProps;for(let f=0;fObject.create(J0),ew=e=>Object.getPrototypeOf(e)===J0;function vx(e,t,n,a=!1){const o={},l=Q0();e.propsDefaults=Object.create(null),tw(e,t,o,l);for(const s in e.propsOptions[0])s in o||(o[s]=void 0);n?e.props=a?o:lv(o):e.type.props?e.props=o:e.props=l,e.attrs=l}function hx(e,t,n,a){const{props:o,attrs:l,vnode:{patchFlag:s}}=e,r=Ht(o),[u]=e.propsOptions;let c=!1;if((a||s>0)&&!(s&16)){if(s&8){const d=e.vnode.dynamicProps;for(let f=0;f{u=!0;const[h,g]=nw(f,t,!0);kn(s,h),g&&r.push(...g)};!n&&t.mixins.length&&t.mixins.forEach(d),e.extends&&d(e.extends),e.mixins&&e.mixins.forEach(d)}if(!l&&!u)return et(e)&&a.set(e,Ms),Ms;if(ye(l))for(let d=0;de==="_"||e==="_ctx"||e==="$stable",mv=e=>ye(e)?e.map(lo):[lo(e)],gx=(e,t,n)=>{if(t._n)return t;const a=Z((...o)=>mv(t(...o)),n);return a._c=!1,a},aw=(e,t,n)=>{const a=e._ctx;for(const o in e){if(hv(o))continue;const l=e[o];if(Be(l))t[o]=gx(o,l,a);else if(l!=null){const s=mv(l);t[o]=()=>s}}},ow=(e,t)=>{const n=mv(t);e.slots.default=()=>n},lw=(e,t,n)=>{for(const a in t)(n||!hv(a))&&(e[a]=t[a])},bx=(e,t,n)=>{const a=e.slots=Q0();if(e.vnode.shapeFlag&32){const o=t._;o?(lw(a,t,n),n&&a0(a,"_",o,!0)):aw(t,a)}else t&&ow(e,t)},yx=(e,t,n)=>{const{vnode:a,slots:o}=e;let l=!0,s=nn;if(a.shapeFlag&32){const r=t._;r?n&&r===1?l=!1:lw(o,t,n):(l=!t.$stable,aw(t,o)),s=t}else t&&(ow(e,t),s={default:1});if(l)for(const r in o)!hv(r)&&s[r]==null&&delete o[r]},Bn=Ex;function wx(e){return Cx(e)}function Cx(e,t){const n=qc();n.__VUE__=!0;const{insert:a,remove:o,patchProp:l,createElement:s,createText:r,createComment:u,setText:c,setElementText:d,parentNode:f,nextSibling:h,setScopeId:g=Pt,insertStaticContent:v}=e,p=(z,J,se,ce=null,he=null,Se=null,Ie=void 0,Ne=null,Te=!!J.dynamicChildren)=>{if(z===J)return;z&&!Dl(z,J)&&(ce=ue(z),G(z,he,Se,!0),z=null),J.patchFlag===-2&&(Te=!1,J.dynamicChildren=null);const{type:pe,ref:Ee,shapeFlag:me}=J;switch(pe){case ir:m(z,J,se,ce);break;case un:b(z,J,se,ce);break;case Pu:z==null&&k(J,se,ce,Ie);break;case Fe:A(z,J,se,ce,he,Se,Ie,Ne,Te);break;default:me&1?S(z,J,se,ce,he,Se,Ie,Ne,Te):me&6?F(z,J,se,ce,he,Se,Ie,Ne,Te):(me&64||me&128)&&pe.process(z,J,se,ce,he,Se,Ie,Ne,Te,ae)}Ee!=null&&he?Dr(Ee,z&&z.ref,Se,J||z,!J):Ee==null&&z&&z.ref!=null&&Dr(z.ref,null,Se,z,!0)},m=(z,J,se,ce)=>{if(z==null)a(J.el=r(J.children),se,ce);else{const he=J.el=z.el;J.children!==z.children&&c(he,J.children)}},b=(z,J,se,ce)=>{z==null?a(J.el=u(J.children||""),se,ce):J.el=z.el},k=(z,J,se,ce)=>{[z.el,z.anchor]=v(z.children,J,se,ce,z.el,z.anchor)},w=({el:z,anchor:J},se,ce)=>{let he;for(;z&&z!==J;)he=h(z),a(z,se,ce),z=he;a(J,se,ce)},C=({el:z,anchor:J})=>{let se;for(;z&&z!==J;)se=h(z),o(z),z=se;o(J)},S=(z,J,se,ce,he,Se,Ie,Ne,Te)=>{if(J.type==="svg"?Ie="svg":J.type==="math"&&(Ie="mathml"),z==null)E(J,se,ce,he,Se,Ie,Ne,Te);else{const pe=z.el&&z.el._isVueCE?z.el:null;try{pe&&pe._beginPatch(),N(z,J,he,Se,Ie,Ne,Te)}finally{pe&&pe._endPatch()}}},E=(z,J,se,ce,he,Se,Ie,Ne)=>{let Te,pe;const{props:Ee,shapeFlag:me,transition:Pe,dirs:Ke}=z;if(Te=z.el=s(z.type,Se,Ee&&Ee.is,Ee),me&8?d(Te,z.children):me&16&&$(z.children,Te,null,ce,he,Yd(z,Se),Ie,Ne),Ke&&Nl(z,null,ce,"created"),O(Te,z,z.scopeId,Ie,ce),Ee){for(const Me in Ee)Me!=="value"&&!Pr(Me)&&l(Te,Me,null,Ee[Me],Se,ce);"value"in Ee&&l(Te,"value",null,Ee.value,Se),(pe=Ee.onVnodeBeforeMount)&&eo(pe,ce,z)}Ke&&Nl(z,null,ce,"beforeMount");const Ge=Sx(he,Pe);Ge&&Pe.beforeEnter(Te),a(Te,J,se),((pe=Ee&&Ee.onVnodeMounted)||Ge||Ke)&&Bn(()=>{pe&&eo(pe,ce,z),Ge&&Pe.enter(Te),Ke&&Nl(z,null,ce,"mounted")},he)},O=(z,J,se,ce,he)=>{if(se&&g(z,se),ce)for(let Se=0;Se{for(let pe=Te;pe{const Ne=J.el=z.el;let{patchFlag:Te,dynamicChildren:pe,dirs:Ee}=J;Te|=z.patchFlag&16;const me=z.props||nn,Pe=J.props||nn;let Ke;if(se&&Ml(se,!1),(Ke=Pe.onVnodeBeforeUpdate)&&eo(Ke,se,J,z),Ee&&Nl(J,z,se,"beforeUpdate"),se&&Ml(se,!0),(me.innerHTML&&Pe.innerHTML==null||me.textContent&&Pe.textContent==null)&&d(Ne,""),pe?I(z.dynamicChildren,pe,Ne,se,ce,Yd(J,he),Se):Ie||M(z,J,Ne,null,se,ce,Yd(J,he),Se,!1),Te>0){if(Te&16)_(Ne,me,Pe,se,he);else if(Te&2&&me.class!==Pe.class&&l(Ne,"class",null,Pe.class,he),Te&4&&l(Ne,"style",me.style,Pe.style,he),Te&8){const Ge=J.dynamicProps;for(let Me=0;Me{Ke&&eo(Ke,se,J,z),Ee&&Nl(J,z,se,"updated")},ce)},I=(z,J,se,ce,he,Se,Ie)=>{for(let Ne=0;Ne{if(J!==se){if(J!==nn)for(const Se in J)!Pr(Se)&&!(Se in se)&&l(z,Se,J[Se],null,he,ce);for(const Se in se){if(Pr(Se))continue;const Ie=se[Se],Ne=J[Se];Ie!==Ne&&Se!=="value"&&l(z,Se,Ne,Ie,he,ce)}"value"in se&&l(z,"value",J.value,se.value,he)}},A=(z,J,se,ce,he,Se,Ie,Ne,Te)=>{const pe=J.el=z?z.el:r(""),Ee=J.anchor=z?z.anchor:r("");let{patchFlag:me,dynamicChildren:Pe,slotScopeIds:Ke}=J;Ke&&(Ne=Ne?Ne.concat(Ke):Ke),z==null?(a(pe,se,ce),a(Ee,se,ce),$(J.children||[],se,Ee,he,Se,Ie,Ne,Te)):me>0&&me&64&&Pe&&z.dynamicChildren&&z.dynamicChildren.length===Pe.length?(I(z.dynamicChildren,Pe,se,he,Se,Ie,Ne),(J.key!=null||he&&J===he.subTree)&&gv(z,J,!0)):M(z,J,se,Ee,he,Se,Ie,Ne,Te)},F=(z,J,se,ce,he,Se,Ie,Ne,Te)=>{J.slotScopeIds=Ne,z==null?J.shapeFlag&512?he.ctx.activate(J,se,ce,Ie,Te):K(J,se,ce,he,Se,Ie,Te):Y(z,J,Te)},K=(z,J,se,ce,he,Se,Ie)=>{const Ne=z.component=Ix(z,ce,he);if(Jc(z)&&(Ne.ctx.renderer=ae),Nx(Ne,!1,Ie),Ne.asyncDep){if(he&&he.registerDep(Ne,W,Ie),!z.el){const Te=Ne.subTree=U(un);b(null,Te,J,se),z.placeholder=Te.el}}else W(Ne,z,J,se,he,Se,Ie)},Y=(z,J,se)=>{const ce=J.component=z.component;if(fx(z,J,se))if(ce.asyncDep&&!ce.asyncResolved){P(ce,J,se);return}else ce.next=J,ce.update();else J.el=z.el,ce.vnode=J},W=(z,J,se,ce,he,Se,Ie)=>{const Ne=()=>{if(z.isMounted){let{next:me,bu:Pe,u:Ke,parent:Ge,vnode:Me}=z;{const at=sw(z);if(at){me&&(me.el=Me.el,P(z,me,Ie)),at.asyncDep.then(()=>{Bn(()=>{z.isUnmounted||pe()},he)});return}}let Ae=me,We;Ml(z,!1),me?(me.el=Me.el,P(z,me,Ie)):me=Me,Pe&&Iu(Pe),(We=me.props&&me.props.onVnodeBeforeUpdate)&&eo(We,Ge,me,Me),Ml(z,!0);const xt=xm(z),je=z.subTree;z.subTree=xt,p(je,xt,f(je.el),ue(je),z,he,Se),me.el=xt.el,Ae===null&&px(z,xt.el),Ke&&Bn(Ke,he),(We=me.props&&me.props.onVnodeUpdated)&&Bn(()=>eo(We,Ge,me,Me),he)}else{let me;const{el:Pe,props:Ke}=J,{bm:Ge,m:Me,parent:Ae,root:We,type:xt}=z,je=As(J);Ml(z,!1),Ge&&Iu(Ge),!je&&(me=Ke&&Ke.onVnodeBeforeMount)&&eo(me,Ae,J),Ml(z,!0);{We.ce&&We.ce._hasShadowRoot()&&We.ce._injectChildStyle(xt,z.parent?z.parent.type:void 0);const at=z.subTree=xm(z);p(null,at,se,ce,z,he,Se),J.el=at.el}if(Me&&Bn(Me,he),!je&&(me=Ke&&Ke.onVnodeMounted)){const at=J;Bn(()=>eo(me,Ae,at),he)}(J.shapeFlag&256||Ae&&As(Ae.vnode)&&Ae.vnode.shapeFlag&256)&&z.a&&Bn(z.a,he),z.isMounted=!0,J=se=ce=null}};z.scope.on();const Te=z.effect=new d0(Ne);z.scope.off();const pe=z.update=Te.run.bind(Te),Ee=z.job=Te.runIfDirty.bind(Te);Ee.i=z,Ee.id=z.uid,Te.scheduler=()=>rv(Ee),Ml(z,!0),pe()},P=(z,J,se)=>{J.component=z;const ce=z.vnode.props;z.vnode=J,z.next=null,hx(z,J.props,ce,se),yx(z,J.children,se),zo(),pm(z),Ho()},M=(z,J,se,ce,he,Se,Ie,Ne,Te=!1)=>{const pe=z&&z.children,Ee=z?z.shapeFlag:0,me=J.children,{patchFlag:Pe,shapeFlag:Ke}=J;if(Pe>0){if(Pe&128){D(pe,me,se,ce,he,Se,Ie,Ne,Te);return}else if(Pe&256){L(pe,me,se,ce,he,Se,Ie,Ne,Te);return}}Ke&8?(Ee&16&&ve(pe,he,Se),me!==pe&&d(se,me)):Ee&16?Ke&16?D(pe,me,se,ce,he,Se,Ie,Ne,Te):ve(pe,he,Se,!0):(Ee&8&&d(se,""),Ke&16&&$(me,se,ce,he,Se,Ie,Ne,Te))},L=(z,J,se,ce,he,Se,Ie,Ne,Te)=>{z=z||Ms,J=J||Ms;const pe=z.length,Ee=J.length,me=Math.min(pe,Ee);let Pe;for(Pe=0;PeEe?ve(z,he,Se,!0,!1,me):$(J,se,ce,he,Se,Ie,Ne,Te,me)},D=(z,J,se,ce,he,Se,Ie,Ne,Te)=>{let pe=0;const Ee=J.length;let me=z.length-1,Pe=Ee-1;for(;pe<=me&&pe<=Pe;){const Ke=z[pe],Ge=J[pe]=Te?Io(J[pe]):lo(J[pe]);if(Dl(Ke,Ge))p(Ke,Ge,se,null,he,Se,Ie,Ne,Te);else break;pe++}for(;pe<=me&&pe<=Pe;){const Ke=z[me],Ge=J[Pe]=Te?Io(J[Pe]):lo(J[Pe]);if(Dl(Ke,Ge))p(Ke,Ge,se,null,he,Se,Ie,Ne,Te);else break;me--,Pe--}if(pe>me){if(pe<=Pe){const Ke=Pe+1,Ge=KePe)for(;pe<=me;)G(z[pe],he,Se,!0),pe++;else{const Ke=pe,Ge=pe,Me=new Map;for(pe=Ge;pe<=Pe;pe++){const be=J[pe]=Te?Io(J[pe]):lo(J[pe]);be.key!=null&&Me.set(be.key,pe)}let Ae,We=0;const xt=Pe-Ge+1;let je=!1,at=0;const ft=new Array(xt);for(pe=0;pe=xt){G(be,he,Se,!0);continue}let Ve;if(be.key!=null)Ve=Me.get(be.key);else for(Ae=Ge;Ae<=Pe;Ae++)if(ft[Ae-Ge]===0&&Dl(be,J[Ae])){Ve=Ae;break}Ve===void 0?G(be,he,Se,!0):(ft[Ve-Ge]=pe+1,Ve>=at?at=Ve:je=!0,p(be,J[Ve],se,null,he,Se,Ie,Ne,Te),We++)}const yt=je?kx(ft):Ms;for(Ae=yt.length-1,pe=xt-1;pe>=0;pe--){const be=Ge+pe,Ve=J[be],de=J[be+1],Ue=be+1{const{el:Se,type:Ie,transition:Ne,children:Te,shapeFlag:pe}=z;if(pe&6){V(z.component.subTree,J,se,ce);return}if(pe&128){z.suspense.move(J,se,ce);return}if(pe&64){Ie.move(z,J,se,ae);return}if(Ie===Fe){a(Se,J,se);for(let me=0;meNe.enter(Se),he);else{const{leave:me,delayLeave:Pe,afterLeave:Ke}=Ne,Ge=()=>{z.ctx.isUnmounted?o(Se):a(Se,J,se)},Me=()=>{Se._isLeaving&&Se[ao](!0),me(Se,()=>{Ge(),Ke&&Ke()})};Pe?Pe(Se,Ge,Me):Me()}else a(Se,J,se)},G=(z,J,se,ce=!1,he=!1)=>{const{type:Se,props:Ie,ref:Ne,children:Te,dynamicChildren:pe,shapeFlag:Ee,patchFlag:me,dirs:Pe,cacheIndex:Ke}=z;if(me===-2&&(he=!1),Ne!=null&&(zo(),Dr(Ne,null,se,z,!0),Ho()),Ke!=null&&(J.renderCache[Ke]=void 0),Ee&256){J.ctx.deactivate(z);return}const Ge=Ee&1&&Pe,Me=!As(z);let Ae;if(Me&&(Ae=Ie&&Ie.onVnodeBeforeUnmount)&&eo(Ae,J,z),Ee&6)Q(z.component,se,ce);else{if(Ee&128){z.suspense.unmount(se,ce);return}Ge&&Nl(z,null,J,"beforeUnmount"),Ee&64?z.type.remove(z,J,se,ae,ce):pe&&!pe.hasOnce&&(Se!==Fe||me>0&&me&64)?ve(pe,J,se,!1,!0):(Se===Fe&&me&384||!he&&Ee&16)&&ve(Te,J,se),ce&&j(z)}(Me&&(Ae=Ie&&Ie.onVnodeUnmounted)||Ge)&&Bn(()=>{Ae&&eo(Ae,J,z),Ge&&Nl(z,null,J,"unmounted")},se)},j=z=>{const{type:J,el:se,anchor:ce,transition:he}=z;if(J===Fe){X(se,ce);return}if(J===Pu){C(z);return}const Se=()=>{o(se),he&&!he.persisted&&he.afterLeave&&he.afterLeave()};if(z.shapeFlag&1&&he&&!he.persisted){const{leave:Ie,delayLeave:Ne}=he,Te=()=>Ie(se,Se);Ne?Ne(z.el,Se,Te):Te()}else Se()},X=(z,J)=>{let se;for(;z!==J;)se=h(z),o(z),z=se;o(J)},Q=(z,J,se)=>{const{bum:ce,scope:he,job:Se,subTree:Ie,um:Ne,m:Te,a:pe}=z;Om(Te),Om(pe),ce&&Iu(ce),he.stop(),Se&&(Se.flags|=8,G(Ie,z,J,se)),Ne&&Bn(Ne,J),Bn(()=>{z.isUnmounted=!0},J)},ve=(z,J,se,ce=!1,he=!1,Se=0)=>{for(let Ie=Se;Ie{if(z.shapeFlag&6)return ue(z.component.subTree);if(z.shapeFlag&128)return z.suspense.next();const J=h(z.anchor||z.el),se=J&&J[A0];return se?h(se):J};let ge=!1;const ie=(z,J,se)=>{let ce;z==null?J._vnode&&(G(J._vnode,null,null,!0),ce=J._vnode.component):p(J._vnode||null,z,J,null,null,null,se),J._vnode=z,ge||(ge=!0,pm(ce),N0(),ge=!1)},ae={p,um:G,m:V,r:j,mt:K,mc:$,pc:M,pbc:I,n:ue,o:e};return{render:ie,hydrate:void 0,createApp:sx(ie)}}function Yd({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function Ml({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Sx(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function gv(e,t,n=!1){const a=e.children,o=t.children;if(ye(a)&&ye(o))for(let l=0;l>1,e[n[r]]0&&(t[a]=n[l-1]),n[l]=a)}}for(l=n.length,s=n[l-1];l-- >0;)n[l]=s,s=t[s];return n}function sw(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:sw(t)}function Om(e){if(e)for(let t=0;te.__isSuspense;function Ex(e,t){t&&t.pendingBranch?ye(e)?t.effects.push(...e):t.effects.push(e):BE(e)}const Fe=Symbol.for("v-fgt"),ir=Symbol.for("v-txt"),un=Symbol.for("v-cmt"),Pu=Symbol.for("v-stc"),Vr=[];let pa=null;function x(e=!1){Vr.push(pa=e?null:[])}function xx(){Vr.pop(),pa=Vr[Vr.length-1]||null}let Qr=1;function fc(e,t=!1){Qr+=e,e<0&&pa&&t&&(pa.hasOnce=!0)}function uw(e){return e.dynamicChildren=Qr>0?pa||Ms:null,xx(),Qr>0&&pa&&pa.push(e),e}function B(e,t,n,a,o,l){return uw(H(e,t,n,a,o,l,!0))}function oe(e,t,n,a,o){return uw(U(e,t,n,a,o,!0))}function zt(e){return e?e.__v_isVNode===!0:!1}function Dl(e,t){return e.type===t.type&&e.key===t.key}const cw=({key:e})=>e??null,Ru=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?_e(e)||Yt(e)||Be(e)?{i:An,r:e,k:t,f:!!n}:e:null);function H(e,t=null,n=null,a=0,o=null,l=e===Fe?0:1,s=!1,r=!1){const u={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&cw(t),ref:t&&Ru(t),scopeId:P0,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:l,patchFlag:a,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:An};return r?(bv(u,n),l&128&&e.normalize(u)):n&&(u.shapeFlag|=_e(n)?8:16),Qr>0&&!s&&pa&&(u.patchFlag>0||l&6)&&u.patchFlag!==32&&pa.push(u),u}const U=Tx;function Tx(e,t=null,n=null,a=0,o=null,l=!1){if((!e||e===W0)&&(e=un),zt(e)){const r=mo(e,t,!0);return n&&bv(r,n),Qr>0&&!l&&pa&&(r.shapeFlag&6?pa[pa.indexOf(e)]=r:pa.push(r)),r.patchFlag=-2,r}if(Ax(e)&&(e=e.__vccOpts),t){t=Do(t);let{class:r,style:u}=t;r&&!_e(r)&&(t.class=T(r)),et(u)&&(Xc(u)&&!ye(u)&&(u=kn({},u)),t.style=He(u))}const s=_e(e)?1:iw(e)?128:_0(e)?64:et(e)?4:Be(e)?2:0;return H(e,t,n,a,o,s,l,!0)}function Do(e){return e?Xc(e)||ew(e)?kn({},e):e:null}function mo(e,t,n=!1,a=!1){const{props:o,ref:l,patchFlag:s,children:r,transition:u}=e,c=t?rt(o||{},t):o,d={__v_isVNode:!0,__v_skip:!0,type:e.type,props:c,key:c&&cw(c),ref:t&&t.ref?n&&l?ye(l)?l.concat(Ru(t)):[l,Ru(t)]:Ru(t):l,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:r,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Fe?s===-1?16:s|16:s,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:u,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&mo(e.ssContent),ssFallback:e.ssFallback&&mo(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return u&&a&&ts(d,u.clone(d)),d}function mt(e=" ",t=0){return U(ir,null,e,t)}function GX(e,t){const n=U(Pu,null,e);return n.staticCount=t,n}function te(e="",t=!1){return t?(x(),oe(un,null,e)):U(un,null,e)}function lo(e){return e==null||typeof e=="boolean"?U(un):ye(e)?U(Fe,null,e.slice()):zt(e)?Io(e):U(ir,null,String(e))}function Io(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:mo(e)}function bv(e,t){let n=0;const{shapeFlag:a}=e;if(t==null)t=null;else if(ye(t))n=16;else if(typeof t=="object")if(a&65){const o=t.default;o&&(o._c&&(o._d=!1),bv(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!ew(t)?t._ctx=An:o===3&&An&&(An.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else Be(t)?(t={default:t,_ctx:An},n=32):(t=String(t),a&64?(n=16,t=[mt(t)]):n=8);e.children=t,e.shapeFlag|=n}function rt(...e){const t={};for(let n=0;nHn||An;let pc,Vf;{const e=qc(),t=(n,a)=>{let o;return(o=e[n])||(o=e[n]=[]),o.push(a),l=>{o.length>1?o.forEach(s=>s(l)):o[0](l)}};pc=t("__VUE_INSTANCE_SETTERS__",n=>Hn=n),Vf=t("__VUE_SSR_SETTERS__",n=>ei=n)}const Oi=e=>{const t=Hn;return pc(e),e.scope.on(),()=>{e.scope.off(),pc(t)}},Im=()=>{Hn&&Hn.scope.off(),pc(null)};function dw(e){return e.vnode.shapeFlag&4}let ei=!1;function Nx(e,t=!1,n=!1){t&&Vf(t);const{props:a,children:o}=e.vnode,l=dw(e);vx(e,a,l,t),bx(e,o,n||t);const s=l?Mx(e,t):void 0;return t&&Vf(!1),s}function Mx(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,QE);const{setup:a}=n;if(a){zo();const o=e.setupContext=a.length>1?pw(e):null,l=Oi(e),s=Ti(a,e,0,[e.props,o]),r=Jl(s);if(Ho(),l(),(r||e.sp)&&!As(e)&&H0(e),r){if(s.then(Im,Im),t)return s.then(u=>{Nm(e,u)}).catch(u=>{Zc(u,e,0)});e.asyncDep=s}else Nm(e,s)}else fw(e)}function Nm(e,t,n){Be(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:et(t)&&(e.setupState=T0(t)),fw(e)}function fw(e,t,n){const a=e.type;e.render||(e.render=a.render||Pt);{const o=Oi(e);zo();try{ex(e)}finally{Ho(),o()}}}const Px={get(e,t){return zn(e,"get",""),e[t]}};function pw(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Px),slots:e.slots,emit:e.emit,expose:t}}function nd(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(T0(uo(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Br)return Br[n](e)},has(t,n){return n in t||n in Br}})):e.proxy}function Rx(e,t=!0){return Be(e)?e.displayName||e.name:e.name||t&&e.__name}function Ax(e){return Be(e)&&"__vccOpts"in e}const y=(e,t)=>RE(e,t,ei);function Ye(e,t,n){try{fc(-1);const a=arguments.length;return a===2?et(t)&&!ye(t)?zt(t)?U(e,null,[t]):U(e,t):U(e,null,t):(a>3?n=Array.prototype.slice.call(arguments,2):a===3&&zt(n)&&(n=[n]),U(e,t,n))}finally{fc(1)}}const _x="3.5.30",Lx=Pt;let Ff;const Mm=typeof window<"u"&&window.trustedTypes;if(Mm)try{Ff=Mm.createPolicy("vue",{createHTML:e=>e})}catch{}const vw=Ff?e=>Ff.createHTML(e):e=>e,Dx="http://www.w3.org/2000/svg",Bx="http://www.w3.org/1998/Math/MathML",Oo=typeof document<"u"?document:null,Pm=Oo&&Oo.createElement("template"),Vx={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,a)=>{const o=t==="svg"?Oo.createElementNS(Dx,e):t==="mathml"?Oo.createElementNS(Bx,e):n?Oo.createElement(e,{is:n}):Oo.createElement(e);return e==="select"&&a&&a.multiple!=null&&o.setAttribute("multiple",a.multiple),o},createText:e=>Oo.createTextNode(e),createComment:e=>Oo.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Oo.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,a,o,l){const s=n?n.previousSibling:t.lastChild;if(o&&(o===l||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===l||!(o=o.nextSibling)););else{Pm.innerHTML=vw(a==="svg"?`${e}`:a==="mathml"?`${e}`:e);const r=Pm.content;if(a==="svg"||a==="mathml"){const u=r.firstChild;for(;u.firstChild;)r.appendChild(u.firstChild);r.removeChild(u)}t.insertBefore(r,n)}return[s?s.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},ol="transition",wr="animation",Ws=Symbol("_vtc"),hw={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},mw=kn({},B0,hw),Fx=e=>(e.displayName="Transition",e.props=mw,e),Mn=Fx((e,{slots:t})=>Ye(jE,gw(e),t)),Pl=(e,t=[])=>{ye(e)?e.forEach(n=>n(...t)):e&&e(...t)},Rm=e=>e?ye(e)?e.some(t=>t.length>1):e.length>1:!1;function gw(e){const t={};for(const A in e)A in hw||(t[A]=e[A]);if(e.css===!1)return t;const{name:n="v",type:a,duration:o,enterFromClass:l=`${n}-enter-from`,enterActiveClass:s=`${n}-enter-active`,enterToClass:r=`${n}-enter-to`,appearFromClass:u=l,appearActiveClass:c=s,appearToClass:d=r,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:h=`${n}-leave-active`,leaveToClass:g=`${n}-leave-to`}=e,v=zx(o),p=v&&v[0],m=v&&v[1],{onBeforeEnter:b,onEnter:k,onEnterCancelled:w,onLeave:C,onLeaveCancelled:S,onBeforeAppear:E=b,onAppear:O=k,onAppearCancelled:$=w}=t,N=(A,F,K,Y)=>{A._enterCancelled=Y,sl(A,F?d:r),sl(A,F?c:s),K&&K()},I=(A,F)=>{A._isLeaving=!1,sl(A,f),sl(A,g),sl(A,h),F&&F()},_=A=>(F,K)=>{const Y=A?O:k,W=()=>N(F,A,K);Pl(Y,[F,W]),Am(()=>{sl(F,A?u:l),to(F,A?d:r),Rm(Y)||_m(F,a,p,W)})};return kn(t,{onBeforeEnter(A){Pl(b,[A]),to(A,l),to(A,s)},onBeforeAppear(A){Pl(E,[A]),to(A,u),to(A,c)},onEnter:_(!1),onAppear:_(!0),onLeave(A,F){A._isLeaving=!0;const K=()=>I(A,F);to(A,f),A._enterCancelled?(to(A,h),zf(A)):(zf(A),to(A,h)),Am(()=>{A._isLeaving&&(sl(A,f),to(A,g),Rm(C)||_m(A,a,m,K))}),Pl(C,[A,K])},onEnterCancelled(A){N(A,!1,void 0,!0),Pl(w,[A])},onAppearCancelled(A){N(A,!0,void 0,!0),Pl($,[A])},onLeaveCancelled(A){I(A),Pl(S,[A])}})}function zx(e){if(e==null)return null;if(et(e))return[Ud(e.enter),Ud(e.leave)];{const t=Ud(e);return[t,t]}}function Ud(e){return eE(e)}function to(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Ws]||(e[Ws]=new Set)).add(t)}function sl(e,t){t.split(/\s+/).forEach(a=>a&&e.classList.remove(a));const n=e[Ws];n&&(n.delete(t),n.size||(e[Ws]=void 0))}function Am(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Hx=0;function _m(e,t,n,a){const o=e._endId=++Hx,l=()=>{o===e._endId&&a()};if(n!=null)return setTimeout(l,n);const{type:s,timeout:r,propCount:u}=bw(e,t);if(!s)return a();const c=s+"end";let d=0;const f=()=>{e.removeEventListener(c,h),l()},h=g=>{g.target===e&&++d>=u&&f()};setTimeout(()=>{d(n[v]||"").split(", "),o=a(`${ol}Delay`),l=a(`${ol}Duration`),s=Lm(o,l),r=a(`${wr}Delay`),u=a(`${wr}Duration`),c=Lm(r,u);let d=null,f=0,h=0;t===ol?s>0&&(d=ol,f=s,h=l.length):t===wr?c>0&&(d=wr,f=c,h=u.length):(f=Math.max(s,c),d=f>0?s>c?ol:wr:null,h=d?d===ol?l.length:u.length:0);const g=d===ol&&/\b(?:transform|all)(?:,|$)/.test(a(`${ol}Property`).toString());return{type:d,timeout:f,propCount:h,hasTransform:g}}function Lm(e,t){for(;e.lengthDm(n)+Dm(e[a])))}function Dm(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function zf(e){return(e?e.ownerDocument:document).body.offsetHeight}function Kx(e,t,n){const a=e[Ws];a&&(t=(t?[t,...a]:[...a]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const vc=Symbol("_vod"),yw=Symbol("_vsh"),Ot={name:"show",beforeMount(e,{value:t},{transition:n}){e[vc]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Cr(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:a}){!t!=!n&&(a?t?(a.beforeEnter(e),Cr(e,!0),a.enter(e)):a.leave(e,()=>{Cr(e,!1)}):Cr(e,t))},beforeUnmount(e,{value:t}){Cr(e,t)}};function Cr(e,t){e.style.display=t?e[vc]:"none",e[yw]=!t}const Wx=Symbol(""),jx=/(?:^|;)\s*display\s*:/;function Yx(e,t,n){const a=e.style,o=_e(n);let l=!1;if(n&&!o){if(t)if(_e(t))for(const s of t.split(";")){const r=s.slice(0,s.indexOf(":")).trim();n[r]==null&&Au(a,r,"")}else for(const s in t)n[s]==null&&Au(a,s,"");for(const s in n)s==="display"&&(l=!0),Au(a,s,n[s])}else if(o){if(t!==n){const s=a[Wx];s&&(n+=";"+s),a.cssText=n,l=jx.test(n)}}else t&&e.removeAttribute("style");vc in e&&(e[vc]=l?a.display:"",e[yw]&&(a.display="none"))}const Bm=/\s*!important$/;function Au(e,t,n){if(ye(n))n.forEach(a=>Au(e,t,a));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const a=Ux(e,t);Bm.test(n)?e.setProperty(Go(a),n.replace(Bm,""),"important"):e[a]=n}}const Vm=["Webkit","Moz","ms"],qd={};function Ux(e,t){const n=qd[t];if(n)return n;let a=Nn(t);if(a!=="filter"&&a in e)return qd[t]=a;a=xi(a);for(let o=0;oGd||(Zx.then(()=>Gd=0),Gd=Date.now());function Qx(e,t){const n=a=>{if(!a._vts)a._vts=Date.now();else if(a._vts<=n.attached)return;Va(eT(a,n.value),t,5,[a])};return n.value=e,n.attached=Jx(),n}function eT(e,t){if(ye(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(a=>o=>!o._stopped&&a&&a(o))}else return t}const jm=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,tT=(e,t,n,a,o,l)=>{const s=o==="svg";t==="class"?Kx(e,a,s):t==="style"?Yx(e,n,a):Wc(t)?Zp(t)||Gx(e,t,n,a,l):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):nT(e,t,a,s))?(Hm(e,t,a),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&zm(e,t,a,s,l,t!=="value")):e._isVueCE&&(aT(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!_e(a)))?Hm(e,Nn(t),a,l,t):(t==="true-value"?e._trueValue=a:t==="false-value"&&(e._falseValue=a),zm(e,t,a,s))};function nT(e,t,n,a){if(a)return!!(t==="innerHTML"||t==="textContent"||t in e&&jm(t)&&Be(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return jm(t)&&_e(n)?!1:t in e}function aT(e,t){const n=e._def.props;if(!n)return!1;const a=Nn(t);return Array.isArray(n)?n.some(o=>Nn(o)===a):Object.keys(n).some(o=>Nn(o)===a)}const ww=new WeakMap,Cw=new WeakMap,hc=Symbol("_moveCb"),Ym=Symbol("_enterCb"),oT=e=>(delete e.props.mode,e),lT=oT({name:"TransitionGroup",props:kn({},mw,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=it(),a=D0();let o,l;return Ya(()=>{if(!o.length)return;const s=e.moveClass||`${e.name||"v"}-move`;if(!uT(o[0].el,n.vnode.el,s)){o=[];return}o.forEach(sT),o.forEach(rT);const r=o.filter(iT);zf(n.vnode.el),r.forEach(u=>{const c=u.el,d=c.style;to(c,s),d.transform=d.webkitTransform=d.transitionDuration="";const f=c[hc]=h=>{h&&h.target!==c||(!h||h.propertyName.endsWith("transform"))&&(c.removeEventListener("transitionend",f),c[hc]=null,sl(c,s))};c.addEventListener("transitionend",f)}),o=[]}),()=>{const s=Ht(e),r=gw(s);let u=s.tag||Fe;if(o=[],l)for(let c=0;c{r.split(/\s+/).forEach(u=>u&&a.classList.remove(u))}),n.split(/\s+/).forEach(r=>r&&a.classList.add(r)),a.style.display="none";const l=t.nodeType===1?t:t.parentNode;l.appendChild(a);const{hasTransform:s}=bw(a);return l.removeChild(a),s}const js=e=>{const t=e.props["onUpdate:modelValue"]||!1;return ye(t)?n=>Iu(t,n):t};function cT(e){e.target.composing=!0}function Um(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Bo=Symbol("_assign");function qm(e,t,n){return t&&(e=e.trim()),n&&(e=Qp(e)),e}const Ew={created(e,{modifiers:{lazy:t,trim:n,number:a}},o){e[Bo]=js(o);const l=a||o.props&&o.props.type==="number";dl(e,t?"change":"input",s=>{s.target.composing||e[Bo](qm(e.value,n,l))}),(n||l)&&dl(e,"change",()=>{e.value=qm(e.value,n,l)}),t||(dl(e,"compositionstart",cT),dl(e,"compositionend",Um),dl(e,"change",Um))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:a,trim:o,number:l}},s){if(e[Bo]=js(s),e.composing)return;const r=(l||e.type==="number")&&!/^0\d/.test(e.value)?Qp(e.value):e.value,u=t??"";r!==u&&(document.activeElement===e&&e.type!=="range"&&(a&&t===n||o&&e.value.trim()===u)||(e.value=u))}},xw={deep:!0,created(e,t,n){e[Bo]=js(n),dl(e,"change",()=>{const a=e._modelValue,o=$w(e),l=e.checked,s=e[Bo];if(ye(a)){const r=l0(a,o),u=r!==-1;if(l&&!u)s(a.concat(o));else if(!l&&u){const c=[...a];c.splice(r,1),s(c)}}else if(jc(a)){const r=new Set(a);l?r.add(o):r.delete(o),s(r)}else s(Ow(e,l))})},mounted:Gm,beforeUpdate(e,t,n){e[Bo]=js(n),Gm(e,t,n)}};function Gm(e,{value:t,oldValue:n},a){e._modelValue=t;let o;if(ye(t))o=l0(t,a.props.value)>-1;else if(jc(t))o=t.has(a.props.value);else{if(t===n)return;o=Ql(t,Ow(e,!0))}e.checked!==o&&(e.checked=o)}const Tw={created(e,{value:t},n){e.checked=Ql(t,n.props.value),e[Bo]=js(n),dl(e,"change",()=>{e[Bo]($w(e))})},beforeUpdate(e,{value:t,oldValue:n},a){e[Bo]=js(a),t!==n&&(e.checked=Ql(t,a.props.value))}};function $w(e){return"_value"in e?e._value:e.value}function Ow(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const dT=["ctrl","shift","alt","meta"],fT={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>dT.some(n=>e[`${n}Key`]&&!t.includes(n))},qe=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),a=t.join(".");return n[a]||(n[a]=((o,...l)=>{for(let s=0;s{const n=e._withKeys||(e._withKeys={}),a=t.join(".");return n[a]||(n[a]=(o=>{if(!("key"in o))return;const l=Go(o.key);if(t.some(s=>s===l||pT[s]===l))return e(o)}))},vT=kn({patchProp:tT},Vx);let Xm;function Iw(){return Xm||(Xm=wx(vT))}const Cl=((...e)=>{Iw().render(...e)}),hT=((...e)=>{const t=Iw().createApp(...e),{mount:n}=t;return t.mount=a=>{const o=gT(a);if(!o)return;const l=t._component;!Be(l)&&!l.render&&!l.template&&(l.template=o.innerHTML),o.nodeType===1&&(o.textContent="");const s=n(o,!1,mT(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),s},t});function mT(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function gT(e){return _e(e)?document.querySelector(e):e}const we={tab:"Tab",enter:"Enter",space:"Space",left:"ArrowLeft",up:"ArrowUp",right:"ArrowRight",down:"ArrowDown",esc:"Escape",delete:"Delete",backspace:"Backspace",numpadEnter:"NumpadEnter",pageUp:"PageUp",pageDown:"PageDown",home:"Home",end:"End"},bT=["year","years","month","months","date","dates","week","datetime","datetimerange","daterange","monthrange","yearrange"],Xd=["sun","mon","tue","wed","thu","fri","sat"],Qe="update:modelValue",vt="change",pn="input",Zm=Symbol("INSTALLED_KEY"),Ua=["","default","small","large"],Jm=["left","center","right"],ad=11,Nw=2;var Mw=typeof global=="object"&&global&&global.Object===Object&&global,yT=typeof self=="object"&&self&&self.Object===Object&&self,qa=Mw||yT||Function("return this")(),Ta=qa.Symbol,Pw=Object.prototype,wT=Pw.hasOwnProperty,CT=Pw.toString,Sr=Ta?Ta.toStringTag:void 0;function ST(e){var t=wT.call(e,Sr),n=e[Sr];try{e[Sr]=void 0;var a=!0}catch{}var o=CT.call(e);return a&&(t?e[Sr]=n:delete e[Sr]),o}var kT=Object.prototype,ET=kT.toString;function xT(e){return ET.call(e)}var TT="[object Null]",$T="[object Undefined]",Qm=Ta?Ta.toStringTag:void 0;function us(e){return e==null?e===void 0?$T:TT:Qm&&Qm in Object(e)?ST(e):xT(e)}function go(e){return e!=null&&typeof e=="object"}var OT="[object Symbol]";function od(e){return typeof e=="symbol"||go(e)&&us(e)==OT}function yv(e,t){for(var n=-1,a=e==null?0:e.length,o=Array(a);++n0){if(++t>=n$)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}function s$(e){return function(){return e}}var mc=(function(){try{var e=ds(Object,"defineProperty");return e({},"",{}),e}catch{}})(),r$=mc?function(e,t){return mc(e,"toString",{configurable:!0,enumerable:!1,value:s$(t),writable:!0})}:wv,_w=l$(r$);function i$(e,t){for(var n=-1,a=e==null?0:e.length;++n-1}var p$=9007199254740991,v$=/^(?:0|[1-9]\d*)$/;function ld(e,t){var n=typeof e;return t=t??p$,!!t&&(n=="number"||n!="symbol"&&v$.test(e))&&e>-1&&e%1==0&&e-1&&e%1==0&&e<=g$}function cr(e){return e!=null&&Ev(e.length)&&!Cv(e)}function b$(e,t,n){if(!ta(n))return!1;var a=typeof t;return(a=="number"?cr(n)&&ld(t,n.length):a=="string"&&t in n)?Ii(n[t],e):!1}function y$(e){return Bw(function(t,n){var a=-1,o=n.length,l=o>1?n[o-1]:void 0,s=o>2?n[2]:void 0;for(l=e.length>3&&typeof l=="function"?(o--,l):void 0,s&&b$(n[0],n[1],s)&&(l=o<3?void 0:l,o=1),t=Object(t);++a-1}function IO(e,t){var n=this.__data__,a=sd(n,e);return a<0?(++this.size,n.push([e,t])):n[a][1]=t,this}function Jo(e){var t=-1,n=e==null?0:e.length;for(this.clear();++t0&&n(r)?t>1?Pi(r,t-1,n,a,o):Iv(o,r):a||(o[o.length]=r)}return o}function gc(e){var t=e==null?0:e.length;return t?Pi(e,1):[]}function Ww(e){return _w(Dw(e,void 0,gc),e+"")}var Nv=Kw(Object.getPrototypeOf,Object),WO="[object Object]",jO=Function.prototype,YO=Object.prototype,jw=jO.toString,UO=YO.hasOwnProperty,qO=jw.call(Object);function Mv(e){if(!go(e)||us(e)!=WO)return!1;var t=Nv(e);if(t===null)return!0;var n=UO.call(t,"constructor")&&t.constructor;return typeof n=="function"&&n instanceof n&&jw.call(n)==qO}function GO(e,t,n){var a=-1,o=e.length;t<0&&(t=-t>o?0:o+t),n=n>o?o:n,n<0&&(n+=o),o=t>n?0:n-t>>>0,t>>>=0;for(var l=Array(o);++a=t?e:t)),e}function zl(e,t,n){return n===void 0&&(n=t,t=void 0),n!==void 0&&(n=Fr(n),n=n===n?n:0),t!==void 0&&(t=Fr(t),t=t===t?t:0),XO(Fr(e),t,n)}function ZO(){this.__data__=new Jo,this.size=0}function JO(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n}function QO(e){return this.__data__.get(e)}function eI(e){return this.__data__.has(e)}var tI=200;function nI(e,t){var n=this.__data__;if(n instanceof Jo){var a=n.__data__;if(!oi||a.lengthr))return!1;var c=l.get(e),d=l.get(t);if(c&&d)return c==t&&d==e;var f=-1,h=!0,g=n&NN?new li:void 0;for(l.set(e,t),l.set(t,e);++f=t||O<0||f&&$>=l}function b(){var E=ef();if(m(E))return k(E);r=setTimeout(b,p(E))}function k(E){return r=void 0,h&&a?g(E):(a=o=void 0,s)}function w(){r!==void 0&&clearTimeout(r),c=0,a=u=o=r=void 0}function C(){return r===void 0?s:k(ef())}function S(){var E=ef(),O=m(E);if(a=arguments,o=this,u=E,O){if(r===void 0)return v(u);if(f)return clearTimeout(r),r=setTimeout(b,t),g(u)}return r===void 0&&(r=setTimeout(b,t)),s}return S.cancel=w,S.flush=C,S}function Yf(e,t,n){(n!==void 0&&!Ii(e[t],n)||n===void 0&&!(t in e))&&Sv(e,t,n)}function c1(e){return go(e)&&cr(e)}function Uf(e,t){if(!(t==="constructor"&&typeof e[t]=="function")&&t!="__proto__")return e[t]}function yM(e){return ur(e,Mi(e))}function wM(e,t,n,a,o,l,s){var r=Uf(e,n),u=Uf(t,n),c=s.get(u);if(c){Yf(e,n,c);return}var d=l?l(r,u,n+"",e,t,s):void 0,f=d===void 0;if(f){var h=ea(u),g=!h&&ni(u),v=!h&&!g&&$v(u);d=u,h||g||v?ea(r)?d=r:c1(r)?d=Aw(r):g?(f=!1,d=Uw(u,!0)):v?(f=!1,d=Jw(u,!0)):d=[]:Mv(u)||ti(u)?(d=r,ti(r)?d=yM(r):(!ta(r)||Cv(r))&&(d=Qw(u))):f=!1}f&&(s.set(u,d),o(d,u,a,l,s),s.delete(u)),Yf(e,n,d)}function d1(e,t,n,a,o){e!==t&&u1(t,function(l,s){if(o||(o=new Aa),ta(l))wM(e,t,s,n,d1,a,o);else{var r=a?a(Uf(e,s),l,s+"",e,t,o):void 0;r===void 0&&(r=l),Yf(e,s,r)}},Mi)}function CM(e){var t=e==null?0:e.length;return t?e[t-1]:void 0}function f1(e,t,n){var a=e==null?0:e.length;if(!a)return-1;var o=a-1;return Lw(e,i1(t),o,!0)}function SM(e,t){var n=-1,a=cr(e)?Array(e.length):[];return hM(e,function(o,l,s){a[++n]=t(o,l,s)}),a}function kM(e,t){var n=ea(e)?yv:SM;return n(e,i1(t))}function p1(e,t){return Pi(kM(e,t),1)}var EM=1/0;function xM(e){var t=e==null?0:e.length;return t?Pi(e,EM):[]}function Us(e){for(var t=-1,n=e==null?0:e.length,a={};++t1),l}),ur(e,Zw(e),n),a&&(n=Hr(n,PM|RM|AM,MM));for(var o=t.length;o--;)NM(n,t[o]);return n});function h1(e,t,n,a){if(!ta(e))return e;t=dr(t,e);for(var o=-1,l=t.length,s=l-1,r=e;r!=null&&++o=zM){var c=FM(e);if(c)return Av(c);s=!1,o=a1,u=new li}else u=r;e:for(;++ae===void 0,Dt=e=>typeof e=="boolean",ze=e=>typeof e=="number",Jn=e=>!e&&e!==0||ye(e)&&e.length===0||et(e)&&!Object.keys(e).length,oa=e=>typeof Element>"u"?!1:e instanceof Element,la=e=>cn(e),KM=e=>_e(e)?!Number.isNaN(Number(e)):!1,Ai=e=>e===window,si=e=>Object.keys(e),m1=e=>Object.entries(e),bl=(e,t,n)=>({get value(){return fn(e,t,n)},set value(a){DM(e,t,a)}}),g1="__epPropKey",q=e=>e,WM=e=>et(e)&&!!e[g1],Ga=(e,t)=>{if(!et(e)||WM(e))return e;const{values:n,required:a,default:o,type:l,validator:s}=e,r={type:l,required:!!a,validator:n||s?u=>{let c=!1,d=[];if(n&&(d=Array.from(n),Tt(e,"default")&&d.push(o),c||=d.includes(u)),s&&(c||=s(u)),!c&&d.length>0){const f=[...new Set(d)].map(h=>JSON.stringify(h)).join(", ");Lx(`Invalid prop: validation failed${t?` for prop "${t}"`:""}. Expected one of [${f}], got value ${JSON.stringify(u)}.`)}return c}:void 0,[g1]:!0};return Tt(e,"default")&&(r.default=o),r},Ce=e=>Us(Object.entries(e).map(([t,n])=>[t,Ga(n,t)])),_i=Ce({to:{type:q([String,Object]),required:!0},disabled:Boolean}),jM=Ce({zIndex:{type:q([Number,String]),default:100},target:{type:String,default:""},offset:{type:Number,default:0},position:{type:String,values:["top","bottom"],default:"top"},teleported:Boolean,appendTo:{type:_i.to.type,default:"body"}}),YM={scroll:({scrollTop:e,fixed:t})=>ze(e)&&Dt(t),[vt]:e=>Dt(e)};var b1=class extends Error{constructor(e){super(e),this.name="ElementPlusError"}};function Gt(e,t){throw new b1(`[${e}] ${t}`)}function ut(e,t){{const n=_e(e)?new b1(`[${e}] ${t}`):e;console.warn(n)}}const UM=["class","style"],qM=/^on[A-Z]/,fd=(e={})=>{const{excludeListeners:t=!1,excludeKeys:n}=e,a=y(()=>(n?.value||[]).concat(UM)),o=it();return o?y(()=>Us(Object.entries(o.proxy?.$attrs).filter(([l])=>!a.value.includes(l)&&!(t&&qM.test(l))))):(ut("use-attrs","getCurrentInstance() returned null. useAttrs() must be called at the top of a setup function"),y(()=>({})))};function y1(e,t){var n;const a=jt();return ia(()=>{a.value=e()},{...t,flush:(n=void 0)!=null?n:"sync"}),es(a)}function fs(e){return u0()?(c0(e),!0):!1}function _n(e){return typeof e=="function"?e():i(e)}function GM(e){if(!Yt(e))return Nt(e);const t=new Proxy({},{get(n,a,o){return i(Reflect.get(e.value,a,o))},set(n,a,o){return Yt(e.value[a])&&!Yt(o)?e.value[a].value=o:e.value[a]=o,!0},deleteProperty(n,a){return Reflect.deleteProperty(e.value,a)},has(n,a){return Reflect.has(e.value,a)},ownKeys(){return Object.keys(e.value)},getOwnPropertyDescriptor(){return{enumerable:!0,configurable:!0}}});return Nt(t)}function XM(e){return GM(y(e))}const It=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const ZM=e=>typeof e<"u",w1=e=>e!=null,JM=Object.prototype.toString,QM=e=>JM.call(e)==="[object Object]",C1=(e,t,n)=>Math.min(n,Math.max(t,e)),_a=()=>{},yc=eP();function eP(){var e,t;return It&&((e=window?.navigator)==null?void 0:e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window?.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window?.navigator.userAgent))}function S1(e,t){function n(...a){return new Promise((o,l)=>{Promise.resolve(e(()=>t.apply(this,a),{fn:t,thisArg:this,args:a})).then(o).catch(l)})}return n}function tP(e,t={}){let n,a,o=_a;const l=r=>{clearTimeout(r),o(),o=_a};return r=>{const u=_n(e),c=_n(t.maxWait);return n&&l(n),u<=0||c!==void 0&&c<=0?(a&&(l(a),a=null),Promise.resolve(r())):new Promise((d,f)=>{o=t.rejectOnCancel?f:d,c&&!a&&(a=setTimeout(()=>{n&&l(n),a=null,d(r())},c)),n=setTimeout(()=>{a&&l(a),a=null,d(r())},u)})}}function nP(...e){let t=0,n,a=!0,o=_a,l,s,r,u,c;!Yt(e[0])&&typeof e[0]=="object"?{delay:s,trailing:r=!0,leading:u=!0,rejectOnCancel:c=!1}=e[0]:[s,r=!0,u=!0,c=!1]=e;const d=()=>{n&&(clearTimeout(n),n=void 0,o(),o=_a)};return h=>{const g=_n(s),v=Date.now()-t,p=()=>l=h();return d(),g<=0?(t=Date.now(),p()):(v>g&&(u||!a)?(t=Date.now(),p()):r&&(l=new Promise((m,b)=>{o=c?b:m,n=setTimeout(()=>{t=Date.now(),a=!0,m(p()),d()},Math.max(0,g-v))})),!u&&!n&&(n=setTimeout(()=>a=!0,g)),a=!1,l)}}function aP(e){return it()}function Li(e,t=200,n={}){return S1(tP(t,n),e)}function oP(e,t=200,n={}){const a=R(e.value),o=Li(()=>{a.value=e.value},t,n);return re(e,()=>o()),a}function k1(e,t=200,n=!1,a=!0,o=!1){return S1(nP(t,n,a,o),e)}function _v(e,t=!0,n){aP()?ct(e,n):t?e():Oe(e)}function qs(e,t,n={}){const{immediate:a=!0}=n,o=R(!1);let l=null;function s(){l&&(clearTimeout(l),l=null)}function r(){o.value=!1,s()}function u(...c){s(),o.value=!0,l=setTimeout(()=>{o.value=!1,l=null,e(...c)},_n(t))}return a&&(o.value=!0,It&&u()),fs(r),{isPending:es(o),start:u,stop:r}}const Xa=It?window:void 0,lP=It?window.document:void 0;function gn(e){var t;const n=_n(e);return(t=n?.$el)!=null?t:n}function At(...e){let t,n,a,o;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,a,o]=e,t=Xa):[t,n,a,o]=e,!t)return _a;Array.isArray(n)||(n=[n]),Array.isArray(a)||(a=[a]);const l=[],s=()=>{l.forEach(d=>d()),l.length=0},r=(d,f,h,g)=>(d.addEventListener(f,h,g),()=>d.removeEventListener(f,h,g)),u=re(()=>[gn(t),_n(o)],([d,f])=>{if(s(),!d)return;const h=QM(f)?{...f}:f;l.push(...n.flatMap(g=>a.map(v=>r(d,g,v,h))))},{immediate:!0,flush:"post"}),c=()=>{u(),s()};return fs(c),c}let Og=!1;function Lv(e,t,n={}){const{window:a=Xa,ignore:o=[],capture:l=!0,detectIframe:s=!1}=n;if(!a)return _a;yc&&!Og&&(Og=!0,Array.from(a.document.body.children).forEach(p=>p.addEventListener("click",_a)),a.document.documentElement.addEventListener("click",_a));let r=!0;const u=p=>_n(o).some(m=>{if(typeof m=="string")return Array.from(a.document.querySelectorAll(m)).some(b=>b===p.target||p.composedPath().includes(b));{const b=gn(m);return b&&(p.target===b||p.composedPath().includes(b))}});function c(p){const m=_n(p);return m&&m.$.subTree.shapeFlag===16}function d(p,m){const b=_n(p),k=b.$.subTree&&b.$.subTree.children;return k==null||!Array.isArray(k)?!1:k.some(w=>w.el===m.target||m.composedPath().includes(w.el))}const f=p=>{const m=gn(e);if(p.target!=null&&!(!(m instanceof Element)&&c(e)&&d(e,p))&&!(!m||m===p.target||p.composedPath().includes(m))){if(p.detail===0&&(r=!u(p)),!r){r=!0;return}t(p)}};let h=!1;const g=[At(a,"click",p=>{h||(h=!0,setTimeout(()=>{h=!1},0),f(p))},{passive:!0,capture:l}),At(a,"pointerdown",p=>{const m=gn(e);r=!u(p)&&!!(m&&!p.composedPath().includes(m))},{passive:!0}),s&&At(a,"blur",p=>{setTimeout(()=>{var m;const b=gn(e);((m=a.document.activeElement)==null?void 0:m.tagName)==="IFRAME"&&!b?.contains(a.document.activeElement)&&t(p)},0)})].filter(Boolean);return()=>g.forEach(p=>p())}function sP(){const e=R(!1),t=it();return t&&ct(()=>{e.value=!0},t),e}function pd(e){const t=sP();return y(()=>(t.value,!!e()))}function Di(e,t,n={}){const{window:a=Xa,...o}=n;let l;const s=pd(()=>a&&"MutationObserver"in a),r=()=>{l&&(l.disconnect(),l=void 0)},u=y(()=>{const h=_n(e),g=(Array.isArray(h)?h:[h]).map(gn).filter(w1);return new Set(g)}),c=re(()=>u.value,h=>{r(),s.value&&h.size&&(l=new MutationObserver(t),h.forEach(g=>l.observe(g,o)))},{immediate:!0,flush:"post"}),d=()=>l?.takeRecords(),f=()=>{c(),r()};return fs(f),{isSupported:s,stop:f,takeRecords:d}}function rP(e={}){var t;const{window:n=Xa,deep:a=!0,triggerOnRemoval:o=!1}=e,l=(t=e.document)!=null?t:n?.document,s=()=>{var c;let d=l?.activeElement;if(a)for(;d?.shadowRoot;)d=(c=d?.shadowRoot)==null?void 0:c.activeElement;return d},r=R(),u=()=>{r.value=s()};return n&&(At(n,"blur",c=>{c.relatedTarget===null&&u()},!0),At(n,"focus",u,!0)),o&&Di(l,c=>{c.filter(d=>d.removedNodes.length).map(d=>Array.from(d.removedNodes)).flat().forEach(d=>{d===r.value&&u()})},{childList:!0,subtree:!0}),u(),r}function iP(e,t={}){const{window:n=Xa}=t,a=pd(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let o;const l=R(!1),s=c=>{l.value=c.matches},r=()=>{o&&("removeEventListener"in o?o.removeEventListener("change",s):o.removeListener(s))},u=ia(()=>{a.value&&(r(),o=n.matchMedia(_n(e)),"addEventListener"in o?o.addEventListener("change",s):o.addListener(s),l.value=o.matches)});return fs(()=>{u(),r(),o=void 0}),l}function uP(e){return JSON.parse(JSON.stringify(e))}function cP(e,t,n={}){const{window:a=Xa,initialValue:o,observe:l=!1}=n,s=R(o),r=y(()=>{var c;return gn(t)||((c=a?.document)==null?void 0:c.documentElement)});function u(){var c;const d=_n(e),f=_n(r);if(f&&a&&d){const h=(c=a.getComputedStyle(f).getPropertyValue(d))==null?void 0:c.trim();s.value=h||o}}return l&&Di(r,u,{attributeFilter:["style","class"],window:a}),re([r,()=>_n(e)],(c,d)=>{d[0]&&d[1]&&d[0].style.removeProperty(d[1]),u()},{immediate:!0}),re(s,c=>{var d;const f=_n(e);(d=r.value)!=null&&d.style&&f&&(c==null?r.value.style.removeProperty(f):r.value.style.setProperty(f,c))}),s}function dP(e={}){const{document:t=lP}=e;if(!t)return R("visible");const n=R(t.visibilityState);return At(t,"visibilitychange",()=>{n.value=t.visibilityState}),n}function Ut(e,t,n={}){const{window:a=Xa,...o}=n;let l;const s=pd(()=>a&&"ResizeObserver"in a),r=()=>{l&&(l.disconnect(),l=void 0)},u=y(()=>{const f=_n(e);return Array.isArray(f)?f.map(h=>gn(h)):[gn(f)]}),c=re(u,f=>{if(r(),s.value&&a){l=new ResizeObserver(t);for(const h of f)h&&l.observe(h,o)}},{immediate:!0,flush:"post"}),d=()=>{r(),c()};return fs(d),{isSupported:s,stop:d}}function Ig(e,t={}){const{reset:n=!0,windowResize:a=!0,windowScroll:o=!0,immediate:l=!0,updateTiming:s="sync"}=t,r=R(0),u=R(0),c=R(0),d=R(0),f=R(0),h=R(0),g=R(0),v=R(0);function p(){const b=gn(e);if(!b){n&&(r.value=0,u.value=0,c.value=0,d.value=0,f.value=0,h.value=0,g.value=0,v.value=0);return}const k=b.getBoundingClientRect();r.value=k.height,u.value=k.bottom,c.value=k.left,d.value=k.right,f.value=k.top,h.value=k.width,g.value=k.x,v.value=k.y}function m(){s==="sync"?p():s==="next-frame"&&requestAnimationFrame(()=>p())}return Ut(e,m),re(()=>gn(e),b=>!b&&m()),Di(e,m,{attributeFilter:["style","class"]}),o&&At("scroll",m,{capture:!0,passive:!0}),a&&At("resize",m,{passive:!0}),_v(()=>{l&&m()}),{height:r,bottom:u,left:c,right:d,top:f,width:h,x:g,y:v,update:m}}function qf(e,t={width:0,height:0},n={}){const{window:a=Xa,box:o="content-box"}=n,l=y(()=>{var f,h;return(h=(f=gn(e))==null?void 0:f.namespaceURI)==null?void 0:h.includes("svg")}),s=R(t.width),r=R(t.height),{stop:u}=Ut(e,([f])=>{const h=o==="border-box"?f.borderBoxSize:o==="content-box"?f.contentBoxSize:f.devicePixelContentBoxSize;if(a&&l.value){const g=gn(e);if(g){const v=g.getBoundingClientRect();s.value=v.width,r.value=v.height}}else if(h){const g=Array.isArray(h)?h:[h];s.value=g.reduce((v,{inlineSize:p})=>v+p,0),r.value=g.reduce((v,{blockSize:p})=>v+p,0)}else s.value=f.contentRect.width,r.value=f.contentRect.height},n);_v(()=>{const f=gn(e);f&&(s.value="offsetWidth"in f?f.offsetWidth:t.width,r.value="offsetHeight"in f?f.offsetHeight:t.height)});const c=re(()=>gn(e),f=>{s.value=f?t.width:0,r.value=f?t.height:0});function d(){u(),c()}return{width:s,height:r,stop:d}}function fP(e,t,n={}){const{root:a,rootMargin:o="0px",threshold:l=0,window:s=Xa,immediate:r=!0}=n,u=pd(()=>s&&"IntersectionObserver"in s),c=y(()=>{const v=_n(e);return(Array.isArray(v)?v:[v]).map(gn).filter(w1)});let d=_a;const f=R(r),h=u.value?re(()=>[c.value,gn(a),f.value],([v,p])=>{if(d(),!f.value||!v.length)return;const m=new IntersectionObserver(t,{root:gn(p),rootMargin:o,threshold:l});v.forEach(b=>b&&m.observe(b)),d=()=>{m.disconnect(),d=_a}},{immediate:r,flush:"post"}):_a,g=()=>{d(),h(),f.value=!1};return fs(g),{isSupported:u,isActive:f,pause(){d(),f.value=!1},resume(){f.value=!0},stop:g}}function E1(e,t,n,a={}){var o,l,s;const{clone:r=!1,passive:u=!1,eventName:c,deep:d=!1,defaultValue:f,shouldEmit:h}=a,g=it(),v=n||g?.emit||((o=g?.$emit)==null?void 0:o.bind(g))||((s=(l=g?.proxy)==null?void 0:l.$emit)==null?void 0:s.bind(g?.proxy));let p=c;t||(t="modelValue"),p=p||`update:${t.toString()}`;const m=w=>r?typeof r=="function"?r(w):uP(w):w,b=()=>ZM(e[t])?m(e[t]):f,k=w=>{h?h(w)&&v(p,w):v(p,w)};if(u){const w=b(),C=R(w);let S=!1;return re(()=>e[t],E=>{S||(S=!0,C.value=m(E),Oe(()=>S=!1))}),re(C,E=>{!S&&(E!==e[t]||d)&&k(E)},{deep:d}),C}else return y({get(){return b()},set(w){k(w)}})}function pP(e={}){const{window:t=Xa}=e;if(!t)return R(!1);const n=R(t.document.hasFocus());return At(t,"blur",()=>{n.value=!1}),At(t,"focus",()=>{n.value=!0}),n}function Dv(e={}){const{window:t=Xa,initialWidth:n=Number.POSITIVE_INFINITY,initialHeight:a=Number.POSITIVE_INFINITY,listenOrientation:o=!0,includeScrollbar:l=!0,type:s="inner"}=e,r=R(n),u=R(a),c=()=>{t&&(s==="outer"?(r.value=t.outerWidth,u.value=t.outerHeight):l?(r.value=t.innerWidth,u.value=t.innerHeight):(r.value=t.document.documentElement.clientWidth,u.value=t.document.documentElement.clientHeight))};if(c(),_v(c),At("resize",c,{passive:!0}),o){const d=iP("(orientation: portrait)");re(d,()=>c())}return{width:r,height:u}}function Bv(){const e=jt(),t=R(0),n=y(()=>({minWidth:`${Math.max(t.value,ad)}px`}));return Ut(e,()=>{t.value=e.value?.getBoundingClientRect().width??0}),{calculatorRef:e,calculatorWidth:t,inputStyle:n}}const co=({from:e,replacement:t,scope:n,version:a,ref:o,type:l="API"},s)=>{re(()=>i(s),r=>{r&&ut(n,`[${l}] ${e} is about to be deprecated in version ${a}, please use ${t} instead. -For more detail, please visit: ${o} -`)},{immediate:!0})},vP='a[href],button:not([disabled]),button:not([hidden]),:not([tabindex="-1"]),input:not([disabled]),input:not([type="hidden"]),select:not([disabled]),textarea:not([disabled])',x1=e=>typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot,Ng=e=>typeof Element>"u"?!1:e instanceof Element,hP=e=>getComputedStyle(e).position==="fixed"?!1:e.offsetParent!==null,Mg=e=>Array.from(e.querySelectorAll(vP)).filter(t=>ri(t)&&hP(t)),ri=e=>{if(e.tabIndex>0||e.tabIndex===0&&e.getAttribute("tabIndex")!==null)return!0;if(e.tabIndex<0||e.hasAttribute("disabled")||e.getAttribute("aria-disabled")==="true")return!1;switch(e.nodeName){case"A":return!!e.href&&e.rel!=="ignore";case"INPUT":return!(e.type==="hidden"||e.type==="file");case"BUTTON":case"SELECT":case"TEXTAREA":return!0;default:return!1}},_u=function(e,t,...n){let a;t.includes("mouse")||t.includes("click")?a="MouseEvents":t.includes("key")?a="KeyboardEvent":a="HTMLEvents";const o=document.createEvent(a);return o.initEvent(t,...n),e.dispatchEvent(o),e},T1=e=>!e.getAttribute("aria-owns"),$1=(e,t,n)=>{const{parentNode:a}=e;if(!a)return null;const o=a.querySelectorAll(n);return o[Array.prototype.indexOf.call(o,e)+t]||null},Bi=(e,t)=>{if(!e||!e.focus)return;let n=!1;Ng(e)&&!ri(e)&&!e.getAttribute("tabindex")&&(e.setAttribute("tabindex","-1"),n=!0),e.focus(t),Ng(e)&&n&&e.removeAttribute("tabindex")},Lu=e=>{e&&(Bi(e),!T1(e)&&e.click())},vd=()=>It&&/firefox/i.test(window.navigator.userAgent),O1=()=>It&&/android/i.test(window.navigator.userAgent),Vv=(e="")=>e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d"),fl=e=>xi(e),mP="utils/dom/style",I1=(e="")=>e.split(" ").filter(t=>!!t.trim()),fo=(e,t)=>{if(!e||!t)return!1;if(t.includes(" "))throw new Error("className should not contain space.");return e.classList.contains(t)},ka=(e,t)=>{!e||!t.trim()||e.classList.add(...I1(t))},jn=(e,t)=>{!e||!t.trim()||e.classList.remove(...I1(t))},Ro=(e,t)=>{if(!It||!e||!t||x1(e))return"";let n=Nn(t);n==="float"&&(n="cssFloat");try{const a=e.style[n];if(a)return a;const o=document.defaultView?.getComputedStyle(e,"");return o?o[n]:""}catch{return e.style[n]}},N1=(e,t,n)=>{if(!(!e||!t))if(et(t))m1(t).forEach(([a,o])=>N1(e,a,o));else{const a=Nn(t);e.style[a]=n}};function en(e,t="px"){if(!e&&e!==0)return"";if(ze(e)||KM(e))return`${e}${t}`;if(_e(e))return e;ut(mP,"binding value must be a string or number")}const M1=(e,t,n,a)=>{const o={offsetX:0,offsetY:0},l=R(!1),s=(h,g)=>{if(e.value){const{offsetX:v,offsetY:p}=o,m=e.value.getBoundingClientRect(),b=m.left,k=m.top,w=m.width,C=m.height,S=document.documentElement.clientWidth,E=document.documentElement.clientHeight,O=-b+v,$=-k+p,N=S-b-w+v,I=E-k-(C{const g=h.clientX,v=h.clientY,{offsetX:p,offsetY:m}=o,b=w=>{l.value||(l.value=!0),s(p+w.clientX-g,m+w.clientY-v)},k=()=>{l.value=!1,document.removeEventListener("mousemove",b),document.removeEventListener("mouseup",k)};document.addEventListener("mousemove",b),document.addEventListener("mouseup",k)},u=()=>{t.value&&e.value&&(t.value.addEventListener("mousedown",r),window.addEventListener("resize",f))},c=()=>{t.value&&e.value&&(t.value.removeEventListener("mousedown",r),window.removeEventListener("resize",f))},d=()=>{o.offsetX=0,o.offsetY=0,e.value&&(e.value.style.transform="")},f=()=>{const{offsetX:h,offsetY:g}=o;s(h,g)};return ct(()=>{ia(()=>{n.value?u():c()})}),Rt(()=>{c()}),{isDragging:l,resetPosition:d,updatePosition:f}};var gP={name:"en",el:{breadcrumb:{label:"Breadcrumb"},colorpicker:{confirm:"OK",clear:"Clear",defaultLabel:"color picker",description:"current color is {color}. press enter to select a new color.",alphaLabel:"pick alpha value",alphaDescription:"alpha {alpha}, current color is {color}",hueLabel:"pick hue value",hueDescription:"hue {hue}, current color is {color}",svLabel:"pick saturation and brightness value",svDescription:"saturation {saturation}, brightness {brightness}, current color is {color}",predefineDescription:"select {value} as the color"},datepicker:{now:"Now",today:"Today",cancel:"Cancel",clear:"Clear",confirm:"OK",dateTablePrompt:"Use the arrow keys and enter to select the day of the month",monthTablePrompt:"Use the arrow keys and enter to select the month",yearTablePrompt:"Use the arrow keys and enter to select the year",selectedDate:"Selected date",selectDate:"Select date",selectTime:"Select time",startDate:"Start Date",startTime:"Start Time",endDate:"End Date",endTime:"End Time",prevYear:"Previous Year",nextYear:"Next Year",prevMonth:"Previous Month",nextMonth:"Next Month",year:"",month1:"January",month2:"February",month3:"March",month4:"April",month5:"May",month6:"June",month7:"July",month8:"August",month9:"September",month10:"October",month11:"November",month12:"December",weeks:{sun:"Sun",mon:"Mon",tue:"Tue",wed:"Wed",thu:"Thu",fri:"Fri",sat:"Sat"},weeksFull:{sun:"Sunday",mon:"Monday",tue:"Tuesday",wed:"Wednesday",thu:"Thursday",fri:"Friday",sat:"Saturday"},months:{jan:"Jan",feb:"Feb",mar:"Mar",apr:"Apr",may:"May",jun:"Jun",jul:"Jul",aug:"Aug",sep:"Sep",oct:"Oct",nov:"Nov",dec:"Dec"}},inputNumber:{decrease:"decrease number",increase:"increase number"},select:{loading:"Loading",noMatch:"No matching data",noData:"No data",placeholder:"Select"},mention:{loading:"Loading"},dropdown:{toggleDropdown:"Toggle Dropdown"},cascader:{noMatch:"No matching data",loading:"Loading",placeholder:"Select",noData:"No data"},pagination:{goto:"Go to",pagesize:"/page",total:"Total {total}",pageClassifier:"",page:"Page",prev:"Go to previous page",next:"Go to next page",currentPage:"page {pager}",prevPages:"Previous {pager} pages",nextPages:"Next {pager} pages",deprecationWarning:"Deprecated usages detected, please refer to the el-pagination documentation for more details"},dialog:{close:"Close this dialog"},drawer:{close:"Close this dialog"},messagebox:{title:"Message",confirm:"OK",cancel:"Cancel",error:"Illegal input",close:"Close this dialog"},upload:{deleteTip:"press delete to remove",delete:"Delete",preview:"Preview",continue:"Continue"},slider:{defaultLabel:"slider between {min} and {max}",defaultRangeStartLabel:"pick start value",defaultRangeEndLabel:"pick end value"},table:{emptyText:"No Data",confirmFilter:"Confirm",resetFilter:"Reset",clearFilter:"All",sumText:"Sum",selectAllLabel:"Select all rows",selectRowLabel:"Select this row",expandRowLabel:"Expand this row",collapseRowLabel:"Collapse this row",sortLabel:"Sort by {column}",filterLabel:"Filter by {column}"},tag:{close:"Close this tag"},tour:{next:"Next",previous:"Previous",finish:"Finish",close:"Close this dialog"},tree:{emptyText:"No Data"},transfer:{noMatch:"No matching data",noData:"No data",titles:["List 1","List 2"],filterPlaceholder:"Enter keyword",noCheckedFormat:"{total} items",hasCheckedFormat:"{checked}/{total} checked"},image:{error:"FAILED"},pageHeader:{title:"Back"},popconfirm:{confirmButtonText:"Yes",cancelButtonText:"No"},carousel:{leftArrow:"Carousel arrow left",rightArrow:"Carousel arrow right",indicator:"Carousel switch to index {index}"}}};const bP=e=>(t,n)=>yP(t,n,i(e)),yP=(e,t,n)=>fn(n,e,e).replace(/\{(\w+)\}/g,(a,o)=>`${t?.[o]??`{${o}}`}`),wP=e=>({lang:y(()=>i(e).name),locale:Yt(e)?e:R(e),t:bP(e)}),P1=Symbol("localeContextKey"),bt=e=>{const t=e||Re(P1,R());return wP(y(()=>t.value||gP))},Kr="el",CP="is-",Rl=(e,t,n,a,o)=>{let l=`${e}-${t}`;return n&&(l+=`-${n}`),a&&(l+=`__${a}`),o&&(l+=`--${o}`),l},R1=Symbol("namespaceContextKey"),Fv=e=>{const t=e||(it()?Re(R1,R(Kr)):R(Kr));return y(()=>i(t)||Kr)},fe=(e,t)=>{const n=Fv(t);return{namespace:n,b:(p="")=>Rl(n.value,e,p,"",""),e:p=>p?Rl(n.value,e,"",p,""):"",m:p=>p?Rl(n.value,e,"","",p):"",be:(p,m)=>p&&m?Rl(n.value,e,p,m,""):"",em:(p,m)=>p&&m?Rl(n.value,e,"",p,m):"",bm:(p,m)=>p&&m?Rl(n.value,e,p,"",m):"",bem:(p,m,b)=>p&&m&&b?Rl(n.value,e,p,m,b):"",is:(p,...m)=>{const b=m.length>=1?m[0]:!0;return p&&b?`${CP}${p}`:""},cssVar:p=>{const m={};for(const b in p)p[b]&&(m[`--${n.value}-${b}`]=p[b]);return m},cssVarName:p=>`--${n.value}-${p}`,cssVarBlock:p=>{const m={};for(const b in p)p[b]&&(m[`--${n.value}-${e}-${b}`]=p[b]);return m},cssVarBlockName:p=>`--${n.value}-${e}-${p}`}};function SP(e,t,n,a){const o=n-t;return e/=a/2,e<1?o/2*e*e*e+t:o/2*((e-=2)*e*e+2)+t}const Fa=e=>It?window.requestAnimationFrame(e):setTimeout(e,16),jo=e=>It?window.cancelAnimationFrame(e):clearTimeout(e),kP=(e,t)=>{if(!It)return!1;const n={undefined:"overflow",true:"overflow-y",false:"overflow-x"}[String(t)],a=Ro(e,n);return["scroll","auto","overlay"].some(o=>a.includes(o))},zv=(e,t)=>{if(!It)return;let n=e;for(;n;){if([window,document,document.documentElement].includes(n))return window;if(kP(n,t))return n;x1(n)?n=n.host:n=n.parentNode}return n};let cu;const A1=e=>{if(!It)return 0;if(cu!==void 0)return cu;const t=document.createElement("div");t.className=`${e}-scrollbar__wrap`,t.style.visibility="hidden",t.style.width="100px",t.style.position="absolute",t.style.top="-9999px",document.body.appendChild(t);const n=t.offsetWidth;t.style.overflow="scroll";const a=document.createElement("div");a.style.width="100%",t.appendChild(a);const o=a.offsetWidth;return t.parentNode?.removeChild(t),cu=n-o,cu};function Hv(e,t){if(!It)return;if(!t){e.scrollTop=0;return}const n=[];let a=t.offsetParent;for(;a!==null&&e!==a&&e.contains(a);)n.push(a),a=a.offsetParent;const o=t.offsetTop+n.reduce((u,c)=>u+c.offsetTop,0),l=o+t.offsetHeight,s=e.scrollTop,r=s+e.clientHeight;or&&(e.scrollTop=l-e.clientHeight)}function EP(e,t,n,a,o){const l=Date.now();let s;const r=()=>{const u=Date.now()-l,c=SP(u>a?a:u,t,n,a);Ai(e)?e.scrollTo(window.pageXOffset,c):e.scrollTop=c,u{s&&jo(s)}}const Pg=(e,t)=>Ai(t)?e.ownerDocument.documentElement:t,Rg=e=>Ai(e)?window.scrollY:e.scrollTop,hd=(e,t={})=>{Yt(e)||Gt("[useLockscreen]","You need to pass a ref param to this function");const n=t.ns||fe("popup"),a=y(()=>n.bm("parent","hidden"));let o=0,l=!1,s="0",r=!1;const u=()=>{r||(r=!0,setTimeout(()=>{typeof document>"u"||l&&document&&(document.body.style.width=s,jn(document.body,a.value))},200))};re(e,c=>{if(!c){u();return}r=!1,l=!fo(document.body,a.value),l&&(s=document.body.style.width,ka(document.body,a.value)),o=A1(n.namespace.value);const d=document.documentElement.clientHeight0&&(d||f==="scroll")&&l&&(document.body.style.width=`calc(100% - ${o}px)`)}),c0(()=>u())},wn=(e,t,{checkForDefaultPrevented:n=!0}={})=>o=>{const l=e?.(o);if(n===!1||!l)return t?.(o)},Ag=e=>t=>t.pointerType==="mouse"?e(t):void 0,Ft=e=>{if(e.code&&e.code!=="Unidentified")return e.code;const t=_1(e);return t?Object.values(we).includes(t)?t:t===" "?we.space:"":""},_1=e=>{let t=e.key&&e.key!=="Unidentified"?e.key:"";if(!t&&e.type==="keyup"&&O1()){const n=e.target;t=n.value.charAt(n.selectionStart-1)}return t},xP=Ga({type:q(Boolean),default:null}),TP=Ga({type:q(Function)}),$P=e=>{const t=`update:${e}`,n=`onUpdate:${e}`,a=[t],o={[e]:xP,[n]:TP};return{useModelToggle:({indicator:s,toggleReason:r,shouldHideWhenRouteChanges:u,shouldProceed:c,onShow:d,onHide:f})=>{const h=it(),{emit:g}=h,v=h.props,p=y(()=>Be(v[n])),m=y(()=>v[e]===null),b=O=>{s.value!==!0&&(s.value=!0,r&&(r.value=O),Be(d)&&d(O))},k=O=>{s.value!==!1&&(s.value=!1,r&&(r.value=O),Be(f)&&f(O))},w=O=>{if(v.disabled===!0||Be(c)&&!c())return;const $=p.value&&It;$&&g(t,!0),(m.value||!$)&&b(O)},C=O=>{if(v.disabled===!0||!It)return;const $=p.value&&It;$&&g(t,!1),(m.value||!$)&&k(O)},S=O=>{Dt(O)&&(v.disabled&&O?p.value&&g(t,!1):s.value!==O&&(O?b():k()))},E=()=>{s.value?C():w()};return re(()=>v[e],S),u&&h.appContext.config.globalProperties.$route!==void 0&&re(()=>({...h.proxy.$route}),()=>{u.value&&s.value&&C()}),ct(()=>{S(v[e])}),{hide:C,show:w,toggle:E,hasUpdateHandler:p}},useModelToggleProps:o,useModelToggleEmits:a}},L1=e=>{const t=it();return y(()=>t?.proxy?.$props?.[e])};var sa="top",$a="bottom",Oa="right",ra="left",Kv="auto",Vi=[sa,$a,Oa,ra],Gs="start",ii="end",OP="clippingParents",D1="viewport",kr="popper",IP="reference",_g=Vi.reduce(function(e,t){return e.concat([t+"-"+Gs,t+"-"+ii])},[]),So=[].concat(Vi,[Kv]).reduce(function(e,t){return e.concat([t,t+"-"+Gs,t+"-"+ii])},[]),NP="beforeRead",MP="read",PP="afterRead",RP="beforeMain",AP="main",_P="afterMain",LP="beforeWrite",DP="write",BP="afterWrite",VP=[NP,MP,PP,RP,AP,_P,LP,DP,BP];function yo(e){return e?(e.nodeName||"").toLowerCase():null}function ba(e){if(e==null)return window;if(e.toString()!=="[object Window]"){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function as(e){var t=ba(e).Element;return e instanceof t||e instanceof Element}function xa(e){var t=ba(e).HTMLElement;return e instanceof t||e instanceof HTMLElement}function Wv(e){if(typeof ShadowRoot>"u")return!1;var t=ba(e).ShadowRoot;return e instanceof t||e instanceof ShadowRoot}function FP(e){var t=e.state;Object.keys(t.elements).forEach(function(n){var a=t.styles[n]||{},o=t.attributes[n]||{},l=t.elements[n];!xa(l)||!yo(l)||(Object.assign(l.style,a),Object.keys(o).forEach(function(s){var r=o[s];r===!1?l.removeAttribute(s):l.setAttribute(s,r===!0?"":r)}))})}function zP(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach(function(a){var o=t.elements[a],l=t.attributes[a]||{},s=Object.keys(t.styles.hasOwnProperty(a)?t.styles[a]:n[a]),r=s.reduce(function(u,c){return u[c]="",u},{});!xa(o)||!yo(o)||(Object.assign(o.style,r),Object.keys(l).forEach(function(u){o.removeAttribute(u)}))})}}var B1={name:"applyStyles",enabled:!0,phase:"write",fn:FP,effect:zP,requires:["computeStyles"]};function po(e){return e.split("-")[0]}var Gl=Math.max,wc=Math.min,Xs=Math.round;function Gf(){var e=navigator.userAgentData;return e!=null&&e.brands&&Array.isArray(e.brands)?e.brands.map(function(t){return t.brand+"/"+t.version}).join(" "):navigator.userAgent}function V1(){return!/^((?!chrome|android).)*safari/i.test(Gf())}function Zs(e,t,n){t===void 0&&(t=!1),n===void 0&&(n=!1);var a=e.getBoundingClientRect(),o=1,l=1;t&&xa(e)&&(o=e.offsetWidth>0&&Xs(a.width)/e.offsetWidth||1,l=e.offsetHeight>0&&Xs(a.height)/e.offsetHeight||1);var s=as(e)?ba(e):window,r=s.visualViewport,u=!V1()&&n,c=(a.left+(u&&r?r.offsetLeft:0))/o,d=(a.top+(u&&r?r.offsetTop:0))/l,f=a.width/o,h=a.height/l;return{width:f,height:h,top:d,right:c+f,bottom:d+h,left:c,x:c,y:d}}function jv(e){var t=Zs(e),n=e.offsetWidth,a=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-a)<=1&&(a=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:a}}function F1(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&Wv(n)){var a=t;do{if(a&&e.isSameNode(a))return!0;a=a.parentNode||a.host}while(a)}return!1}function Yo(e){return ba(e).getComputedStyle(e)}function HP(e){return["table","td","th"].indexOf(yo(e))>=0}function Ol(e){return((as(e)?e.ownerDocument:e.document)||window.document).documentElement}function md(e){return yo(e)==="html"?e:e.assignedSlot||e.parentNode||(Wv(e)?e.host:null)||Ol(e)}function Lg(e){return!xa(e)||Yo(e).position==="fixed"?null:e.offsetParent}function KP(e){var t=/firefox/i.test(Gf()),n=/Trident/i.test(Gf());if(n&&xa(e)){var a=Yo(e);if(a.position==="fixed")return null}var o=md(e);for(Wv(o)&&(o=o.host);xa(o)&&["html","body"].indexOf(yo(o))<0;){var l=Yo(o);if(l.transform!=="none"||l.perspective!=="none"||l.contain==="paint"||["transform","perspective"].indexOf(l.willChange)!==-1||t&&l.willChange==="filter"||t&&l.filter&&l.filter!=="none")return o;o=o.parentNode}return null}function Fi(e){for(var t=ba(e),n=Lg(e);n&&HP(n)&&Yo(n).position==="static";)n=Lg(n);return n&&(yo(n)==="html"||yo(n)==="body"&&Yo(n).position==="static")?t:n||KP(e)||t}function Yv(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function Wr(e,t,n){return Gl(e,wc(t,n))}function WP(e,t,n){var a=Wr(e,t,n);return a>n?n:a}function z1(){return{top:0,right:0,bottom:0,left:0}}function H1(e){return Object.assign({},z1(),e)}function K1(e,t){return t.reduce(function(n,a){return n[a]=e,n},{})}var jP=function(e,t){return e=typeof e=="function"?e(Object.assign({},t.rects,{placement:t.placement})):e,H1(typeof e!="number"?e:K1(e,Vi))};function YP(e){var t,n=e.state,a=e.name,o=e.options,l=n.elements.arrow,s=n.modifiersData.popperOffsets,r=po(n.placement),u=Yv(r),c=[ra,Oa].indexOf(r)>=0,d=c?"height":"width";if(!(!l||!s)){var f=jP(o.padding,n),h=jv(l),g=u==="y"?sa:ra,v=u==="y"?$a:Oa,p=n.rects.reference[d]+n.rects.reference[u]-s[u]-n.rects.popper[d],m=s[u]-n.rects.reference[u],b=Fi(l),k=b?u==="y"?b.clientHeight||0:b.clientWidth||0:0,w=p/2-m/2,C=f[g],S=k-h[d]-f[v],E=k/2-h[d]/2+w,O=Wr(C,E,S),$=u;n.modifiersData[a]=(t={},t[$]=O,t.centerOffset=O-E,t)}}function UP(e){var t=e.state,n=e.options,a=n.element,o=a===void 0?"[data-popper-arrow]":a;o!=null&&(typeof o=="string"&&(o=t.elements.popper.querySelector(o),!o)||F1(t.elements.popper,o)&&(t.elements.arrow=o))}var qP={name:"arrow",enabled:!0,phase:"main",fn:YP,effect:UP,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Js(e){return e.split("-")[1]}var GP={top:"auto",right:"auto",bottom:"auto",left:"auto"};function XP(e,t){var n=e.x,a=e.y,o=t.devicePixelRatio||1;return{x:Xs(n*o)/o||0,y:Xs(a*o)/o||0}}function Dg(e){var t,n=e.popper,a=e.popperRect,o=e.placement,l=e.variation,s=e.offsets,r=e.position,u=e.gpuAcceleration,c=e.adaptive,d=e.roundOffsets,f=e.isFixed,h=s.x,g=h===void 0?0:h,v=s.y,p=v===void 0?0:v,m=typeof d=="function"?d({x:g,y:p}):{x:g,y:p};g=m.x,p=m.y;var b=s.hasOwnProperty("x"),k=s.hasOwnProperty("y"),w=ra,C=sa,S=window;if(c){var E=Fi(n),O="clientHeight",$="clientWidth";if(E===ba(n)&&(E=Ol(n),Yo(E).position!=="static"&&r==="absolute"&&(O="scrollHeight",$="scrollWidth")),E=E,o===sa||(o===ra||o===Oa)&&l===ii){C=$a;var N=f&&E===S&&S.visualViewport?S.visualViewport.height:E[O];p-=N-a.height,p*=u?1:-1}if(o===ra||(o===sa||o===$a)&&l===ii){w=Oa;var I=f&&E===S&&S.visualViewport?S.visualViewport.width:E[$];g-=I-a.width,g*=u?1:-1}}var _=Object.assign({position:r},c&&GP),A=d===!0?XP({x:g,y:p},ba(n)):{x:g,y:p};if(g=A.x,p=A.y,u){var F;return Object.assign({},_,(F={},F[C]=k?"0":"",F[w]=b?"0":"",F.transform=(S.devicePixelRatio||1)<=1?"translate("+g+"px, "+p+"px)":"translate3d("+g+"px, "+p+"px, 0)",F))}return Object.assign({},_,(t={},t[C]=k?p+"px":"",t[w]=b?g+"px":"",t.transform="",t))}function ZP(e){var t=e.state,n=e.options,a=n.gpuAcceleration,o=a===void 0?!0:a,l=n.adaptive,s=l===void 0?!0:l,r=n.roundOffsets,u=r===void 0?!0:r,c={placement:po(t.placement),variation:Js(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:o,isFixed:t.options.strategy==="fixed"};t.modifiersData.popperOffsets!=null&&(t.styles.popper=Object.assign({},t.styles.popper,Dg(Object.assign({},c,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:s,roundOffsets:u})))),t.modifiersData.arrow!=null&&(t.styles.arrow=Object.assign({},t.styles.arrow,Dg(Object.assign({},c,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:u})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})}var W1={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:ZP,data:{}},du={passive:!0};function JP(e){var t=e.state,n=e.instance,a=e.options,o=a.scroll,l=o===void 0?!0:o,s=a.resize,r=s===void 0?!0:s,u=ba(t.elements.popper),c=[].concat(t.scrollParents.reference,t.scrollParents.popper);return l&&c.forEach(function(d){d.addEventListener("scroll",n.update,du)}),r&&u.addEventListener("resize",n.update,du),function(){l&&c.forEach(function(d){d.removeEventListener("scroll",n.update,du)}),r&&u.removeEventListener("resize",n.update,du)}}var j1={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:JP,data:{}},QP={left:"right",right:"left",bottom:"top",top:"bottom"};function Du(e){return e.replace(/left|right|bottom|top/g,function(t){return QP[t]})}var eR={start:"end",end:"start"};function Bg(e){return e.replace(/start|end/g,function(t){return eR[t]})}function Uv(e){var t=ba(e),n=t.pageXOffset,a=t.pageYOffset;return{scrollLeft:n,scrollTop:a}}function qv(e){return Zs(Ol(e)).left+Uv(e).scrollLeft}function tR(e,t){var n=ba(e),a=Ol(e),o=n.visualViewport,l=a.clientWidth,s=a.clientHeight,r=0,u=0;if(o){l=o.width,s=o.height;var c=V1();(c||!c&&t==="fixed")&&(r=o.offsetLeft,u=o.offsetTop)}return{width:l,height:s,x:r+qv(e),y:u}}function nR(e){var t,n=Ol(e),a=Uv(e),o=(t=e.ownerDocument)==null?void 0:t.body,l=Gl(n.scrollWidth,n.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),s=Gl(n.scrollHeight,n.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),r=-a.scrollLeft+qv(e),u=-a.scrollTop;return Yo(o||n).direction==="rtl"&&(r+=Gl(n.clientWidth,o?o.clientWidth:0)-l),{width:l,height:s,x:r,y:u}}function Gv(e){var t=Yo(e),n=t.overflow,a=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+a)}function Y1(e){return["html","body","#document"].indexOf(yo(e))>=0?e.ownerDocument.body:xa(e)&&Gv(e)?e:Y1(md(e))}function jr(e,t){var n;t===void 0&&(t=[]);var a=Y1(e),o=a===((n=e.ownerDocument)==null?void 0:n.body),l=ba(a),s=o?[l].concat(l.visualViewport||[],Gv(a)?a:[]):a,r=t.concat(s);return o?r:r.concat(jr(md(s)))}function Xf(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function aR(e,t){var n=Zs(e,!1,t==="fixed");return n.top=n.top+e.clientTop,n.left=n.left+e.clientLeft,n.bottom=n.top+e.clientHeight,n.right=n.left+e.clientWidth,n.width=e.clientWidth,n.height=e.clientHeight,n.x=n.left,n.y=n.top,n}function Vg(e,t,n){return t===D1?Xf(tR(e,n)):as(t)?aR(t,n):Xf(nR(Ol(e)))}function oR(e){var t=jr(md(e)),n=["absolute","fixed"].indexOf(Yo(e).position)>=0,a=n&&xa(e)?Fi(e):e;return as(a)?t.filter(function(o){return as(o)&&F1(o,a)&&yo(o)!=="body"}):[]}function lR(e,t,n,a){var o=t==="clippingParents"?oR(e):[].concat(t),l=[].concat(o,[n]),s=l[0],r=l.reduce(function(u,c){var d=Vg(e,c,a);return u.top=Gl(d.top,u.top),u.right=wc(d.right,u.right),u.bottom=wc(d.bottom,u.bottom),u.left=Gl(d.left,u.left),u},Vg(e,s,a));return r.width=r.right-r.left,r.height=r.bottom-r.top,r.x=r.left,r.y=r.top,r}function U1(e){var t=e.reference,n=e.element,a=e.placement,o=a?po(a):null,l=a?Js(a):null,s=t.x+t.width/2-n.width/2,r=t.y+t.height/2-n.height/2,u;switch(o){case sa:u={x:s,y:t.y-n.height};break;case $a:u={x:s,y:t.y+t.height};break;case Oa:u={x:t.x+t.width,y:r};break;case ra:u={x:t.x-n.width,y:r};break;default:u={x:t.x,y:t.y}}var c=o?Yv(o):null;if(c!=null){var d=c==="y"?"height":"width";switch(l){case Gs:u[c]=u[c]-(t[d]/2-n[d]/2);break;case ii:u[c]=u[c]+(t[d]/2-n[d]/2);break}}return u}function ui(e,t){t===void 0&&(t={});var n=t,a=n.placement,o=a===void 0?e.placement:a,l=n.strategy,s=l===void 0?e.strategy:l,r=n.boundary,u=r===void 0?OP:r,c=n.rootBoundary,d=c===void 0?D1:c,f=n.elementContext,h=f===void 0?kr:f,g=n.altBoundary,v=g===void 0?!1:g,p=n.padding,m=p===void 0?0:p,b=H1(typeof m!="number"?m:K1(m,Vi)),k=h===kr?IP:kr,w=e.rects.popper,C=e.elements[v?k:h],S=lR(as(C)?C:C.contextElement||Ol(e.elements.popper),u,d,s),E=Zs(e.elements.reference),O=U1({reference:E,element:w,placement:o}),$=Xf(Object.assign({},w,O)),N=h===kr?$:E,I={top:S.top-N.top+b.top,bottom:N.bottom-S.bottom+b.bottom,left:S.left-N.left+b.left,right:N.right-S.right+b.right},_=e.modifiersData.offset;if(h===kr&&_){var A=_[o];Object.keys(I).forEach(function(F){var K=[Oa,$a].indexOf(F)>=0?1:-1,Y=[sa,$a].indexOf(F)>=0?"y":"x";I[F]+=A[Y]*K})}return I}function sR(e,t){t===void 0&&(t={});var n=t,a=n.placement,o=n.boundary,l=n.rootBoundary,s=n.padding,r=n.flipVariations,u=n.allowedAutoPlacements,c=u===void 0?So:u,d=Js(a),f=d?r?_g:_g.filter(function(v){return Js(v)===d}):Vi,h=f.filter(function(v){return c.indexOf(v)>=0});h.length===0&&(h=f);var g=h.reduce(function(v,p){return v[p]=ui(e,{placement:p,boundary:o,rootBoundary:l,padding:s})[po(p)],v},{});return Object.keys(g).sort(function(v,p){return g[v]-g[p]})}function rR(e){if(po(e)===Kv)return[];var t=Du(e);return[Bg(e),t,Bg(t)]}function iR(e){var t=e.state,n=e.options,a=e.name;if(!t.modifiersData[a]._skip){for(var o=n.mainAxis,l=o===void 0?!0:o,s=n.altAxis,r=s===void 0?!0:s,u=n.fallbackPlacements,c=n.padding,d=n.boundary,f=n.rootBoundary,h=n.altBoundary,g=n.flipVariations,v=g===void 0?!0:g,p=n.allowedAutoPlacements,m=t.options.placement,b=po(m),k=b===m,w=u||(k||!v?[Du(m)]:rR(m)),C=[m].concat(w).reduce(function(X,Q){return X.concat(po(Q)===Kv?sR(t,{placement:Q,boundary:d,rootBoundary:f,padding:c,flipVariations:v,allowedAutoPlacements:p}):Q)},[]),S=t.rects.reference,E=t.rects.popper,O=new Map,$=!0,N=C[0],I=0;I=0,Y=K?"width":"height",W=ui(t,{placement:_,boundary:d,rootBoundary:f,altBoundary:h,padding:c}),P=K?F?Oa:ra:F?$a:sa;S[Y]>E[Y]&&(P=Du(P));var M=Du(P),L=[];if(l&&L.push(W[A]<=0),r&&L.push(W[P]<=0,W[M]<=0),L.every(function(X){return X})){N=_,$=!1;break}O.set(_,L)}if($)for(var D=v?3:1,V=function(X){var Q=C.find(function(ve){var ue=O.get(ve);if(ue)return ue.slice(0,X).every(function(ge){return ge})});if(Q)return N=Q,"break"},G=D;G>0;G--){var j=V(G);if(j==="break")break}t.placement!==N&&(t.modifiersData[a]._skip=!0,t.placement=N,t.reset=!0)}}var uR={name:"flip",enabled:!0,phase:"main",fn:iR,requiresIfExists:["offset"],data:{_skip:!1}};function Fg(e,t,n){return n===void 0&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function zg(e){return[sa,Oa,$a,ra].some(function(t){return e[t]>=0})}function cR(e){var t=e.state,n=e.name,a=t.rects.reference,o=t.rects.popper,l=t.modifiersData.preventOverflow,s=ui(t,{elementContext:"reference"}),r=ui(t,{altBoundary:!0}),u=Fg(s,a),c=Fg(r,o,l),d=zg(u),f=zg(c);t.modifiersData[n]={referenceClippingOffsets:u,popperEscapeOffsets:c,isReferenceHidden:d,hasPopperEscaped:f},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":d,"data-popper-escaped":f})}var dR={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:cR};function fR(e,t,n){var a=po(e),o=[ra,sa].indexOf(a)>=0?-1:1,l=typeof n=="function"?n(Object.assign({},t,{placement:e})):n,s=l[0],r=l[1];return s=s||0,r=(r||0)*o,[ra,Oa].indexOf(a)>=0?{x:r,y:s}:{x:s,y:r}}function pR(e){var t=e.state,n=e.options,a=e.name,o=n.offset,l=o===void 0?[0,0]:o,s=So.reduce(function(d,f){return d[f]=fR(f,t.rects,l),d},{}),r=s[t.placement],u=r.x,c=r.y;t.modifiersData.popperOffsets!=null&&(t.modifiersData.popperOffsets.x+=u,t.modifiersData.popperOffsets.y+=c),t.modifiersData[a]=s}var vR={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:pR};function hR(e){var t=e.state,n=e.name;t.modifiersData[n]=U1({reference:t.rects.reference,element:t.rects.popper,placement:t.placement})}var q1={name:"popperOffsets",enabled:!0,phase:"read",fn:hR,data:{}};function mR(e){return e==="x"?"y":"x"}function gR(e){var t=e.state,n=e.options,a=e.name,o=n.mainAxis,l=o===void 0?!0:o,s=n.altAxis,r=s===void 0?!1:s,u=n.boundary,c=n.rootBoundary,d=n.altBoundary,f=n.padding,h=n.tether,g=h===void 0?!0:h,v=n.tetherOffset,p=v===void 0?0:v,m=ui(t,{boundary:u,rootBoundary:c,padding:f,altBoundary:d}),b=po(t.placement),k=Js(t.placement),w=!k,C=Yv(b),S=mR(C),E=t.modifiersData.popperOffsets,O=t.rects.reference,$=t.rects.popper,N=typeof p=="function"?p(Object.assign({},t.rects,{placement:t.placement})):p,I=typeof N=="number"?{mainAxis:N,altAxis:N}:Object.assign({mainAxis:0,altAxis:0},N),_=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,A={x:0,y:0};if(E){if(l){var F,K=C==="y"?sa:ra,Y=C==="y"?$a:Oa,W=C==="y"?"height":"width",P=E[C],M=P+m[K],L=P-m[Y],D=g?-$[W]/2:0,V=k===Gs?O[W]:$[W],G=k===Gs?-$[W]:-O[W],j=t.elements.arrow,X=g&&j?jv(j):{width:0,height:0},Q=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:z1(),ve=Q[K],ue=Q[Y],ge=Wr(0,O[W],X[W]),ie=w?O[W]/2-D-ge-ve-I.mainAxis:V-ge-ve-I.mainAxis,ae=w?-O[W]/2+D+ge+ue+I.mainAxis:G+ge+ue+I.mainAxis,ne=t.elements.arrow&&Fi(t.elements.arrow),z=ne?C==="y"?ne.clientTop||0:ne.clientLeft||0:0,J=(F=_?.[C])!=null?F:0,se=P+ie-J-z,ce=P+ae-J,he=Wr(g?wc(M,se):M,P,g?Gl(L,ce):L);E[C]=he,A[C]=he-P}if(r){var Se,Ie=C==="x"?sa:ra,Ne=C==="x"?$a:Oa,Te=E[S],pe=S==="y"?"height":"width",Ee=Te+m[Ie],me=Te-m[Ne],Pe=[sa,ra].indexOf(b)!==-1,Ke=(Se=_?.[S])!=null?Se:0,Ge=Pe?Ee:Te-O[pe]-$[pe]-Ke+I.altAxis,Me=Pe?Te+O[pe]+$[pe]-Ke-I.altAxis:me,Ae=g&&Pe?WP(Ge,Te,Me):Wr(g?Ge:Ee,Te,g?Me:me);E[S]=Ae,A[S]=Ae-Te}t.modifiersData[a]=A}}var bR={name:"preventOverflow",enabled:!0,phase:"main",fn:gR,requiresIfExists:["offset"]};function yR(e){return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}}function wR(e){return e===ba(e)||!xa(e)?Uv(e):yR(e)}function CR(e){var t=e.getBoundingClientRect(),n=Xs(t.width)/e.offsetWidth||1,a=Xs(t.height)/e.offsetHeight||1;return n!==1||a!==1}function SR(e,t,n){n===void 0&&(n=!1);var a=xa(t),o=xa(t)&&CR(t),l=Ol(t),s=Zs(e,o,n),r={scrollLeft:0,scrollTop:0},u={x:0,y:0};return(a||!a&&!n)&&((yo(t)!=="body"||Gv(l))&&(r=wR(t)),xa(t)?(u=Zs(t,!0),u.x+=t.clientLeft,u.y+=t.clientTop):l&&(u.x=qv(l))),{x:s.left+r.scrollLeft-u.x,y:s.top+r.scrollTop-u.y,width:s.width,height:s.height}}function kR(e){var t=new Map,n=new Set,a=[];e.forEach(function(l){t.set(l.name,l)});function o(l){n.add(l.name);var s=[].concat(l.requires||[],l.requiresIfExists||[]);s.forEach(function(r){if(!n.has(r)){var u=t.get(r);u&&o(u)}}),a.push(l)}return e.forEach(function(l){n.has(l.name)||o(l)}),a}function ER(e){var t=kR(e);return VP.reduce(function(n,a){return n.concat(t.filter(function(o){return o.phase===a}))},[])}function xR(e){var t;return function(){return t||(t=new Promise(function(n){Promise.resolve().then(function(){t=void 0,n(e())})})),t}}function TR(e){var t=e.reduce(function(n,a){var o=n[a.name];return n[a.name]=o?Object.assign({},o,a,{options:Object.assign({},o.options,a.options),data:Object.assign({},o.data,a.data)}):a,n},{});return Object.keys(t).map(function(n){return t[n]})}var Hg={placement:"bottom",modifiers:[],strategy:"absolute"};function Kg(){for(var e=arguments.length,t=new Array(e),n=0;n{const a={name:"updateState",enabled:!0,phase:"write",fn:({state:u})=>{const c=MR(u);Object.assign(s.value,c)},requires:["computeStyles"]},o=y(()=>{const{onFirstUpdate:u,placement:c,strategy:d,modifiers:f}=i(n);return{onFirstUpdate:u,placement:c||"bottom",strategy:d||"absolute",modifiers:[...f||[],a,{name:"applyStyles",enabled:!1}]}}),l=jt(),s=R({styles:{popper:{position:i(o).strategy,left:"0",top:"0"},arrow:{position:"absolute"}},attributes:{}}),r=()=>{l.value&&(l.value.destroy(),l.value=void 0)};return re(o,u=>{const c=i(l);c&&c.setOptions(u)},{deep:!0}),re([e,t],([u,c])=>{r(),!(!u||!c)&&(l.value=IR(u,c,i(o)))}),Rt(()=>{r()}),{state:y(()=>({...i(l)?.state||{}})),styles:y(()=>i(s).styles),attributes:y(()=>i(s).attributes),update:()=>i(l)?.update(),forceUpdate:()=>i(l)?.forceUpdate(),instanceRef:y(()=>i(l))}};function MR(e){const t=Object.keys(e.elements);return{styles:Us(t.map(n=>[n,e.styles[n]||{}])),attributes:Us(t.map(n=>[n,e.attributes[n]]))}}const Zv=e=>{if(!e)return{onClick:Pt,onMousedown:Pt,onMouseup:Pt};let t=!1,n=!1;return{onClick:s=>{t&&n&&e(s),t=n=!1},onMousedown:s=>{t=s.target===s.currentTarget},onMouseup:s=>{n=s.target===s.currentTarget}}},PR=(e,t=0)=>{if(t===0)return e;const n=R(et(t)&&!!t.initVal);let a=null;const o=s=>{if(St(s)){n.value=e.value;return}a&&clearTimeout(a),a=setTimeout(()=>{n.value=e.value},s)},l=s=>{s==="leading"?ze(t)?o(t):o(t.leading):et(t)?o(t.trailing):n.value=!1};return ct(()=>l("leading")),re(()=>e.value,s=>{l(s?"leading":"trailing")}),n};function Wg(){let e;const t=(a,o)=>{n(),e=window.setTimeout(a,o)},n=()=>window.clearTimeout(e);return fs(()=>n()),{registerTimeout:t,cancelTimeout:n}}const Zf={prefix:Math.floor(Math.random()*1e4),current:0},RR=Symbol("elIdInjection"),Jv=()=>it()?Re(RR,Zf):Zf,Pn=e=>{const t=Jv();!It&&t===Zf&&ut("IdInjection",`Looks like you are using server rendering, you must provide a id provider to ensure the hydration process to be succeed -usage: app.provide(ID_INJECTION_KEY, { - prefix: number, - current: number, -})`);const n=Fv();return y1(()=>i(e)||`${n.value}-id-${t.prefix}-${t.current++}`)};let Ts=[];const jg=e=>{Ft(e)===we.esc&&Ts.forEach(t=>t(e))},AR=e=>{ct(()=>{Ts.length===0&&document.addEventListener("keydown",jg),It&&Ts.push(e)}),Rt(()=>{Ts=Ts.filter(t=>t!==e),Ts.length===0&&It&&document.removeEventListener("keydown",jg)})},G1=()=>{const e=Fv(),t=Jv(),n=y(()=>`${e.value}-popper-container-${t.prefix}`);return{id:n,selector:y(()=>`#${n.value}`)}},_R=e=>{const t=document.createElement("div");return t.id=e,document.body.appendChild(t),t},LR=()=>{const{id:e,selector:t}=G1();return ed(()=>{It&&(document.body.querySelector(t.value)||_R(e.value))}),{id:e,selector:t}},DR=Ce({showAfter:{type:Number,default:0},hideAfter:{type:Number,default:200},autoClose:{type:Number,default:0}}),BR=({showAfter:e,hideAfter:t,autoClose:n,open:a,close:o})=>{const{registerTimeout:l}=Wg(),{registerTimeout:s,cancelTimeout:r}=Wg();return{onOpen:(d,f=i(e))=>{l(()=>{a(d);const h=i(n);ze(h)&&h>0&&s(()=>{o(d)},h)},f)},onClose:(d,f=i(t))=>{r(),l(()=>{o(d)},f)}}},X1=Symbol("elForwardRef"),VR=e=>{gt(X1,{setForwardRef:(n=>{e.value=n})})},FR=e=>({mounted(t){e(t)},updated(t){e(t)},unmounted(){e(null)}}),Yg={current:0},Ug=R(0),Z1=2e3,qg=Symbol("elZIndexContextKey"),J1=Symbol("zIndexContextKey"),zi=e=>{const t=it()?Re(qg,Yg):Yg,n=e||(it()?Re(J1,void 0):void 0),a=y(()=>{const s=i(n);return ze(s)?s:Z1}),o=y(()=>a.value+Ug.value),l=()=>(t.current++,Ug.value=t.current,o.value);return!It&&!Re(qg)&&ut("ZIndexInjection",`Looks like you are using server rendering, you must provide a z-index provider to ensure the hydration process to be succeed -usage: app.provide(ZINDEX_INJECTION_KEY, { current: 0 })`),{initialZIndex:a,currentZIndex:o,nextZIndex:l}},Qs=Math.min,Xl=Math.max,Cc=Math.round,fu=Math.floor,vo=e=>({x:e,y:e}),zR={left:"right",right:"left",bottom:"top",top:"bottom"};function Jf(e,t,n){return Xl(e,Qs(t,n))}function Hi(e,t){return typeof e=="function"?e(t):e}function os(e){return e.split("-")[0]}function Ki(e){return e.split("-")[1]}function Q1(e){return e==="x"?"y":"x"}function Qv(e){return e==="y"?"height":"width"}function hl(e){const t=e[0];return t==="t"||t==="b"?"y":"x"}function eh(e){return Q1(hl(e))}function HR(e,t,n){n===void 0&&(n=!1);const a=Ki(e),o=eh(e),l=Qv(o);let s=o==="x"?a===(n?"end":"start")?"right":"left":a==="start"?"bottom":"top";return t.reference[l]>t.floating[l]&&(s=Sc(s)),[s,Sc(s)]}function KR(e){const t=Sc(e);return[Qf(e),t,Qf(t)]}function Qf(e){return e.includes("start")?e.replace("start","end"):e.replace("end","start")}const Gg=["left","right"],Xg=["right","left"],WR=["top","bottom"],jR=["bottom","top"];function YR(e,t,n){switch(e){case"top":case"bottom":return n?t?Xg:Gg:t?Gg:Xg;case"left":case"right":return t?WR:jR;default:return[]}}function UR(e,t,n,a){const o=Ki(e);let l=YR(os(e),n==="start",a);return o&&(l=l.map(s=>s+"-"+o),t&&(l=l.concat(l.map(Qf)))),l}function Sc(e){const t=os(e);return zR[t]+e.slice(t.length)}function qR(e){return{top:0,right:0,bottom:0,left:0,...e}}function eC(e){return typeof e!="number"?qR(e):{top:e,right:e,bottom:e,left:e}}function kc(e){const{x:t,y:n,width:a,height:o}=e;return{width:a,height:o,top:n,left:t,right:t+a,bottom:n+o,x:t,y:n}}function Zg(e,t,n){let{reference:a,floating:o}=e;const l=hl(t),s=eh(t),r=Qv(s),u=os(t),c=l==="y",d=a.x+a.width/2-o.width/2,f=a.y+a.height/2-o.height/2,h=a[r]/2-o[r]/2;let g;switch(u){case"top":g={x:d,y:a.y-o.height};break;case"bottom":g={x:d,y:a.y+a.height};break;case"right":g={x:a.x+a.width,y:f};break;case"left":g={x:a.x-o.width,y:f};break;default:g={x:a.x,y:a.y}}switch(Ki(t)){case"start":g[s]-=h*(n&&c?-1:1);break;case"end":g[s]+=h*(n&&c?-1:1);break}return g}async function tC(e,t){var n;t===void 0&&(t={});const{x:a,y:o,platform:l,rects:s,elements:r,strategy:u}=e,{boundary:c="clippingAncestors",rootBoundary:d="viewport",elementContext:f="floating",altBoundary:h=!1,padding:g=0}=Hi(t,e),v=eC(g),m=r[h?f==="floating"?"reference":"floating":f],b=kc(await l.getClippingRect({element:(n=await(l.isElement==null?void 0:l.isElement(m)))==null||n?m:m.contextElement||await(l.getDocumentElement==null?void 0:l.getDocumentElement(r.floating)),boundary:c,rootBoundary:d,strategy:u})),k=f==="floating"?{x:a,y:o,width:s.floating.width,height:s.floating.height}:s.reference,w=await(l.getOffsetParent==null?void 0:l.getOffsetParent(r.floating)),C=await(l.isElement==null?void 0:l.isElement(w))?await(l.getScale==null?void 0:l.getScale(w))||{x:1,y:1}:{x:1,y:1},S=kc(l.convertOffsetParentRelativeRectToViewportRelativeRect?await l.convertOffsetParentRelativeRectToViewportRelativeRect({elements:r,rect:k,offsetParent:w,strategy:u}):k);return{top:(b.top-S.top+v.top)/C.y,bottom:(S.bottom-b.bottom+v.bottom)/C.y,left:(b.left-S.left+v.left)/C.x,right:(S.right-b.right+v.right)/C.x}}const GR=50,XR=async(e,t,n)=>{const{placement:a="bottom",strategy:o="absolute",middleware:l=[],platform:s}=n,r=s.detectOverflow?s:{...s,detectOverflow:tC},u=await(s.isRTL==null?void 0:s.isRTL(t));let c=await s.getElementRects({reference:e,floating:t,strategy:o}),{x:d,y:f}=Zg(c,a,u),h=a,g=0;const v={};for(let p=0;p({name:"arrow",options:e,async fn(t){const{x:n,y:a,placement:o,rects:l,platform:s,elements:r,middlewareData:u}=t,{element:c,padding:d=0}=Hi(e,t)||{};if(c==null)return{};const f=eC(d),h={x:n,y:a},g=eh(o),v=Qv(g),p=await s.getDimensions(c),m=g==="y",b=m?"top":"left",k=m?"bottom":"right",w=m?"clientHeight":"clientWidth",C=l.reference[v]+l.reference[g]-h[g]-l.floating[v],S=h[g]-l.reference[g],E=await(s.getOffsetParent==null?void 0:s.getOffsetParent(c));let O=E?E[w]:0;(!O||!await(s.isElement==null?void 0:s.isElement(E)))&&(O=r.floating[w]||l.floating[v]);const $=C/2-S/2,N=O/2-p[v]/2-1,I=Qs(f[b],N),_=Qs(f[k],N),A=I,F=O-p[v]-_,K=O/2-p[v]/2+$,Y=Jf(A,K,F),W=!u.arrow&&Ki(o)!=null&&K!==Y&&l.reference[v]/2-(KK<=0)){var _,A;const K=(((_=l.flip)==null?void 0:_.index)||0)+1,Y=O[K];if(Y&&(!(f==="alignment"?k!==hl(Y):!1)||I.every(M=>hl(M.placement)===k?M.overflows[0]>0:!0)))return{data:{index:K,overflows:I},reset:{placement:Y}};let W=(A=I.filter(P=>P.overflows[0]<=0).sort((P,M)=>P.overflows[1]-M.overflows[1])[0])==null?void 0:A.placement;if(!W)switch(g){case"bestFit":{var F;const P=(F=I.filter(M=>{if(E){const L=hl(M.placement);return L===k||L==="y"}return!0}).map(M=>[M.placement,M.overflows.filter(L=>L>0).reduce((L,D)=>L+D,0)]).sort((M,L)=>M[1]-L[1])[0])==null?void 0:F[0];P&&(W=P);break}case"initialPlacement":W=r;break}if(o!==W)return{reset:{placement:W}}}return{}}}},QR=new Set(["left","top"]);async function eA(e,t){const{placement:n,platform:a,elements:o}=e,l=await(a.isRTL==null?void 0:a.isRTL(o.floating)),s=os(n),r=Ki(n),u=hl(n)==="y",c=QR.has(s)?-1:1,d=l&&u?-1:1,f=Hi(t,e);let{mainAxis:h,crossAxis:g,alignmentAxis:v}=typeof f=="number"?{mainAxis:f,crossAxis:0,alignmentAxis:null}:{mainAxis:f.mainAxis||0,crossAxis:f.crossAxis||0,alignmentAxis:f.alignmentAxis};return r&&typeof v=="number"&&(g=r==="end"?v*-1:v),u?{x:g*d,y:h*c}:{x:h*c,y:g*d}}const tA=function(e){return e===void 0&&(e=0),{name:"offset",options:e,async fn(t){var n,a;const{x:o,y:l,placement:s,middlewareData:r}=t,u=await eA(t,e);return s===((n=r.offset)==null?void 0:n.placement)&&(a=r.arrow)!=null&&a.alignmentOffset?{}:{x:o+u.x,y:l+u.y,data:{...u,placement:s}}}}},nA=function(e){return e===void 0&&(e={}),{name:"shift",options:e,async fn(t){const{x:n,y:a,placement:o,platform:l}=t,{mainAxis:s=!0,crossAxis:r=!1,limiter:u={fn:b=>{let{x:k,y:w}=b;return{x:k,y:w}}},...c}=Hi(e,t),d={x:n,y:a},f=await l.detectOverflow(t,c),h=hl(os(o)),g=Q1(h);let v=d[g],p=d[h];if(s){const b=g==="y"?"top":"left",k=g==="y"?"bottom":"right",w=v+f[b],C=v-f[k];v=Jf(w,v,C)}if(r){const b=h==="y"?"top":"left",k=h==="y"?"bottom":"right",w=p+f[b],C=p-f[k];p=Jf(w,p,C)}const m=u.fn({...t,[g]:v,[h]:p});return{...m,data:{x:m.x-n,y:m.y-a,enabled:{[g]:s,[h]:r}}}}}};function gd(){return typeof window<"u"}function pr(e){return nC(e)?(e.nodeName||"").toLowerCase():"#document"}function ga(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function ko(e){var t;return(t=(nC(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function nC(e){return gd()?e instanceof Node||e instanceof ga(e).Node:!1}function za(e){return gd()?e instanceof Element||e instanceof ga(e).Element:!1}function el(e){return gd()?e instanceof HTMLElement||e instanceof ga(e).HTMLElement:!1}function Jg(e){return!gd()||typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof ga(e).ShadowRoot}function Wi(e){const{overflow:t,overflowX:n,overflowY:a,display:o}=Ha(e);return/auto|scroll|overlay|hidden|clip/.test(t+a+n)&&o!=="inline"&&o!=="contents"}function aA(e){return/^(table|td|th)$/.test(pr(e))}function bd(e){try{if(e.matches(":popover-open"))return!0}catch{}try{return e.matches(":modal")}catch{return!1}}const oA=/transform|translate|scale|rotate|perspective|filter/,lA=/paint|layout|strict|content/,Al=e=>!!e&&e!=="none";let nf;function th(e){const t=za(e)?Ha(e):e;return Al(t.transform)||Al(t.translate)||Al(t.scale)||Al(t.rotate)||Al(t.perspective)||!nh()&&(Al(t.backdropFilter)||Al(t.filter))||oA.test(t.willChange||"")||lA.test(t.contain||"")}function sA(e){let t=Sl(e);for(;el(t)&&!er(t);){if(th(t))return t;if(bd(t))return null;t=Sl(t)}return null}function nh(){return nf==null&&(nf=typeof CSS<"u"&&CSS.supports&&CSS.supports("-webkit-backdrop-filter","none")),nf}function er(e){return/^(html|body|#document)$/.test(pr(e))}function Ha(e){return ga(e).getComputedStyle(e)}function yd(e){return za(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function Sl(e){if(pr(e)==="html")return e;const t=e.assignedSlot||e.parentNode||Jg(e)&&e.host||ko(e);return Jg(t)?t.host:t}function aC(e){const t=Sl(e);return er(t)?e.ownerDocument?e.ownerDocument.body:e.body:el(t)&&Wi(t)?t:aC(t)}function ci(e,t,n){var a;t===void 0&&(t=[]),n===void 0&&(n=!0);const o=aC(e),l=o===((a=e.ownerDocument)==null?void 0:a.body),s=ga(o);if(l){const r=ep(s);return t.concat(s,s.visualViewport||[],Wi(o)?o:[],r&&n?ci(r):[])}else return t.concat(o,ci(o,[],n))}function ep(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function oC(e){const t=Ha(e);let n=parseFloat(t.width)||0,a=parseFloat(t.height)||0;const o=el(e),l=o?e.offsetWidth:n,s=o?e.offsetHeight:a,r=Cc(n)!==l||Cc(a)!==s;return r&&(n=l,a=s),{width:n,height:a,$:r}}function ah(e){return za(e)?e:e.contextElement}function Ds(e){const t=ah(e);if(!el(t))return vo(1);const n=t.getBoundingClientRect(),{width:a,height:o,$:l}=oC(t);let s=(l?Cc(n.width):n.width)/a,r=(l?Cc(n.height):n.height)/o;return(!s||!Number.isFinite(s))&&(s=1),(!r||!Number.isFinite(r))&&(r=1),{x:s,y:r}}const rA=vo(0);function lC(e){const t=ga(e);return!nh()||!t.visualViewport?rA:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function iA(e,t,n){return t===void 0&&(t=!1),!n||t&&n!==ga(e)?!1:t}function ls(e,t,n,a){t===void 0&&(t=!1),n===void 0&&(n=!1);const o=e.getBoundingClientRect(),l=ah(e);let s=vo(1);t&&(a?za(a)&&(s=Ds(a)):s=Ds(e));const r=iA(l,n,a)?lC(l):vo(0);let u=(o.left+r.x)/s.x,c=(o.top+r.y)/s.y,d=o.width/s.x,f=o.height/s.y;if(l){const h=ga(l),g=a&&za(a)?ga(a):a;let v=h,p=ep(v);for(;p&&a&&g!==v;){const m=Ds(p),b=p.getBoundingClientRect(),k=Ha(p),w=b.left+(p.clientLeft+parseFloat(k.paddingLeft))*m.x,C=b.top+(p.clientTop+parseFloat(k.paddingTop))*m.y;u*=m.x,c*=m.y,d*=m.x,f*=m.y,u+=w,c+=C,v=ga(p),p=ep(v)}}return kc({width:d,height:f,x:u,y:c})}function wd(e,t){const n=yd(e).scrollLeft;return t?t.left+n:ls(ko(e)).left+n}function sC(e,t){const n=e.getBoundingClientRect(),a=n.left+t.scrollLeft-wd(e,n),o=n.top+t.scrollTop;return{x:a,y:o}}function uA(e){let{elements:t,rect:n,offsetParent:a,strategy:o}=e;const l=o==="fixed",s=ko(a),r=t?bd(t.floating):!1;if(a===s||r&&l)return n;let u={scrollLeft:0,scrollTop:0},c=vo(1);const d=vo(0),f=el(a);if((f||!f&&!l)&&((pr(a)!=="body"||Wi(s))&&(u=yd(a)),f)){const g=ls(a);c=Ds(a),d.x=g.x+a.clientLeft,d.y=g.y+a.clientTop}const h=s&&!f&&!l?sC(s,u):vo(0);return{width:n.width*c.x,height:n.height*c.y,x:n.x*c.x-u.scrollLeft*c.x+d.x+h.x,y:n.y*c.y-u.scrollTop*c.y+d.y+h.y}}function cA(e){return Array.from(e.getClientRects())}function dA(e){const t=ko(e),n=yd(e),a=e.ownerDocument.body,o=Xl(t.scrollWidth,t.clientWidth,a.scrollWidth,a.clientWidth),l=Xl(t.scrollHeight,t.clientHeight,a.scrollHeight,a.clientHeight);let s=-n.scrollLeft+wd(e);const r=-n.scrollTop;return Ha(a).direction==="rtl"&&(s+=Xl(t.clientWidth,a.clientWidth)-o),{width:o,height:l,x:s,y:r}}const Qg=25;function fA(e,t){const n=ga(e),a=ko(e),o=n.visualViewport;let l=a.clientWidth,s=a.clientHeight,r=0,u=0;if(o){l=o.width,s=o.height;const d=nh();(!d||d&&t==="fixed")&&(r=o.offsetLeft,u=o.offsetTop)}const c=wd(a);if(c<=0){const d=a.ownerDocument,f=d.body,h=getComputedStyle(f),g=d.compatMode==="CSS1Compat"&&parseFloat(h.marginLeft)+parseFloat(h.marginRight)||0,v=Math.abs(a.clientWidth-f.clientWidth-g);v<=Qg&&(l-=v)}else c<=Qg&&(l+=c);return{width:l,height:s,x:r,y:u}}function pA(e,t){const n=ls(e,!0,t==="fixed"),a=n.top+e.clientTop,o=n.left+e.clientLeft,l=el(e)?Ds(e):vo(1),s=e.clientWidth*l.x,r=e.clientHeight*l.y,u=o*l.x,c=a*l.y;return{width:s,height:r,x:u,y:c}}function eb(e,t,n){let a;if(t==="viewport")a=fA(e,n);else if(t==="document")a=dA(ko(e));else if(za(t))a=pA(t,n);else{const o=lC(e);a={x:t.x-o.x,y:t.y-o.y,width:t.width,height:t.height}}return kc(a)}function rC(e,t){const n=Sl(e);return n===t||!za(n)||er(n)?!1:Ha(n).position==="fixed"||rC(n,t)}function vA(e,t){const n=t.get(e);if(n)return n;let a=ci(e,[],!1).filter(r=>za(r)&&pr(r)!=="body"),o=null;const l=Ha(e).position==="fixed";let s=l?Sl(e):e;for(;za(s)&&!er(s);){const r=Ha(s),u=th(s);!u&&r.position==="fixed"&&(o=null),(l?!u&&!o:!u&&r.position==="static"&&!!o&&(o.position==="absolute"||o.position==="fixed")||Wi(s)&&!u&&rC(e,s))?a=a.filter(d=>d!==s):o=r,s=Sl(s)}return t.set(e,a),a}function hA(e){let{element:t,boundary:n,rootBoundary:a,strategy:o}=e;const s=[...n==="clippingAncestors"?bd(t)?[]:vA(t,this._c):[].concat(n),a],r=eb(t,s[0],o);let u=r.top,c=r.right,d=r.bottom,f=r.left;for(let h=1;h{s(!1,1e-7)},1e3)}O===1&&!uC(c,e.getBoundingClientRect())&&s(),C=!1}try{n=new IntersectionObserver(S,{...w,root:o.ownerDocument})}catch{n=new IntersectionObserver(S,w)}n.observe(e)}return s(!0),l}function SA(e,t,n,a){a===void 0&&(a={});const{ancestorScroll:o=!0,ancestorResize:l=!0,elementResize:s=typeof ResizeObserver=="function",layoutShift:r=typeof IntersectionObserver=="function",animationFrame:u=!1}=a,c=ah(e),d=o||l?[...c?ci(c):[],...t?ci(t):[]]:[];d.forEach(b=>{o&&b.addEventListener("scroll",n,{passive:!0}),l&&b.addEventListener("resize",n)});const f=c&&r?CA(c,n):null;let h=-1,g=null;s&&(g=new ResizeObserver(b=>{let[k]=b;k&&k.target===c&&g&&t&&(g.unobserve(t),cancelAnimationFrame(h),h=requestAnimationFrame(()=>{var w;(w=g)==null||w.observe(t)})),n()}),c&&!u&&g.observe(c),t&&g.observe(t));let v,p=u?ls(e):null;u&&m();function m(){const b=ls(e);p&&!uC(p,b)&&n(),p=b,v=requestAnimationFrame(m)}return n(),()=>{var b;d.forEach(k=>{o&&k.removeEventListener("scroll",n),l&&k.removeEventListener("resize",n)}),f?.(),(b=g)==null||b.disconnect(),g=null,u&&cancelAnimationFrame(v)}}const kA=tC,EA=tA,xA=nA,TA=JR,$A=ZR,OA=(e,t,n)=>{const a=new Map,o={platform:wA,...n},l={...o.platform,_c:a};return XR(e,t,{...o,platform:l})};function IA(e){let t;function n(){if(e.value==null)return;const{selectionStart:o,selectionEnd:l,value:s}=e.value;o==null||l==null||(t={selectionStart:o,selectionEnd:l,value:s,beforeTxt:s.slice(0,Math.max(0,o)),afterTxt:s.slice(Math.max(0,l))})}function a(){if(e.value==null||t==null)return;const{value:o}=e.value,{beforeTxt:l,afterTxt:s,selectionStart:r}=t;if(l==null||s==null||r==null)return;let u=o.length;if(o.endsWith(s))u=o.length-s.length;else if(o.startsWith(l))u=l.length;else{const c=l[r-1],d=o.indexOf(c,r-1);d!==-1&&(u=d+1)}e.value.setSelectionRange(u,u)}return[n,a]}const NA="utils/vue/vnode";let Ma=(function(e){return e[e.TEXT=1]="TEXT",e[e.CLASS=2]="CLASS",e[e.STYLE=4]="STYLE",e[e.PROPS=8]="PROPS",e[e.FULL_PROPS=16]="FULL_PROPS",e[e.HYDRATE_EVENTS=32]="HYDRATE_EVENTS",e[e.STABLE_FRAGMENT=64]="STABLE_FRAGMENT",e[e.KEYED_FRAGMENT=128]="KEYED_FRAGMENT",e[e.UNKEYED_FRAGMENT=256]="UNKEYED_FRAGMENT",e[e.NEED_PATCH=512]="NEED_PATCH",e[e.DYNAMIC_SLOTS=1024]="DYNAMIC_SLOTS",e[e.HOISTED=-1]="HOISTED",e[e.BAIL=-2]="BAIL",e})({});function tp(e){return zt(e)&&e.type===Fe}function cC(e){return zt(e)&&e.type===un}function MA(e){return zt(e)&&!tp(e)&&!cC(e)}const PA=e=>{if(!zt(e))return ut(NA,"[getNormalizedProps] must be a VNode"),{};const t=e.props||{},n=(zt(e.type)?e.type.props:void 0)||{},a={};return Object.keys(n).forEach(o=>{Tt(n[o],"default")&&(a[o]=n[o].default)}),Object.keys(t).forEach(o=>{a[Nn(o)]=t[o]}),a},va=e=>{const t=ye(e)?e:[e],n=[];return t.forEach(a=>{ye(a)?n.push(...va(a)):zt(a)&&a.component?.subTree?n.push(a,...va(a.component.subTree)):zt(a)&&ye(a.children)?n.push(...va(a.children)):zt(a)&&a.shapeFlag===2?n.push(...va(a.type())):n.push(a)}),n},RA=(e,t,n)=>va(e.subTree).filter(a=>zt(a)&&a.type?.name===t&&!!a.component).map(a=>a.component.uid).map(a=>n[a]).filter(a=>!!a),Cd=(e,t)=>{const n=jt({}),a=jt([]),o=new WeakMap,l=c=>{n.value[c.uid]=c,Nu(n),ct(()=>{const d=c.getVnode().el,f=d.parentNode;if(!o.has(f)){o.set(f,[]);const h=f.insertBefore.bind(f);f.insertBefore=(g,v)=>(o.get(f).some(p=>g===p||v===p)&&Nu(n),h(g,v))}o.get(f).push(d)})},s=c=>{delete n.value[c.uid],Nu(n);const d=c.getVnode().el,f=d.parentNode,h=o.get(f),g=h.indexOf(d);h.splice(g,1)},r=()=>{a.value=RA(e,t,n.value)},u=c=>c.render();return{children:a,addChild:l,removeChild:s,ChildrenSorter:le({setup(c,{slots:d}){return()=>(r(),d.default?Ye(u,{render:d.default}):null)}})}},bn=Ga({type:String,values:Ua,required:!1}),dC=Symbol("size"),fC=()=>{const e=Re(dC,{});return y(()=>i(e.size)||"")};function tl(e,{disabled:t,beforeFocus:n,afterFocus:a,beforeBlur:o,afterBlur:l}={}){const{emit:s}=it(),r=jt(),u=R(!1),c=h=>{const g=Be(n)?n(h):!1;i(t)||u.value||g||(u.value=!0,s("focus",h),a?.())},d=h=>{const g=Be(o)?o(h):!1;i(t)||h.relatedTarget&&r.value?.contains(h.relatedTarget)||g||(u.value=!1,s("blur",h),l?.())},f=h=>{i(t)||ri(h.target)||r.value?.contains(document.activeElement)&&r.value!==document.activeElement||e.value?.focus()};return re([r,()=>i(t)],([h,g])=>{h&&(g?h.removeAttribute("tabindex"):h.setAttribute("tabindex","-1"))}),At(r,"focus",c,!0),At(r,"blur",d,!0),At(r,"click",f,!0),{isFocused:u,wrapperRef:r,handleFocus:c,handleBlur:d}}const AA=e=>/([\uAC00-\uD7AF\u3130-\u318F])+/gi.test(e);function ji({afterComposition:e,emit:t}){const n=R(!1),a=r=>{t?.("compositionstart",r),n.value=!0},o=r=>{t?.("compositionupdate",r);const u=r.target?.value;n.value=!AA(u[u.length-1]||"")},l=r=>{t?.("compositionend",r),n.value&&(n.value=!1,Oe(()=>e(r)))};return{isComposing:n,handleComposition:r=>{r.type==="compositionend"?l(r):o(r)},handleCompositionStart:a,handleCompositionUpdate:o,handleCompositionEnd:l}}const pC=Symbol("emptyValuesContextKey"),_A="use-empty-values",LA=["",void 0,null],DA=void 0,ps=Ce({emptyValues:Array,valueOnClear:{type:q([String,Number,Boolean,Function]),default:void 0,validator:e=>(e=Be(e)?e():e,ye(e)?e.every(t=>!t):!e)}}),Yi=(e,t)=>{const n=it()?Re(pC,R({})):R({}),a=y(()=>e.emptyValues||n.value.emptyValues||LA),o=y(()=>Be(e.valueOnClear)?e.valueOnClear():e.valueOnClear!==void 0?e.valueOnClear:Be(n.value.valueOnClear)?n.value.valueOnClear():n.value.valueOnClear!==void 0?n.value.valueOnClear:t!==void 0?t:DA),l=s=>{let r=!0;return ye(s)?r=a.value.some(u=>Jt(s,u)):r=a.value.includes(s),r};return l(o.value)||ut(_A,"value-on-clear should be a value of empty-values"),{emptyValues:a,valueOnClear:o,isEmptyValue:l}},BA=Ce({ariaLabel:String,ariaOrientation:{type:String,values:["horizontal","vertical","undefined"]},ariaControls:String}),Un=e=>Wo(BA,e),vC=e=>{const t=e.props,n=ye(t)?Us(t.map(a=>[a,{}])):t;e.setPropsDefaults=a=>{if(n){for(const[o,l]of Object.entries(a)){const s=n[o];if(Tt(n,o)){if(Mv(s)){n[o]={...s,default:l};continue}n[o]={type:s,default:l}}}e.props=n}}},nt=(e,t)=>{if(e.install=n=>{for(const a of[e,...Object.values(t??{})])n.component(a.name,a)},t)for(const[n,a]of Object.entries(t))e[n]=a;return vC(e),e},hC=(e,t)=>(e.install=n=>{e._context=n._context,n.config.globalProperties[t]=e},e),VA=(e,t)=>(e.install=n=>{n.directive(t,e)},e),Xt=e=>(e.install=Pt,vC(e),e);var FA=le({__name:"teleport",props:_i,setup(e){return(t,n)=>t.disabled?ee(t.$slots,"default",{key:0}):(x(),oe(KE,{key:1,to:t.to},[ee(t.$slots,"default")],8,["to"]))}}),zA=FA;const vr=nt(zA),nb="ElAffix";var HA=le({name:nb,__name:"affix",props:jM,emits:YM,setup(e,{expose:t,emit:n}){const a=e,o=n,l=fe("affix"),s=jt(),r=jt(),u=jt(),{height:c}=Dv(),{height:d,width:f,top:h,bottom:g,left:v,update:p}=Ig(r,{windowScroll:!1}),m=Ig(s),b=R(!1),k=R(0),w=R(0),C=y(()=>!a.teleported||!b.value),S=y(()=>({display:"flow-root",height:b.value?`${d.value}px`:"",width:b.value?`${f.value}px`:""})),E=y(()=>{if(!b.value)return{};const I=en(a.offset);return{height:`${d.value}px`,width:`${f.value}px`,top:a.position==="top"?I:"",bottom:a.position==="bottom"?I:"",left:a.teleported?`${v.value}px`:"",transform:w.value?`translateY(${w.value}px)`:"",zIndex:a.zIndex}}),O=()=>{if(!u.value)return;k.value=u.value instanceof Window?document.documentElement.scrollTop:u.value.scrollTop||0;const{position:I,target:_,offset:A}=a,F=A+d.value;if(I==="top")if(_){const K=m.bottom.value-F;b.value=A>h.value&&m.bottom.value>0,w.value=K<0?K:0}else b.value=A>h.value;else if(_){const K=c.value-m.top.value-F;b.value=c.value-Am.top.value,w.value=K<0?-K:0}else b.value=c.value-A{if(!b.value){p();return}b.value=!1,await Oe(),p(),b.value=!0},N=async()=>{p(),await Oe(),o("scroll",{scrollTop:k.value,fixed:b.value})};return re(b,I=>o(vt,I)),ct(()=>{a.target?(s.value=document.querySelector(a.target)??void 0,s.value||Gt(nb,`Target does not exist: ${a.target}`)):s.value=document.documentElement,u.value=zv(r.value,!0),p()}),$i(()=>{Oe($)}),cv(()=>{b.value=!1}),At(u,"scroll",N),ia(O),t({update:O,updateRoot:$}),(I,_)=>(x(),B("div",{ref_key:"root",ref:r,class:T(i(l).b()),style:He(S.value)},[U(i(vr),{disabled:C.value,to:e.appendTo},{default:Z(()=>[H("div",{class:T({[i(l).m("fixed")]:b.value}),style:He(E.value)},[ee(I.$slots,"default")],6)]),_:3},8,["disabled","to"])],6))}}),KA=HA;const WA=nt(KA);var jA=le({name:"ArrowDown",__name:"arrow-down",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M831.872 340.864 512 652.672 192.128 340.864a30.59 30.59 0 0 0-42.752 0 29.12 29.12 0 0 0 0 41.6L489.664 714.24a32 32 0 0 0 44.672 0l340.288-331.712a29.12 29.12 0 0 0 0-41.728 30.59 30.59 0 0 0-42.752 0z"})]))}}),Eo=jA,YA=le({name:"ArrowLeft",__name:"arrow-left",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M609.408 149.376 277.76 489.6a32 32 0 0 0 0 44.672l331.648 340.352a29.12 29.12 0 0 0 41.728 0 30.59 30.59 0 0 0 0-42.752L339.264 511.936l311.872-319.872a30.59 30.59 0 0 0 0-42.688 29.12 29.12 0 0 0-41.728 0"})]))}}),Uo=YA,UA=le({name:"ArrowRight",__name:"arrow-right",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M340.864 149.312a30.59 30.59 0 0 0 0 42.752L652.736 512 340.864 831.872a30.59 30.59 0 0 0 0 42.752 29.12 29.12 0 0 0 41.728 0L714.24 534.336a32 32 0 0 0 0-44.672L382.592 149.376a29.12 29.12 0 0 0-41.728 0z"})]))}}),Yn=UA,qA=le({name:"ArrowUp",__name:"arrow-up",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"m488.832 344.32-339.84 356.672a32 32 0 0 0 0 44.16l.384.384a29.44 29.44 0 0 0 42.688 0l320-335.872 319.872 335.872a29.44 29.44 0 0 0 42.688 0l.384-.384a32 32 0 0 0 0-44.16L535.168 344.32a32 32 0 0 0-46.336 0"})]))}}),Sd=qA,GA=le({name:"Back",__name:"back",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M224 480h640a32 32 0 1 1 0 64H224a32 32 0 0 1 0-64"}),H("path",{fill:"currentColor",d:"m237.248 512 265.408 265.344a32 32 0 0 1-45.312 45.312l-288-288a32 32 0 0 1 0-45.312l288-288a32 32 0 1 1 45.312 45.312z"})]))}}),XA=GA,ZA=le({name:"Calendar",__name:"calendar",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M128 384v512h768V192H768v32a32 32 0 1 1-64 0v-32H320v32a32 32 0 0 1-64 0v-32H128v128h768v64zm192-256h384V96a32 32 0 1 1 64 0v32h160a32 32 0 0 1 32 32v768a32 32 0 0 1-32 32H96a32 32 0 0 1-32-32V160a32 32 0 0 1 32-32h160V96a32 32 0 0 1 64 0zm-32 384h64a32 32 0 0 1 0 64h-64a32 32 0 0 1 0-64m0 192h64a32 32 0 1 1 0 64h-64a32 32 0 1 1 0-64m192-192h64a32 32 0 0 1 0 64h-64a32 32 0 0 1 0-64m0 192h64a32 32 0 1 1 0 64h-64a32 32 0 1 1 0-64m192-192h64a32 32 0 1 1 0 64h-64a32 32 0 1 1 0-64m0 192h64a32 32 0 1 1 0 64h-64a32 32 0 1 1 0-64"})]))}}),JA=ZA,QA=le({name:"CaretRight",__name:"caret-right",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M384 192v640l384-320.064z"})]))}}),mC=QA,e3=le({name:"CaretTop",__name:"caret-top",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M512 320 192 704h639.936z"})]))}}),t3=e3,n3=le({name:"Check",__name:"check",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M406.656 706.944 195.84 496.256a32 32 0 1 0-45.248 45.248l256 256 512-512a32 32 0 0 0-45.248-45.248L406.592 706.944z"})]))}}),Ui=n3,a3=le({name:"CircleCheckFilled",__name:"circle-check-filled",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m-55.808 536.384-99.52-99.584a38.4 38.4 0 1 0-54.336 54.336l126.72 126.72a38.27 38.27 0 0 0 54.336 0l262.4-262.464a38.4 38.4 0 1 0-54.272-54.336z"})]))}}),o3=a3,l3=le({name:"CircleCheck",__name:"circle-check",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M512 896a384 384 0 1 0 0-768 384 384 0 0 0 0 768m0 64a448 448 0 1 1 0-896 448 448 0 0 1 0 896"}),H("path",{fill:"currentColor",d:"M745.344 361.344a32 32 0 0 1 45.312 45.312l-288 288a32 32 0 0 1-45.312 0l-160-160a32 32 0 1 1 45.312-45.312L480 626.752z"})]))}}),oh=l3,s3=le({name:"CircleCloseFilled",__name:"circle-close-filled",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m0 393.664L407.936 353.6a38.4 38.4 0 1 0-54.336 54.336L457.664 512 353.6 616.064a38.4 38.4 0 1 0 54.336 54.336L512 566.336 616.064 670.4a38.4 38.4 0 1 0 54.336-54.336L566.336 512 670.4 407.936a38.4 38.4 0 1 0-54.336-54.336z"})]))}}),lh=s3,r3=le({name:"CircleClose",__name:"circle-close",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"m466.752 512-90.496-90.496a32 32 0 0 1 45.248-45.248L512 466.752l90.496-90.496a32 32 0 1 1 45.248 45.248L557.248 512l90.496 90.496a32 32 0 1 1-45.248 45.248L512 557.248l-90.496 90.496a32 32 0 0 1-45.248-45.248z"}),H("path",{fill:"currentColor",d:"M512 896a384 384 0 1 0 0-768 384 384 0 0 0 0 768m0 64a448 448 0 1 1 0-896 448 448 0 0 1 0 896"})]))}}),xo=r3,i3=le({name:"Clock",__name:"clock",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M512 896a384 384 0 1 0 0-768 384 384 0 0 0 0 768m0 64a448 448 0 1 1 0-896 448 448 0 0 1 0 896"}),H("path",{fill:"currentColor",d:"M480 256a32 32 0 0 1 32 32v256a32 32 0 0 1-64 0V288a32 32 0 0 1 32-32"}),H("path",{fill:"currentColor",d:"M480 512h256q32 0 32 32t-32 32H480q-32 0-32-32t32-32"})]))}}),gC=i3,u3=le({name:"Close",__name:"close",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M764.288 214.592 512 466.88 259.712 214.592a31.936 31.936 0 0 0-45.12 45.12L466.752 512 214.528 764.224a31.936 31.936 0 1 0 45.12 45.184L512 557.184l252.288 252.288a31.936 31.936 0 0 0 45.12-45.12L557.12 512.064l252.288-252.352a31.936 31.936 0 1 0-45.12-45.184z"})]))}}),Ia=u3,c3=le({name:"DArrowLeft",__name:"d-arrow-left",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M529.408 149.376a29.12 29.12 0 0 1 41.728 0 30.59 30.59 0 0 1 0 42.688L259.264 511.936l311.872 319.936a30.59 30.59 0 0 1-.512 43.264 29.12 29.12 0 0 1-41.216-.512L197.76 534.272a32 32 0 0 1 0-44.672zm256 0a29.12 29.12 0 0 1 41.728 0 30.59 30.59 0 0 1 0 42.688L515.264 511.936l311.872 319.936a30.59 30.59 0 0 1-.512 43.264 29.12 29.12 0 0 1-41.216-.512L453.76 534.272a32 32 0 0 1 0-44.672z"})]))}}),kl=c3,d3=le({name:"DArrowRight",__name:"d-arrow-right",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M452.864 149.312a29.12 29.12 0 0 1 41.728.064L826.24 489.664a32 32 0 0 1 0 44.672L494.592 874.624a29.12 29.12 0 0 1-41.728 0 30.59 30.59 0 0 1 0-42.752L764.736 512 452.864 192a30.59 30.59 0 0 1 0-42.688m-256 0a29.12 29.12 0 0 1 41.728.064L570.24 489.664a32 32 0 0 1 0 44.672L238.592 874.624a29.12 29.12 0 0 1-41.728 0 30.59 30.59 0 0 1 0-42.752L508.736 512 196.864 192a30.59 30.59 0 0 1 0-42.688"})]))}}),El=d3,f3=le({name:"Delete",__name:"delete",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M160 256H96a32 32 0 0 1 0-64h256V95.936a32 32 0 0 1 32-32h256a32 32 0 0 1 32 32V192h256a32 32 0 1 1 0 64h-64v672a32 32 0 0 1-32 32H192a32 32 0 0 1-32-32zm448-64v-64H416v64zM224 896h576V256H224zm192-128a32 32 0 0 1-32-32V416a32 32 0 0 1 64 0v320a32 32 0 0 1-32 32m192 0a32 32 0 0 1-32-32V416a32 32 0 0 1 64 0v320a32 32 0 0 1-32 32"})]))}}),p3=f3,v3=le({name:"Document",__name:"document",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M832 384H576V128H192v768h640zm-26.496-64L640 154.496V320zM160 64h480l256 256v608a32 32 0 0 1-32 32H160a32 32 0 0 1-32-32V96a32 32 0 0 1 32-32m160 448h384v64H320zm0-192h160v64H320zm0 384h384v64H320z"})]))}}),h3=v3,m3=le({name:"FullScreen",__name:"full-screen",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"m160 96.064 192 .192a32 32 0 0 1 0 64l-192-.192V352a32 32 0 0 1-64 0V96h64zm0 831.872V928H96V672a32 32 0 1 1 64 0v191.936l192-.192a32 32 0 1 1 0 64zM864 96.064V96h64v256a32 32 0 1 1-64 0V160.064l-192 .192a32 32 0 1 1 0-64zm0 831.872-192-.192a32 32 0 0 1 0-64l192 .192V672a32 32 0 1 1 64 0v256h-64z"})]))}}),g3=m3,b3=le({name:"Hide",__name:"hide",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M876.8 156.8c0-9.6-3.2-16-9.6-22.4s-12.8-9.6-22.4-9.6-16 3.2-22.4 9.6L736 220.8c-64-32-137.6-51.2-224-60.8-160 16-288 73.6-377.6 176S0 496 0 512s48 73.6 134.4 176c22.4 25.6 44.8 48 73.6 67.2l-86.4 89.6c-6.4 6.4-9.6 12.8-9.6 22.4s3.2 16 9.6 22.4 12.8 9.6 22.4 9.6 16-3.2 22.4-9.6l704-710.4c3.2-6.4 6.4-12.8 6.4-22.4m-646.4 528Q115.2 579.2 76.8 512q43.2-72 153.6-172.8C304 272 400 230.4 512 224c64 3.2 124.8 19.2 176 44.8l-54.4 54.4C598.4 300.8 560 288 512 288c-64 0-115.2 22.4-160 64s-64 96-64 160c0 48 12.8 89.6 35.2 124.8L256 707.2c-9.6-6.4-19.2-16-25.6-22.4m140.8-96Q352 555.2 352 512c0-44.8 16-83.2 48-112s67.2-48 112-48c28.8 0 54.4 6.4 73.6 19.2zM889.599 336c-12.8-16-28.8-28.8-41.6-41.6l-48 48c73.6 67.2 124.8 124.8 150.4 169.6q-43.2 72-153.6 172.8c-73.6 67.2-172.8 108.8-284.8 115.2-51.2-3.2-99.2-12.8-140.8-28.8l-48 48c57.6 22.4 118.4 38.4 188.8 44.8 160-16 288-73.6 377.6-176S1024 528 1024 512s-48.001-73.6-134.401-176"}),H("path",{fill:"currentColor",d:"M511.998 672c-12.8 0-25.6-3.2-38.4-6.4l-51.2 51.2c28.8 12.8 57.6 19.2 89.6 19.2 64 0 115.2-22.4 160-64 41.6-41.6 64-96 64-160 0-32-6.4-64-19.2-89.6l-51.2 51.2c3.2 12.8 6.4 25.6 6.4 38.4 0 44.8-16 83.2-48 112s-67.2 48-112 48"})]))}}),y3=b3,w3=le({name:"InfoFilled",__name:"info-filled",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896.064A448 448 0 0 1 512 64m67.2 275.072c33.28 0 60.288-23.104 60.288-57.344s-27.072-57.344-60.288-57.344c-33.28 0-60.16 23.104-60.16 57.344s26.88 57.344 60.16 57.344M590.912 699.2c0-6.848 2.368-24.64 1.024-34.752l-52.608 60.544c-10.88 11.456-24.512 19.392-30.912 17.28a12.99 12.99 0 0 1-8.256-14.72l87.68-276.992c7.168-35.136-12.544-67.2-54.336-71.296-44.096 0-108.992 44.736-148.48 101.504 0 6.784-1.28 23.68.064 33.792l52.544-60.608c10.88-11.328 23.552-19.328 29.952-17.152a12.8 12.8 0 0 1 7.808 16.128L388.48 728.576c-10.048 32.256 8.96 63.872 55.04 71.04 67.84 0 107.904-43.648 147.456-100.416z"})]))}}),di=w3,C3=le({name:"Loading",__name:"loading",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32m0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32m448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32m-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32M195.2 195.2a32 32 0 0 1 45.248 0L376.32 331.008a32 32 0 0 1-45.248 45.248L195.2 240.448a32 32 0 0 1 0-45.248m452.544 452.544a32 32 0 0 1 45.248 0L828.8 783.552a32 32 0 0 1-45.248 45.248L647.744 692.992a32 32 0 0 1 0-45.248M828.8 195.264a32 32 0 0 1 0 45.184L692.992 376.32a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0m-452.544 452.48a32 32 0 0 1 0 45.248L240.448 828.8a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0"})]))}}),wo=C3,S3=le({name:"Minus",__name:"minus",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M128 544h768a32 32 0 1 0 0-64H128a32 32 0 0 0 0 64"})]))}}),k3=S3,E3=le({name:"MoreFilled",__name:"more-filled",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M176 416a112 112 0 1 1 0 224 112 112 0 0 1 0-224m336 0a112 112 0 1 1 0 224 112 112 0 0 1 0-224m336 0a112 112 0 1 1 0 224 112 112 0 0 1 0-224"})]))}}),ab=E3,x3=le({name:"More",__name:"more",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M176 416a112 112 0 1 0 0 224 112 112 0 0 0 0-224m0 64a48 48 0 1 1 0 96 48 48 0 0 1 0-96m336-64a112 112 0 1 1 0 224 112 112 0 0 1 0-224m0 64a48 48 0 1 0 0 96 48 48 0 0 0 0-96m336-64a112 112 0 1 1 0 224 112 112 0 0 1 0-224m0 64a48 48 0 1 0 0 96 48 48 0 0 0 0-96"})]))}}),T3=x3,$3=le({name:"PictureFilled",__name:"picture-filled",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M96 896a32 32 0 0 1-32-32V160a32 32 0 0 1 32-32h832a32 32 0 0 1 32 32v704a32 32 0 0 1-32 32zm315.52-228.48-68.928-68.928a32 32 0 0 0-45.248 0L128 768.064h778.688l-242.112-290.56a32 32 0 0 0-49.216 0L458.752 665.408a32 32 0 0 1-47.232 2.112M256 384a96 96 0 1 0 192.064-.064A96 96 0 0 0 256 384"})]))}}),O3=$3,I3=le({name:"Plus",__name:"plus",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M480 480V128a32 32 0 0 1 64 0v352h352a32 32 0 1 1 0 64H544v352a32 32 0 1 1-64 0V544H128a32 32 0 0 1 0-64z"})]))}}),bC=I3,N3=le({name:"QuestionFilled",__name:"question-filled",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m23.744 191.488c-52.096 0-92.928 14.784-123.2 44.352-30.976 29.568-45.76 70.4-45.76 122.496h80.256c0-29.568 5.632-52.8 17.6-68.992 13.376-19.712 35.2-28.864 66.176-28.864 23.936 0 42.944 6.336 56.32 19.712 12.672 13.376 19.712 31.68 19.712 54.912 0 17.6-6.336 34.496-19.008 49.984l-8.448 9.856c-45.76 40.832-73.216 70.4-82.368 89.408-9.856 19.008-14.08 42.24-14.08 68.992v9.856h80.96v-9.856c0-16.896 3.52-31.68 10.56-45.76 6.336-12.672 15.488-24.64 28.16-35.2 33.792-29.568 54.208-48.576 60.544-55.616 16.896-22.528 26.048-51.392 26.048-86.592q0-64.416-42.24-101.376c-28.16-25.344-65.472-37.312-111.232-37.312m-12.672 406.208a54.27 54.27 0 0 0-38.72 14.784 49.4 49.4 0 0 0-15.488 38.016c0 15.488 4.928 28.16 15.488 38.016A54.85 54.85 0 0 0 523.072 768c15.488 0 28.16-4.928 38.72-14.784a51.52 51.52 0 0 0 16.192-38.72 51.97 51.97 0 0 0-15.488-38.016 55.94 55.94 0 0 0-39.424-14.784"})]))}}),M3=N3,P3=le({name:"RefreshLeft",__name:"refresh-left",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M289.088 296.704h92.992a32 32 0 0 1 0 64H232.96a32 32 0 0 1-32-32V179.712a32 32 0 0 1 64 0v50.56a384 384 0 0 1 643.84 282.88 384 384 0 0 1-383.936 384 384 384 0 0 1-384-384h64a320 320 0 1 0 640 0 320 320 0 0 0-555.712-216.448z"})]))}}),R3=P3,A3=le({name:"RefreshRight",__name:"refresh-right",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M784.512 230.272v-50.56a32 32 0 1 1 64 0v149.056a32 32 0 0 1-32 32H667.52a32 32 0 1 1 0-64h92.992A320 320 0 1 0 524.8 833.152a320 320 0 0 0 320-320h64a384 384 0 0 1-384 384 384 384 0 0 1-384-384 384 384 0 0 1 643.712-282.88"})]))}}),_3=A3,L3=le({name:"ScaleToOriginal",__name:"scale-to-original",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M813.176 180.706a60.235 60.235 0 0 1 60.236 60.235v481.883a60.235 60.235 0 0 1-60.236 60.235H210.824a60.235 60.235 0 0 1-60.236-60.235V240.94a60.235 60.235 0 0 1 60.236-60.235h602.352zm0-60.235H210.824A120.47 120.47 0 0 0 90.353 240.94v481.883a120.47 120.47 0 0 0 120.47 120.47h602.353a120.47 120.47 0 0 0 120.471-120.47V240.94a120.47 120.47 0 0 0-120.47-120.47zm-120.47 180.705a30.12 30.12 0 0 0-30.118 30.118v301.177a30.118 30.118 0 0 0 60.236 0V331.294a30.12 30.12 0 0 0-30.118-30.118m-361.412 0a30.12 30.12 0 0 0-30.118 30.118v301.177a30.118 30.118 0 1 0 60.236 0V331.294a30.12 30.12 0 0 0-30.118-30.118M512 361.412a30.12 30.12 0 0 0-30.118 30.117v30.118a30.118 30.118 0 0 0 60.236 0V391.53A30.12 30.12 0 0 0 512 361.412M512 512a30.12 30.12 0 0 0-30.118 30.118v30.117a30.118 30.118 0 0 0 60.236 0v-30.117A30.12 30.12 0 0 0 512 512"})]))}}),D3=L3,B3=le({name:"Search",__name:"search",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"m795.904 750.72 124.992 124.928a32 32 0 0 1-45.248 45.248L750.656 795.904a416 416 0 1 1 45.248-45.248zM480 832a352 352 0 1 0 0-704 352 352 0 0 0 0 704"})]))}}),V3=B3,F3=le({name:"SortDown",__name:"sort-down",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M576 96v709.568L333.312 562.816A32 32 0 1 0 288 608l297.408 297.344A32 32 0 0 0 640 882.688V96a32 32 0 0 0-64 0"})]))}}),z3=F3,H3=le({name:"SortUp",__name:"sort-up",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M384 141.248V928a32 32 0 1 0 64 0V218.56l242.688 242.688A32 32 0 1 0 736 416L438.592 118.656A32 32 0 0 0 384 141.248"})]))}}),K3=H3,W3=le({name:"StarFilled",__name:"star-filled",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M313.6 924.48a70.4 70.4 0 0 1-74.152-5.365 70.4 70.4 0 0 1-27.992-68.875l37.888-220.928L88.96 472.96a70.4 70.4 0 0 1 3.788-104.225A70.4 70.4 0 0 1 128 352.896l221.76-32.256 99.2-200.96a70.4 70.4 0 0 1 100.246-28.595 70.4 70.4 0 0 1 25.962 28.595l99.2 200.96 221.824 32.256a70.4 70.4 0 0 1 39.04 120.064L774.72 629.376l37.888 220.928a70.4 70.4 0 0 1-102.144 74.24L512 820.096l-198.4 104.32z"})]))}}),pu=W3,j3=le({name:"Star",__name:"star",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"m512 747.84 228.16 119.936a6.4 6.4 0 0 0 9.28-6.72l-43.52-254.08 184.512-179.904a6.4 6.4 0 0 0-3.52-10.88l-255.104-37.12L517.76 147.904a6.4 6.4 0 0 0-11.52 0L392.192 379.072l-255.104 37.12a6.4 6.4 0 0 0-3.52 10.88L318.08 606.976l-43.584 254.08a6.4 6.4 0 0 0 9.28 6.72zM313.6 924.48a70.4 70.4 0 0 1-102.144-74.24l37.888-220.928L88.96 472.96A70.4 70.4 0 0 1 128 352.896l221.76-32.256 99.2-200.96a70.4 70.4 0 0 1 126.208 0l99.2 200.96 221.824 32.256a70.4 70.4 0 0 1 39.04 120.064L774.72 629.376l37.888 220.928a70.4 70.4 0 0 1-102.144 74.24L512 820.096l-198.4 104.32z"})]))}}),Y3=j3,U3=le({name:"SuccessFilled",__name:"success-filled",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m-55.808 536.384-99.52-99.584a38.4 38.4 0 1 0-54.336 54.336l126.72 126.72a38.27 38.27 0 0 0 54.336 0l262.4-262.464a38.4 38.4 0 1 0-54.272-54.336z"})]))}}),yC=U3,q3=le({name:"View",__name:"view",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M512 160c320 0 512 352 512 352S832 864 512 864 0 512 0 512s192-352 512-352m0 64c-225.28 0-384.128 208.064-436.8 288 52.608 79.872 211.456 288 436.8 288 225.28 0 384.128-208.064 436.8-288-52.608-79.872-211.456-288-436.8-288m0 64a224 224 0 1 1 0 448 224 224 0 0 1 0-448m0 64a160.19 160.19 0 0 0-160 160c0 88.192 71.744 160 160 160s160-71.808 160-160-71.744-160-160-160"})]))}}),G3=q3,X3=le({name:"WarningFilled",__name:"warning-filled",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m0 192a58.43 58.43 0 0 0-58.24 63.744l23.36 256.384a35.072 35.072 0 0 0 69.76 0l23.296-256.384A58.43 58.43 0 0 0 512 256m0 512a51.2 51.2 0 1 0 0-102.4 51.2 51.2 0 0 0 0 102.4"})]))}}),kd=X3,Z3=le({name:"ZoomIn",__name:"zoom-in",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"m795.904 750.72 124.992 124.928a32 32 0 0 1-45.248 45.248L750.656 795.904a416 416 0 1 1 45.248-45.248zM480 832a352 352 0 1 0 0-704 352 352 0 0 0 0 704m-32-384v-96a32 32 0 0 1 64 0v96h96a32 32 0 0 1 0 64h-96v96a32 32 0 0 1-64 0v-96h-96a32 32 0 0 1 0-64z"})]))}}),wC=Z3,J3=le({name:"ZoomOut",__name:"zoom-out",setup(e){return(t,n)=>(x(),B("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[H("path",{fill:"currentColor",d:"m795.904 750.72 124.992 124.928a32 32 0 0 1-45.248 45.248L750.656 795.904a416 416 0 1 1 45.248-45.248zM480 832a352 352 0 1 0 0-704 352 352 0 0 0 0 704M352 448h256a32 32 0 0 1 0 64H352a32 32 0 0 1 0-64"})]))}}),Q3=J3;const Bt=q([String,Object,Function]),CC={Close:Ia},sh={Close:Ia,SuccessFilled:yC,InfoFilled:di,WarningFilled:kd,CircleCloseFilled:lh},xl={primary:di,success:yC,warning:kd,error:lh,info:di},Ed={validating:wo,success:oh,error:xo},e4=["light","dark"],t4=Ce({title:{type:String,default:""},description:{type:String,default:""},type:{type:String,values:si(xl),default:"info"},closable:{type:Boolean,default:!0},closeText:{type:String,default:""},showIcon:Boolean,center:Boolean,effect:{type:String,values:e4,default:"light"}}),n4={close:e=>e instanceof MouseEvent},a4=Ce({size:{type:q([Number,String])},color:{type:String}});var o4=le({name:"ElIcon",inheritAttrs:!1,__name:"icon",props:a4,setup(e){const t=e,n=fe("icon"),a=y(()=>{const{size:o,color:l}=t,s=en(o);return!s&&!l?{}:{fontSize:s,"--color":l}});return(o,l)=>(x(),B("i",rt({class:i(n).b(),style:a.value},o.$attrs),[ee(o.$slots,"default")],16))}}),l4=o4;const Le=nt(l4);var s4=le({name:"ElAlert",__name:"alert",props:t4,emits:n4,setup(e,{emit:t}){const{Close:n}=sh,a=e,o=t,l=sn(),s=fe("alert"),r=R(!0),u=y(()=>xl[a.type]),c=y(()=>{if(a.description)return!0;const f=l.default?.();return f?va(f).some(h=>!cC(h)):!1}),d=f=>{r.value=!1,o("close",f)};return(f,h)=>(x(),oe(Mn,{name:i(s).b("fade"),persisted:""},{default:Z(()=>[st(H("div",{class:T([i(s).b(),i(s).m(e.type),i(s).is("center",e.center),i(s).is(e.effect)]),role:"alert"},[e.showIcon&&(f.$slots.icon||u.value)?(x(),oe(i(Le),{key:0,class:T([i(s).e("icon"),i(s).is("big",c.value)])},{default:Z(()=>[ee(f.$slots,"icon",{},()=>[(x(),oe(ot(u.value)))])]),_:3},8,["class"])):te("v-if",!0),H("div",{class:T(i(s).e("content"))},[e.title||f.$slots.title?(x(),B("span",{key:0,class:T([i(s).e("title"),{"with-description":c.value}])},[ee(f.$slots,"title",{},()=>[mt(ke(e.title),1)])],2)):te("v-if",!0),c.value?(x(),B("p",{key:1,class:T(i(s).e("description"))},[ee(f.$slots,"default",{},()=>[mt(ke(e.description),1)])],2)):te("v-if",!0),e.closable?(x(),B(Fe,{key:2},[e.closeText?(x(),B("div",{key:0,class:T([i(s).e("close-btn"),i(s).is("customed")]),onClick:d},ke(e.closeText),3)):(x(),oe(i(Le),{key:1,class:T(i(s).e("close-btn")),onClick:d},{default:Z(()=>[U(i(n))]),_:1},8,["class"]))],64)):te("v-if",!0)],2)],2),[[Ot,r.value]])]),_:3},8,["name"]))}}),r4=s4;const i4=nt(r4),SC=["dialog","grid","group","listbox","menu","navigation","tooltip","tree"],kC=Ce({role:{type:String,values:SC,default:"tooltip"}}),rh=Symbol("popper"),EC=Symbol("popperContent");var u4=le({name:"ElPopperArrow",inheritAttrs:!1,__name:"arrow",setup(e,{expose:t}){const n=fe("popper"),{arrowRef:a,arrowStyle:o}=Re(EC,void 0);return Rt(()=>{a.value=void 0}),t({arrowRef:a}),(l,s)=>(x(),B("span",{ref_key:"arrowRef",ref:a,class:T(i(n).e("arrow")),style:He(i(o)),"data-popper-arrow":""},null,6))}}),c4=u4;const xC=Ce({virtualRef:{type:q(Object)},virtualTriggering:Boolean,onMouseenter:{type:q(Function)},onMouseleave:{type:q(Function)},onClick:{type:q(Function)},onKeydown:{type:q(Function)},onFocus:{type:q(Function)},onBlur:{type:q(Function)},onContextmenu:{type:q(Function)},id:String,open:Boolean}),of="ElOnlyChild",TC=le({name:of,setup(e,{slots:t,attrs:n}){const a=FR(Re(X1)?.setForwardRef??Pt);return()=>{const o=t.default?.(n);if(!o)return null;const[l,s]=$C(o);return l?(s>1&&ut(of,"requires exact only one valid child."),st(mo(l,n),[[a]])):(ut(of,"no valid child node found"),null)}}});function $C(e){if(!e)return[null,0];const t=e,n=t.filter(a=>a.type!==un).length;for(const a of t){if(et(a))switch(a.type){case un:continue;case ir:case"svg":return[ob(a),n];case Fe:return $C(a.children);default:return[a,n]}return[ob(a),n]}return[null,0]}function ob(e){const t=fe("only-child");return U("span",{class:t.e("content")},[e])}var d4=le({name:"ElPopperTrigger",inheritAttrs:!1,__name:"trigger",props:xC,setup(e,{expose:t}){const n=e,{role:a,triggerRef:o}=Re(rh,void 0);VR(o);const l=y(()=>r.value?n.id:void 0),s=y(()=>{if(a&&a.value==="tooltip")return n.open&&n.id?n.id:void 0}),r=y(()=>{if(a&&a.value!=="tooltip")return a.value}),u=y(()=>r.value?`${n.open}`:void 0);let c;const d=["onMouseenter","onMouseleave","onClick","onKeydown","onFocus","onBlur","onContextmenu"];return ct(()=>{re(()=>n.virtualRef,f=>{f&&(o.value=gn(f))},{immediate:!0}),re(o,(f,h)=>{c?.(),c=void 0,oa(h)&&d.forEach(g=>{const v=n[g];v&&h.removeEventListener(g.slice(2).toLowerCase(),v,["onFocus","onBlur"].includes(g))}),oa(f)&&(d.forEach(g=>{const v=n[g];v&&f.addEventListener(g.slice(2).toLowerCase(),v,["onFocus","onBlur"].includes(g))}),ri(f)&&(c=re([l,s,r,u],g=>{["aria-controls","aria-describedby","aria-haspopup","aria-expanded"].forEach((v,p)=>{cn(g[p])?f.removeAttribute(v):f.setAttribute(v,g[p])})},{immediate:!0}))),oa(h)&&ri(h)&&["aria-controls","aria-describedby","aria-haspopup","aria-expanded"].forEach(g=>h.removeAttribute(g))},{immediate:!0})}),Rt(()=>{if(c?.(),c=void 0,o.value&&oa(o.value)){const f=o.value;d.forEach(h=>{const g=n[h];g&&f.removeEventListener(h.slice(2).toLowerCase(),g,["onFocus","onBlur"].includes(h))}),o.value=void 0}}),t({triggerRef:o}),(f,h)=>e.virtualTriggering?te("v-if",!0):(x(),oe(i(TC),rt({key:0},f.$attrs,{"aria-controls":l.value,"aria-describedby":s.value,"aria-expanded":u.value,"aria-haspopup":r.value}),{default:Z(()=>[ee(f.$slots,"default")]),_:3},16,["aria-controls","aria-describedby","aria-expanded","aria-haspopup"]))}}),f4=d4;const OC=Ce({arrowOffset:{type:Number,default:5}}),p4=["fixed","absolute"],v4=Ce({boundariesPadding:{type:Number,default:0},fallbackPlacements:{type:q(Array),default:void 0},gpuAcceleration:{type:Boolean,default:!0},offset:{type:Number,default:12},placement:{type:String,values:So,default:"bottom"},popperOptions:{type:q(Object),default:()=>({})},strategy:{type:String,values:p4,default:"absolute"}}),IC=Ce({...v4,...OC,id:String,style:{type:q([String,Array,Object])},className:{type:q([String,Array,Object])},effect:{type:q(String),default:"dark"},visible:Boolean,enterable:{type:Boolean,default:!0},pure:Boolean,focusOnShow:Boolean,trapping:Boolean,popperClass:{type:q([String,Array,Object])},popperStyle:{type:q([String,Array,Object])},referenceEl:{type:q(Object)},triggerTargetEl:{type:q(Object)},stopPopperMouseEvent:{type:Boolean,default:!0},virtualTriggering:Boolean,zIndex:Number,...Un(["ariaLabel"]),loop:Boolean}),h4={mouseenter:e=>e instanceof MouseEvent,mouseleave:e=>e instanceof MouseEvent,focus:()=>!0,blur:()=>!0,close:()=>!0},m4=Ce({size:{type:String,values:Ua},disabled:Boolean}),g4=Ce({...m4,model:Object,rules:{type:q(Object)},labelPosition:{type:String,values:["left","right","top"],default:"right"},requireAsteriskPosition:{type:String,values:["left","right"],default:"left"},labelWidth:{type:[String,Number],default:""},labelSuffix:{type:String,default:""},inline:Boolean,inlineMessage:Boolean,statusIcon:Boolean,showMessage:{type:Boolean,default:!0},validateOnRuleChange:{type:Boolean,default:!0},hideRequiredAsterisk:Boolean,scrollToError:Boolean,scrollIntoViewOptions:{type:q([Object,Boolean]),default:!0}}),b4={validate:(e,t,n)=>(ye(e)||_e(e))&&Dt(t)&&_e(n)},vs=Symbol("formContextKey"),Co=Symbol("formItemContextKey"),vn=(e,t={})=>{const n=R(void 0),a=t.prop?n:L1("size"),o=t.global?n:fC(),l=t.form?{size:void 0}:Re(vs,void 0),s=t.formItem?{size:void 0}:Re(Co,void 0);return y(()=>a.value||i(e)||s?.size||l?.size||o.value||"")},tn=e=>{const t=L1("disabled"),n=Re(vs,void 0);return y(()=>t.value??i(e)??n?.disabled??!1)},On=()=>({form:Re(vs,void 0),formItem:Re(Co,void 0)}),ya=(e,{formItemContext:t,disableIdGeneration:n,disableIdManagement:a})=>{n||(n=R(!1)),a||(a=R(!1));const o=it(),l=()=>{let c=o?.parent;for(;c;){if(c.type.name==="ElFormItem")return!1;if(c.type.name==="ElLabelWrap")return!0;c=c.parent}return!1},s=R();let r;const u=y(()=>!!(!(e.label||e.ariaLabel)&&t&&t.inputIds&&t.inputIds?.length<=1));return ct(()=>{r=re([_t(e,"id"),n],([c,d])=>{const f=c??(d?void 0:Pn().value);f!==s.value&&(t?.removeInputId&&!l()&&(s.value&&t.removeInputId(s.value),!a?.value&&!d&&f&&t.addInputId(f)),s.value=f)},{immediate:!0})}),rr(()=>{r&&r(),t?.removeInputId&&s.value&&t.removeInputId(s.value)}),{isLabeledByFormItem:u,inputId:s}},y4=["","error","validating","success"],w4=Ce({label:String,labelWidth:{type:[String,Number]},labelPosition:{type:String,values:["left","right","top",""],default:""},prop:{type:q([String,Array])},required:{type:Boolean,default:void 0},rules:{type:q([Object,Array])},error:String,validateStatus:{type:String,values:y4},for:String,inlineMessage:{type:Boolean,default:void 0},showMessage:{type:Boolean,default:!0},size:{type:String,values:Ua}}),lb=e=>[...new Set(e)],Er=e=>ye(e)?e[0]:e,Kn=e=>!e&&e!==0?[]:ye(e)?e:[e],C4="ElForm";function S4(){const e=R([]),t=y(()=>{if(!e.value.length)return"0";const l=Math.max(...e.value);return l?`${l}px`:""});function n(l){const s=e.value.indexOf(l);return s===-1&&t.value==="0"&&ut(C4,`unexpected width ${l}`),s}function a(l,s){if(l&&s){const r=n(s);e.value.splice(r,1,l)}else l&&e.value.push(l)}function o(l){const s=n(l);s>-1&&e.value.splice(s,1)}return{autoLabelWidth:t,registerLabelWidth:a,deregisterLabelWidth:o}}const vu=(e,t)=>{const n=Cn(t).map(a=>ye(a)?a.join("."):a);return n.length>0?e.filter(a=>a.propString&&n.includes(a.propString)):e},bs="ElForm";var k4=le({name:bs,__name:"form",props:g4,emits:b4,setup(e,{expose:t,emit:n}){const a=e,o=n,l=R(),s=Nt([]),r=new Map,u=vn(),c=fe("form"),d=y(()=>{const{labelPosition:O,inline:$}=a;return[c.b(),c.m(u.value||"default"),{[c.m(`label-${O}`)]:O,[c.m("inline")]:$}]}),f=O=>vu(s,[O])[0],h=O=>{s.push(O),O.propString&&(r.has(O.propString)?O.setInitialValue(r.get(O.propString)):r.set(O.propString,Vo(O.fieldValue)))},g=O=>{O.prop&&s.splice(s.indexOf(O),1)},v=O=>{if(!a.model){ut(bs,"model is required for setInitialValues to work.");return}if(!O){ut(bs,"initModel is required for setInitialValues to work.");return}for(const $ of r.keys())r.set($,Vo(bl(O,$).value));s.forEach($=>{$.prop&&$.setInitialValue(bl(O,$.prop).value)})},p=(O=[])=>{if(!a.model){ut(bs,"model is required for resetFields to work.");return}vu(s,O).forEach(I=>I.resetField());const $=new Set(s.map(I=>I.propString).filter(Boolean)),N=O.length>0?Cn(O).map(I=>ye(I)?I.join("."):I):[...r.keys()];for(const I of N)!$.has(I)&&r.has(I)&&(bl(a.model,I).value=Vo(r.get(I)))},m=(O=[])=>{vu(s,O).forEach($=>$.clearValidate())},b=y(()=>{const O=!!a.model;return O||ut(bs,"model is required for validate to work."),O}),k=O=>{if(s.length===0)return[];const $=vu(s,O);return $.length?$:(ut(bs,"please pass correct props!"),[])},w=async O=>S(void 0,O),C=async(O=[])=>{if(!b.value)return!1;const $=k(O);if($.length===0)return!0;let N={};for(const I of $)try{await I.validate(""),I.validateState==="error"&&!I.error&&I.resetField()}catch(_){N={...N,..._}}return Object.keys(N).length===0?!0:Promise.reject(N)},S=async(O=[],$)=>{let N=!1;const I=!Be($);try{return N=await C(O),N===!0&&await $?.(N),N}catch(_){if(_ instanceof Error)throw _;const A=_;return a.scrollToError&&l.value&&l.value.querySelector(`.${c.b()}-item.is-error`)?.scrollIntoView(a.scrollIntoViewOptions),!N&&await $?.(!1,A),I&&Promise.reject(A)}},E=O=>{const $=f(O);$&&$.$el?.scrollIntoView(a.scrollIntoViewOptions)};return re(()=>a.rules,()=>{a.validateOnRuleChange&&w().catch(O=>ut(O))},{deep:!0,flush:"post"}),gt(vs,Nt({...En(a),emit:o,resetFields:p,clearValidate:m,validateField:S,getField:f,addField:h,removeField:g,setInitialValues:v,...S4()})),t({validate:w,validateField:S,resetFields:p,clearValidate:m,scrollToField:E,getField:f,fields:s,setInitialValues:v}),(O,$)=>(x(),B("form",{ref_key:"formRef",ref:l,class:T(d.value)},[ee(O.$slots,"default")],2))}}),E4=k4;const sb="ElLabelWrap";var x4=le({name:sb,props:{isAutoWidth:Boolean,updateAll:Boolean},setup(e,{slots:t}){const n=Re(vs,void 0),a=Re(Co);a||Gt(sb,"usage: ");const o=fe("form"),l=R(),s=R(0),r=()=>{if(l.value?.firstElementChild){const d=window.getComputedStyle(l.value.firstElementChild).width;return Math.ceil(Number.parseFloat(d))}else return 0},u=(d="update")=>{Oe(()=>{t.default&&e.isAutoWidth&&(d==="update"?s.value=r():d==="remove"&&n?.deregisterLabelWidth(s.value))})},c=()=>u("update");return ct(()=>{c()}),Rt(()=>{u("remove")}),Ya(()=>c()),re(s,(d,f)=>{e.updateAll&&n?.registerLabelWidth(d,f)}),Ut(y(()=>l.value?.firstElementChild??null),c),()=>{if(!t)return null;const{isAutoWidth:d}=e;if(d){const f=n?.autoLabelWidth,h=a?.hasLabel,g={};if(h&&f&&f!=="auto"){const v=Math.max(0,Number.parseInt(f,10)-s.value),p=(a.labelPosition||n.labelPosition)==="left"?"marginRight":"marginLeft";v&&(g[p]=`${v}px`)}return U("div",{ref:l,class:[o.be("item","label-wrap")],style:g},[t.default?.()])}else return U(Fe,{ref:l},[t.default?.()])}}});function Hl(){return Hl=Object.assign?Object.assign.bind():function(e){for(var t=1;t"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function Bu(e,t,n){return $4()?Bu=Reflect.construct.bind():Bu=function(o,l,s){var r=[null];r.push.apply(r,l);var u=Function.bind.apply(o,r),c=new u;return s&&fi(c,s.prototype),c},Bu.apply(null,arguments)}function O4(e){return Function.toString.call(e).indexOf("[native code]")!==-1}function ap(e){var t=typeof Map=="function"?new Map:void 0;return ap=function(a){if(a===null||!O4(a))return a;if(typeof a!="function")throw new TypeError("Super expression must either be null or a function");if(typeof t<"u"){if(t.has(a))return t.get(a);t.set(a,o)}function o(){return Bu(a,arguments,np(this).constructor)}return o.prototype=Object.create(a.prototype,{constructor:{value:o,enumerable:!1,writable:!0,configurable:!0}}),fi(o,a)},ap(e)}var I4=/%[sdj%]/g,N4=function(){};function op(e){if(!e||!e.length)return null;var t={};return e.forEach(function(n){var a=n.field;t[a]=t[a]||[],t[a].push(n)}),t}function ha(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),a=1;a=l)return r;switch(r){case"%s":return String(n[o++]);case"%d":return Number(n[o++]);case"%j":try{return JSON.stringify(n[o++])}catch{return"[Circular]"}break;default:return r}});return s}return e}function M4(e){return e==="string"||e==="url"||e==="hex"||e==="email"||e==="date"||e==="pattern"}function Tn(e,t){return!!(e==null||t==="array"&&Array.isArray(e)&&!e.length||M4(t)&&typeof e=="string"&&!e)}function P4(e,t,n){var a=[],o=0,l=e.length;function s(r){a.push.apply(a,r||[]),o++,o===l&&n(a)}e.forEach(function(r){t(r,s)})}function rb(e,t,n){var a=0,o=e.length;function l(s){if(s&&s.length){n(s);return}var r=a;a=a+1,r()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+\.)+[a-zA-Z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]{2,}))$/,hex:/^#?([a-f0-9]{6}|[a-f0-9]{3})$/i},Ir={integer:function(t){return Ir.number(t)&&parseInt(t,10)===t},float:function(t){return Ir.number(t)&&!Ir.integer(t)},array:function(t){return Array.isArray(t)},regexp:function(t){if(t instanceof RegExp)return!0;try{return!!new RegExp(t)}catch{return!1}},date:function(t){return typeof t.getTime=="function"&&typeof t.getMonth=="function"&&typeof t.getYear=="function"&&!isNaN(t.getTime())},number:function(t){return isNaN(t)?!1:typeof t=="number"},object:function(t){return typeof t=="object"&&!Ir.array(t)},method:function(t){return typeof t=="function"},email:function(t){return typeof t=="string"&&t.length<=320&&!!t.match(db.email)},url:function(t){return typeof t=="string"&&t.length<=2048&&!!t.match(B4())},hex:function(t){return typeof t=="string"&&!!t.match(db.hex)}},V4=function(t,n,a,o,l){if(t.required&&n===void 0){NC(t,n,a,o,l);return}var s=["integer","float","array","regexp","object","method","email","number","date","url","hex"],r=t.type;s.indexOf(r)>-1?Ir[r](n)||o.push(ha(l.messages.types[r],t.fullField,t.type)):r&&typeof n!==t.type&&o.push(ha(l.messages.types[r],t.fullField,t.type))},F4=function(t,n,a,o,l){var s=typeof t.len=="number",r=typeof t.min=="number",u=typeof t.max=="number",c=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,d=n,f=null,h=typeof n=="number",g=typeof n=="string",v=Array.isArray(n);if(h?f="number":g?f="string":v&&(f="array"),!f)return!1;v&&(d=n.length),g&&(d=n.replace(c,"_").length),s?d!==t.len&&o.push(ha(l.messages[f].len,t.fullField,t.len)):r&&!u&&dt.max?o.push(ha(l.messages[f].max,t.fullField,t.max)):r&&u&&(dt.max)&&o.push(ha(l.messages[f].range,t.fullField,t.min,t.max))},ys="enum",z4=function(t,n,a,o,l){t[ys]=Array.isArray(t[ys])?t[ys]:[],t[ys].indexOf(n)===-1&&o.push(ha(l.messages[ys],t.fullField,t[ys].join(", ")))},H4=function(t,n,a,o,l){if(t.pattern){if(t.pattern instanceof RegExp)t.pattern.lastIndex=0,t.pattern.test(n)||o.push(ha(l.messages.pattern.mismatch,t.fullField,n,t.pattern));else if(typeof t.pattern=="string"){var s=new RegExp(t.pattern);s.test(n)||o.push(ha(l.messages.pattern.mismatch,t.fullField,n,t.pattern))}}},Wt={required:NC,whitespace:D4,type:V4,range:F4,enum:z4,pattern:H4},K4=function(t,n,a,o,l){var s=[],r=t.required||!t.required&&o.hasOwnProperty(t.field);if(r){if(Tn(n,"string")&&!t.required)return a();Wt.required(t,n,o,s,l,"string"),Tn(n,"string")||(Wt.type(t,n,o,s,l),Wt.range(t,n,o,s,l),Wt.pattern(t,n,o,s,l),t.whitespace===!0&&Wt.whitespace(t,n,o,s,l))}a(s)},W4=function(t,n,a,o,l){var s=[],r=t.required||!t.required&&o.hasOwnProperty(t.field);if(r){if(Tn(n)&&!t.required)return a();Wt.required(t,n,o,s,l),n!==void 0&&Wt.type(t,n,o,s,l)}a(s)},j4=function(t,n,a,o,l){var s=[],r=t.required||!t.required&&o.hasOwnProperty(t.field);if(r){if(n===""&&(n=void 0),Tn(n)&&!t.required)return a();Wt.required(t,n,o,s,l),n!==void 0&&(Wt.type(t,n,o,s,l),Wt.range(t,n,o,s,l))}a(s)},Y4=function(t,n,a,o,l){var s=[],r=t.required||!t.required&&o.hasOwnProperty(t.field);if(r){if(Tn(n)&&!t.required)return a();Wt.required(t,n,o,s,l),n!==void 0&&Wt.type(t,n,o,s,l)}a(s)},U4=function(t,n,a,o,l){var s=[],r=t.required||!t.required&&o.hasOwnProperty(t.field);if(r){if(Tn(n)&&!t.required)return a();Wt.required(t,n,o,s,l),Tn(n)||Wt.type(t,n,o,s,l)}a(s)},q4=function(t,n,a,o,l){var s=[],r=t.required||!t.required&&o.hasOwnProperty(t.field);if(r){if(Tn(n)&&!t.required)return a();Wt.required(t,n,o,s,l),n!==void 0&&(Wt.type(t,n,o,s,l),Wt.range(t,n,o,s,l))}a(s)},G4=function(t,n,a,o,l){var s=[],r=t.required||!t.required&&o.hasOwnProperty(t.field);if(r){if(Tn(n)&&!t.required)return a();Wt.required(t,n,o,s,l),n!==void 0&&(Wt.type(t,n,o,s,l),Wt.range(t,n,o,s,l))}a(s)},X4=function(t,n,a,o,l){var s=[],r=t.required||!t.required&&o.hasOwnProperty(t.field);if(r){if(n==null&&!t.required)return a();Wt.required(t,n,o,s,l,"array"),n!=null&&(Wt.type(t,n,o,s,l),Wt.range(t,n,o,s,l))}a(s)},Z4=function(t,n,a,o,l){var s=[],r=t.required||!t.required&&o.hasOwnProperty(t.field);if(r){if(Tn(n)&&!t.required)return a();Wt.required(t,n,o,s,l),n!==void 0&&Wt.type(t,n,o,s,l)}a(s)},J4="enum",Q4=function(t,n,a,o,l){var s=[],r=t.required||!t.required&&o.hasOwnProperty(t.field);if(r){if(Tn(n)&&!t.required)return a();Wt.required(t,n,o,s,l),n!==void 0&&Wt[J4](t,n,o,s,l)}a(s)},e_=function(t,n,a,o,l){var s=[],r=t.required||!t.required&&o.hasOwnProperty(t.field);if(r){if(Tn(n,"string")&&!t.required)return a();Wt.required(t,n,o,s,l),Tn(n,"string")||Wt.pattern(t,n,o,s,l)}a(s)},t_=function(t,n,a,o,l){var s=[],r=t.required||!t.required&&o.hasOwnProperty(t.field);if(r){if(Tn(n,"date")&&!t.required)return a();if(Wt.required(t,n,o,s,l),!Tn(n,"date")){var u;n instanceof Date?u=n:u=new Date(n),Wt.type(t,u,o,s,l),u&&Wt.range(t,u.getTime(),o,s,l)}}a(s)},n_=function(t,n,a,o,l){var s=[],r=Array.isArray(n)?"array":typeof n;Wt.required(t,n,o,s,l,r),a(s)},lf=function(t,n,a,o,l){var s=t.type,r=[],u=t.required||!t.required&&o.hasOwnProperty(t.field);if(u){if(Tn(n,s)&&!t.required)return a();Wt.required(t,n,o,r,l,s),Tn(n,s)||Wt.type(t,n,o,r,l)}a(r)},a_=function(t,n,a,o,l){var s=[],r=t.required||!t.required&&o.hasOwnProperty(t.field);if(r){if(Tn(n)&&!t.required)return a();Wt.required(t,n,o,s,l)}a(s)},Yr={string:K4,method:W4,number:j4,boolean:Y4,regexp:U4,integer:q4,float:G4,array:X4,object:Z4,enum:Q4,pattern:e_,date:t_,url:lf,hex:lf,email:lf,required:n_,any:a_};function lp(){return{default:"Validation error on field %s",required:"%s is required",enum:"%s must be one of %s",whitespace:"%s cannot be empty",date:{format:"%s date %s is invalid for format %s",parse:"%s date could not be parsed, %s is invalid ",invalid:"%s date %s is invalid"},types:{string:"%s is not a %s",method:"%s is not a %s (function)",array:"%s is not an %s",object:"%s is not an %s",number:"%s is not a %s",date:"%s is not a %s",boolean:"%s is not a %s",integer:"%s is not an %s",float:"%s is not a %s",regexp:"%s is not a valid %s",email:"%s is not a valid %s",url:"%s is not a valid %s",hex:"%s is not a valid %s"},string:{len:"%s must be exactly %s characters",min:"%s must be at least %s characters",max:"%s cannot be longer than %s characters",range:"%s must be between %s and %s characters"},number:{len:"%s must equal %s",min:"%s cannot be less than %s",max:"%s cannot be greater than %s",range:"%s must be between %s and %s"},array:{len:"%s must be exactly %s in length",min:"%s cannot be less than %s in length",max:"%s cannot be greater than %s in length",range:"%s must be between %s and %s in length"},pattern:{mismatch:"%s value %s does not match pattern %s"},clone:function(){var t=JSON.parse(JSON.stringify(this));return t.clone=this.clone,t}}}var sp=lp(),qi=(function(){function e(n){this.rules=null,this._messages=sp,this.define(n)}var t=e.prototype;return t.define=function(a){var o=this;if(!a)throw new Error("Cannot configure a schema with no rules");if(typeof a!="object"||Array.isArray(a))throw new Error("Rules must be an object");this.rules={},Object.keys(a).forEach(function(l){var s=a[l];o.rules[l]=Array.isArray(s)?s:[s]})},t.messages=function(a){return a&&(this._messages=cb(lp(),a)),this._messages},t.validate=function(a,o,l){var s=this;o===void 0&&(o={}),l===void 0&&(l=function(){});var r=a,u=o,c=l;if(typeof u=="function"&&(c=u,u={}),!this.rules||Object.keys(this.rules).length===0)return c&&c(null,r),Promise.resolve(r);function d(p){var m=[],b={};function k(C){if(Array.isArray(C)){var S;m=(S=m).concat.apply(S,C)}else m.push(C)}for(var w=0;wn.labelPosition||o?.labelPosition),b=y(()=>m.value==="top"?{}:{width:en(n.labelWidth??o?.labelWidth)}),k=y(()=>{if(m.value==="top"||o?.inline)return{};if(!n.label&&!n.labelWidth&&I)return{};const ie=en(n.labelWidth??o?.labelWidth);return!n.label&&!a.label?{marginLeft:ie}:{}}),w=y(()=>[r.b(),r.m(s.value),r.is("error",d.value==="error"),r.is("validating",d.value==="validating"),r.is("success",d.value==="success"),r.is("required",Y.value||n.required),r.is("no-asterisk",o?.hideRequiredAsterisk),o?.requireAsteriskPosition==="right"?"asterisk-right":"asterisk-left",{[r.m("feedback")]:o?.statusIcon,[r.m(`label-${m.value}`)]:m.value}]),C=y(()=>Dt(n.inlineMessage)?n.inlineMessage:o?.inlineMessage||!1),S=y(()=>[r.e("error"),{[r.em("error","inline")]:C.value}]),E=y(()=>n.prop?ye(n.prop)?n.prop.join("."):n.prop:""),O=y(()=>!!(n.label||a.label)),$=y(()=>n.for??(c.value.length===1?c.value[0]:void 0)),N=y(()=>!$.value&&O.value),I=!!l,_=y(()=>{const ie=o?.model;if(!(!ie||!n.prop))return bl(ie,n.prop).value}),A=y(()=>{const{required:ie}=n,ae=[];n.rules&&ae.push(...Cn(n.rules));const ne=o?.rules;if(ne&&n.prop){const z=bl(ne,n.prop).value;z&&ae.push(...Cn(z))}if(ie!==void 0){const z=ae.map((J,se)=>[J,se]).filter(([J])=>"required"in J);if(z.length>0)for(const[J,se]of z)J.required!==ie&&(ae[se]={...J,required:ie});else ae.push({required:ie})}return ae}),F=y(()=>A.value.length>0),K=ie=>A.value.filter(ae=>!ae.trigger||!ie?!0:ye(ae.trigger)?ae.trigger.includes(ie):ae.trigger===ie).map(({trigger:ae,...ne})=>ne),Y=y(()=>A.value.some(ie=>ie.required)),W=y(()=>f.value==="error"&&n.showMessage&&(o?.showMessage??!0)),P=y(()=>`${n.label||""}${o?.labelSuffix||""}`),M=ie=>{d.value=ie},L=ie=>{const{errors:ae,fields:ne}=ie;(!ae||!ne)&&console.error(ie),M("error"),h.value=ae?ae?.[0]?.message??`${n.prop} is required`:"",o?.emit("validate",n.prop,!1,h.value)},D=()=>{M("success"),o?.emit("validate",n.prop,!0,"")},V=async ie=>{const ae=E.value;return new qi({[ae]:ie}).validate({[ae]:_.value},{firstFields:!0}).then(()=>(D(),!0)).catch(ne=>(L(ne),Promise.reject(ne)))},G=async(ie,ae)=>{if(p||!n.prop)return!1;const ne=Be(ae);if(!F.value)return ae?.(!1),!1;const z=K(ie);return z.length===0?(ae?.(!0),!0):(M("validating"),V(z).then(()=>(ae?.(!0),!0)).catch(J=>{const{fields:se}=J;return ae?.(!1,se),ne?!1:Promise.reject(se)}))},j=()=>{M(""),h.value="",p=!1},X=async()=>{const ie=o?.model;if(!ie||!n.prop)return;const ae=bl(ie,n.prop);p=!0,ae.value=Vo(v),await Oe(),j(),p=!1},Q=ie=>{c.value.includes(ie)||c.value.push(ie)},ve=ie=>{c.value=c.value.filter(ae=>ae!==ie)},ue=ie=>{v=Vo(ie)};re(()=>n.error,ie=>{h.value=ie||"",M(ie?"error":"")},{immediate:!0}),re(()=>n.validateStatus,ie=>M(ie||""));const ge=Nt({...En(n),$el:g,size:s,validateMessage:h,validateState:d,labelId:u,inputIds:c,isGroup:N,hasLabel:O,fieldValue:_,addInputId:Q,removeInputId:ve,resetField:X,clearValidate:j,validate:G,propString:E,setInitialValue:ue});return gt(Co,ge),ct(()=>{n.prop&&(ue(_.value),o?.addField(ge))}),Rt(()=>{o?.removeField(ge)}),t({size:s,validateMessage:h,validateState:d,validate:G,clearValidate:j,resetField:X,setInitialValue:ue}),(ie,ae)=>(x(),B("div",{ref_key:"formItemRef",ref:g,class:T(w.value),role:N.value?"group":void 0,"aria-labelledby":N.value?i(u):void 0},[U(i(x4),{"is-auto-width":b.value.width==="auto","update-all":i(o)?.labelWidth==="auto"},{default:Z(()=>[e.label||ie.$slots.label?(x(),oe(ot($.value?"label":"div"),{key:0,id:i(u),for:$.value,class:T(i(r).e("label")),style:He(b.value)},{default:Z(()=>[ee(ie.$slots,"label",{label:P.value},()=>[mt(ke(P.value),1)])]),_:3},8,["id","for","class","style"])):te("v-if",!0)]),_:3},8,["is-auto-width","update-all"]),H("div",{class:T(i(r).e("content")),style:He(k.value)},[ee(ie.$slots,"default"),U(Sw,{name:`${i(r).namespace.value}-zoom-in-top`},{default:Z(()=>[W.value?ee(ie.$slots,"error",{key:0,error:h.value},()=>[H("div",{class:T(S.value)},ke(h.value),3)]):te("v-if",!0)]),_:3},8,["name"])],6)],10,o_))}}),MC=l_;const s_=nt(E4,{FormItem:MC}),r_=Xt(MC),sf="focus-trap.focus-after-trapped",rf="focus-trap.focus-after-released",i_="focus-trap.focusout-prevented",fb={cancelable:!0,bubbles:!1},u_={cancelable:!0,bubbles:!1},pb="focusAfterTrapped",vb="focusAfterReleased",PC=Symbol("elFocusTrap"),ih=R(),xd=R(0),uh=R(0);let mu=0;const RC=e=>{const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:a=>{const o=a.tagName==="INPUT"&&a.type==="hidden";return a.disabled||a.hidden||o?NodeFilter.FILTER_SKIP:a.tabIndex>=0||a===document.activeElement?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t},hb=(e,t)=>{for(const n of e)if(!c_(n,t))return n},c_=(e,t)=>{if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1},d_=e=>{const t=RC(e);return[hb(t,e),hb(t.reverse(),e)]},f_=e=>e instanceof HTMLInputElement&&"select"in e,rl=(e,t)=>{if(e){const n=document.activeElement;Bi(e,{preventScroll:!0}),uh.value=window.performance.now(),e!==n&&f_(e)&&t&&e.select()}};function mb(e,t){const n=[...e],a=e.indexOf(t);return a!==-1&&n.splice(a,1),n}const p_=()=>{let e=[];return{push:a=>{const o=e[0];o&&a!==o&&o.pause(),e=mb(e,a),e.unshift(a)},remove:a=>{e=mb(e,a),e[0]?.resume?.()}}},v_=(e,t=!1)=>{const n=document.activeElement;for(const a of e)if(rl(a,t),document.activeElement!==n)return},gb=p_(),h_=()=>xd.value>uh.value,gu=()=>{ih.value="pointer",xd.value=window.performance.now()},bb=()=>{ih.value="keyboard",xd.value=window.performance.now()},m_=()=>(ct(()=>{mu===0&&(document.addEventListener("mousedown",gu),document.addEventListener("touchstart",gu),document.addEventListener("keydown",bb)),mu++}),Rt(()=>{mu--,mu<=0&&(document.removeEventListener("mousedown",gu),document.removeEventListener("touchstart",gu),document.removeEventListener("keydown",bb))}),{focusReason:ih,lastUserFocusTimestamp:xd,lastAutomatedFocusTimestamp:uh}),bu=e=>new CustomEvent(i_,{...u_,detail:e});var g_=le({name:"ElFocusTrap",inheritAttrs:!1,props:{loop:Boolean,trapped:Boolean,focusTrapEl:Object,focusStartEl:{type:[Object,String],default:"first"}},emits:[pb,vb,"focusin","focusout","focusout-prevented","release-requested"],setup(e,{emit:t}){const n=R();let a,o;const{focusReason:l}=m_();AR(v=>{e.trapped&&!s.paused&&t("release-requested",v)});const s={paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}},r=v=>{if(!e.loop&&!e.trapped||s.paused)return;const{altKey:p,ctrlKey:m,metaKey:b,currentTarget:k,shiftKey:w}=v,{loop:C}=e,S=Ft(v)===we.tab&&!p&&!m&&!b,E=document.activeElement;if(S&&E){const O=k,[$,N]=d_(O);if($&&N){if(!w&&E===N){const I=bu({focusReason:l.value});t("focusout-prevented",I),I.defaultPrevented||(v.preventDefault(),C&&rl($,!0))}else if(w&&[$,O].includes(E)){const I=bu({focusReason:l.value});t("focusout-prevented",I),I.defaultPrevented||(v.preventDefault(),C&&rl(N,!0))}}else if(E===O){const I=bu({focusReason:l.value});t("focusout-prevented",I),I.defaultPrevented||v.preventDefault()}}};gt(PC,{focusTrapRef:n,onKeydown:r}),re(()=>e.focusTrapEl,v=>{v&&(n.value=v)},{immediate:!0}),re([n],([v],[p])=>{v&&(v.addEventListener("keydown",r),v.addEventListener("focusin",d),v.addEventListener("focusout",f)),p&&(p.removeEventListener("keydown",r),p.removeEventListener("focusin",d),p.removeEventListener("focusout",f))});const u=v=>{t(pb,v)},c=v=>t(vb,v),d=v=>{const p=i(n);if(!p)return;const m=v.target,b=v.relatedTarget,k=m&&p.contains(m);e.trapped||b&&p.contains(b)||(a=b),k&&t("focusin",v),!s.paused&&e.trapped&&(k?o=m:rl(o,!0))},f=v=>{const p=i(n);if(!(s.paused||!p))if(e.trapped){const m=v.relatedTarget;!cn(m)&&!p.contains(m)&&setTimeout(()=>{if(!s.paused&&e.trapped){const b=bu({focusReason:l.value});t("focusout-prevented",b),b.defaultPrevented||rl(o,!0)}},0)}else{const m=v.target;m&&p.contains(m)||t("focusout",v)}};async function h(){await Oe();const v=i(n);if(v){gb.push(s);const p=v.contains(document.activeElement)?a:document.activeElement;if(a=p,!v.contains(p)){const m=new Event(sf,fb);v.addEventListener(sf,u),v.dispatchEvent(m),m.defaultPrevented||Oe(()=>{let b=e.focusStartEl;_e(b)||(rl(b),document.activeElement!==b&&(b="first")),b==="first"&&v_(RC(v),!0),(document.activeElement===p||b==="container")&&rl(v)})}}}function g(){const v=i(n);if(v){v.removeEventListener(sf,u);const p=new CustomEvent(rf,{...fb,detail:{focusReason:l.value}});v.addEventListener(rf,c),v.dispatchEvent(p),!p.defaultPrevented&&(l.value=="keyboard"||!h_()||v.contains(document.activeElement))&&rl(a??document.body),v.removeEventListener(rf,c),gb.remove(s),a=null,o=null}}return ct(()=>{e.trapped&&h(),re(()=>e.trapped,v=>{v?h():g()})}),Rt(()=>{e.trapped&&g(),n.value&&(n.value.removeEventListener("keydown",r),n.value.removeEventListener("focusin",d),n.value.removeEventListener("focusout",f),n.value=void 0),a=null,o=null}),{onKeydown:r}}}),yn=(e,t)=>{const n=e.__vccOpts||e;for(const[a,o]of t)n[a]=o;return n};function b_(e,t,n,a,o,l){return ee(e.$slots,"default",{handleKeydown:e.onKeydown})}var y_=yn(g_,[["render",b_]]),hr=y_;const w_=(e,t=[])=>{const{placement:n,strategy:a,popperOptions:o}=e,l={placement:n,strategy:a,...o,modifiers:[...S_(e),...t]};return k_(l,o?.modifiers),l},C_=e=>{if(It)return gn(e)};function S_(e){const{offset:t,gpuAcceleration:n,fallbackPlacements:a}=e;return[{name:"offset",options:{offset:[0,t??12]}},{name:"preventOverflow",options:{padding:{top:0,bottom:0,left:0,right:0}}},{name:"flip",options:{padding:5,fallbackPlacements:a}},{name:"computeStyles",options:{gpuAcceleration:n}}]}function k_(e,t){t&&(e.modifiers=[...e.modifiers,...t??[]])}const E_=0,x_=e=>{const{popperInstanceRef:t,contentRef:n,triggerRef:a,role:o}=Re(rh,void 0),l=R(),s=y(()=>e.arrowOffset),r=y(()=>({name:"eventListeners",enabled:!!e.visible})),u=y(()=>{const b=i(l),k=i(s)??E_;return{name:"arrow",enabled:!$M(b),options:{element:b,padding:k}}}),c=y(()=>({onFirstUpdate:()=>{v()},...w_(e,[i(u),i(r)])})),d=y(()=>C_(e.referenceEl)||i(a)),{attributes:f,state:h,styles:g,update:v,forceUpdate:p,instanceRef:m}=NR(d,n,c);return re(m,b=>t.value=b,{flush:"sync"}),ct(()=>{re(()=>i(d)?.getBoundingClientRect?.(),()=>{v()})}),Rt(()=>{t.value=void 0}),{attributes:f,arrowRef:l,contentRef:n,instanceRef:m,state:h,styles:g,role:o,forceUpdate:p,update:v}},T_=(e,{attributes:t,styles:n,role:a})=>{const{nextZIndex:o}=zi(),l=fe("popper"),s=y(()=>i(t).popper),r=R(ze(e.zIndex)?e.zIndex:o()),u=y(()=>[l.b(),l.is("pure",e.pure),l.is(e.effect),e.popperClass]),c=y(()=>[{zIndex:i(r)},i(n).popper,e.popperStyle||{}]),d=y(()=>a.value==="dialog"?"false":void 0),f=y(()=>i(n).arrow||{});return{ariaModal:d,arrowStyle:f,contentAttrs:s,contentClass:u,contentStyle:c,contentZIndex:r,updateZIndex:()=>{r.value=ze(e.zIndex)?e.zIndex:o()}}},$_=(e,t)=>{const n=R(!1),a=R(),o=()=>{t("focus")},l=c=>{c.detail?.focusReason!=="pointer"&&(a.value="first",t("blur"))},s=c=>{e.visible&&!n.value&&(c.target&&(a.value=c.target),n.value=!0)},r=c=>{e.trapping||(c.detail.focusReason==="pointer"&&c.preventDefault(),n.value=!1)},u=()=>{n.value=!1,t("close")};return Rt(()=>{a.value=void 0}),{focusStartRef:a,trapped:n,onFocusAfterReleased:l,onFocusAfterTrapped:o,onFocusInTrap:s,onFocusoutPrevented:r,onReleaseRequested:u}};var O_=le({name:"ElPopperContent",__name:"content",props:IC,emits:h4,setup(e,{expose:t,emit:n}){const a=n,o=e,{focusStartRef:l,trapped:s,onFocusAfterReleased:r,onFocusAfterTrapped:u,onFocusInTrap:c,onFocusoutPrevented:d,onReleaseRequested:f}=$_(o,a),{attributes:h,arrowRef:g,contentRef:v,styles:p,instanceRef:m,role:b,update:k}=x_(o),{ariaModal:w,arrowStyle:C,contentAttrs:S,contentClass:E,contentStyle:O,updateZIndex:$}=T_(o,{styles:p,attributes:h,role:b}),N=Re(Co,void 0);gt(EC,{arrowStyle:C,arrowRef:g}),N&>(Co,{...N,addInputId:Pt,removeInputId:Pt});let I;const _=(F=!0)=>{k(),F&&$()},A=()=>{_(!1),o.visible&&o.focusOnShow?s.value=!0:o.visible===!1&&(s.value=!1)};return ct(()=>{re(()=>o.triggerTargetEl,(F,K)=>{I?.(),I=void 0;const Y=i(F||v.value),W=i(K||v.value);oa(Y)&&(I=re([b,()=>o.ariaLabel,w,()=>o.id],P=>{["role","aria-label","aria-modal","id"].forEach((M,L)=>{cn(P[L])?Y.removeAttribute(M):Y.setAttribute(M,P[L])})},{immediate:!0})),W!==Y&&oa(W)&&["role","aria-label","aria-modal","id"].forEach(P=>{W.removeAttribute(P)})},{immediate:!0}),re(()=>o.visible,A,{immediate:!0})}),Rt(()=>{I?.(),I=void 0,v.value=void 0}),t({popperContentRef:v,popperInstanceRef:m,updatePopper:_,contentStyle:O}),(F,K)=>(x(),B("div",rt({ref_key:"contentRef",ref:v},i(S),{style:i(O),class:i(E),tabindex:"-1",onMouseenter:K[0]||(K[0]=Y=>F.$emit("mouseenter",Y)),onMouseleave:K[1]||(K[1]=Y=>F.$emit("mouseleave",Y))}),[U(i(hr),{loop:e.loop,trapped:i(s),"trap-on-focus-in":!0,"focus-trap-el":i(v),"focus-start-el":i(l),onFocusAfterTrapped:i(u),onFocusAfterReleased:i(r),onFocusin:i(c),onFocusoutPrevented:i(d),onReleaseRequested:i(f)},{default:Z(()=>[ee(F.$slots,"default")]),_:3},8,["loop","trapped","focus-trap-el","focus-start-el","onFocusAfterTrapped","onFocusAfterReleased","onFocusin","onFocusoutPrevented","onReleaseRequested"])],16))}}),I_=O_,N_=le({name:"ElPopper",inheritAttrs:!1,__name:"popper",props:kC,setup(e,{expose:t}){const n=e,a={triggerRef:R(),popperInstanceRef:R(),contentRef:R(),referenceRef:R(),role:y(()=>n.role)};return t(a),gt(rh,a),(o,l)=>ee(o.$slots,"default")}}),M_=N_;const AC=nt(M_),Lt=Ce({...DR,...IC,appendTo:{type:_i.to.type},content:{type:String,default:""},rawContent:Boolean,persistent:Boolean,visible:{type:q(Boolean),default:null},transition:String,teleported:{type:Boolean,default:!0},disabled:Boolean,...Un(["ariaLabel"])}),ho=Ce({...xC,disabled:Boolean,trigger:{type:q([String,Array]),default:"hover"},triggerKeys:{type:q(Array),default:()=>[we.enter,we.numpadEnter,we.space]},focusOnTarget:Boolean}),{useModelToggleProps:P_,useModelToggleEmits:R_,useModelToggle:A_}=$P("visible"),__=Ce({...kC,...P_,...Lt,...ho,...OC,showArrow:{type:Boolean,default:!0}}),L_=[...R_,"before-show","before-hide","show","hide","open","close"],ch=Symbol("elTooltip"),rp=(e,t)=>ye(e)?e.includes(t):e===t,ws=(e,t,n)=>a=>{rp(i(e),t)&&n(a)};var D_=le({name:"ElTooltipTrigger",__name:"trigger",props:ho,setup(e,{expose:t}){const n=e,a=fe("tooltip"),{controlled:o,id:l,open:s,onOpen:r,onClose:u,onToggle:c}=Re(ch,void 0),d=R(null),f=()=>{if(i(o)||n.disabled)return!0},h=_t(n,"trigger"),g=wn(f,ws(h,"hover",C=>{r(C),n.focusOnTarget&&C.target&&Oe(()=>{Bi(C.target,{preventScroll:!0})})})),v=wn(f,ws(h,"hover",u)),p=wn(f,ws(h,"click",C=>{C.button===0&&c(C)})),m=wn(f,ws(h,"focus",r)),b=wn(f,ws(h,"focus",u)),k=wn(f,ws(h,"contextmenu",C=>{C.preventDefault(),c(C)})),w=wn(f,C=>{const S=Ft(C);n.triggerKeys.includes(S)&&(C.preventDefault(),c(C))});return t({triggerRef:d}),(C,S)=>(x(),oe(i(f4),{id:i(l),"virtual-ref":e.virtualRef,open:i(s),"virtual-triggering":e.virtualTriggering,class:T(i(a).e("trigger")),onBlur:i(b),onClick:i(p),onContextmenu:i(k),onFocus:i(m),onMouseenter:i(g),onMouseleave:i(v),onKeydown:i(w)},{default:Z(()=>[ee(C.$slots,"default")]),_:3},8,["id","virtual-ref","open","virtual-triggering","class","onBlur","onClick","onContextmenu","onFocus","onMouseenter","onMouseleave","onKeydown"]))}}),B_=D_,V_=le({name:"ElTooltipContent",inheritAttrs:!1,__name:"content",props:Lt,setup(e,{expose:t}){const n=e,{selector:a}=G1(),o=fe("tooltip"),l=R(),s=y1(()=>l.value?.popperContentRef);let r;const{controlled:u,id:c,open:d,trigger:f,onClose:h,onOpen:g,onShow:v,onHide:p,onBeforeShow:m,onBeforeHide:b}=Re(ch,void 0),k=y(()=>n.transition||`${o.namespace.value}-fade-in-linear`),w=y(()=>n.persistent);Rt(()=>{r?.()});const C=y(()=>i(w)?!0:i(d)),S=y(()=>n.disabled?!1:i(d)),E=y(()=>n.appendTo||a.value),O=y(()=>n.style??{}),$=R(!0),N=()=>{p(),P()&&Bi(document.body,{preventScroll:!0}),$.value=!0},I=()=>{if(i(u))return!0},_=wn(I,()=>{n.enterable&&rp(i(f),"hover")&&g()}),A=wn(I,()=>{rp(i(f),"hover")&&h()}),F=()=>{l.value?.updatePopper?.(),m?.()},K=()=>{b?.()},Y=()=>{v()},W=()=>{n.virtualTriggering||h()},P=M=>{const L=l.value?.popperContentRef,D=M?.relatedTarget||document.activeElement;return L?.contains(D)};return re(()=>i(d),M=>{M?($.value=!1,r=Lv(s,()=>{i(u)||Kn(i(f)).every(L=>L!=="hover"&&L!=="focus")&&h()},{detectIframe:!0})):r?.()},{flush:"post"}),re(()=>n.content,()=>{l.value?.updatePopper?.()}),t({contentRef:l,isFocusInsideContent:P}),(M,L)=>(x(),oe(i(vr),{disabled:!e.teleported,to:E.value},{default:Z(()=>[C.value||!$.value?(x(),oe(Mn,{key:0,name:k.value,appear:!w.value,onAfterLeave:N,onBeforeEnter:F,onAfterEnter:Y,onBeforeLeave:K,persisted:""},{default:Z(()=>[st(U(i(I_),rt({id:i(c),ref_key:"contentRef",ref:l},M.$attrs,{"aria-label":e.ariaLabel,"aria-hidden":$.value,"boundaries-padding":e.boundariesPadding,"fallback-placements":e.fallbackPlacements,"gpu-acceleration":e.gpuAcceleration,offset:e.offset,placement:e.placement,"popper-options":e.popperOptions,"arrow-offset":e.arrowOffset,strategy:e.strategy,effect:e.effect,enterable:e.enterable,pure:e.pure,"popper-class":e.popperClass,"popper-style":[e.popperStyle,O.value],"reference-el":e.referenceEl,"trigger-target-el":e.triggerTargetEl,visible:S.value,"z-index":e.zIndex,loop:e.loop,onMouseenter:i(_),onMouseleave:i(A),onBlur:W,onClose:i(h)}),{default:Z(()=>[ee(M.$slots,"default")]),_:3},16,["id","aria-label","aria-hidden","boundaries-padding","fallback-placements","gpu-acceleration","offset","placement","popper-options","arrow-offset","strategy","effect","enterable","pure","popper-class","popper-style","reference-el","trigger-target-el","visible","z-index","loop","onMouseenter","onMouseleave","onClose"]),[[Ot,S.value]])]),_:3},8,["name","appear"])):te("v-if",!0)]),_:3},8,["disabled","to"]))}}),F_=V_;const z_=["innerHTML"],H_={key:1};var K_=le({name:"ElTooltip",__name:"tooltip",props:__,emits:L_,setup(e,{expose:t,emit:n}){const a=e,o=n;LR();const l=fe("tooltip"),s=Pn(),r=R(),u=R(),c=()=>{const C=i(r);C&&C.popperInstanceRef?.update()},d=R(!1),f=R(),{show:h,hide:g,hasUpdateHandler:v}=A_({indicator:d,toggleReason:f}),{onOpen:p,onClose:m}=BR({showAfter:_t(a,"showAfter"),hideAfter:_t(a,"hideAfter"),autoClose:_t(a,"autoClose"),open:h,close:g}),b=y(()=>Dt(a.visible)&&!v.value),k=y(()=>[l.b(),a.popperClass]);gt(ch,{controlled:b,id:s,open:es(d),trigger:_t(a,"trigger"),onOpen:p,onClose:m,onToggle:C=>{i(d)?m(C):p(C)},onShow:()=>{o("show",f.value)},onHide:()=>{o("hide",f.value)},onBeforeShow:()=>{o("before-show",f.value)},onBeforeHide:()=>{o("before-hide",f.value)},updatePopper:c}),re(()=>a.disabled,C=>{C&&d.value&&(d.value=!1)});const w=C=>u.value?.isFocusInsideContent(C);return cv(()=>d.value&&g()),Rt(()=>{f.value=void 0}),t({popperRef:r,contentRef:u,isFocusInsideContent:w,updatePopper:c,onOpen:p,onClose:m,hide:g}),(C,S)=>(x(),oe(i(AC),{ref_key:"popperRef",ref:r,role:e.role},{default:Z(()=>[U(B_,{disabled:e.disabled,trigger:e.trigger,"trigger-keys":e.triggerKeys,"virtual-ref":e.virtualRef,"virtual-triggering":e.virtualTriggering,"focus-on-target":e.focusOnTarget},{default:Z(()=>[C.$slots.default?ee(C.$slots,"default",{key:0}):te("v-if",!0)]),_:3},8,["disabled","trigger","trigger-keys","virtual-ref","virtual-triggering","focus-on-target"]),U(F_,{ref_key:"contentRef",ref:u,"aria-label":e.ariaLabel,"boundaries-padding":e.boundariesPadding,content:e.content,disabled:e.disabled,effect:e.effect,enterable:e.enterable,"fallback-placements":e.fallbackPlacements,"hide-after":e.hideAfter,"gpu-acceleration":e.gpuAcceleration,offset:e.offset,persistent:e.persistent,"popper-class":k.value,"popper-style":e.popperStyle,placement:e.placement,"popper-options":e.popperOptions,"arrow-offset":e.arrowOffset,pure:e.pure,"raw-content":e.rawContent,"reference-el":e.referenceEl,"trigger-target-el":e.triggerTargetEl,"show-after":e.showAfter,strategy:e.strategy,teleported:e.teleported,transition:e.transition,"virtual-triggering":e.virtualTriggering,"z-index":e.zIndex,"append-to":e.appendTo,loop:e.loop},{default:Z(()=>[ee(C.$slots,"content",{},()=>[e.rawContent?(x(),B("span",{key:0,innerHTML:e.content},null,8,z_)):(x(),B("span",H_,ke(e.content),1))]),e.showArrow?(x(),oe(i(c4),{key:0})):te("v-if",!0)]),_:3},8,["aria-label","boundaries-padding","content","disabled","effect","enterable","fallback-placements","hide-after","gpu-acceleration","offset","persistent","popper-class","popper-style","placement","popper-options","arrow-offset","pure","raw-content","reference-el","trigger-target-el","show-after","strategy","teleported","transition","virtual-triggering","z-index","append-to","loop"])]),_:3},8,["role"]))}}),W_=K_;const $n=nt(W_),Qt=e=>e,Gi=Ce({id:{type:String,default:void 0},size:bn,disabled:{type:Boolean,default:void 0},modelValue:{type:q([String,Number,Object]),default:""},modelModifiers:{type:q(Object),default:()=>({})},maxlength:{type:[String,Number]},minlength:{type:[String,Number]},type:{type:q(String),default:"text"},resize:{type:String,values:["none","both","horizontal","vertical"]},autosize:{type:q([Boolean,Object]),default:!1},autocomplete:{type:q(String),default:"off"},formatter:{type:Function},parser:{type:Function},placeholder:{type:String},form:{type:String},readonly:Boolean,clearable:Boolean,clearIcon:{type:Bt,default:xo},showPassword:Boolean,showWordLimit:Boolean,wordLimitPosition:{type:String,values:["inside","outside"],default:"inside"},suffixIcon:{type:Bt},prefixIcon:{type:Bt},containerRole:{type:String,default:void 0},tabindex:{type:[String,Number],default:0},validateEvent:{type:Boolean,default:!0},inputStyle:{type:q([Object,Array,String]),default:()=>Qt({})},autofocus:Boolean,rows:{type:Number,default:2},...Un(["ariaLabel"]),inputmode:{type:q(String),default:void 0},name:String}),j_={[Qe]:e=>_e(e),input:e=>_e(e),change:(e,t)=>_e(e)&&(t instanceof Event||t===void 0),focus:e=>e instanceof FocusEvent,blur:e=>e instanceof FocusEvent,clear:e=>e===void 0||e instanceof MouseEvent,mouseleave:e=>e instanceof MouseEvent,mouseenter:e=>e instanceof MouseEvent,keydown:e=>e instanceof Event,compositionstart:e=>e instanceof CompositionEvent,compositionupdate:e=>e instanceof CompositionEvent,compositionend:e=>e instanceof CompositionEvent};uo(xo);let Ca;const Y_={height:"0",visibility:"hidden",overflow:vd()?"":"hidden",position:"absolute","z-index":"-1000",top:"0",right:"0"},U_=["letter-spacing","line-height","padding-top","padding-bottom","font-family","font-weight","font-size","text-rendering","text-transform","width","text-indent","padding-left","padding-right","border-width","box-sizing","word-break"],yb=e=>{const t=Number.parseFloat(e);return Number.isNaN(t)?e:t};function q_(e){const t=window.getComputedStyle(e),n=t.getPropertyValue("box-sizing"),a=Number.parseFloat(t.getPropertyValue("padding-bottom"))+Number.parseFloat(t.getPropertyValue("padding-top")),o=Number.parseFloat(t.getPropertyValue("border-bottom-width"))+Number.parseFloat(t.getPropertyValue("border-top-width"));return{contextStyle:U_.map(l=>[l,t.getPropertyValue(l)]),paddingSize:a,borderSize:o,boxSizing:n}}function wb(e,t=1,n){if(!Ca){Ca=document.createElement("textarea");let d=document.body;!vd()&&e.parentNode&&(d=e.parentNode),d.appendChild(Ca)}const{paddingSize:a,borderSize:o,boxSizing:l,contextStyle:s}=q_(e);s.forEach(([d,f])=>Ca?.style.setProperty(d,f)),Object.entries(Y_).forEach(([d,f])=>Ca?.style.setProperty(d,f,"important")),Ca.value=e.value||e.placeholder||"";let r=Ca.scrollHeight;const u={};l==="border-box"?r=r+o:l==="content-box"&&(r=r-a),Ca.value="";const c=Ca.scrollHeight-a;if(ze(t)){let d=c*t;l==="border-box"&&(d=d+a+o),r=Math.max(d,r),u.minHeight=`${d}px`}if(ze(n)){let d=c*n;l==="border-box"&&(d=d+a+o),r=Math.min(d,r)}return u.height=`${r}px`,Ca.parentNode?.removeChild(Ca),Ca=void 0,u}const G_=["id","name","minlength","maxlength","type","disabled","readonly","autocomplete","tabindex","aria-label","placeholder","form","autofocus","role","inputmode"],X_=["id","name","minlength","maxlength","tabindex","disabled","readonly","autocomplete","aria-label","placeholder","form","autofocus","rows","role"],Cb="ElInput";var Z_=le({name:Cb,inheritAttrs:!1,__name:"input",props:Gi,emits:j_,setup(e,{expose:t,emit:n}){const a=e,o=n,l=Zo(),s=fd(),r=sn(),u=y(()=>[a.type==="textarea"?m.b():p.b(),p.m(g.value),p.is("disabled",v.value),p.is("exceed",j.value),{[p.b("group")]:r.prepend||r.append,[p.m("prefix")]:r.prefix||a.prefixIcon,[p.m("suffix")]:r.suffix||a.suffixIcon||a.clearable||a.showPassword,[p.bm("suffix","password-clear")]:L.value&&D.value,[p.b("hidden")]:a.type==="hidden"},l.class]),c=y(()=>[p.e("wrapper"),p.is("focus",N.value)]),{form:d,formItem:f}=On(),{inputId:h}=ya(a,{formItemContext:f}),g=vn(),v=tn(),p=fe("input"),m=fe("textarea"),b=jt(),k=jt(),w=R(!1),C=R(!1),S=R(),E=jt(a.inputStyle),O=y(()=>b.value||k.value),{wrapperRef:$,isFocused:N,handleFocus:I,handleBlur:_}=tl(O,{disabled:v,afterBlur(){a.validateEvent&&f?.validate?.("blur").catch(Me=>ut(Me))}}),A=y(()=>d?.statusIcon??!1),F=y(()=>f?.validateState||""),K=y(()=>F.value&&Ed[F.value]),Y=y(()=>C.value?G3:y3),W=y(()=>[l.style]),P=y(()=>[a.inputStyle,E.value,{resize:a.resize}]),M=y(()=>cn(a.modelValue)?"":String(a.modelValue)),L=y(()=>a.clearable&&!v.value&&!a.readonly&&!!M.value&&(N.value||w.value)),D=y(()=>a.showPassword&&!v.value&&!!M.value),V=y(()=>a.showWordLimit&&!!a.maxlength&&(a.type==="text"||a.type==="textarea")&&!v.value&&!a.readonly&&!a.showPassword),G=y(()=>M.value.length),j=y(()=>!!V.value&&G.value>Number(a.maxlength)),X=y(()=>!!r.suffix||!!a.suffixIcon||L.value||a.showPassword||V.value||!!F.value&&A.value),Q=y(()=>!!Object.keys(a.modelModifiers).length),[ve,ue]=IA(b);Ut(k,Me=>{if(ae(),!V.value||a.resize!=="both"&&a.resize!=="horizontal")return;const{width:Ae}=Me[0].contentRect;S.value={right:`calc(100% - ${Ae+22-10}px)`}});const ge=()=>{const{type:Me,autosize:Ae}=a;if(!(!It||Me!=="textarea"||!k.value))if(Ae){const We=et(Ae)?Ae.minRows:void 0,xt=et(Ae)?Ae.maxRows:void 0,je=wb(k.value,We,xt);E.value={overflowY:"hidden",...je},Oe(()=>{k.value.offsetHeight,E.value=je})}else E.value={minHeight:wb(k.value).minHeight}},ae=(Me=>{let Ae=!1;return()=>{Ae||!a.autosize||k.value?.offsetParent!==null&&(setTimeout(Me),Ae=!0)}})(ge),ne=()=>{const Me=O.value,Ae=a.formatter?a.formatter(M.value):M.value;!Me||Me.value===Ae||a.type==="file"||(Me.value=Ae)},z=Me=>{const{trim:Ae,number:We}=a.modelModifiers;return Ae&&(Me=Me.trim()),We&&(Me=`${yb(Me)}`),a.formatter&&a.parser&&(Me=a.parser(Me)),Me},J=async Me=>{if(ce.value)return;const{lazy:Ae}=a.modelModifiers;let{value:We}=Me.target;if(Ae){o(pn,We);return}if(We=z(We),String(We)===M.value){a.formatter&&ne();return}ve(),o(Qe,We),o(pn,We),await Oe(),(a.formatter&&a.parser||!Q.value)&&ne(),ue()},se=async Me=>{let{value:Ae}=Me.target;Ae=z(Ae),a.modelModifiers.lazy&&o(Qe,Ae),o(vt,Ae,Me),await Oe(),ne()},{isComposing:ce,handleCompositionStart:he,handleCompositionUpdate:Se,handleCompositionEnd:Ie}=ji({emit:o,afterComposition:J}),Ne=()=>{C.value=!C.value},Te=()=>O.value?.focus(),pe=()=>O.value?.blur(),Ee=Me=>{w.value=!1,o("mouseleave",Me)},me=Me=>{w.value=!0,o("mouseenter",Me)},Pe=Me=>{o("keydown",Me)},Ke=()=>{O.value?.select()},Ge=Me=>{o(Qe,""),o(vt,""),o("clear",Me),o(pn,"")};return re(()=>a.modelValue,()=>{Oe(()=>ge()),a.validateEvent&&f?.validate?.("change").catch(Me=>ut(Me))}),re(M,Me=>{if(!O.value)return;const{trim:Ae,number:We}=a.modelModifiers,xt=O.value.value,je=(We||a.type==="number")&&!/^0\d/.test(xt)?`${yb(xt)}`:xt;je!==Me&&(document.activeElement===O.value&&O.value.type!=="range"&&Ae&&je.trim()===Me||ne())}),re(()=>a.type,async()=>{await Oe(),ne(),ge()}),ct(()=>{!a.formatter&&a.parser&&ut(Cb,"If you set the parser, you also need to set the formatter."),ne(),Oe(ge)}),t({input:b,textarea:k,ref:O,textareaStyle:P,autosize:_t(a,"autosize"),isComposing:ce,focus:Te,blur:pe,select:Ke,clear:Ge,resizeTextarea:ge}),(Me,Ae)=>(x(),B("div",{class:T([u.value,{[i(p).bm("group","append")]:Me.$slots.append,[i(p).bm("group","prepend")]:Me.$slots.prepend}]),style:He(W.value),onMouseenter:me,onMouseleave:Ee},[te(" input "),e.type!=="textarea"?(x(),B(Fe,{key:0},[te(" prepend slot "),Me.$slots.prepend?(x(),B("div",{key:0,class:T(i(p).be("group","prepend"))},[ee(Me.$slots,"prepend")],2)):te("v-if",!0),H("div",{ref_key:"wrapperRef",ref:$,class:T(c.value)},[te(" prefix slot "),Me.$slots.prefix||e.prefixIcon?(x(),B("span",{key:0,class:T(i(p).e("prefix"))},[H("span",{class:T(i(p).e("prefix-inner"))},[ee(Me.$slots,"prefix"),e.prefixIcon?(x(),oe(i(Le),{key:0,class:T(i(p).e("icon"))},{default:Z(()=>[(x(),oe(ot(e.prefixIcon)))]),_:1},8,["class"])):te("v-if",!0)],2)],2)):te("v-if",!0),H("input",rt({id:i(h),ref_key:"input",ref:b,class:i(p).e("inner")},i(s),{name:e.name,minlength:e.minlength,maxlength:e.maxlength,type:e.showPassword?C.value?"text":"password":e.type,disabled:i(v),readonly:e.readonly,autocomplete:e.autocomplete,tabindex:e.tabindex,"aria-label":e.ariaLabel,placeholder:e.placeholder,style:e.inputStyle,form:e.form,autofocus:e.autofocus,role:e.containerRole,inputmode:e.inputmode,onCompositionstart:Ae[0]||(Ae[0]=(...We)=>i(he)&&i(he)(...We)),onCompositionupdate:Ae[1]||(Ae[1]=(...We)=>i(Se)&&i(Se)(...We)),onCompositionend:Ae[2]||(Ae[2]=(...We)=>i(Ie)&&i(Ie)(...We)),onInput:J,onChange:se,onKeydown:Pe}),null,16,G_),te(" suffix slot "),X.value?(x(),B("span",{key:1,class:T(i(p).e("suffix"))},[H("span",{class:T(i(p).e("suffix-inner"))},[!L.value||!D.value||!V.value?(x(),B(Fe,{key:0},[ee(Me.$slots,"suffix"),e.suffixIcon?(x(),oe(i(Le),{key:0,class:T(i(p).e("icon"))},{default:Z(()=>[(x(),oe(ot(e.suffixIcon)))]),_:1},8,["class"])):te("v-if",!0)],64)):te("v-if",!0),L.value?(x(),oe(i(Le),{key:1,class:T([i(p).e("icon"),i(p).e("clear")]),onMousedown:qe(i(Pt),["prevent"]),onClick:Ge},{default:Z(()=>[(x(),oe(ot(e.clearIcon)))]),_:1},8,["class","onMousedown"])):te("v-if",!0),D.value?(x(),oe(i(Le),{key:2,class:T([i(p).e("icon"),i(p).e("password")]),onClick:Ne,onMousedown:qe(i(Pt),["prevent"]),onMouseup:qe(i(Pt),["prevent"])},{default:Z(()=>[(x(),oe(ot(Y.value)))]),_:1},8,["class","onMousedown","onMouseup"])):te("v-if",!0),V.value?(x(),B("span",{key:3,class:T([i(p).e("count"),i(p).is("outside",e.wordLimitPosition==="outside")])},[H("span",{class:T(i(p).e("count-inner"))},ke(G.value)+" / "+ke(e.maxlength),3)],2)):te("v-if",!0),F.value&&K.value&&A.value?(x(),oe(i(Le),{key:4,class:T([i(p).e("icon"),i(p).e("validateIcon"),i(p).is("loading",F.value==="validating")])},{default:Z(()=>[(x(),oe(ot(K.value)))]),_:1},8,["class"])):te("v-if",!0)],2)],2)):te("v-if",!0)],2),te(" append slot "),Me.$slots.append?(x(),B("div",{key:1,class:T(i(p).be("group","append"))},[ee(Me.$slots,"append")],2)):te("v-if",!0)],64)):(x(),B(Fe,{key:1},[te(" textarea "),H("textarea",rt({id:i(h),ref_key:"textarea",ref:k,class:[i(m).e("inner"),i(p).is("focus",i(N)),i(m).is("clearable",e.clearable)]},i(s),{name:e.name,minlength:e.minlength,maxlength:e.maxlength,tabindex:e.tabindex,disabled:i(v),readonly:e.readonly,autocomplete:e.autocomplete,style:P.value,"aria-label":e.ariaLabel,placeholder:e.placeholder,form:e.form,autofocus:e.autofocus,rows:e.rows,role:e.containerRole,onCompositionstart:Ae[3]||(Ae[3]=(...We)=>i(he)&&i(he)(...We)),onCompositionupdate:Ae[4]||(Ae[4]=(...We)=>i(Se)&&i(Se)(...We)),onCompositionend:Ae[5]||(Ae[5]=(...We)=>i(Ie)&&i(Ie)(...We)),onInput:J,onFocus:Ae[6]||(Ae[6]=(...We)=>i(I)&&i(I)(...We)),onBlur:Ae[7]||(Ae[7]=(...We)=>i(_)&&i(_)(...We)),onChange:se,onKeydown:Pe}),null,16,X_),L.value?(x(),oe(i(Le),{key:0,class:T([i(m).e("icon"),i(m).e("clear")]),onMousedown:qe(i(Pt),["prevent"]),onClick:Ge},{default:Z(()=>[(x(),oe(ot(e.clearIcon)))]),_:1},8,["class","onMousedown"])):te("v-if",!0),V.value?(x(),B("span",{key:1,style:He(S.value),class:T([i(p).e("count"),i(p).is("outside",e.wordLimitPosition==="outside")])},ke(G.value)+" / "+ke(e.maxlength),7)):te("v-if",!0)],64))],38))}}),J_=Z_;const Wn=nt(J_),Q_=Ce({...Gi,valueKey:{type:String,default:"value"},modelValue:{type:[String,Number],default:""},debounce:{type:Number,default:300},placement:{type:q(String),values:["top","top-start","top-end","bottom","bottom-start","bottom-end"],default:"bottom-start"},fetchSuggestions:{type:q([Function,Array]),default:Pt},popperClass:Lt.popperClass,popperStyle:Lt.popperStyle,triggerOnFocus:{type:Boolean,default:!0},selectWhenUnmatched:Boolean,hideLoading:Boolean,teleported:Lt.teleported,appendTo:Lt.appendTo,highlightFirstItem:Boolean,fitInputWidth:Boolean,loopNavigation:{type:Boolean,default:!0}}),eL={[Qe]:e=>_e(e)||ze(e),[pn]:e=>_e(e)||ze(e),[vt]:e=>_e(e)||ze(e),focus:e=>e instanceof FocusEvent,blur:e=>e instanceof FocusEvent,clear:()=>!0,select:e=>et(e)},tL=Ce({distance:{type:Number,default:0},height:{type:[String,Number],default:""},maxHeight:{type:[String,Number],default:""},native:Boolean,wrapStyle:{type:q([String,Object,Array]),default:""},wrapClass:{type:[String,Array],default:""},viewClass:{type:[String,Array],default:""},viewStyle:{type:[String,Array,Object],default:""},noresize:Boolean,tag:{type:String,default:"div"},always:Boolean,minSize:{type:Number,default:20},tabindex:{type:[String,Number],default:void 0},id:String,role:String,...Un(["ariaLabel","ariaOrientation"])}),_C={"end-reached":e=>["left","right","top","bottom"].includes(e),scroll:({scrollTop:e,scrollLeft:t})=>[e,t].every(ze)},Cs=4,LC={vertical:{offset:"offsetHeight",scroll:"scrollTop",scrollSize:"scrollHeight",size:"height",key:"vertical",axis:"Y",client:"clientY",direction:"top"},horizontal:{offset:"offsetWidth",scroll:"scrollLeft",scrollSize:"scrollWidth",size:"width",key:"horizontal",axis:"X",client:"clientX",direction:"left"}},nL=({move:e,size:t,bar:n})=>({[n.size]:t,transform:`translate${n.axis}(${e}%)`}),aL=Ce({vertical:Boolean,size:String,move:Number,ratio:{type:Number,required:!0},always:Boolean}),dh=Symbol("scrollbarContextKey"),oL=Ce({always:{type:Boolean,default:!0},minSize:{type:Number,required:!0}}),lL="Thumb";var sL=le({__name:"thumb",props:aL,setup(e){const t=e,n=Re(dh),a=fe("scrollbar");n||Gt(lL,"can not inject scrollbar context");const o=R(),l=R(),s=R({}),r=R(!1);let u=!1,c=!1,d=0,f=0,h=It?document.onselectstart:null;const g=y(()=>LC[t.vertical?"vertical":"horizontal"]),v=y(()=>nL({size:t.size,move:t.move,bar:g.value})),p=y(()=>o.value[g.value.offset]**2/n.wrapElement[g.value.scrollSize]/t.ratio/l.value[g.value.offset]),m=$=>{if($.stopPropagation(),$.ctrlKey||[1,2].includes($.button))return;window.getSelection()?.removeAllRanges(),k($);const N=$.currentTarget;N&&(s.value[g.value.axis]=N[g.value.offset]-($[g.value.client]-N.getBoundingClientRect()[g.value.direction]))},b=$=>{if(!l.value||!o.value||!n.wrapElement)return;const N=(Math.abs($.target.getBoundingClientRect()[g.value.direction]-$[g.value.client])-l.value[g.value.offset]/2)*100*p.value/o.value[g.value.offset];n.wrapElement[g.value.scroll]=N*n.wrapElement[g.value.scrollSize]/100},k=$=>{$.stopImmediatePropagation(),u=!0,d=n.wrapElement.scrollHeight,f=n.wrapElement.scrollWidth,document.addEventListener("mousemove",w),document.addEventListener("mouseup",C),h=document.onselectstart,document.onselectstart=()=>!1},w=$=>{if(!o.value||!l.value||u===!1)return;const N=s.value[g.value.axis];if(!N)return;const I=((o.value.getBoundingClientRect()[g.value.direction]-$[g.value.client])*-1-(l.value[g.value.offset]-N))*100*p.value/o.value[g.value.offset];g.value.scroll==="scrollLeft"?n.wrapElement[g.value.scroll]=I*f/100:n.wrapElement[g.value.scroll]=I*d/100},C=()=>{u=!1,s.value[g.value.axis]=0,document.removeEventListener("mousemove",w),document.removeEventListener("mouseup",C),O(),c&&(r.value=!1)},S=()=>{c=!1,r.value=!!t.size},E=()=>{c=!0,r.value=u};Rt(()=>{O(),document.removeEventListener("mouseup",C)});const O=()=>{document.onselectstart!==h&&(document.onselectstart=h)};return At(_t(n,"scrollbarElement"),"mousemove",S),At(_t(n,"scrollbarElement"),"mouseleave",E),($,N)=>(x(),oe(Mn,{name:i(a).b("fade"),persisted:""},{default:Z(()=>[st(H("div",{ref_key:"instance",ref:o,class:T([i(a).e("bar"),i(a).is(g.value.key)]),onMousedown:b,onClick:N[0]||(N[0]=qe(()=>{},["stop"]))},[H("div",{ref_key:"thumb",ref:l,class:T(i(a).e("thumb")),style:He(v.value),onMousedown:m},null,38)],34),[[Ot,e.always||r.value]])]),_:1},8,["name"]))}}),Sb=sL,rL=le({__name:"bar",props:oL,setup(e,{expose:t}){const n=e,a=Re(dh),o=R(0),l=R(0),s=R(""),r=R(""),u=R(1),c=R(1);return t({handleScroll:h=>{if(h){const g=h.offsetHeight-Cs,v=h.offsetWidth-Cs;l.value=h.scrollTop*100/g*u.value,o.value=h.scrollLeft*100/v*c.value}},update:()=>{const h=a?.wrapElement;if(!h)return;const g=h.offsetHeight-Cs,v=h.offsetWidth-Cs,p=g**2/h.scrollHeight,m=v**2/h.scrollWidth,b=Math.max(p,n.minSize),k=Math.max(m,n.minSize);u.value=p/(g-p)/(b/(g-b)),c.value=m/(v-m)/(k/(v-k)),r.value=b+Cs(x(),B(Fe,null,[U(Sb,{move:o.value,ratio:c.value,size:s.value,always:e.always},null,8,["move","ratio","size","always"]),U(Sb,{move:l.value,ratio:u.value,size:r.value,vertical:"",always:e.always},null,8,["move","ratio","size","always"])],64))}}),iL=rL;const uL=["tabindex"],uf="ElScrollbar";var cL=le({name:uf,__name:"scrollbar",props:tL,emits:_C,setup(e,{expose:t,emit:n}){const a=e,o=n,l=fe("scrollbar");let s,r,u,c=0,d=0,f="";const h={bottom:!1,top:!1,right:!1,left:!1},g=R(),v=R(),p=R(),m=R(),b=y(()=>{const A={},F=en(a.height),K=en(a.maxHeight);return F&&(A.height=F),K&&(A.maxHeight=K),[a.wrapStyle,A]}),k=y(()=>[a.wrapClass,l.e("wrap"),{[l.em("wrap","hidden-default")]:!a.native}]),w=y(()=>[l.e("view"),a.viewClass]),C=A=>h[A]??!1,S={top:"bottom",bottom:"top",left:"right",right:"left"},E=A=>{const F=S[f];if(!F)return;const K=A[f],Y=A[F];K&&!h[f]&&(h[f]=!0),!Y&&h[F]&&(h[F]=!1)},O=()=>{if(v.value){m.value?.handleScroll(v.value);const A=c,F=d;c=v.value.scrollTop,d=v.value.scrollLeft;const K={bottom:c+v.value.clientHeight>=v.value.scrollHeight-a.distance,top:c<=a.distance&&A!==0,right:d+v.value.clientWidth>=v.value.scrollWidth-a.distance&&F!==d,left:d<=a.distance&&F!==0};if(o("scroll",{scrollTop:c,scrollLeft:d}),A!==c&&(f=c>A?"bottom":"top"),F!==d&&(f=d>F?"right":"left"),a.distance>0){if(C(f))return;E(K)}K[f]&&o("end-reached",f)}};function $(A,F){et(A)?v.value.scrollTo(A):ze(A)&&ze(F)&&v.value.scrollTo(A,F)}const N=A=>{if(!ze(A)){ut(uf,"value must be a number");return}v.value.scrollTop=A},I=A=>{if(!ze(A)){ut(uf,"value must be a number");return}v.value.scrollLeft=A},_=()=>{m.value?.update(),h[f]=!1};return re(()=>a.noresize,A=>{A?(s?.(),r?.(),u?.()):({stop:s}=Ut(p,_),{stop:r}=Ut(v,_),u=At("resize",_))},{immediate:!0}),re(()=>[a.maxHeight,a.height],()=>{a.native||Oe(()=>{_(),v.value&&m.value?.handleScroll(v.value)})}),gt(dh,Nt({scrollbarElement:g,wrapElement:v})),$i(()=>{v.value&&(v.value.scrollTop=c,v.value.scrollLeft=d)}),ct(()=>{a.native||Oe(()=>{_()})}),Ya(()=>_()),t({wrapRef:v,update:_,scrollTo:$,setScrollTop:N,setScrollLeft:I,handleScroll:O}),(A,F)=>(x(),B("div",{ref_key:"scrollbarRef",ref:g,class:T(i(l).b())},[H("div",{ref_key:"wrapRef",ref:v,class:T(k.value),style:He(b.value),tabindex:e.tabindex,onScroll:O},[(x(),oe(ot(e.tag),{id:e.id,ref_key:"resizeRef",ref:p,class:T(w.value),style:He(e.viewStyle),role:e.role,"aria-label":e.ariaLabel,"aria-orientation":e.ariaOrientation},{default:Z(()=>[ee(A.$slots,"default")]),_:3},8,["id","class","style","role","aria-label","aria-orientation"]))],46,uL),e.native?te("v-if",!0):(x(),oe(iL,{key:0,ref_key:"barRef",ref:m,always:e.always,"min-size":e.minSize},null,8,["always","min-size"]))],2))}}),dL=cL;const Ka=nt(dL),fL=["aria-expanded","aria-owns"],pL={key:0},vL=["id","aria-selected","onClick"],kb="ElAutocomplete";var hL=le({name:kb,inheritAttrs:!1,__name:"autocomplete",props:Q_,emits:eL,setup(e,{expose:t,emit:n}){const a=e,o=n,l=y(()=>Wo(a,Object.keys(Gi))),s=Zo(),r=tn(),u=fe("autocomplete"),c=R(),d=R(),f=R(),h=R();let g=!1,v=!1;const p=R([]),m=R(-1),b=R(""),k=R(!1),w=R(!1),C=R(!1),S=Pn(),E=y(()=>s.style),O=y(()=>(p.value.length>0||C.value)&&k.value),$=y(()=>!a.hideLoading&&C.value),N=y(()=>c.value?Array.from(c.value.$el.querySelectorAll("input")):[]),I=()=>{O.value&&(b.value=`${c.value.$el.offsetWidth}px`)},_=()=>{m.value=-1},A=async ae=>{if(w.value)return;const ne=z=>{C.value=!1,!w.value&&(ye(z)?(p.value=z,m.value=a.highlightFirstItem?0:-1):Gt(kb,"autocomplete suggestions must be an array"))};if(C.value=!0,ye(a.fetchSuggestions))ne(a.fetchSuggestions);else{const z=await a.fetchSuggestions(ae,ne);ye(z)&&ne(z)}},F=Li(A,y(()=>a.debounce)),K=ae=>{const ne=!!ae;if(o(pn,ae),o(Qe,ae),w.value=!1,k.value||=ne,!a.triggerOnFocus&&!ae){w.value=!0,p.value=[];return}F(ae)},Y=ae=>{r.value||(ae.target?.tagName!=="INPUT"||N.value.includes(document.activeElement))&&(k.value=!0)},W=ae=>{o(vt,ae)},P=ae=>{if(v)v=!1;else{k.value=!0,o("focus",ae);const ne=a.modelValue??"";a.triggerOnFocus&&!g&&F(String(ne))}},M=ae=>{setTimeout(()=>{if(f.value?.isFocusInsideContent()){v=!0;return}k.value&&G(),o("blur",ae)})},L=()=>{k.value=!1,o(Qe,""),o("clear")},D=async()=>{c.value?.isComposing||(O.value&&m.value>=0&&m.value{O.value&&(ae.preventDefault(),ae.stopPropagation(),G())},G=()=>{k.value=!1},j=()=>{c.value?.focus()},X=()=>{c.value?.blur()},Q=async ae=>{o(pn,ae[a.valueKey]),o(Qe,ae[a.valueKey]),o("select",ae),p.value=[],m.value=-1},ve=ae=>{if(!O.value||C.value)return;if(ae<0){if(!a.loopNavigation){m.value=-1;return}ae=p.value.length-1}ae>=p.value.length&&(ae=a.loopNavigation?0:p.value.length-1);const[ne,z]=ue(),J=z[ae],se=ne.scrollTop,{offsetTop:ce,scrollHeight:he}=J;ce+he>se+ne.clientHeight&&(ne.scrollTop=ce+he-ne.clientHeight),ce{const ae=d.value.querySelector(`.${u.be("suggestion","wrap")}`);return[ae,ae.querySelectorAll(`.${u.be("suggestion","list")} li`)]},ge=Lv(h,ae=>{if(f.value?.isFocusInsideContent())return;const ne=v;v=!1,O.value&&(ne?M(new FocusEvent("blur",ae)):G())}),ie=ae=>{switch(Ft(ae)){case we.up:ae.preventDefault(),ve(m.value-1);break;case we.down:ae.preventDefault(),ve(m.value+1);break;case we.enter:case we.numpadEnter:ae.preventDefault(),D();break;case we.tab:G();break;case we.esc:V(ae);break;case we.home:ae.preventDefault(),ve(0);break;case we.end:ae.preventDefault(),ve(p.value.length-1);break;case we.pageUp:ae.preventDefault(),ve(Math.max(0,m.value-10));break;case we.pageDown:ae.preventDefault(),ve(Math.min(p.value.length-1,m.value+10));break}};return Rt(()=>{ge?.()}),ct(()=>{const ae=c.value?.ref;ae&&([{key:"role",value:"textbox"},{key:"aria-autocomplete",value:"list"},{key:"aria-controls",value:S.value},{key:"aria-activedescendant",value:`${S.value}-item-${m.value}`}].forEach(({key:ne,value:z})=>ae.setAttribute(ne,z)),g=ae.hasAttribute("readonly"))}),t({highlightedIndex:m,activated:k,loading:C,inputRef:c,popperRef:f,suggestions:p,handleSelect:Q,handleKeyEnter:D,focus:j,blur:X,close:G,highlight:ve,getData:A}),(ae,ne)=>(x(),oe(i($n),{ref_key:"popperRef",ref:f,visible:O.value,placement:e.placement,"fallback-placements":["bottom-start","top-start"],"popper-class":[i(u).e("popper"),e.popperClass],"popper-style":e.popperStyle,teleported:e.teleported,"append-to":e.appendTo,"gpu-acceleration":!1,pure:"","manual-mode":"",effect:"light",trigger:"click",transition:`${i(u).namespace.value}-zoom-in-top`,persistent:"",role:"listbox",onBeforeShow:I,onHide:_},{content:Z(()=>[H("div",{ref_key:"regionRef",ref:d,class:T([i(u).b("suggestion"),i(u).is("loading",$.value)]),style:He({[e.fitInputWidth?"width":"minWidth"]:b.value,outline:"none"}),role:"region"},[ae.$slots.header?(x(),B("div",{key:0,class:T(i(u).be("suggestion","header")),onClick:ne[0]||(ne[0]=qe(()=>{},["stop"]))},[ee(ae.$slots,"header")],2)):te("v-if",!0),U(i(Ka),{id:i(S),tag:"ul","wrap-class":i(u).be("suggestion","wrap"),"view-class":i(u).be("suggestion","list"),role:"listbox"},{default:Z(()=>[$.value?(x(),B("li",pL,[ee(ae.$slots,"loading",{},()=>[U(i(Le),{class:T(i(u).is("loading"))},{default:Z(()=>[U(i(wo))]),_:1},8,["class"])])])):(x(!0),B(Fe,{key:1},ht(p.value,(z,J)=>(x(),B("li",{id:`${i(S)}-item-${J}`,key:J,class:T({highlighted:m.value===J}),role:"option","aria-selected":m.value===J,onClick:se=>Q(z)},[ee(ae.$slots,"default",{item:z},()=>[mt(ke(z[e.valueKey]),1)])],10,vL))),128))]),_:3},8,["id","wrap-class","view-class"]),ae.$slots.footer?(x(),B("div",{key:1,class:T(i(u).be("suggestion","footer")),onClick:ne[1]||(ne[1]=qe(()=>{},["stop"]))},[ee(ae.$slots,"footer")],2)):te("v-if",!0)],6)]),default:Z(()=>[H("div",{ref_key:"listboxRef",ref:h,class:T([i(u).b(),ae.$attrs.class]),style:He(E.value),role:"combobox","aria-haspopup":"listbox","aria-expanded":O.value,"aria-owns":i(S)},[U(i(Wn),rt({ref_key:"inputRef",ref:c},rt(l.value,ae.$attrs),{"model-value":e.modelValue,disabled:i(r),onInput:K,onChange:W,onFocus:P,onBlur:M,onClear:L,onKeydown:ie,onMousedown:Y}),Qn({_:2},[ae.$slots.prepend?{name:"prepend",fn:Z(()=>[ee(ae.$slots,"prepend")]),key:"0"}:void 0,ae.$slots.append?{name:"append",fn:Z(()=>[ee(ae.$slots,"append")]),key:"1"}:void 0,ae.$slots.prefix?{name:"prefix",fn:Z(()=>[ee(ae.$slots,"prefix")]),key:"2"}:void 0,ae.$slots.suffix?{name:"suffix",fn:Z(()=>[ee(ae.$slots,"suffix")]),key:"3"}:void 0]),1040,["model-value","disabled"])],14,fL)]),_:3},8,["visible","placement","popper-class","popper-style","teleported","append-to","transition"]))}}),mL=hL;const gL=nt(mL),bL=Ce({size:{type:[Number,String],values:Ua,validator:e=>ze(e)},shape:{type:String,values:["circle","square"]},icon:{type:Bt},src:{type:String,default:""},alt:String,srcSet:String,fit:{type:q(String),default:"cover"}}),yL={error:e=>e instanceof Event},DC=Symbol("avatarGroupContextKey"),wL={size:{type:q([Number,String]),values:Ua,validator:e=>ze(e)},shape:{type:q(String),values:["circle","square"]},collapseAvatars:Boolean,collapseAvatarsTooltip:Boolean,maxCollapseAvatars:{type:Number,default:1},effect:{type:q(String),default:"light"},placement:{type:q(String),values:So,default:"top"},popperClass:Lt.popperClass,popperStyle:Lt.popperStyle,collapseClass:String,collapseStyle:{type:q([String,Array,Object])}},CL=["src","alt","srcset"];var SL=le({name:"ElAvatar",__name:"avatar",props:bL,emits:yL,setup(e,{emit:t}){const n=e,a=t,o=Re(DC,void 0),l=fe("avatar"),s=R(!1),r=y(()=>n.size??o?.size),u=y(()=>n.shape??o?.shape??"circle"),c=y(()=>{const{icon:g}=n,v=[l.b()];return _e(r.value)&&v.push(l.m(r.value)),g&&v.push(l.m("icon")),u.value&&v.push(l.m(u.value)),v}),d=y(()=>ze(r.value)?l.cssVarBlock({size:en(r.value)}):void 0),f=y(()=>({objectFit:n.fit}));re(()=>[n.src,n.srcSet],()=>s.value=!1);function h(g){s.value=!0,a("error",g)}return(g,v)=>(x(),B("span",{class:T(c.value),style:He(d.value)},[(e.src||e.srcSet)&&!s.value?(x(),B("img",{key:0,src:e.src,alt:e.alt,srcset:e.srcSet,style:He(f.value),onError:h},null,44,CL)):e.icon?(x(),oe(i(Le),{key:1},{default:Z(()=>[(x(),oe(ot(e.icon)))]),_:1})):ee(g.$slots,"default",{key:2})],6))}}),BC=SL,VC=le({name:"ElAvatarGroup",props:wL,setup(e,{slots:t}){const n=fe("avatar-group");return gt(DC,Nt({size:_t(e,"size"),shape:_t(e,"shape")})),()=>{const a=va(t.default?.()??[]);let o=a;if(e.collapseAvatars&&a.length>e.maxCollapseAvatars){o=a.slice(0,e.maxCollapseAvatars);const l=a.slice(e.maxCollapseAvatars);o.push(U($n,{popperClass:e.popperClass,popperStyle:e.popperStyle,placement:e.placement,effect:e.effect,disabled:!e.collapseAvatarsTooltip},{default:()=>U(BC,{size:e.size,shape:e.shape,class:e.collapseClass,style:e.collapseStyle},{default:()=>[mt("+ "),l.length]}),content:()=>U("div",{class:n.e("collapse-avatars")},[l.map((s,r)=>zt(s)?mo(s,{key:s.key??r}):s)])}))}return U("div",{class:n.b()},[o])}}});const kL=nt(BC,{AvatarGroup:VC}),EL=Xt(VC),xL={visibilityHeight:{type:Number,default:200},target:{type:String,default:""},right:{type:Number,default:40},bottom:{type:Number,default:40}},TL={click:e=>e instanceof MouseEvent},$L=(e,t,n)=>{const a=jt(),o=jt(),l=R(!1),s=()=>{a.value&&(l.value=a.value.scrollTop>=e.visibilityHeight)},r=u=>{a.value?.scrollTo({top:0,behavior:"smooth"}),t("click",u)};return At(o,"scroll",k1(s,300,!0)),ct(()=>{o.value=document,a.value=document.documentElement,e.target&&(a.value=document.querySelector(e.target)??void 0,a.value||Gt(n,`target does not exist: ${e.target}`),o.value=a.value),s()}),{visible:l,handleClick:r}},Eb="ElBacktop";var OL=le({name:Eb,__name:"backtop",props:xL,emits:TL,setup(e,{emit:t}){const n=e,a=t,o=fe("backtop"),{handleClick:l,visible:s}=$L(n,a,Eb),r=y(()=>({right:`${n.right}px`,bottom:`${n.bottom}px`}));return(u,c)=>(x(),oe(Mn,{name:`${i(o).namespace.value}-fade-in`},{default:Z(()=>[i(s)?(x(),B("div",{key:0,style:He(r.value),class:T(i(o).b()),onClick:c[0]||(c[0]=qe((...d)=>i(l)&&i(l)(...d),["stop"]))},[ee(u.$slots,"default",{},()=>[U(i(Le),{class:T(i(o).e("icon"))},{default:Z(()=>[U(i(t3))]),_:1},8,["class"])])],6)):te("v-if",!0)]),_:3},8,["name"]))}}),IL=OL;const NL=nt(IL),ML=Ce({value:{type:[String,Number],default:""},max:{type:Number,default:99},isDot:Boolean,hidden:Boolean,type:{type:String,values:["primary","success","warning","info","danger"],default:"danger"},showZero:{type:Boolean,default:!0},color:String,badgeStyle:{type:q([String,Object,Array])},offset:{type:q(Array),default:()=>[0,0]},badgeClass:{type:String}});var PL=le({name:"ElBadge",__name:"badge",props:ML,setup(e,{expose:t}){const n=e,a=fe("badge"),o=y(()=>n.isDot?"":ze(n.value)&&ze(n.max)?n.max[{backgroundColor:n.color,marginRight:en(-n.offset[0]),marginTop:en(n.offset[1])},n.badgeStyle??{}]);return t({content:o}),(s,r)=>(x(),B("div",{class:T(i(a).b())},[ee(s.$slots,"default"),U(Mn,{name:`${i(a).namespace.value}-zoom-in-center`},{default:Z(()=>[!e.hidden&&(o.value||e.isDot||s.$slots.content)?(x(),B("sup",{key:0,class:T([i(a).e("content"),i(a).em("content",e.type),i(a).is("fixed",!!s.$slots.default),i(a).is("dot",e.isDot),i(a).is("hide-zero",!e.showZero&&e.value===0),e.badgeClass]),style:He(l.value)},[ee(s.$slots,"content",{value:o.value},()=>[mt(ke(o.value),1)])],6)):te("v-if",!0)]),_:3},8,["name"])],2))}}),RL=PL;const FC=nt(RL),AL=Ce({separator:{type:String,default:"/"},separatorIcon:{type:Bt}}),zC=Symbol("breadcrumbKey"),_L=Ce({to:{type:q([String,Object]),default:""},replace:Boolean}),LL=["aria-label"];var DL=le({name:"ElBreadcrumb",__name:"breadcrumb",props:AL,setup(e){const{t}=bt(),n=e,a=fe("breadcrumb"),o=R();return gt(zC,n),ct(()=>{const l=o.value.querySelectorAll(`.${a.e("item")}`);l.length&&l[l.length-1].setAttribute("aria-current","page")}),(l,s)=>(x(),B("div",{ref_key:"breadcrumb",ref:o,class:T(i(a).b()),"aria-label":i(t)("el.breadcrumb.label"),role:"navigation"},[ee(l.$slots,"default")],10,LL))}}),BL=DL,VL=le({name:"ElBreadcrumbItem",__name:"breadcrumb-item",props:_L,setup(e){const t=e,n=it(),a=Re(zC,void 0),o=fe("breadcrumb"),l=n.appContext.config.globalProperties.$router,s=()=>{!t.to||!l||(t.replace?l.replace(t.to):l.push(t.to))};return(r,u)=>(x(),B("span",{class:T(i(o).e("item"))},[H("span",{class:T([i(o).e("inner"),i(o).is("link",!!e.to)]),role:"link",onClick:s},[ee(r.$slots,"default")],2),i(a)?.separatorIcon?(x(),oe(i(Le),{key:0,class:T(i(o).e("separator"))},{default:Z(()=>[(x(),oe(ot(i(a).separatorIcon)))]),_:1},8,["class"])):(x(),B("span",{key:1,class:T(i(o).e("separator")),role:"presentation"},ke(i(a)?.separator),3))],2))}}),HC=VL;const FL=nt(BL,{BreadcrumbItem:HC}),zL=Xt(HC),ip=["default","primary","success","warning","info","danger","text",""],HL=["button","submit","reset"],up=Ce({size:bn,disabled:{type:Boolean,default:void 0},type:{type:String,values:ip,default:""},icon:{type:Bt},nativeType:{type:String,values:HL,default:"button"},loading:Boolean,loadingIcon:{type:Bt,default:()=>wo},plain:{type:Boolean,default:void 0},text:{type:Boolean,default:void 0},link:Boolean,bg:Boolean,autofocus:Boolean,round:{type:Boolean,default:void 0},circle:Boolean,dashed:{type:Boolean,default:void 0},color:String,dark:Boolean,autoInsertSpace:{type:Boolean,default:void 0},tag:{type:q([String,Object]),default:"button"}}),KL={click:e=>e instanceof MouseEvent},KC=Symbol(),Ec=R();function nl(e,t=void 0){const n=it()?Re(KC,Ec):Ec;return e?y(()=>n.value?.[e]??t):n}function Td(e,t){const n=nl(),a=fe(e,y(()=>n.value?.namespace||Kr)),o=bt(y(()=>n.value?.locale)),l=zi(y(()=>n.value?.zIndex||Z1)),s=y(()=>i(t)||n.value?.size||"");return fh(y(()=>i(n)||{})),{ns:a,locale:o,zIndex:l,size:s}}const fh=(e,t,n=!1)=>{const a=!!it(),o=a?nl():void 0,l=t?.provide??(a?gt:void 0);if(!l){ut("provideGlobalConfig","provideGlobalConfig() can only be used inside setup().");return}const s=y(()=>{const r=i(e);return o?.value?WL(o.value,r):r});return l(KC,s),l(P1,y(()=>s.value.locale)),l(R1,y(()=>s.value.namespace)),l(J1,y(()=>s.value.zIndex)),l(dC,{size:y(()=>s.value.size||"")}),l(pC,y(()=>({emptyValues:s.value.emptyValues,valueOnClear:s.value.valueOnClear}))),(n||!Ec.value)&&(Ec.value=s.value),s},WL=(e,t)=>{const n=[...new Set([...si(e),...si(t)])],a={};for(const o of n)a[o]=t[o]!==void 0?t[o]:e[o];return a},jL=Ce({a11y:{type:Boolean,default:!0},locale:{type:q(Object)},size:bn,button:{type:q(Object)},card:{type:q(Object)},dialog:{type:q(Object)},link:{type:q(Object)},experimentalFeatures:{type:q(Object)},keyboardNavigation:{type:Boolean,default:!0},message:{type:q(Object)},zIndex:Number,namespace:{type:String,default:"el"},table:{type:q(Object)},...ps}),Fn={placement:"top"},YL=le({name:"ElConfigProvider",props:jL,setup(e,{slots:t}){const n=fh(e);return re(()=>e.message,a=>{Object.assign(Fn,n?.value?.message??{},a??{})},{immediate:!0,deep:!0}),()=>ee(t,"default",{config:n?.value})}}),UL=nt(YL),WC=Symbol("buttonGroupContextKey"),qL=(e,t)=>{co({from:"type.text",replacement:"link",version:"3.0.0",scope:"props",ref:"https://element-plus.org/en-US/component/button.html#button-attributes"},y(()=>e.type==="text"));const n=Re(WC,void 0),a=nl("button"),{form:o}=On(),l=vn(y(()=>n?.size)),s=tn(),r=R(),u=sn(),c=y(()=>e.type||n?.type||a.value?.type||""),d=y(()=>e.autoInsertSpace??a.value?.autoInsertSpace??!1),f=y(()=>e.plain??a.value?.plain??!1),h=y(()=>e.round??a.value?.round??!1),g=y(()=>e.text??a.value?.text??!1),v=y(()=>e.dashed??a.value?.dashed??!1),p=y(()=>e.tag==="button"?{ariaDisabled:s.value||e.loading,disabled:s.value||e.loading,autofocus:e.autofocus,type:e.nativeType}:{}),m=y(()=>{const k=u.default?.();if(d.value&&k?.length===1){const w=k[0];if(w?.type===ir){const C=w.children;return new RegExp("^\\p{Unified_Ideograph}{2}$","u").test(C.trim())}}return!1});return{_disabled:s,_size:l,_type:c,_ref:r,_props:p,_plain:f,_round:h,_text:g,_dashed:v,shouldAddSpace:m,handleClick:k=>{if(s.value||e.loading){k.stopPropagation();return}e.nativeType==="reset"&&o?.resetFields(),t("click",k)}}};function Ln(e,t){GL(e)&&(e="100%");const n=XL(e);return e=t===360?e:Math.min(t,Math.max(0,parseFloat(e))),n&&(e=parseInt(String(e*t),10)/100),Math.abs(e-t)<1e-6?1:(t===360?e=(e<0?e%t+t:e%t)/parseFloat(String(t)):e=e%t/parseFloat(String(t)),e)}function yu(e){return Math.min(1,Math.max(0,e))}function GL(e){return typeof e=="string"&&e.indexOf(".")!==-1&&parseFloat(e)===1}function XL(e){return typeof e=="string"&&e.indexOf("%")!==-1}function jC(e){return e=parseFloat(e),(isNaN(e)||e<0||e>1)&&(e=1),e}function wu(e){return Number(e)<=1?`${Number(e)*100}%`:e}function Kl(e){return e.length===1?"0"+e:String(e)}function ZL(e,t,n){return{r:Ln(e,255)*255,g:Ln(t,255)*255,b:Ln(n,255)*255}}function xb(e,t,n){e=Ln(e,255),t=Ln(t,255),n=Ln(n,255);const a=Math.max(e,t,n),o=Math.min(e,t,n);let l=0,s=0;const r=(a+o)/2;if(a===o)s=0,l=0;else{const u=a-o;switch(s=r>.5?u/(2-a-o):u/(a+o),a){case e:l=(t-n)/u+(t1&&(n-=1),n<1/6?e+(t-e)*(6*n):n<1/2?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function JL(e,t,n){let a,o,l;if(e=Ln(e,360),t=Ln(t,100),n=Ln(n,100),t===0)o=n,l=n,a=n;else{const s=n<.5?n*(1+t):n+t-n*t,r=2*n-s;a=cf(r,s,e+1/3),o=cf(r,s,e),l=cf(r,s,e-1/3)}return{r:a*255,g:o*255,b:l*255}}function Tb(e,t,n){e=Ln(e,255),t=Ln(t,255),n=Ln(n,255);const a=Math.max(e,t,n),o=Math.min(e,t,n);let l=0;const s=a,r=a-o,u=a===0?0:r/a;if(a===o)l=0;else{switch(a){case e:l=(t-n)/r+(t>16,g:(e&65280)>>8,b:e&255}}const cp={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",goldenrod:"#daa520",gold:"#ffd700",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavenderblush:"#fff0f5",lavender:"#e6e6fa",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};function oD(e){let t={r:0,g:0,b:0},n=1,a=null,o=null,l=null,s=!1,r=!1;return typeof e=="string"&&(e=rD(e)),typeof e=="object"&&(ca(e.r)&&ca(e.g)&&ca(e.b)?(t=ZL(e.r,e.g,e.b),s=!0,r=String(e.r).substr(-1)==="%"?"prgb":"rgb"):ca(e.h)&&ca(e.s)&&ca(e.v)?(a=wu(e.s),o=wu(e.v),t=QL(e.h,a,o),s=!0,r="hsv"):ca(e.h)&&ca(e.s)&&ca(e.l)?(a=wu(e.s),l=wu(e.l),t=JL(e.h,a,l),s=!0,r="hsl"):ca(e.c)&&ca(e.m)&&ca(e.y)&&ca(e.k)&&(t=tD(e.c,e.m,e.y,e.k),s=!0,r="cmyk"),Object.prototype.hasOwnProperty.call(e,"a")&&(n=e.a)),n=jC(n),{ok:s,format:e.format||r,r:Math.min(255,Math.max(t.r,0)),g:Math.min(255,Math.max(t.g,0)),b:Math.min(255,Math.max(t.b,0)),a:n}}const lD="[-\\+]?\\d+%?",sD="[-\\+]?\\d*\\.\\d+%?",ml="(?:"+sD+")|(?:"+lD+")",df="[\\s|\\(]+("+ml+")[,|\\s]+("+ml+")[,|\\s]+("+ml+")\\s*\\)?",Cu="[\\s|\\(]+("+ml+")[,|\\s]+("+ml+")[,|\\s]+("+ml+")[,|\\s]+("+ml+")\\s*\\)?",Sa={CSS_UNIT:new RegExp(ml),rgb:new RegExp("rgb"+df),rgba:new RegExp("rgba"+Cu),hsl:new RegExp("hsl"+df),hsla:new RegExp("hsla"+Cu),hsv:new RegExp("hsv"+df),hsva:new RegExp("hsva"+Cu),cmyk:new RegExp("cmyk"+Cu),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/};function rD(e){if(e=e.trim().toLowerCase(),e.length===0)return!1;let t=!1;if(cp[e])e=cp[e],t=!0;else if(e==="transparent")return{r:0,g:0,b:0,a:0,format:"name"};let n=Sa.rgb.exec(e);return n?{r:n[1],g:n[2],b:n[3]}:(n=Sa.rgba.exec(e),n?{r:n[1],g:n[2],b:n[3],a:n[4]}:(n=Sa.hsl.exec(e),n?{h:n[1],s:n[2],l:n[3]}:(n=Sa.hsla.exec(e),n?{h:n[1],s:n[2],l:n[3],a:n[4]}:(n=Sa.hsv.exec(e),n?{h:n[1],s:n[2],v:n[3]}:(n=Sa.hsva.exec(e),n?{h:n[1],s:n[2],v:n[3],a:n[4]}:(n=Sa.cmyk.exec(e),n?{c:n[1],m:n[2],y:n[3],k:n[4]}:(n=Sa.hex8.exec(e),n?{r:da(n[1]),g:da(n[2]),b:da(n[3]),a:Ib(n[4]),format:t?"name":"hex8"}:(n=Sa.hex6.exec(e),n?{r:da(n[1]),g:da(n[2]),b:da(n[3]),format:t?"name":"hex"}:(n=Sa.hex4.exec(e),n?{r:da(n[1]+n[1]),g:da(n[2]+n[2]),b:da(n[3]+n[3]),a:Ib(n[4]+n[4]),format:t?"name":"hex8"}:(n=Sa.hex3.exec(e),n?{r:da(n[1]+n[1]),g:da(n[2]+n[2]),b:da(n[3]+n[3]),format:t?"name":"hex"}:!1))))))))))}function ca(e){return typeof e=="number"?!Number.isNaN(e):Sa.CSS_UNIT.test(e)}class on{constructor(t="",n={}){if(t instanceof on)return t;typeof t=="number"&&(t=aD(t)),this.originalInput=t;const a=oD(t);this.originalInput=t,this.r=a.r,this.g=a.g,this.b=a.b,this.a=a.a,this.roundA=Math.round(100*this.a)/100,this.format=n.format??a.format,this.gradientType=n.gradientType,this.r<1&&(this.r=Math.round(this.r)),this.g<1&&(this.g=Math.round(this.g)),this.b<1&&(this.b=Math.round(this.b)),this.isValid=a.ok}isDark(){return this.getBrightness()<128}isLight(){return!this.isDark()}getBrightness(){const t=this.toRgb();return(t.r*299+t.g*587+t.b*114)/1e3}getLuminance(){const t=this.toRgb();let n,a,o;const l=t.r/255,s=t.g/255,r=t.b/255;return l<=.03928?n=l/12.92:n=Math.pow((l+.055)/1.055,2.4),s<=.03928?a=s/12.92:a=Math.pow((s+.055)/1.055,2.4),r<=.03928?o=r/12.92:o=Math.pow((r+.055)/1.055,2.4),.2126*n+.7152*a+.0722*o}getAlpha(){return this.a}setAlpha(t){return this.a=jC(t),this.roundA=Math.round(100*this.a)/100,this}isMonochrome(){const{s:t}=this.toHsl();return t===0}toHsv(){const t=Tb(this.r,this.g,this.b);return{h:t.h*360,s:t.s,v:t.v,a:this.a}}toHsvString(){const t=Tb(this.r,this.g,this.b),n=Math.round(t.h*360),a=Math.round(t.s*100),o=Math.round(t.v*100);return this.a===1?`hsv(${n}, ${a}%, ${o}%)`:`hsva(${n}, ${a}%, ${o}%, ${this.roundA})`}toHsl(){const t=xb(this.r,this.g,this.b);return{h:t.h*360,s:t.s,l:t.l,a:this.a}}toHslString(){const t=xb(this.r,this.g,this.b),n=Math.round(t.h*360),a=Math.round(t.s*100),o=Math.round(t.l*100);return this.a===1?`hsl(${n}, ${a}%, ${o}%)`:`hsla(${n}, ${a}%, ${o}%, ${this.roundA})`}toHex(t=!1){return $b(this.r,this.g,this.b,t)}toHexString(t=!1){return"#"+this.toHex(t)}toHex8(t=!1){return eD(this.r,this.g,this.b,this.a,t)}toHex8String(t=!1){return"#"+this.toHex8(t)}toHexShortString(t=!1){return this.a===1?this.toHexString(t):this.toHex8String(t)}toRgb(){return{r:Math.round(this.r),g:Math.round(this.g),b:Math.round(this.b),a:this.a}}toRgbString(){const t=Math.round(this.r),n=Math.round(this.g),a=Math.round(this.b);return this.a===1?`rgb(${t}, ${n}, ${a})`:`rgba(${t}, ${n}, ${a}, ${this.roundA})`}toPercentageRgb(){const t=n=>`${Math.round(Ln(n,255)*100)}%`;return{r:t(this.r),g:t(this.g),b:t(this.b),a:this.a}}toPercentageRgbString(){const t=n=>Math.round(Ln(n,255)*100);return this.a===1?`rgb(${t(this.r)}%, ${t(this.g)}%, ${t(this.b)}%)`:`rgba(${t(this.r)}%, ${t(this.g)}%, ${t(this.b)}%, ${this.roundA})`}toCmyk(){return{...Ob(this.r,this.g,this.b)}}toCmykString(){const{c:t,m:n,y:a,k:o}=Ob(this.r,this.g,this.b);return`cmyk(${t}, ${n}, ${a}, ${o})`}toName(){if(this.a===0)return"transparent";if(this.a<1)return!1;const t="#"+$b(this.r,this.g,this.b,!1);for(const[n,a]of Object.entries(cp))if(t===a)return n;return!1}toString(t){const n=!!t;t=t??this.format;let a=!1;const o=this.a<1&&this.a>=0;return!n&&o&&(t.startsWith("hex")||t==="name")?t==="name"&&this.a===0?this.toName():this.toRgbString():(t==="rgb"&&(a=this.toRgbString()),t==="prgb"&&(a=this.toPercentageRgbString()),(t==="hex"||t==="hex6")&&(a=this.toHexString()),t==="hex3"&&(a=this.toHexString(!0)),t==="hex4"&&(a=this.toHex8String(!0)),t==="hex8"&&(a=this.toHex8String()),t==="name"&&(a=this.toName()),t==="hsl"&&(a=this.toHslString()),t==="hsv"&&(a=this.toHsvString()),t==="cmyk"&&(a=this.toCmykString()),a||this.toHexString())}toNumber(){return(Math.round(this.r)<<16)+(Math.round(this.g)<<8)+Math.round(this.b)}clone(){return new on(this.toString())}lighten(t=10){const n=this.toHsl();return n.l+=t/100,n.l=yu(n.l),new on(n)}brighten(t=10){const n=this.toRgb();return n.r=Math.max(0,Math.min(255,n.r-Math.round(255*-(t/100)))),n.g=Math.max(0,Math.min(255,n.g-Math.round(255*-(t/100)))),n.b=Math.max(0,Math.min(255,n.b-Math.round(255*-(t/100)))),new on(n)}darken(t=10){const n=this.toHsl();return n.l-=t/100,n.l=yu(n.l),new on(n)}tint(t=10){return this.mix("white",t)}shade(t=10){return this.mix("black",t)}desaturate(t=10){const n=this.toHsl();return n.s-=t/100,n.s=yu(n.s),new on(n)}saturate(t=10){const n=this.toHsl();return n.s+=t/100,n.s=yu(n.s),new on(n)}greyscale(){return this.desaturate(100)}spin(t){const n=this.toHsl(),a=(n.h+t)%360;return n.h=a<0?360+a:a,new on(n)}mix(t,n=50){const a=this.toRgb(),o=new on(t).toRgb(),l=n/100,s={r:(o.r-a.r)*l+a.r,g:(o.g-a.g)*l+a.g,b:(o.b-a.b)*l+a.b,a:(o.a-a.a)*l+a.a};return new on(s)}analogous(t=6,n=30){const a=this.toHsl(),o=360/n,l=[this];for(a.h=(a.h-(o*t>>1)+720)%360;--t;)a.h=(a.h+o)%360,l.push(new on(a));return l}complement(){const t=this.toHsl();return t.h=(t.h+180)%360,new on(t)}monochromatic(t=6){const n=this.toHsv(),{h:a}=n,{s:o}=n;let{v:l}=n;const s=[],r=1/t;for(;t--;)s.push(new on({h:a,s:o,v:l})),l=(l+r)%1;return s}splitcomplement(){const t=this.toHsl(),{h:n}=t;return[this,new on({h:(n+72)%360,s:t.s,l:t.l}),new on({h:(n+216)%360,s:t.s,l:t.l})]}onBackground(t){const n=this.toRgb(),a=new on(t).toRgb(),o=n.a+a.a*(1-n.a);return new on({r:(n.r*n.a+a.r*a.a*(1-n.a))/o,g:(n.g*n.a+a.g*a.a*(1-n.a))/o,b:(n.b*n.a+a.b*a.a*(1-n.a))/o,a:o})}triad(){return this.polyad(3)}tetrad(){return this.polyad(4)}polyad(t){const n=this.toHsl(),{h:a}=n,o=[this],l=360/t;for(let s=1;s{let a={},o=e.color;if(o){const l=o.match(/var\((.*?)\)/);l&&(o=window.getComputedStyle(window.document.documentElement).getPropertyValue(l[1]));const s=new on(o),r=e.dark?s.tint(20).toString():ll(s,20);if(e.plain)a=n.cssVarBlock({"bg-color":e.dark?ll(s,90):s.tint(90).toString(),"text-color":o,"border-color":e.dark?ll(s,50):s.tint(50).toString(),"hover-text-color":`var(${n.cssVarName("color-white")})`,"hover-bg-color":o,"hover-border-color":o,"active-bg-color":r,"active-text-color":`var(${n.cssVarName("color-white")})`,"active-border-color":r}),t.value&&(a[n.cssVarBlockName("disabled-bg-color")]=e.dark?ll(s,90):s.tint(90).toString(),a[n.cssVarBlockName("disabled-text-color")]=e.dark?ll(s,50):s.tint(50).toString(),a[n.cssVarBlockName("disabled-border-color")]=e.dark?ll(s,80):s.tint(80).toString());else{const u=e.dark?ll(s,30):s.tint(30).toString(),c=s.isDark()?`var(${n.cssVarName("color-white")})`:`var(${n.cssVarName("color-black")})`;if(a=n.cssVarBlock({"bg-color":o,"text-color":c,"border-color":o,"hover-bg-color":u,"hover-text-color":c,"hover-border-color":u,"active-bg-color":r,"active-border-color":r}),t.value){const d=e.dark?ll(s,50):s.tint(50).toString();a[n.cssVarBlockName("disabled-bg-color")]=d,a[n.cssVarBlockName("disabled-text-color")]=e.dark?"rgba(255, 255, 255, 0.5)":`var(${n.cssVarName("color-white")})`,a[n.cssVarBlockName("disabled-border-color")]=d}}}return a})}var uD=le({name:"ElButton",__name:"button",props:up,emits:KL,setup(e,{expose:t,emit:n}){const a=e,o=n,l=iD(a),s=fe("button"),{_ref:r,_size:u,_type:c,_disabled:d,_props:f,_plain:h,_round:g,_text:v,_dashed:p,shouldAddSpace:m,handleClick:b}=qL(a,o),k=y(()=>[s.b(),s.m(c.value),s.m(u.value),s.is("disabled",d.value),s.is("loading",a.loading),s.is("plain",h.value),s.is("round",g.value),s.is("circle",a.circle),s.is("text",v.value),s.is("dashed",p.value),s.is("link",a.link),s.is("has-bg",a.bg)]);return t({ref:r,size:u,type:c,disabled:d,shouldAddSpace:m}),(w,C)=>(x(),oe(ot(e.tag),rt({ref_key:"_ref",ref:r},i(f),{class:k.value,style:i(l),onClick:i(b)}),{default:Z(()=>[e.loading?(x(),B(Fe,{key:0},[w.$slots.loading?ee(w.$slots,"loading",{key:0}):(x(),oe(i(Le),{key:1,class:T(i(s).is("loading"))},{default:Z(()=>[(x(),oe(ot(e.loadingIcon)))]),_:1},8,["class"]))],64)):e.icon||w.$slots.icon?(x(),oe(i(Le),{key:1},{default:Z(()=>[e.icon?(x(),oe(ot(e.icon),{key:0})):ee(w.$slots,"icon",{key:1})]),_:3})):te("v-if",!0),w.$slots.default?(x(),B("span",{key:2,class:T({[i(s).em("text","expand")]:i(m)})},[ee(w.$slots,"default")],2)):te("v-if",!0)]),_:3},16,["class","style","onClick"]))}}),cD=uD;const dD={size:up.size,type:up.type,direction:{type:q(String),values:["horizontal","vertical"],default:"horizontal"}};var fD=le({name:"ElButtonGroup",__name:"button-group",props:dD,setup(e){const t=e;gt(WC,Nt({size:_t(t,"size"),type:_t(t,"type")}));const n=fe("button");return(a,o)=>(x(),B("div",{class:T([i(n).b("group"),i(n).bm("group",t.direction)])},[ee(a.$slots,"default")],2))}}),YC=fD;const Sn=nt(cD,{ButtonGroup:YC}),UC=Xt(YC),pD=e=>ye(e)&&e.length===2&&e.every(t=>wl(t)),vD=Ce({modelValue:{type:Date},range:{type:q(Array),validator:pD},controllerType:{type:String,values:["button","select"],default:"button"},formatter:{type:q(Function)}}),hD={[Qe]:e=>wl(e),[pn]:e=>wl(e)},Nb=["hours","minutes","seconds"],Wa="EP_PICKER_BASE",ph="ElPopperOptions",qC=Symbol("commonPickerContextKey"),tr="HH:mm:ss",pl="YYYY-MM-DD",mD={date:pl,dates:pl,week:"gggg[w]ww",year:"YYYY",years:"YYYY",month:"YYYY-MM",months:"YYYY-MM",datetime:`${pl} ${tr}`,monthrange:"YYYY-MM",yearrange:"YYYY",daterange:pl,datetimerange:`${pl} ${tr}`};function al(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Vu={exports:{}},gD=Vu.exports,Mb;function bD(){return Mb||(Mb=1,(function(e,t){(function(n,a){e.exports=a()})(gD,(function(){var n=1e3,a=6e4,o=36e5,l="millisecond",s="second",r="minute",u="hour",c="day",d="week",f="month",h="quarter",g="year",v="date",p="Invalid Date",m=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,b=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,k={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(K){var Y=["th","st","nd","rd"],W=K%100;return"["+K+(Y[(W-20)%10]||Y[W]||Y[0])+"]"}},w=function(K,Y,W){var P=String(K);return!P||P.length>=Y?K:""+Array(Y+1-P.length).join(W)+K},C={s:w,z:function(K){var Y=-K.utcOffset(),W=Math.abs(Y),P=Math.floor(W/60),M=W%60;return(Y<=0?"+":"-")+w(P,2,"0")+":"+w(M,2,"0")},m:function K(Y,W){if(Y.date()1)return K(D[0])}else{var V=Y.name;E[V]=Y,M=V}return!P&&M&&(S=M),M||!P&&S},I=function(K,Y){if($(K))return K.clone();var W=typeof Y=="object"?Y:{};return W.date=K,W.args=arguments,new A(W)},_=C;_.l=N,_.i=$,_.w=function(K,Y){return I(K,{locale:Y.$L,utc:Y.$u,x:Y.$x,$offset:Y.$offset})};var A=(function(){function K(W){this.$L=N(W.locale,null,!0),this.parse(W),this.$x=this.$x||W.x||{},this[O]=!0}var Y=K.prototype;return Y.parse=function(W){this.$d=(function(P){var M=P.date,L=P.utc;if(M===null)return new Date(NaN);if(_.u(M))return new Date;if(M instanceof Date)return new Date(M);if(typeof M=="string"&&!/Z$/i.test(M)){var D=M.match(m);if(D){var V=D[2]-1||0,G=(D[7]||"0").substring(0,3);return L?new Date(Date.UTC(D[1],V,D[3]||1,D[4]||0,D[5]||0,D[6]||0,G)):new Date(D[1],V,D[3]||1,D[4]||0,D[5]||0,D[6]||0,G)}}return new Date(M)})(W),this.init()},Y.init=function(){var W=this.$d;this.$y=W.getFullYear(),this.$M=W.getMonth(),this.$D=W.getDate(),this.$W=W.getDay(),this.$H=W.getHours(),this.$m=W.getMinutes(),this.$s=W.getSeconds(),this.$ms=W.getMilliseconds()},Y.$utils=function(){return _},Y.isValid=function(){return this.$d.toString()!==p},Y.isSame=function(W,P){var M=I(W);return this.startOf(P)<=M&&M<=this.endOf(P)},Y.isAfter=function(W,P){return I(W)[e>0?e-1:void 0,e,eArray.from(Array.from({length:e}).keys()),GC=e=>e.replace(/\W?m{1,2}|\W?ZZ/g,"").replace(/\W?h{1,2}|\W?s{1,3}|\W?a/gi,"").trim(),XC=e=>e.replace(/\W?D{1,2}|\W?Do|\W?d{1,4}|\W?M{1,4}|\W?Y{2,4}/g,"").trim(),Pb=function(e,t){const n=wl(e),a=wl(t);return n&&a?e.getTime()===t.getTime():!n&&!a?e===t:!1},ZC=function(e,t){const n=ye(e),a=ye(t);return n&&a?e.length!==t.length?!1:e.every((o,l)=>Pb(o,t[l])):!n&&!a?Pb(e,t):!1},Rb=function(e,t,n){const a=Jn(t)||t==="x"?tt(e).locale(n):tt(e,t).locale(n);return a.isValid()?a:void 0},Ab=function(e,t,n){return Jn(t)?e:t==="x"?+e:tt(e).locale(n).format(t)},pf=(e,t)=>{const n=[],a=t?.();for(let o=0;oye(e)?e.map(t=>t.toDate()):e.toDate(),vh=Ce({disabledHours:{type:q(Function)},disabledMinutes:{type:q(Function)},disabledSeconds:{type:q(Function)}}),JC=Ce({visible:Boolean,actualVisible:{type:Boolean,default:void 0},format:{type:String,default:""}}),hh=Ce({automaticDropdown:{type:Boolean,default:!0},id:{type:q([Array,String])},name:{type:q([Array,String])},popperClass:Lt.popperClass,popperStyle:Lt.popperStyle,format:String,valueFormat:String,dateFormat:String,timeFormat:String,type:{type:String,default:""},clearable:{type:Boolean,default:!0},clearIcon:{type:q([String,Object]),default:xo},editable:{type:Boolean,default:!0},saveOnBlur:{type:Boolean,default:!0},prefixIcon:{type:q([String,Object]),default:""},size:bn,readonly:Boolean,disabled:{type:Boolean,default:void 0},placeholder:{type:String,default:""},popperOptions:{type:q(Object),default:()=>({})},modelValue:{type:q([Date,Array,String,Number]),default:""},rangeSeparator:{type:String,default:"-"},startPlaceholder:String,endPlaceholder:String,defaultValue:{type:q([Date,Array])},defaultTime:{type:q([Date,Array])},isRange:Boolean,...vh,disabledDate:{type:Function},cellClassName:{type:Function},shortcuts:{type:Array,default:()=>[]},arrowControl:Boolean,tabindex:{type:q([String,Number]),default:0},validateEvent:{type:Boolean,default:!0},unlinkPanels:Boolean,placement:{type:q(String),values:So,default:"bottom"},fallbackPlacements:{type:q(Array),default:["bottom","top","right","left"]},...ps,...Un(["ariaLabel"]),showNow:{type:Boolean,default:!0},showConfirm:{type:Boolean,default:!0},showFooter:{type:Boolean,default:!0},showWeekNumber:Boolean}),wD=Ce({id:{type:q(Array)},name:{type:q(Array)},modelValue:{type:q([Array,String])},startPlaceholder:String,endPlaceholder:String,disabled:Boolean}),QC=(e,t)=>{const{lang:n}=bt(),a=R(!1),o=R(!1),l=R(null),s=y(()=>{const{modelValue:v}=e;return!v||ye(v)&&!v.filter(Boolean).length}),r=v=>{if(!ZC(e.modelValue,v)){let p;ye(v)?p=v.map(m=>Ab(m,e.valueFormat,n.value)):v&&(p=Ab(v,e.valueFormat,n.value)),t(Qe,v&&p,n.value)}},u=y(()=>{let v;if(s.value?c.value.getDefaultValue&&(v=c.value.getDefaultValue()):ye(e.modelValue)?v=e.modelValue.map(p=>Rb(p,e.valueFormat,n.value)):v=Rb(e.modelValue??"",e.valueFormat,n.value),c.value.getRangeAvailableTime){const p=c.value.getRangeAvailableTime(v);Jt(p,v)||(v=p,s.value||r(Fu(v)))}return ye(v)&&v.some(p=>!p)&&(v=[]),v}),c=R({});return{parsedValue:u,pickerActualVisible:o,pickerOptions:c,pickerVisible:a,userInput:l,valueIsEmpty:s,emitInput:r,onCalendarChange:v=>{t("calendar-change",v)},onPanelChange:(v,p,m)=>{t("panel-change",v,p,m)},onPick:(v="",p=!1)=>{a.value=p;let m;ye(v)?m=v.map(b=>b.toDate()):m=v&&v.toDate(),l.value=null,r(m)},onSetPickerOption:v=>{c.value[v[0]]=v[1],c.value.panelReady=!0}}},CD=["id","name","placeholder","value","disabled"],SD=["id","name","placeholder","value","disabled"];var kD=le({name:"PickerRangeTrigger",inheritAttrs:!1,__name:"picker-range-trigger",props:wD,emits:["mouseenter","mouseleave","click","touchstart","focus","blur","startInput","endInput","startChange","endChange"],setup(e,{expose:t,emit:n}){const a=e,o=n,{formItem:l}=On(),{inputId:s}=ya(Nt({id:y(()=>a.id?.[0])}),{formItemContext:l}),r=fd(),u=fe("date"),c=fe("range"),d=R(),f=R(),{wrapperRef:h,isFocused:g}=tl(d,{disabled:y(()=>a.disabled)}),v=$=>{o("click",$)},p=$=>{o("mouseenter",$)},m=$=>{o("mouseleave",$)},b=$=>{o("touchstart",$)},k=$=>{o("startInput",$)},w=$=>{o("endInput",$)},C=$=>{o("startChange",$)},S=$=>{o("endChange",$)};return t({focus:()=>{d.value?.focus()},blur:()=>{d.value?.blur(),f.value?.blur()}}),($,N)=>(x(),B("div",{ref_key:"wrapperRef",ref:h,class:T([i(u).is("active",i(g)),$.$attrs.class]),style:He($.$attrs.style),onClick:v,onMouseenter:p,onMouseleave:m,onTouchstartPassive:b},[ee($.$slots,"prefix"),H("input",rt(i(r),{id:i(s),ref_key:"inputRef",ref:d,name:$.name&&$.name[0],placeholder:$.startPlaceholder,value:$.modelValue&&$.modelValue[0],class:i(c).b("input"),disabled:$.disabled,onInput:k,onChange:C}),null,16,CD),ee($.$slots,"range-separator"),H("input",rt(i(r),{id:$.id&&$.id[1],ref_key:"endInputRef",ref:f,name:$.name&&$.name[1],placeholder:$.endPlaceholder,value:$.modelValue&&$.modelValue[1],class:i(c).b("input"),disabled:$.disabled,onInput:w,onChange:S}),null,16,SD),ee($.$slots,"suffix")],38))}}),ED=kD,xD=le({name:"Picker",__name:"picker",props:hh,emits:[Qe,vt,"focus","blur","clear","calendar-change","panel-change","visible-change","keydown"],setup(e,{expose:t,emit:n}){const a=e,o=n,l=Zo(),s=fe("date"),r=fe("input"),u=fe("range"),{formItem:c}=On(),d=Re(ph,{}),f=Yi(a,null),h=R(),g=R(),v=R(null);let p=!1;const m=tn(),b=QC(a,o),{parsedValue:k,pickerActualVisible:w,userInput:C,pickerVisible:S,pickerOptions:E,valueIsEmpty:O,emitInput:$,onPick:N,onSetPickerOption:I,onCalendarChange:_,onPanelChange:A}=b,{isFocused:F,handleFocus:K,handleBlur:Y}=tl(g,{disabled:m,beforeFocus(){return a.readonly},afterFocus(){a.automaticDropdown&&(S.value=!0)},beforeBlur(de){return!p&&h.value?.isFocusInsideContent(de)},afterBlur(){ae.value&&!a.saveOnBlur?O.value||E.value.handleCancel?.():Ke(),S.value=!1,p=!1,a.validateEvent&&c?.validate("blur").catch(de=>ut(de))}}),W=R(!1),P=y(()=>[s.b("editor"),s.bm("editor",a.type),r.e("wrapper"),s.is("disabled",m.value),s.is("active",S.value),u.b("editor"),Ee?u.bm("editor",Ee.value):"",l.class]),M=y(()=>[r.e("icon"),u.e("close-icon"),ce.value?"":u.em("close-icon","hidden")]);re(S,de=>{de?Oe(()=>{de&&(v.value=a.modelValue)}):(C.value=null,Oe(()=>{L(a.modelValue)}))});const L=(de,Ue)=>{(Ue||!ZC(de,v.value))&&(o(vt,de),Ue&&(v.value=de),a.validateEvent&&c?.validate("change").catch(kt=>ut(kt)))},D=de=>{o("keydown",de)},V=y(()=>g.value?Array.from(g.value.$el.querySelectorAll("input")):[]),G=(de,Ue,kt)=>{const qt=V.value;qt.length&&(!kt||kt==="min"?(qt[0].setSelectionRange(de,Ue),qt[0].focus()):kt==="max"&&(qt[1].setSelectionRange(de,Ue),qt[1].focus()))},j=()=>{w.value=!0},X=()=>{o("visible-change",!0)},Q=()=>{w.value=!1,S.value=!1,o("visible-change",!1)},ve=()=>{S.value=!0},ue=()=>{S.value=!1},ge=y(()=>{const de=Me(k.value);return ye(C.value)?[C.value[0]||de&&de[0]||"",C.value[1]||de&&de[1]||""]:C.value!==null?C.value:ae.value&&O.value&&!a.saveOnBlur||!ae.value&&O.value||!S.value&&O.value?"":de?ne.value||z.value||J.value?de.join(", "):de:""}),ie=y(()=>a.type.includes("time")),ae=y(()=>a.type.startsWith("time")),ne=y(()=>a.type==="dates"),z=y(()=>a.type==="months"),J=y(()=>a.type==="years"),se=y(()=>a.prefixIcon||(ie.value?gC:JA)),ce=y(()=>a.clearable&&!m.value&&!a.readonly&&!O.value&&(W.value||F.value)),he=de=>{a.readonly||m.value||(ce.value&&(de?.stopPropagation(),E.value.handleClear?E.value.handleClear():$(f.valueOnClear.value),L(f.valueOnClear.value,!0),Q()),o("clear"))},Se=async de=>{a.readonly||m.value||(de.target?.tagName!=="INPUT"||F.value||!a.automaticDropdown)&&(S.value=!0)},Ie=()=>{a.readonly||m.value||!O.value&&a.clearable&&(W.value=!0)},Ne=()=>{W.value=!1},Te=de=>{a.readonly||m.value||(de.touches[0].target?.tagName!=="INPUT"||F.value||!a.automaticDropdown)&&(S.value=!0)},pe=y(()=>a.type.includes("range")),Ee=vn(),me=y(()=>i(h)?.popperRef?.contentRef),Pe=Lv(g,de=>{const Ue=i(me),kt=gn(g);Ue&&(de.target===Ue||de.composedPath().includes(Ue))||de.target===kt||kt&&de.composedPath().includes(kt)||(S.value=!1)});Rt(()=>{Pe?.()});const Ke=()=>{if(!(ae.value&&!a.saveOnBlur)){if(C.value){const de=Ge(ge.value);de&&(Ae(de)&&$(Fu(de)),C.value=null)}C.value===""&&($(f.valueOnClear.value),L(f.valueOnClear.value,!0),C.value=null)}},Ge=de=>de?E.value.parseUserInput(de):null,Me=de=>de?ye(de)?de.map(Ue=>Ue.format(a.format)):de.format(a.format):null,Ae=de=>E.value.isValidValue(de),We=async de=>{if(a.readonly||m.value)return;const Ue=Ft(de);if(D(de),Ue===we.esc){S.value===!0&&(S.value=!1,de.preventDefault(),de.stopPropagation());return}if(Ue===we.down&&(E.value.handleFocusPicker&&(de.preventDefault(),de.stopPropagation()),S.value===!1&&(S.value=!0,await Oe()),E.value.handleFocusPicker)){E.value.handleFocusPicker();return}if(Ue===we.tab){p=!0;return}if(Ue===we.enter||Ue===we.numpadEnter){S.value?(C.value===null||C.value===""||Ae(Ge(ge.value)))&&(Ke(),S.value=!1):S.value=!0,de.preventDefault(),de.stopPropagation();return}if(C.value){de.stopPropagation();return}E.value.handleKeydownInput&&E.value.handleKeydownInput(de)},xt=de=>{C.value=de,S.value||(S.value=!0)},je=de=>{const Ue=de.target;C.value?C.value=[Ue.value,C.value[1]]:C.value=[Ue.value,null]},at=de=>{const Ue=de.target;C.value?C.value=[C.value[0],Ue.value]:C.value=[null,Ue.value]},ft=()=>{const de=C.value,Ue=Ge(de&&de[0]),kt=i(k);if(Ue&&Ue.isValid()){C.value=[Me(Ue),ge.value?.[1]||null];const qt=[Ue,kt&&(kt[1]||null)];Ae(qt)&&($(Fu(qt)),C.value=null)}},yt=()=>{const de=i(C),Ue=Ge(de&&de[1]),kt=i(k);if(Ue&&Ue.isValid()){C.value=[i(ge)?.[0]||null,Me(Ue)];const qt=[kt&&kt[0],Ue];Ae(qt)&&($(Fu(qt)),C.value=null)}},be=()=>{g.value?.focus()},Ve=()=>{g.value?.blur()};return gt(Wa,{props:a,emptyValues:f}),gt(qC,b),t({focus:be,blur:Ve,handleOpen:ve,handleClose:ue,onPick:N}),(de,Ue)=>(x(),oe(i($n),rt({ref_key:"refPopper",ref:h,visible:i(S),effect:"light",pure:"",trigger:"click"},de.$attrs,{role:"dialog",teleported:"",transition:`${i(s).namespace.value}-zoom-in-top`,"popper-class":[`${i(s).namespace.value}-picker__popper`,de.popperClass],"popper-style":de.popperStyle,"popper-options":i(d),"fallback-placements":de.fallbackPlacements,"gpu-acceleration":!1,placement:de.placement,"stop-popper-mouse-event":!1,"hide-after":0,persistent:"",onBeforeShow:j,onShow:X,onHide:Q}),{default:Z(()=>[pe.value?(x(),oe(ED,{key:1,id:de.id,ref_key:"inputRef",ref:g,"model-value":ge.value,name:de.name,disabled:i(m),readonly:!de.editable||de.readonly,"start-placeholder":de.startPlaceholder,"end-placeholder":de.endPlaceholder,class:T(P.value),style:He(de.$attrs.style),"aria-label":de.ariaLabel,tabindex:de.tabindex,autocomplete:"off",role:"combobox",onClick:Se,onFocus:i(K),onBlur:i(Y),onStartInput:je,onStartChange:ft,onEndInput:at,onEndChange:yt,onMousedown:Se,onMouseenter:Ie,onMouseleave:Ne,onTouchstartPassive:Te,onKeydown:We},{prefix:Z(()=>[se.value?(x(),oe(i(Le),{key:0,class:T([i(r).e("icon"),i(u).e("icon")])},{default:Z(()=>[(x(),oe(ot(se.value)))]),_:1},8,["class"])):te("v-if",!0)]),"range-separator":Z(()=>[ee(de.$slots,"range-separator",{},()=>[H("span",{class:T(i(u).b("separator"))},ke(de.rangeSeparator),3)])]),suffix:Z(()=>[de.clearIcon?(x(),oe(i(Le),{key:0,class:T(M.value),onMousedown:qe(i(Pt),["prevent"]),onClick:he},{default:Z(()=>[(x(),oe(ot(de.clearIcon)))]),_:1},8,["class","onMousedown"])):te("v-if",!0)]),_:3},8,["id","model-value","name","disabled","readonly","start-placeholder","end-placeholder","class","style","aria-label","tabindex","onFocus","onBlur"])):(x(),oe(i(Wn),{key:0,id:de.id,ref_key:"inputRef",ref:g,"container-role":"combobox","model-value":ge.value,name:de.name,size:i(Ee),disabled:i(m),placeholder:de.placeholder,class:T([i(s).b("editor"),i(s).bm("editor",de.type),i(s).is("focus",i(S)),de.$attrs.class]),style:He(de.$attrs.style),readonly:!de.editable||de.readonly||ne.value||z.value||J.value||de.type==="week","aria-label":de.ariaLabel,tabindex:de.tabindex,"validate-event":!1,onInput:xt,onFocus:i(K),onBlur:i(Y),onKeydown:We,onChange:Ke,onMousedown:Se,onMouseenter:Ie,onMouseleave:Ne,onTouchstartPassive:Te,onClick:Ue[0]||(Ue[0]=qe(()=>{},["stop"]))},{prefix:Z(()=>[se.value?(x(),oe(i(Le),{key:0,class:T(i(r).e("icon")),onMousedown:qe(Se,["prevent"]),onTouchstartPassive:Te},{default:Z(()=>[(x(),oe(ot(se.value)))]),_:1},8,["class"])):te("v-if",!0)]),suffix:Z(()=>[ce.value&&de.clearIcon?(x(),oe(i(Le),{key:0,class:T(`${i(r).e("icon")} clear-icon`),onMousedown:qe(i(Pt),["prevent"]),onClick:he},{default:Z(()=>[(x(),oe(ot(de.clearIcon)))]),_:1},8,["class","onMousedown"])):te("v-if",!0)]),_:1},8,["id","model-value","name","size","disabled","placeholder","class","style","readonly","aria-label","tabindex","onFocus","onBlur"]))]),content:Z(()=>[ee(de.$slots,"default",{visible:i(S),actualVisible:i(w),parsedValue:i(k),format:de.format,dateFormat:de.dateFormat,timeFormat:de.timeFormat,unlinkPanels:de.unlinkPanels,type:de.type,defaultValue:de.defaultValue,showNow:de.showNow,showConfirm:de.showConfirm,showFooter:de.showFooter,showWeekNumber:de.showWeekNumber,onPick:Ue[1]||(Ue[1]=(...kt)=>i(N)&&i(N)(...kt)),onSelectRange:G,onSetPickerOption:Ue[2]||(Ue[2]=(...kt)=>i(I)&&i(I)(...kt)),onCalendarChange:Ue[3]||(Ue[3]=(...kt)=>i(_)&&i(_)(...kt)),onClear:he,onPanelChange:Ue[4]||(Ue[4]=(...kt)=>i(A)&&i(A)(...kt)),onMousedown:Ue[5]||(Ue[5]=qe(()=>{},["stop"]))})]),_:3},16,["visible","transition","popper-class","popper-style","popper-options","fallback-placements","placement"]))}}),eS=xD;const il=new Map;if(It){let e;document.addEventListener("mousedown",t=>e=t),document.addEventListener("mouseup",t=>{if(e){for(const n of il.values())for(const{documentHandler:a}of n)a(t,e);e=void 0}})}function _b(e,t){let n=[];return ye(t.arg)?n=t.arg:oa(t.arg)&&n.push(t.arg),function(a,o){const l=t.instance.popperRef,s=a.target,r=o?.target,u=!t||!t.instance,c=!s||!r,d=e.contains(s)||e.contains(r),f=e===s,h=n.length&&n.some(v=>v?.contains(s))||n.length&&n.includes(r),g=l&&(l.contains(s)||l.contains(r));u||c||d||f||h||g||t.value(a,o)}}const Tl={beforeMount(e,t){il.has(e)||il.set(e,[]),il.get(e).push({documentHandler:_b(e,t),bindingFn:t.value})},updated(e,t){il.has(e)||il.set(e,[]);const n=il.get(e),a=n.findIndex(l=>l.bindingFn===t.oldValue),o={documentHandler:_b(e,t),bindingFn:t.value};a>=0?n.splice(a,1,o):n.push(o)},unmounted(e){il.delete(e)}},TD=100,$D=600,Su="_RepeatClick",xc={beforeMount(e,t){const n=t.value,{interval:a=TD,delay:o=$D}=Be(n)?{}:n;let l,s;const r=()=>Be(n)?n():n.handler(),u=()=>{s&&(clearTimeout(s),s=void 0),l&&(clearInterval(l),l=void 0)},c=d=>{d.button===0&&(u(),r(),document.addEventListener("mouseup",u,{once:!0}),s=setTimeout(()=>{l=setInterval(()=>{r()},a)},o))};e[Su]={start:c,clear:u},e.addEventListener("mousedown",c)},unmounted(e){if(!e[Su])return;const{start:t,clear:n}=e[Su];t&&e.removeEventListener("mousedown",t),n&&(n(),document.removeEventListener("mouseup",n)),e[Su]=null}},dp="_trap-focus-children",Wl=[],Lb=e=>{if(Wl.length===0)return;const t=Ft(e),n=Wl[Wl.length-1][dp];if(n.length>0&&t===we.tab){if(n.length===1){e.preventDefault(),document.activeElement!==n[0]&&n[0].focus();return}const a=e.shiftKey,o=e.target===n[0],l=e.target===n[n.length-1];o&&a&&(e.preventDefault(),n[n.length-1].focus()),l&&!a&&(e.preventDefault(),n[0].focus())}},OD={beforeMount(e){e[dp]=Mg(e),Wl.push(e),Wl.length<=1&&document.addEventListener("keydown",Lb)},updated(e){Oe(()=>{e[dp]=Mg(e)})},unmounted(){Wl.shift(),Wl.length===0&&document.removeEventListener("keydown",Lb)}};var Db=!1,Bl,fp,pp,zu,Hu,tS,Ku,vp,hp,mp,nS,gp,bp,aS,oS;function na(){if(!Db){Db=!0;var e=navigator.userAgent,t=/(?:MSIE.(\d+\.\d+))|(?:(?:Firefox|GranParadiso|Iceweasel).(\d+\.\d+))|(?:Opera(?:.+Version.|.)(\d+\.\d+))|(?:AppleWebKit.(\d+(?:\.\d+)?))|(?:Trident\/\d+\.\d+.*rv:(\d+\.\d+))/.exec(e),n=/(Mac OS X)|(Windows)|(Linux)/.exec(e);if(gp=/\b(iPhone|iP[ao]d)/.exec(e),bp=/\b(iP[ao]d)/.exec(e),mp=/Android/i.exec(e),aS=/FBAN\/\w+;/i.exec(e),oS=/Mobile/i.exec(e),nS=!!/Win64/.exec(e),t){Bl=t[1]?parseFloat(t[1]):t[5]?parseFloat(t[5]):NaN,Bl&&document&&document.documentMode&&(Bl=document.documentMode);var a=/(?:Trident\/(\d+.\d+))/.exec(e);tS=a?parseFloat(a[1])+4:Bl,fp=t[2]?parseFloat(t[2]):NaN,pp=t[3]?parseFloat(t[3]):NaN,zu=t[4]?parseFloat(t[4]):NaN,zu?(t=/(?:Chrome\/(\d+\.\d+))/.exec(e),Hu=t&&t[1]?parseFloat(t[1]):NaN):Hu=NaN}else Bl=fp=pp=Hu=zu=NaN;if(n){if(n[1]){var o=/(?:Mac OS X (\d+(?:[._]\d+)?))/.exec(e);Ku=o?parseFloat(o[1].replace("_",".")):!0}else Ku=!1;vp=!!n[2],hp=!!n[3]}else Ku=vp=hp=!1}}var yp={ie:function(){return na()||Bl},ieCompatibilityMode:function(){return na()||tS>Bl},ie64:function(){return yp.ie()&&nS},firefox:function(){return na()||fp},opera:function(){return na()||pp},webkit:function(){return na()||zu},safari:function(){return yp.webkit()},chrome:function(){return na()||Hu},windows:function(){return na()||vp},osx:function(){return na()||Ku},linux:function(){return na()||hp},iphone:function(){return na()||gp},mobile:function(){return na()||gp||bp||mp||oS},nativeApp:function(){return na()||aS},android:function(){return na()||mp},ipad:function(){return na()||bp}},ID=yp,ND=!!(typeof window<"u"&&window.document&&window.document.createElement),MD={canUseDOM:ND},lS=MD,sS;lS.canUseDOM&&(sS=document.implementation&&document.implementation.hasFeature&&document.implementation.hasFeature("","")!==!0);function PD(e,t){if(!lS.canUseDOM||t&&!("addEventListener"in document))return!1;var n="on"+e,a=n in document;if(!a){var o=document.createElement("div");o.setAttribute(n,"return;"),a=typeof o[n]=="function"}return!a&&sS&&e==="wheel"&&(a=document.implementation.hasFeature("Events.wheel","3.0")),a}var RD=PD,Bb=10,Vb=40,Fb=800;function rS(e){var t=0,n=0,a=0,o=0;return"detail"in e&&(n=e.detail),"wheelDelta"in e&&(n=-e.wheelDelta/120),"wheelDeltaY"in e&&(n=-e.wheelDeltaY/120),"wheelDeltaX"in e&&(t=-e.wheelDeltaX/120),"axis"in e&&e.axis===e.HORIZONTAL_AXIS&&(t=n,n=0),a=t*Bb,o=n*Bb,"deltaY"in e&&(o=e.deltaY),"deltaX"in e&&(a=e.deltaX),(a||o)&&e.deltaMode&&(e.deltaMode==1?(a*=Vb,o*=Vb):(a*=Fb,o*=Fb)),a&&!t&&(t=a<1?-1:1),o&&!n&&(n=o<1?-1:1),{spinX:t,spinY:n,pixelX:a,pixelY:o}}rS.getEventType=function(){return ID.firefox()?"DOMMouseScroll":RD("wheel")?"wheel":"mousewheel"};var AD=rS;const Wu="_Mousewheel",zb=function(e,t){if(e&&e.addEventListener){iS(e);const n=function(a){const o=AD(a);t&&Reflect.apply(t,this,[a,o])};e[Wu]={wheelHandler:n},e.addEventListener("wheel",n,{passive:!0})}},iS=e=>{e[Wu]?.wheelHandler&&(e.removeEventListener("wheel",e[Wu].wheelHandler),e[Wu]=null)},_D={beforeMount(e,t){zb(e,t.value)},unmounted(e){iS(e)},updated(e,t){t.value!==t.oldValue&&zb(e,t.value)}},LD=Ce({...JC,datetimeRole:String,parsedValue:{type:q(Object)}}),uS=({getAvailableHours:e,getAvailableMinutes:t,getAvailableSeconds:n})=>{const a=(s,r,u,c)=>{const d={hour:e,minute:t,second:n};let f=s;return["hour","minute","second"].forEach(h=>{if(d[h]){let g;const v=d[h];switch(h){case"minute":g=v(f.hour(),r,c);break;case"second":g=v(f.hour(),f.minute(),r,c);break;default:g=v(r,c);break}if(g?.length&&!g.includes(f[h]())){const p=u?0:g.length-1;f=f[h](g[p])}}}),f},o={};return{timePickerOptions:o,getAvailableTime:a,onSetOption:([s,r])=>{o[s]=r}}},vf=e=>{const t=(a,o)=>a||o,n=a=>a!==!0;return e.map(t).filter(n)},cS=(e,t,n)=>({getHoursList:(s,r)=>pf(24,e&&(()=>e?.(s,r))),getMinutesList:(s,r,u)=>pf(60,t&&(()=>t?.(s,r,u))),getSecondsList:(s,r,u,c)=>pf(60,n&&(()=>n?.(s,r,u,c)))}),dS=(e,t,n)=>{const{getHoursList:a,getMinutesList:o,getSecondsList:l}=cS(e,t,n);return{getAvailableHours:(c,d)=>vf(a(c,d)),getAvailableMinutes:(c,d,f)=>vf(o(c,d,f)),getAvailableSeconds:(c,d,f,h)=>vf(l(c,d,f,h))}},fS=(e,t)=>{const n=R(e.parsedValue);return re(()=>e.visible,a=>{const o=fm(t.modelValue),l=fm(t.valueOnClear);if(a&&o===l){n.value=l;return}a||(n.value=e.parsedValue)}),n},DD=Ce({role:{type:String,required:!0},spinnerDate:{type:q(Object),required:!0},showSeconds:{type:Boolean,default:!0},arrowControl:Boolean,amPmMode:{type:q(String),default:""},...vh}),BD=["onClick"],VD=["onMouseenter"];var FD=le({__name:"basic-time-spinner",props:DD,emits:[vt,"select-range","set-option"],setup(e,{emit:t}){const n=e,{isRange:a,format:o,saveOnBlur:l}=Re(Wa).props,s=t,r=fe("time"),{getHoursList:u,getMinutesList:c,getSecondsList:d}=cS(n.disabledHours,n.disabledMinutes,n.disabledSeconds);let f=!1;const h={hours:!1,minutes:!1,seconds:!1},g=R(),v={hours:R(),minutes:R(),seconds:R()},p=y(()=>n.showSeconds?Nb:Nb.slice(0,2)),m=y(()=>{const{spinnerDate:V}=n;return{hours:V.hour(),minutes:V.minute(),seconds:V.second()}}),b=y(()=>{const{hours:V,minutes:G}=i(m),{role:j,spinnerDate:X}=n,Q=a?void 0:X;return{hours:u(j,Q),minutes:c(V,j,Q),seconds:d(V,G,j,Q)}}),k=y(()=>{const{hours:V,minutes:G,seconds:j}=i(m);return{hours:ff(V,23),minutes:ff(G,59),seconds:ff(j,59)}}),w=bo(V=>{f=!1,E(V)},200),C=V=>{if(!n.amPmMode)return"";const G=n.amPmMode==="A";let j=V<12?" am":" pm";return G&&(j=j.toUpperCase()),j},S=V=>{let G=[0,0];const j=o||tr,X=j.indexOf("HH"),Q=j.indexOf("mm"),ve=j.indexOf("ss");switch(V){case"hours":X!==-1&&(G=[X,X+2]);break;case"minutes":Q!==-1&&(G=[Q,Q+2]);break;case"seconds":ve!==-1&&(G=[ve,ve+2]);break}const[ue,ge]=G;s("select-range",ue,ge),g.value=V},E=V=>{N(V,i(m)[V])},O=()=>{E("hours"),E("minutes"),E("seconds")},$=V=>V.querySelector(`.${r.namespace.value}-scrollbar__wrap`),N=(V,G)=>{if(n.arrowControl)return;const j=i(v[V]);j&&j.$el&&(l||(h[V]=!0,Fa(()=>{h[V]=!1})),$(j.$el).scrollTop=Math.max(0,G*I(V)))},I=V=>{const G=i(v[V])?.$el.querySelector("li");return G&&Number.parseFloat(Ro(G,"height"))||0},_=()=>{F(1)},A=()=>{F(-1)},F=V=>{g.value||S("hours");const G=g.value,j=i(m)[G],X=K(G,j,V,g.value==="hours"?24:60);Y(G,X),N(G,X),Oe(()=>S(G))},K=(V,G,j,X)=>{let Q=(G+j+X)%X;const ve=i(b)[V];for(;ve[Q]&&Q!==G;)Q=(Q+j+X)%X;return Q},Y=(V,G)=>{if(i(b)[V][G])return;const{hours:j,minutes:X,seconds:Q}=i(m);let ve;switch(V){case"hours":ve=n.spinnerDate.hour(G).minute(X).second(Q);break;case"minutes":ve=n.spinnerDate.hour(j).minute(G).second(Q);break;case"seconds":ve=n.spinnerDate.hour(j).minute(X).second(G);break}s(vt,ve)},W=(V,{value:G,disabled:j})=>{j||(Y(V,G),S(V),N(V,G))},P=V=>{if(!l&&h[V])return;const G=i(v[V]);G&&(f=!0,w(V),Y(V,Math.min(Math.round(($(G.$el).scrollTop-(M(V)*.5-10)/I(V)+3)/I(V)),V==="hours"?23:59)))},M=V=>i(v[V]).$el.offsetHeight,L=()=>{const V=G=>{const j=i(v[G]);j&&j.$el&&($(j.$el).onscroll=()=>{P(G)})};V("hours"),V("minutes"),V("seconds")};ct(()=>{Oe(()=>{!n.arrowControl&&L(),O(),n.role==="start"&&S("hours")})});const D=(V,G)=>{v[G].value=V??void 0};return s("set-option",[`${n.role}_scrollDown`,F]),s("set-option",[`${n.role}_emitSelectRange`,S]),re(()=>n.spinnerDate,()=>{f||O()}),(V,G)=>(x(),B("div",{class:T([i(r).b("spinner"),{"has-seconds":V.showSeconds}])},[V.arrowControl?te("v-if",!0):(x(!0),B(Fe,{key:0},ht(p.value,j=>(x(),oe(i(Ka),{key:j,ref_for:!0,ref:X=>D(X,j),class:T(i(r).be("spinner","wrapper")),"wrap-style":"max-height: inherit;","view-class":i(r).be("spinner","list"),noresize:"",tag:"ul",onMouseenter:X=>S(j),onMousemove:X=>E(j)},{default:Z(()=>[(x(!0),B(Fe,null,ht(b.value[j],(X,Q)=>(x(),B("li",{key:Q,class:T([i(r).be("spinner","item"),i(r).is("active",Q===m.value[j]),i(r).is("disabled",X)]),onClick:ve=>W(j,{value:Q,disabled:X})},[j==="hours"?(x(),B(Fe,{key:0},[mt(ke(("0"+(V.amPmMode?Q%12||12:Q)).slice(-2))+ke(C(Q)),1)],64)):(x(),B(Fe,{key:1},[mt(ke(("0"+Q).slice(-2)),1)],64))],10,BD))),128))]),_:2},1032,["class","view-class","onMouseenter","onMousemove"]))),128)),V.arrowControl?(x(!0),B(Fe,{key:1},ht(p.value,j=>(x(),B("div",{key:j,class:T([i(r).be("spinner","wrapper"),i(r).is("arrow")]),onMouseenter:X=>S(j)},[st((x(),oe(i(Le),{class:T(["arrow-up",i(r).be("spinner","arrow")])},{default:Z(()=>[U(i(Sd))]),_:1},8,["class"])),[[i(xc),A]]),st((x(),oe(i(Le),{class:T(["arrow-down",i(r).be("spinner","arrow")])},{default:Z(()=>[U(i(Eo))]),_:1},8,["class"])),[[i(xc),_]]),H("ul",{class:T(i(r).be("spinner","list"))},[(x(!0),B(Fe,null,ht(k.value[j],(X,Q)=>(x(),B("li",{key:Q,class:T([i(r).be("spinner","item"),i(r).is("active",X===m.value[j]),i(r).is("disabled",b.value[j][X])])},[i(ze)(X)?(x(),B(Fe,{key:0},[j==="hours"?(x(),B(Fe,{key:0},[mt(ke(("0"+(V.amPmMode?X%12||12:X)).slice(-2))+ke(C(X)),1)],64)):(x(),B(Fe,{key:1},[mt(ke(("0"+X).slice(-2)),1)],64))],64)):te("v-if",!0)],2))),128))],2)],42,VD))),128)):te("v-if",!0)],2))}}),wp=FD,zD=le({__name:"panel-time-pick",props:LD,emits:["pick","select-range","set-picker-option"],setup(e,{emit:t}){const n=e,a=t,o=Re(Wa),{arrowControl:l,disabledHours:s,disabledMinutes:r,disabledSeconds:u,defaultValue:c}=o.props,{getAvailableHours:d,getAvailableMinutes:f,getAvailableSeconds:h}=dS(s,r,u),g=fe("time"),{t:v,lang:p}=bt(),m=R([0,2]),b=fS(n,{modelValue:y(()=>o.props.modelValue),valueOnClear:y(()=>o?.emptyValues?o.emptyValues.valueOnClear.value:null)}),k=y(()=>St(n.actualVisible)?`${g.namespace.value}-zoom-in-top`:""),w=y(()=>n.format.includes("ss")),C=y(()=>n.format.includes("A")?"A":n.format.includes("a")?"a":""),S=M=>{const L=tt(M).locale(p.value),D=Y(L);return L.isSame(D)},E=()=>{const M=b.value;a("pick",M,!1),Oe(()=>{b.value=M})},O=(M=!1,L=!1)=>{L||a("pick",n.parsedValue,M)},$=M=>{n.visible&&a("pick",Y(M).millisecond(0),!0)},N=(M,L)=>{a("select-range",M,L),m.value=[M,L]},I=M=>{const L=n.format,D=L.indexOf("HH"),V=L.indexOf("mm"),G=L.indexOf("ss"),j=[],X=[];D!==-1&&(j.push(D),X.push("hours")),V!==-1&&(j.push(V),X.push("minutes")),G!==-1&&w.value&&(j.push(G),X.push("seconds"));const Q=(j.indexOf(m.value[0])+M+j.length)%j.length;A.start_emitSelectRange(X[Q])},_=M=>{const L=Ft(M),{left:D,right:V,up:G,down:j}=we;if([D,V].includes(L)){I(L===D?-1:1),M.preventDefault();return}if([G,j].includes(L)){const X=L===G?-1:1;A.start_scrollDown(X),M.preventDefault();return}},{timePickerOptions:A,onSetOption:F,getAvailableTime:K}=uS({getAvailableHours:d,getAvailableMinutes:f,getAvailableSeconds:h}),Y=M=>K(M,n.datetimeRole||"",!0),W=M=>M?tt(M,n.format).locale(p.value):null,P=()=>tt(c).locale(p.value);return a("set-picker-option",["isValidValue",S]),a("set-picker-option",["parseUserInput",W]),a("set-picker-option",["handleKeydownInput",_]),a("set-picker-option",["getRangeAvailableTime",Y]),a("set-picker-option",["getDefaultValue",P]),a("set-picker-option",["handleCancel",E]),(M,L)=>(x(),oe(Mn,{name:k.value},{default:Z(()=>[M.actualVisible||M.visible?(x(),B("div",{key:0,class:T(i(g).b("panel"))},[H("div",{class:T([i(g).be("panel","content"),{"has-seconds":w.value}])},[U(wp,{ref:"spinner",role:M.datetimeRole||"start","arrow-control":i(l),"show-seconds":w.value,"am-pm-mode":C.value,"spinner-date":M.parsedValue,"disabled-hours":i(s),"disabled-minutes":i(r),"disabled-seconds":i(u),onChange:$,onSetOption:i(F),onSelectRange:N},null,8,["role","arrow-control","show-seconds","am-pm-mode","spinner-date","disabled-hours","disabled-minutes","disabled-seconds","onSetOption"])],2),H("div",{class:T(i(g).be("panel","footer"))},[H("button",{type:"button",class:T([i(g).be("panel","btn"),"cancel"]),onClick:E},ke(i(v)("el.datepicker.cancel")),3),H("button",{type:"button",class:T([i(g).be("panel","btn"),"confirm"]),onClick:L[0]||(L[0]=D=>O())},ke(i(v)("el.datepicker.confirm")),3)],2)],2)):te("v-if",!0)]),_:1},8,["name"]))}}),Tc=zD;const HD=Ce({...JC,parsedValue:{type:q(Array)}}),KD=["disabled"];var WD=le({__name:"panel-time-range",props:HD,emits:["pick","select-range","set-picker-option"],setup(e,{emit:t}){const n=e,a=t,o=(ne,z)=>{const J=[];for(let se=ne;se<=z;se++)J.push(se);return J},{t:l,lang:s}=bt(),r=fe("time"),u=fe("picker"),c=Re(Wa),{arrowControl:d,disabledHours:f,disabledMinutes:h,disabledSeconds:g,defaultValue:v}=c.props,p=y(()=>[r.be("range-picker","body"),r.be("panel","content"),r.is("arrow",d),S.value?"has-seconds":""]),m=y(()=>[r.be("range-picker","body"),r.be("panel","content"),r.is("arrow",d),S.value?"has-seconds":""]),b=y(()=>n.parsedValue[0]),k=y(()=>n.parsedValue[1]),w=fS(n,{modelValue:y(()=>c.props.modelValue),valueOnClear:y(()=>c?.emptyValues?c.emptyValues.valueOnClear.value:null)}),C=()=>{const ne=w.value;a("pick",ne,!1),Oe(()=>{w.value=ne})},S=y(()=>n.format.includes("ss")),E=y(()=>n.format.includes("A")?"A":n.format.includes("a")?"a":""),O=(ne=!1)=>{a("pick",[b.value,k.value],ne)},$=ne=>{_(ne.millisecond(0),k.value)},N=ne=>{_(b.value,ne.millisecond(0))},I=ne=>{const z=ne.map(se=>tt(se).locale(s.value)),J=G(z);return z[0].isSame(J[0])&&z[1].isSame(J[1])},_=(ne,z)=>{n.visible&&a("pick",[ne,z],!0)},A=y(()=>b.value>k.value),F=R([0,2]),K=(ne,z)=>{a("select-range",ne,z,"min"),F.value=[ne,z]},Y=y(()=>S.value?11:8),W=(ne,z)=>{a("select-range",ne,z,"max");const J=i(Y);F.value=[ne+J,z+J]},P=ne=>{const z=S.value?[0,3,6,11,14,17]:[0,3,8,11],J=["hours","minutes"].concat(S.value?["seconds"]:[]),se=(z.indexOf(F.value[0])+ne+z.length)%z.length,ce=z.length/2;se{const z=Ft(ne),{left:J,right:se,up:ce,down:he}=we;if([J,se].includes(z)){P(z===J?-1:1),ne.preventDefault();return}if([ce,he].includes(z)){const Se=z===ce?-1:1;ve[`${F.value[0]{const J=f?f(ne):[],se=ne==="start",ce=(z||(se?k.value:b.value)).hour();return tf(J,se?o(ce+1,23):o(0,ce-1))},D=(ne,z,J)=>{const se=h?h(ne,z):[],ce=z==="start",he=J||(ce?k.value:b.value);if(ne!==he.hour())return se;const Se=he.minute();return tf(se,ce?o(Se+1,59):o(0,Se-1))},V=(ne,z,J,se)=>{const ce=g?g(ne,z,J):[],he=J==="start",Se=se||(he?k.value:b.value),Ie=Se.hour(),Ne=Se.minute();if(ne!==Ie||z!==Ne)return ce;const Te=Se.second();return tf(ce,he?o(Te+1,59):o(0,Te-1))},G=([ne,z])=>[ue(ne,"start",!0,z),ue(z,"end",!1,ne)],{getAvailableHours:j,getAvailableMinutes:X,getAvailableSeconds:Q}=dS(L,D,V),{timePickerOptions:ve,getAvailableTime:ue,onSetOption:ge}=uS({getAvailableHours:j,getAvailableMinutes:X,getAvailableSeconds:Q}),ie=ne=>ne?ye(ne)?ne.map(z=>tt(z,n.format).locale(s.value)):tt(ne,n.format).locale(s.value):null,ae=()=>{if(ye(v))return v.map(z=>tt(z).locale(s.value));const ne=tt(v).locale(s.value);return[ne,ne.add(60,"m")]};return a("set-picker-option",["parseUserInput",ie]),a("set-picker-option",["isValidValue",I]),a("set-picker-option",["handleKeydownInput",M]),a("set-picker-option",["getDefaultValue",ae]),a("set-picker-option",["getRangeAvailableTime",G]),a("set-picker-option",["handleCancel",C]),(ne,z)=>ne.actualVisible?(x(),B("div",{key:0,class:T([i(r).b("range-picker"),i(u).b("panel")])},[H("div",{class:T(i(r).be("range-picker","content"))},[H("div",{class:T(i(r).be("range-picker","cell"))},[H("div",{class:T(i(r).be("range-picker","header"))},ke(i(l)("el.datepicker.startTime")),3),H("div",{class:T(p.value)},[U(wp,{ref:"minSpinner",role:"start","show-seconds":S.value,"am-pm-mode":E.value,"arrow-control":i(d),"spinner-date":b.value,"disabled-hours":L,"disabled-minutes":D,"disabled-seconds":V,onChange:$,onSetOption:i(ge),onSelectRange:K},null,8,["show-seconds","am-pm-mode","arrow-control","spinner-date","onSetOption"])],2)],2),H("div",{class:T(i(r).be("range-picker","cell"))},[H("div",{class:T(i(r).be("range-picker","header"))},ke(i(l)("el.datepicker.endTime")),3),H("div",{class:T(m.value)},[U(wp,{ref:"maxSpinner",role:"end","show-seconds":S.value,"am-pm-mode":E.value,"arrow-control":i(d),"spinner-date":k.value,"disabled-hours":L,"disabled-minutes":D,"disabled-seconds":V,onChange:N,onSetOption:i(ge),onSelectRange:W},null,8,["show-seconds","am-pm-mode","arrow-control","spinner-date","onSetOption"])],2)],2)],2),H("div",{class:T(i(r).be("panel","footer"))},[H("button",{type:"button",class:T([i(r).be("panel","btn"),"cancel"]),onClick:z[0]||(z[0]=J=>C())},ke(i(l)("el.datepicker.cancel")),3),H("button",{type:"button",class:T([i(r).be("panel","btn"),"confirm"]),disabled:A.value,onClick:z[1]||(z[1]=J=>O())},ke(i(l)("el.datepicker.confirm")),11,KD)],2)],2)):te("v-if",!0)}}),jD=WD,ju={exports:{}},YD=ju.exports,Hb;function UD(){return Hb||(Hb=1,(function(e,t){(function(n,a){e.exports=a()})(YD,(function(){var n={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},a=/(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,o=/\d/,l=/\d\d/,s=/\d\d?/,r=/\d*[^-_:/,()\s\d]+/,u={},c=function(m){return(m=+m)+(m>68?1900:2e3)},d=function(m){return function(b){this[m]=+b}},f=[/[+-]\d\d:?(\d\d)?|Z/,function(m){(this.zone||(this.zone={})).offset=(function(b){if(!b||b==="Z")return 0;var k=b.match(/([+-]|\d\d)/g),w=60*k[1]+(+k[2]||0);return w===0?0:k[0]==="+"?-w:w})(m)}],h=function(m){var b=u[m];return b&&(b.indexOf?b:b.s.concat(b.f))},g=function(m,b){var k,w=u.meridiem;if(w){for(var C=1;C<=24;C+=1)if(m.indexOf(w(C,0,b))>-1){k=C>12;break}}else k=m===(b?"pm":"PM");return k},v={A:[r,function(m){this.afternoon=g(m,!1)}],a:[r,function(m){this.afternoon=g(m,!0)}],Q:[o,function(m){this.month=3*(m-1)+1}],S:[o,function(m){this.milliseconds=100*+m}],SS:[l,function(m){this.milliseconds=10*+m}],SSS:[/\d{3}/,function(m){this.milliseconds=+m}],s:[s,d("seconds")],ss:[s,d("seconds")],m:[s,d("minutes")],mm:[s,d("minutes")],H:[s,d("hours")],h:[s,d("hours")],HH:[s,d("hours")],hh:[s,d("hours")],D:[s,d("day")],DD:[l,d("day")],Do:[r,function(m){var b=u.ordinal,k=m.match(/\d+/);if(this.day=k[0],b)for(var w=1;w<=31;w+=1)b(w).replace(/\[|\]/g,"")===m&&(this.day=w)}],w:[s,d("week")],ww:[l,d("week")],M:[s,d("month")],MM:[l,d("month")],MMM:[r,function(m){var b=h("months"),k=(h("monthsShort")||b.map((function(w){return w.slice(0,3)}))).indexOf(m)+1;if(k<1)throw new Error;this.month=k%12||k}],MMMM:[r,function(m){var b=h("months").indexOf(m)+1;if(b<1)throw new Error;this.month=b%12||b}],Y:[/[+-]?\d+/,d("year")],YY:[l,function(m){this.year=c(m)}],YYYY:[/\d{4}/,d("year")],Z:f,ZZ:f};function p(m){var b,k;b=m,k=u&&u.formats;for(var w=(m=b.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function(I,_,A){var F=A&&A.toUpperCase();return _||k[A]||n[A]||k[F].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,(function(K,Y,W){return Y||W.slice(1)}))}))).match(a),C=w.length,S=0;S-1)return new Date((M==="X"?1e3:1)*P);var V=p(M)(P),G=V.year,j=V.month,X=V.day,Q=V.hours,ve=V.minutes,ue=V.seconds,ge=V.milliseconds,ie=V.zone,ae=V.week,ne=new Date,z=X||(G||j?1:ne.getDate()),J=G||ne.getFullYear(),se=0;G&&!j||(se=j>0?j-1:ne.getMonth());var ce,he=Q||0,Se=ve||0,Ie=ue||0,Ne=ge||0;return ie?new Date(Date.UTC(J,se,z,he,Se,Ie,Ne+60*ie.offset*1e3)):L?new Date(Date.UTC(J,se,z,he,Se,Ie,Ne)):(ce=new Date(J,se,z,he,Se,Ie,Ne),ae&&(ce=D(ce).week(ae).toDate()),ce)}catch{return new Date("")}})(E,N,O,k),this.init(),F&&F!==!0&&(this.$L=this.locale(F).$L),A&&E!=this.format(N)&&(this.$d=new Date("")),u={}}else if(N instanceof Array)for(var K=N.length,Y=1;Y<=K;Y+=1){$[1]=N[Y-1];var W=k.apply(this,$);if(W.isValid()){this.$d=W.$d,this.$L=W.$L,this.init();break}Y===K&&(this.$d=new Date(""))}else C.call(this,S)}}}))})(ju)),ju.exports}var qD=UD();const mh=al(qD);tt.extend(mh);var GD=le({name:"ElTimePicker",install:null,props:{...hh,isRange:Boolean},emits:[Qe],setup(e,t){const n=R(),[a,o]=e.isRange?["timerange",jD]:["time",Tc],l=s=>t.emit(Qe,s);return gt(ph,e.popperOptions),t.expose({focus:()=>{n.value?.focus()},blur:()=>{n.value?.blur()},handleOpen:()=>{n.value?.handleOpen()},handleClose:()=>{n.value?.handleClose()}}),()=>{const s=e.format??tr;return U(eS,rt(e,{ref:n,type:a,format:s,"onUpdate:modelValue":l}),{default:r=>U(o,r,null)})}}});const XD=nt(GD),qo=Ce({type:{type:String,values:["primary","success","info","warning","danger"],default:"primary"},closable:Boolean,disableTransitions:Boolean,hit:Boolean,color:String,size:{type:String,values:Ua},effect:{type:String,values:["dark","light","plain"],default:"light"},round:Boolean}),ZD={close:e=>e instanceof MouseEvent,click:e=>e instanceof MouseEvent},JD=["aria-label"],QD=["aria-label"];var e8=le({name:"ElTag",__name:"tag",props:qo,emits:ZD,setup(e,{emit:t}){const n=e,a=t,o=vn(),{t:l}=bt(),s=fe("tag"),r=y(()=>{const{type:f,hit:h,effect:g,closable:v,round:p}=n;return[s.b(),s.is("closable",v),s.m(f||"primary"),s.m(o.value),s.m(g),s.is("hit",h),s.is("round",p)]}),u=f=>{a("close",f)},c=f=>{a("click",f)},d=f=>{f?.component?.subTree?.component?.bum&&(f.component.subTree.component.bum=null)};return(f,h)=>e.disableTransitions?(x(),B("span",{key:0,class:T(r.value),style:He({backgroundColor:e.color}),onClick:c},[H("span",{class:T(i(s).e("content"))},[ee(f.$slots,"default")],2),e.closable?(x(),B("button",{key:0,"aria-label":i(l)("el.tag.close"),class:T(i(s).e("close")),type:"button",onClick:qe(u,["stop"])},[U(i(Le),null,{default:Z(()=>[U(i(Ia))]),_:1})],10,JD)):te("v-if",!0)],6)):(x(),oe(Mn,{key:1,name:`${i(s).namespace.value}-zoom-in-center`,appear:"",onVnodeMounted:d},{default:Z(()=>[H("span",{class:T(r.value),style:He({backgroundColor:e.color}),onClick:c},[H("span",{class:T(i(s).e("content"))},[ee(f.$slots,"default")],2),e.closable?(x(),B("button",{key:0,"aria-label":i(l)("el.tag.close"),class:T(i(s).e("close")),type:"button",onClick:qe(u,["stop"])},[U(i(Le),null,{default:Z(()=>[U(i(Ia))]),_:1})],10,QD)):te("v-if",!0)],6)]),_:3},8,["name"]))}}),t8=e8;const Fo=nt(t8),pS=Symbol("ElSelectGroup"),Xi=Symbol("ElSelect"),$c={label:"label",value:"value",disabled:"disabled",options:"options"};function Zi(e){const t=R({...$c,...e.props});let n={...e.props};return re(()=>e.props,r=>{Jt(r,n)||(t.value={...$c,...r},n={...r})},{deep:!0}),{aliasProps:t,getLabel:r=>fn(r,t.value.label),getValue:r=>fn(r,t.value.value),getDisabled:r=>fn(r,t.value.disabled),getOptions:r=>fn(r,t.value.options)}}const vS=Ce({name:String,id:String,modelValue:{type:q([Array,String,Number,Boolean,Object]),default:void 0},autocomplete:{type:String,default:"off"},automaticDropdown:Boolean,size:bn,effect:{type:q(String),default:"light"},disabled:{type:Boolean,default:void 0},clearable:Boolean,filterable:Boolean,allowCreate:Boolean,loading:Boolean,popperClass:{type:String,default:""},popperStyle:{type:q([String,Object])},popperOptions:{type:q(Object),default:()=>({})},remote:Boolean,debounce:{type:Number,default:300},loadingText:String,noMatchText:String,noDataText:String,remoteMethod:{type:q(Function)},filterMethod:{type:q(Function)},multiple:Boolean,multipleLimit:{type:Number,default:0},placeholder:{type:String},defaultFirstOption:Boolean,reserveKeyword:{type:Boolean,default:!0},valueKey:{type:String,default:"value"},collapseTags:Boolean,collapseTagsTooltip:Boolean,tagTooltip:{type:q(Object),default:()=>({})},maxCollapseTags:{type:Number,default:1},teleported:Lt.teleported,persistent:{type:Boolean,default:!0},clearIcon:{type:Bt,default:xo},fitInputWidth:Boolean,suffixIcon:{type:Bt,default:Eo},tagType:{...qo.type,default:"info"},tagEffect:{...qo.effect,default:"light"},validateEvent:{type:Boolean,default:!0},remoteShowSuffix:Boolean,showArrow:{type:Boolean,default:!0},offset:{type:Number,default:12},placement:{type:q(String),values:So,default:"bottom-start"},fallbackPlacements:{type:q(Array),default:["bottom-start","top-start","right","left"]},tabindex:{type:[String,Number],default:0},appendTo:Lt.appendTo,options:{type:q(Array)},props:{type:q(Object),default:()=>$c},...ps,...Un(["ariaLabel"])});_C.scroll;const Cp="ElOption",n8=Ce({value:{type:[String,Number,Boolean,Object],required:!0},label:{type:[String,Number]},created:Boolean,disabled:Boolean});function a8(e,t){const n=Re(Xi);n||Gt(Cp,"usage: ");const a=Re(pS,{disabled:!1}),o=y(()=>d(Cn(n.props.modelValue),e.value)),l=y(()=>{if(n.props.multiple){const g=Cn(n.props.modelValue??[]);return!o.value&&g.length>=n.props.multipleLimit&&n.props.multipleLimit>0}else return!1}),s=y(()=>e.label??(et(e.value)?"":e.value)),r=y(()=>e.value||e.label||""),u=y(()=>e.disabled||t.groupDisabled||l.value),c=it(),d=(g=[],v)=>{if(et(e.value)){const p=n.props.valueKey;return g&&g.some(m=>Ht(fn(m,p))===fn(v,p))}else return g&&g.includes(v)},f=()=>{u.value||(n.states.hoveringIndex=n.optionsArray.indexOf(c.proxy))},h=g=>{t.visible=new RegExp(Vv(g),"i").test(String(s.value))||e.created};return re(()=>s.value,()=>{!e.created&&!n.props.remote&&n.setSelected()}),re(()=>e.value,(g,v)=>{const{remote:p,valueKey:m}=n.props;if((p?g!==v:!Jt(g,v))&&(n.onOptionDestroy(v,c.proxy),n.onOptionCreate(c.proxy)),!e.created&&!p){if(m&&et(g)&&et(v)&&g[m]===v[m])return;n.setSelected()}}),re(()=>a.disabled,()=>{t.groupDisabled=a.disabled},{immediate:!0}),{select:n,currentLabel:s,currentValue:r,itemSelected:o,isDisabled:u,hoverItem:f,updateOption:h}}var o8=le({name:Cp,componentName:Cp,props:n8,setup(e){const t=fe("select"),n=Pn(),a=y(()=>[t.be("dropdown","item"),t.is("disabled",i(r)),t.is("selected",i(s)),t.is("hovering",i(h))]),o=Nt({index:-1,groupDisabled:!1,visible:!0,hover:!1}),{currentLabel:l,itemSelected:s,isDisabled:r,select:u,hoverItem:c,updateOption:d}=a8(e,o),{visible:f,hover:h}=En(o),g=it().proxy;u.onOptionCreate(g),Rt(()=>{const p=g.value;Oe(()=>{const{selected:m}=u.states,b=m.some(k=>k.value===g.value);u.states.cachedOptions.get(p)===g&&!b&&u.states.cachedOptions.delete(p)}),u.onOptionDestroy(p,g)});function v(){r.value||u.handleOptionSelect(g)}return{ns:t,id:n,containerKls:a,currentLabel:l,itemSelected:s,isDisabled:r,select:u,visible:f,hover:h,states:o,hoverItem:c,updateOption:d,selectOptionClick:v}}});const l8=["id","aria-disabled","aria-selected"];function s8(e,t,n,a,o,l){return st((x(),B("li",{id:e.id,class:T(e.containerKls),role:"option","aria-disabled":e.isDisabled||void 0,"aria-selected":e.itemSelected,onMousemove:t[0]||(t[0]=(...s)=>e.hoverItem&&e.hoverItem(...s)),onClick:t[1]||(t[1]=qe((...s)=>e.selectOptionClick&&e.selectOptionClick(...s),["stop"]))},[ee(e.$slots,"default",{},()=>[H("span",null,ke(e.currentLabel),1)])],42,l8)),[[Ot,e.visible]])}var gh=yn(o8,[["render",s8]]),r8=le({name:"ElOptionGroup",componentName:"ElOptionGroup",props:{label:String,disabled:Boolean},setup(e){const t=fe("select"),n=R(),a=it(),o=R([]);gt(pS,Nt({...En(e)}));const l=y(()=>o.value.some(c=>c.visible===!0)),s=c=>c.type.name==="ElOption"&&!!c.component?.proxy,r=c=>{const d=Cn(c),f=[];return d.forEach(h=>{zt(h)&&(s(h)?f.push(h.component.proxy):ye(h.children)&&h.children.length?f.push(...r(h.children)):h.component?.subTree&&f.push(...r(h.component.subTree)))}),f},u=()=>{o.value=r(a.subTree)};return ct(()=>{u()}),Di(n,u,{attributes:!0,subtree:!0,childList:!0}),{groupRef:n,visible:l,ns:t}}});function i8(e,t,n,a,o,l){return st((x(),B("ul",{ref:"groupRef",class:T(e.ns.be("group","wrap"))},[H("li",{class:T(e.ns.be("group","title"))},ke(e.label),3),H("li",null,[H("ul",{class:T(e.ns.b("group"))},[ee(e.$slots,"default")],2)])],2)),[[Ot,e.visible]])}var bh=yn(r8,[["render",i8]]),u8=le({name:"ElSelectDropdown",componentName:"ElSelectDropdown",setup(){const e=Re(Xi),t=fe("select"),n=y(()=>e.props.popperClass),a=y(()=>e.props.multiple),o=y(()=>e.props.fitInputWidth),l=R("");function s(){const r=e.selectRef?.offsetWidth;r?l.value=`${r-Nw}px`:l.value=""}return ct(()=>{s(),Ut(e.selectRef,s)}),{ns:t,minWidth:l,popperClass:n,isMultiple:a,isFitInputWidth:o}}});function c8(e,t,n,a,o,l){return x(),B("div",{class:T([e.ns.b("dropdown"),e.ns.is("multiple",e.isMultiple),e.popperClass]),style:He({[e.isFitInputWidth?"width":"minWidth"]:e.minWidth})},[e.$slots.header?(x(),B("div",{key:0,class:T(e.ns.be("dropdown","header"))},[ee(e.$slots,"header")],2)):te("v-if",!0),ee(e.$slots,"default"),e.$slots.footer?(x(),B("div",{key:1,class:T(e.ns.be("dropdown","footer"))},[ee(e.$slots,"footer")],2)):te("v-if",!0)],6)}var d8=yn(u8,[["render",c8]]);const f8=(e,t)=>{const{t:n}=bt(),a=sn(),o=Pn(),l=fe("select"),s=fe("input"),r=Nt({inputValue:"",options:new Map,cachedOptions:new Map,optionValues:[],selected:[],selectionWidth:0,collapseItemWidth:0,selectedLabel:"",hoveringIndex:-1,previousQuery:null,inputHovering:!1,menuVisibleOnFocus:!1,isBeforeHide:!1}),u=R(),c=R(),d=R(),f=R(),h=R(),g=R(),v=R(),p=R(),m=R(),b=R(),k=R(),w=R(!1),C=R(),S=R(!1),{form:E,formItem:O}=On(),{inputId:$}=ya(e,{formItemContext:O}),{valueOnClear:N,isEmptyValue:I}=Yi(e),{isComposing:_,handleCompositionStart:A,handleCompositionUpdate:F,handleCompositionEnd:K}=ji({afterComposition:xe=>xt(xe)}),Y=tn(),{wrapperRef:W,isFocused:P,handleBlur:M}=tl(h,{disabled:Y,afterFocus(){e.automaticDropdown&&!w.value&&(w.value=!0,r.menuVisibleOnFocus=!0)},beforeBlur(xe){return d.value?.isFocusInsideContent(xe)||f.value?.isFocusInsideContent(xe)},afterBlur(){w.value=!1,r.menuVisibleOnFocus=!1,e.validateEvent&&O?.validate?.("blur").catch(xe=>ut(xe))}}),L=y(()=>ye(e.modelValue)?e.modelValue.length>0:!I(e.modelValue)),D=y(()=>E?.statusIcon??!1),V=y(()=>e.clearable&&!Y.value&&L.value&&(P.value||r.inputHovering)),G=y(()=>e.remote&&e.filterable&&!e.remoteShowSuffix?"":e.suffixIcon),j=y(()=>l.is("reverse",!!(G.value&&w.value))),X=y(()=>O?.validateState||""),Q=y(()=>X.value&&Ed[X.value]),ve=y(()=>e.remote?e.debounce:0),ue=y(()=>e.remote&&!r.inputValue&&r.options.size===0),ge=y(()=>e.loading?e.loadingText||n("el.select.loading"):e.filterable&&r.inputValue&&r.options.size>0&&ie.value===0?e.noMatchText||n("el.select.noMatch"):r.options.size===0?e.noDataText||n("el.select.noData"):null),ie=y(()=>ae.value.filter(xe=>xe.visible).length),ae=y(()=>{const xe=Array.from(r.options.values()),dt=[];return r.optionValues.forEach(Mt=>{const Kt=xe.findIndex(mn=>mn.value===Mt);Kt>-1&&dt.push(xe[Kt])}),dt.length>=xe.length?dt:xe}),ne=y(()=>Array.from(r.cachedOptions.values())),z=y(()=>{const xe=ae.value.filter(dt=>!dt.created).some(dt=>dt.currentLabel===r.inputValue);return e.filterable&&e.allowCreate&&r.inputValue!==""&&!xe}),J=()=>{e.filterable&&Be(e.filterMethod)||e.filterable&&e.remote&&Be(e.remoteMethod)||ae.value.forEach(xe=>{xe.updateOption?.(r.inputValue)})},se=vn(),ce=y(()=>["small"].includes(se.value)?"small":"default"),he=y({get(){return w.value&&(e.loading||!ue.value||e.remote&&!!a.empty)&&(!S.value||!Jn(r.previousQuery))},set(xe){w.value=xe}}),Se=y(()=>{if(e.multiple&&!St(e.modelValue))return Cn(e.modelValue).length===0&&!r.inputValue;const xe=ye(e.modelValue)?e.modelValue[0]:e.modelValue;return e.filterable||St(xe)?!r.inputValue:!0}),Ie=y(()=>{const xe=e.placeholder??n("el.select.placeholder");return e.multiple||!L.value?xe:r.selectedLabel}),Ne=y(()=>yc?null:"mouseenter");re(()=>e.modelValue,(xe,dt)=>{e.multiple&&e.filterable&&!e.reserveKeyword&&(r.inputValue="",Te("")),Ee(),!Jt(xe,dt)&&e.validateEvent&&O?.validate("change").catch(Mt=>ut(Mt))},{flush:"post",deep:!0}),re(()=>w.value,xe=>{xe?Te(r.inputValue):(r.inputValue="",r.previousQuery=null,r.isBeforeHide=!0,r.menuVisibleOnFocus=!1)}),re(()=>r.options.entries(),()=>{It&&(Ee(),e.defaultFirstOption&&(e.filterable||e.remote)&&ie.value&&pe())},{flush:"post"}),re([()=>r.hoveringIndex,ae],([xe])=>{ze(xe)&&xe>-1?C.value=ae.value[xe]||{}:C.value={},ae.value.forEach(dt=>{dt.hover=C.value===dt})}),ia(()=>{r.isBeforeHide||J()});const Te=xe=>{r.previousQuery===xe||_.value||(r.previousQuery=xe,e.filterable&&Be(e.filterMethod)?e.filterMethod(xe):e.filterable&&e.remote&&Be(e.remoteMethod)&&e.remoteMethod(xe),e.defaultFirstOption&&(e.filterable||e.remote)&&ie.value?Oe(pe):Oe(Pe))},pe=()=>{const xe=ae.value.filter(Kt=>Kt.visible&&!Kt.disabled&&!Kt.states.groupDisabled),dt=xe.find(Kt=>Kt.created),Mt=xe[0];r.hoveringIndex=Ue(ae.value.map(Kt=>Kt.value),dt||Mt)},Ee=()=>{if(e.multiple)r.selectedLabel="";else{const dt=me(ye(e.modelValue)?e.modelValue[0]:e.modelValue);r.selectedLabel=dt.currentLabel,r.selected=[dt];return}const xe=[];St(e.modelValue)||Cn(e.modelValue).forEach(dt=>{xe.push(me(dt))}),r.selected=xe},me=xe=>{let dt;const Mt=qr(xe);for(let Kt=r.cachedOptions.size-1;Kt>=0;Kt--){const mn=ne.value[Kt];if(Mt?fn(mn.value,e.valueKey)===fn(xe,e.valueKey):mn.value===xe){dt={index:ae.value.filter(Qa=>!Qa.created).indexOf(mn),value:xe,currentLabel:mn.currentLabel,get isDisabled(){return mn.isDisabled}};break}}return dt||{index:-1,value:xe,currentLabel:Mt?xe.label:xe??""}},Pe=()=>{const xe=r.selected.length;if(xe>0){const dt=r.selected[xe-1];r.hoveringIndex=ae.value.findIndex(Mt=>qn(dt)===qn(Mt))}else r.hoveringIndex=-1},Ke=()=>{r.selectionWidth=Number.parseFloat(window.getComputedStyle(c.value).width)},Ge=()=>{r.collapseItemWidth=b.value.getBoundingClientRect().width},Me=()=>{d.value?.updatePopper?.()},Ae=()=>{f.value?.updatePopper?.()},We=()=>{r.inputValue.length>0&&!w.value&&(w.value=!0),Te(r.inputValue)},xt=xe=>{if(r.inputValue=xe.target.value,e.remote)S.value=!0,je();else return We()},je=Li(()=>{We(),S.value=!1},ve),at=xe=>{Jt(e.modelValue,xe)||t(vt,xe)},ft=xe=>f1(xe,dt=>{const Mt=r.cachedOptions.get(dt);return!Mt?.disabled&&!Mt?.states.groupDisabled}),yt=xe=>{const dt=Ft(xe);if(e.multiple&&dt!==we.delete&&xe.target.value.length<=0){const Mt=Cn(e.modelValue).slice(),Kt=ft(Mt);if(Kt<0)return;const mn=Mt[Kt];Mt.splice(Kt,1),t(Qe,Mt),at(Mt),t("remove-tag",mn)}},be=(xe,dt)=>{const Mt=r.selected.indexOf(dt);if(Mt>-1&&!Y.value){const Kt=Cn(e.modelValue).slice();Kt.splice(Mt,1),t(Qe,Kt),at(Kt),t("remove-tag",dt.value)}xe.stopPropagation(),lt()},Ve=xe=>{xe.stopPropagation();const dt=e.multiple?[]:N.value;if(e.multiple)for(const Mt of r.selected)Mt.isDisabled&&dt.push(Mt.value);t(Qe,dt),at(dt),r.hoveringIndex=-1,w.value=!1,t("clear"),lt()},de=xe=>{if(e.multiple){const dt=Cn(e.modelValue??[]).slice(),Mt=Ue(dt,xe);Mt>-1?dt.splice(Mt,1):(e.multipleLimit<=0||dt.length{kt(xe)})},Ue=(xe,dt)=>St(dt)?-1:et(dt.value)?xe.findIndex(Mt=>Jt(fn(Mt,e.valueKey),qn(dt))):xe.indexOf(dt.value),kt=xe=>{const dt=ye(xe)?xe[xe.length-1]:xe;let Mt=null;if(!cn(dt?.value)){const Kt=ae.value.filter(mn=>mn.value===dt.value);Kt.length>0&&(Mt=Kt[0].$el)}if(d.value&&Mt){const Kt=d.value?.popperRef?.contentRef?.querySelector?.(`.${l.be("dropdown","wrap")}`);Kt&&Hv(Kt,Mt)}k.value?.handleScroll()},qt=xe=>{r.options.set(xe.value,xe),r.cachedOptions.set(xe.value,xe)},xn=(xe,dt)=>{r.options.get(xe)===dt&&r.options.delete(xe)},De=y(()=>d.value?.popperRef?.contentRef),Je=()=>{r.isBeforeHide=!1,Oe(()=>{k.value?.update(),kt(r.selected)})},lt=()=>{h.value?.focus()},hn=()=>{if(w.value){w.value=!1,Oe(()=>h.value?.blur());return}h.value?.blur()},Vt=xe=>{Ve(xe)},dn=xe=>{if(w.value=!1,P.value){const dt=new FocusEvent("blur",xe);Oe(()=>M(dt))}},Xe=()=>{r.inputValue.length>0?r.inputValue="":w.value=!1},Ze=xe=>{Y.value||e.filterable&&w.value&&xe&&!v.value?.contains(xe.target)||(yc&&(r.inputHovering=!0),r.menuVisibleOnFocus?r.menuVisibleOnFocus=!1:w.value=!w.value)},pt=()=>{if(!w.value)Ze();else{const xe=ae.value[r.hoveringIndex];xe&&!xe.isDisabled&&de(xe)}},qn=xe=>et(xe.value)?fn(xe.value,e.valueKey):xe.value,Ja=y(()=>ae.value.filter(xe=>xe.visible).every(xe=>xe.isDisabled)),Na=y(()=>e.multiple?e.collapseTags?r.selected.slice(0,e.maxCollapseTags):r.selected:[]),tu=y(()=>e.multiple?e.collapseTags?r.selected.slice(e.maxCollapseTags):[]:[]),Il=xe=>{if(!w.value){w.value=!0;return}if(!(r.options.size===0||ie.value===0||_.value)&&!Ja.value){xe==="next"?(r.hoveringIndex++,r.hoveringIndex===r.options.size&&(r.hoveringIndex=0)):xe==="prev"&&(r.hoveringIndex--,r.hoveringIndex<0&&(r.hoveringIndex=r.options.size-1));const dt=ae.value[r.hoveringIndex];(dt.isDisabled||!dt.visible)&&Il(xe),Oe(()=>kt(C.value))}},nu=(xe,dt,Mt,Kt)=>{for(let mn=dt;mn>=0&&mn{const Mt=r.options.size;if(Mt===0)return;const Kt=zl(xe,0,Mt-1),mn=ae.value,Qa=dt==="up"?-1:1,ms=nu(mn,Kt,Qa,Mt)??nu(mn,Kt-Qa,-Qa,Mt);ms!=null&&(r.hoveringIndex=ms,Oe(()=>kt(C.value)))},Ad=xe=>{const dt=Ft(xe);let Mt=!0;switch(dt){case we.up:Il("prev");break;case we.down:Il("next");break;case we.enter:case we.numpadEnter:_.value||pt();break;case we.esc:Xe();break;case we.backspace:Mt=!1,yt(xe);return;case we.home:if(!w.value)return;To(0,"down");break;case we.end:if(!w.value)return;To(r.options.size-1,"up");break;case we.pageUp:if(!w.value)return;To(r.hoveringIndex-10,"up");break;case we.pageDown:if(!w.value)return;To(r.hoveringIndex+10,"down");break;default:Mt=!1;break}Mt&&(xe.preventDefault(),xe.stopPropagation())},_d=()=>{if(!c.value)return 0;const xe=window.getComputedStyle(c.value);return Number.parseFloat(xe.gap||"6px")},Ld=y(()=>{const xe=_d(),dt=e.filterable?xe+ad:0;return{maxWidth:`${b.value&&e.maxCollapseTags===1?r.selectionWidth-r.collapseItemWidth-xe-dt:r.selectionWidth-dt}px`}}),Dd=y(()=>({maxWidth:`${r.selectionWidth}px`})),Bd=xe=>{t("popup-scroll",xe)};Ut(c,Ke),Ut(W,Me),Ut(m,Ae),Ut(b,Ge);let hs;return re(()=>he.value,xe=>{xe?hs=Ut(p,Me).stop:(hs?.(),hs=void 0),t("visible-change",xe)}),ct(()=>{Ee()}),{inputId:$,contentId:o,nsSelect:l,nsInput:s,states:r,isFocused:P,expanded:w,optionsArray:ae,hoverOption:C,selectSize:se,filteredOptionsCount:ie,updateTooltip:Me,updateTagTooltip:Ae,debouncedOnInputChange:je,onInput:xt,deletePrevTag:yt,deleteTag:be,deleteSelected:Ve,handleOptionSelect:de,scrollToOption:kt,hasModelValue:L,shouldShowPlaceholder:Se,currentPlaceholder:Ie,mouseEnterEventName:Ne,needStatusIcon:D,showClearBtn:V,iconComponent:G,iconReverse:j,validateState:X,validateIcon:Q,showNewOption:z,updateOptions:J,collapseTagSize:ce,setSelected:Ee,selectDisabled:Y,emptyText:ge,handleCompositionStart:A,handleCompositionUpdate:F,handleCompositionEnd:K,handleKeydown:Ad,onOptionCreate:qt,onOptionDestroy:xn,handleMenuEnter:Je,focus:lt,blur:hn,handleClearClick:Vt,handleClickOutside:dn,handleEsc:Xe,toggleMenu:Ze,selectOption:pt,getValueKey:qn,navigateOptions:Il,dropdownMenuVisible:he,showTagList:Na,collapseTagList:tu,popupScroll:Bd,getOption:me,tagStyle:Ld,collapseTagStyle:Dd,popperRef:De,inputRef:h,tooltipRef:d,tagTooltipRef:f,prefixRef:g,suffixRef:v,selectRef:u,wrapperRef:W,selectionRef:c,scrollbarRef:k,menuRef:p,tagMenuRef:m,collapseItemRef:b}};var p8=le({name:"ElOptions",setup(e,{slots:t}){const n=Re(Xi);let a=[];return()=>{const o=t.default?.(),l=[];function s(r){ye(r)&&r.forEach(u=>{const c=(u?.type||{})?.name;c==="ElOptionGroup"?s(!_e(u.children)&&!ye(u.children)&&Be(u.children?.default)?u.children?.default():u.children):c==="ElOption"?l.push(u.props?.value):ye(u.children)&&s(u.children)})}return o.length&&s(o[0]?.children),Jt(l,a)||(a=l,n&&(n.states.optionValues=l)),o}}});const Kb="ElSelect",pi=new WeakMap,v8=e=>(...t)=>{const n=t[0];if(!n||n.includes('Slot "default" invoked outside of the render function')&&t[2]?.includes("ElTreeSelect"))return;const a=pi.get(e)?.originalWarnHandler;if(a){a(...t);return}console.warn(...t)},h8=e=>{let t=pi.get(e);return t||(t={originalWarnHandler:e.config.warnHandler,handler:v8(e),count:0},pi.set(e,t)),t};var m8=le({name:Kb,componentName:Kb,components:{ElSelectMenu:d8,ElOption:gh,ElOptions:p8,ElOptionGroup:bh,ElTag:Fo,ElScrollbar:Ka,ElTooltip:$n,ElIcon:Le},directives:{ClickOutside:Tl},props:vS,emits:[Qe,vt,"remove-tag","clear","visible-change","focus","blur","popup-scroll"],setup(e,{emit:t,slots:n}){const a=it(),o=h8(a.appContext);o.count+=1,a.appContext.config.warnHandler=o.handler;const l=y(()=>{const{modelValue:k,multiple:w}=e,C=w?[]:void 0;return ye(k)?w?k:C:w?C:k}),s=Nt({...En(e),modelValue:l}),r=f8(s,t),{calculatorRef:u,inputStyle:c}=Bv(),{getLabel:d,getValue:f,getOptions:h,getDisabled:g}=Zi(e),v=k=>({label:d(k),value:f(k),disabled:g(k)}),p=k=>k.reduce((w,C)=>(w.push(C),C.children&&C.children.length>0&&w.push(...p(C.children)),w),[]),m=k=>{va(k||[]).forEach(w=>{if(et(w)&&(w.type.name==="ElOption"||w.type.name==="ElTree")){const C=w.type.name;if(C==="ElTree")p(w.props?.data||[]).forEach(S=>{S.currentLabel=S.label||(et(S.value)?"":S.value),r.onOptionCreate(S)});else if(C==="ElOption"){const S={...w.props};S.currentLabel=S.label||(et(S.value)?"":S.value),r.onOptionCreate(S)}}})};re(()=>[e.persistent||r.expanded.value||!n.default?void 0:n.default?.(),l.value],()=>{e.persistent||r.expanded.value||(r.states.options.clear(),m(n.default?.()))},{immediate:!0}),gt(Xi,Nt({props:s,states:r.states,selectRef:r.selectRef,optionsArray:r.optionsArray,setSelected:r.setSelected,handleOptionSelect:r.handleOptionSelect,onOptionCreate:r.onOptionCreate,onOptionDestroy:r.onOptionDestroy}));const b=y(()=>e.multiple?r.states.selected.map(k=>k.currentLabel):r.states.selectedLabel);return Rt(()=>{const k=pi.get(a.appContext);k&&(k.count-=1,k.count<=0&&(a.appContext.config.warnHandler=k.originalWarnHandler,pi.delete(a.appContext)))}),{...r,modelValue:l,selectedLabel:b,calculatorRef:u,inputStyle:c,getLabel:d,getValue:f,getOptions:h,getDisabled:g,getOptionProps:v}}});const g8=["id","value","name","disabled","autocomplete","tabindex","readonly","aria-activedescendant","aria-controls","aria-expanded","aria-label"],b8=["textContent"],y8={key:1};function w8(e,t,n,a,o,l){const s=$t("el-tag"),r=$t("el-tooltip"),u=$t("el-icon"),c=$t("el-option"),d=$t("el-option-group"),f=$t("el-options"),h=$t("el-scrollbar"),g=$t("el-select-menu"),v=pv("click-outside");return st((x(),B("div",rt({ref:"selectRef",class:[e.nsSelect.b(),e.nsSelect.m(e.selectSize)]},{[Rr(e.mouseEnterEventName)]:t[11]||(t[11]=p=>e.states.inputHovering=!0)},{onMouseleave:t[12]||(t[12]=p=>e.states.inputHovering=!1)}),[U(r,{ref:"tooltipRef",visible:e.dropdownMenuVisible,placement:e.placement,teleported:e.teleported,"popper-class":[e.nsSelect.e("popper"),e.popperClass],"popper-style":e.popperStyle,"popper-options":e.popperOptions,"fallback-placements":e.fallbackPlacements,effect:e.effect,pure:"",trigger:"click",transition:`${e.nsSelect.namespace.value}-zoom-in-top`,"stop-popper-mouse-event":!1,"gpu-acceleration":!1,persistent:e.persistent,"append-to":e.appendTo,"show-arrow":e.showArrow,offset:e.offset,onBeforeShow:e.handleMenuEnter,onHide:t[10]||(t[10]=p=>e.states.isBeforeHide=!1)},{default:Z(()=>[H("div",{ref:"wrapperRef",class:T([e.nsSelect.e("wrapper"),e.nsSelect.is("focused",e.isFocused),e.nsSelect.is("hovering",e.states.inputHovering),e.nsSelect.is("filterable",e.filterable),e.nsSelect.is("disabled",e.selectDisabled)]),onClick:t[7]||(t[7]=qe((...p)=>e.toggleMenu&&e.toggleMenu(...p),["prevent"]))},[e.$slots.prefix?(x(),B("div",{key:0,ref:"prefixRef",class:T(e.nsSelect.e("prefix"))},[ee(e.$slots,"prefix")],2)):te("v-if",!0),H("div",{ref:"selectionRef",class:T([e.nsSelect.e("selection"),e.nsSelect.is("near",e.multiple&&!e.$slots.prefix&&!!e.states.selected.length)])},[e.multiple?ee(e.$slots,"tag",{key:0,data:e.states.selected,deleteTag:e.deleteTag,selectDisabled:e.selectDisabled},()=>[(x(!0),B(Fe,null,ht(e.showTagList,p=>(x(),B("div",{key:e.getValueKey(p),class:T(e.nsSelect.e("selected-item"))},[U(s,{closable:!e.selectDisabled&&!p.isDisabled,size:e.collapseTagSize,type:e.tagType,effect:e.tagEffect,"disable-transitions":"",style:He(e.tagStyle),onClose:m=>e.deleteTag(m,p)},{default:Z(()=>[H("span",{class:T(e.nsSelect.e("tags-text"))},[ee(e.$slots,"label",{index:p.index,label:p.currentLabel,value:p.value},()=>[mt(ke(p.currentLabel),1)])],2)]),_:2},1032,["closable","size","type","effect","style","onClose"])],2))),128)),e.collapseTags&&e.states.selected.length>e.maxCollapseTags?(x(),oe(r,{key:0,ref:"tagTooltipRef",disabled:e.dropdownMenuVisible||!e.collapseTagsTooltip,"fallback-placements":e.tagTooltip?.fallbackPlacements??["bottom","top","right","left"],effect:e.tagTooltip?.effect??e.effect,placement:e.tagTooltip?.placement??"bottom","popper-class":e.tagTooltip?.popperClass??e.popperClass,"popper-style":e.tagTooltip?.popperStyle??e.popperStyle,teleported:e.tagTooltip?.teleported??e.teleported,"append-to":e.tagTooltip?.appendTo??e.appendTo,"popper-options":e.tagTooltip?.popperOptions??e.popperOptions,transition:e.tagTooltip?.transition,"show-after":e.tagTooltip?.showAfter,"hide-after":e.tagTooltip?.hideAfter,"auto-close":e.tagTooltip?.autoClose,offset:e.tagTooltip?.offset},{default:Z(()=>[H("div",{ref:"collapseItemRef",class:T(e.nsSelect.e("selected-item"))},[U(s,{closable:!1,size:e.collapseTagSize,type:e.tagType,effect:e.tagEffect,"disable-transitions":"",style:He(e.collapseTagStyle)},{default:Z(()=>[H("span",{class:T(e.nsSelect.e("tags-text"))}," + "+ke(e.states.selected.length-e.maxCollapseTags),3)]),_:1},8,["size","type","effect","style"])],2)]),content:Z(()=>[H("div",{ref:"tagMenuRef",class:T(e.nsSelect.e("selection"))},[(x(!0),B(Fe,null,ht(e.collapseTagList,p=>(x(),B("div",{key:e.getValueKey(p),class:T(e.nsSelect.e("selected-item"))},[U(s,{class:"in-tooltip",closable:!e.selectDisabled&&!p.isDisabled,size:e.collapseTagSize,type:e.tagType,effect:e.tagEffect,"disable-transitions":"",onClose:m=>e.deleteTag(m,p)},{default:Z(()=>[H("span",{class:T(e.nsSelect.e("tags-text"))},[ee(e.$slots,"label",{index:p.index,label:p.currentLabel,value:p.value},()=>[mt(ke(p.currentLabel),1)])],2)]),_:2},1032,["closable","size","type","effect","onClose"])],2))),128))],2)]),_:3},8,["disabled","fallback-placements","effect","placement","popper-class","popper-style","teleported","append-to","popper-options","transition","show-after","hide-after","auto-close","offset"])):te("v-if",!0)]):te("v-if",!0),H("div",{class:T([e.nsSelect.e("selected-item"),e.nsSelect.e("input-wrapper"),e.nsSelect.is("hidden",!e.filterable||e.selectDisabled||!e.states.inputValue&&!e.isFocused)])},[H("input",{id:e.inputId,ref:"inputRef",value:e.states.inputValue,type:"text",name:e.name,class:T([e.nsSelect.e("input"),e.nsSelect.is(e.selectSize)]),disabled:e.selectDisabled,autocomplete:e.autocomplete,style:He(e.inputStyle),tabindex:e.tabindex,role:"combobox",readonly:!e.filterable,spellcheck:"false","aria-activedescendant":e.hoverOption?.id||"","aria-controls":e.contentId,"aria-expanded":e.dropdownMenuVisible,"aria-label":e.ariaLabel,"aria-autocomplete":"none","aria-haspopup":"listbox",onKeydown:t[0]||(t[0]=(...p)=>e.handleKeydown&&e.handleKeydown(...p)),onCompositionstart:t[1]||(t[1]=(...p)=>e.handleCompositionStart&&e.handleCompositionStart(...p)),onCompositionupdate:t[2]||(t[2]=(...p)=>e.handleCompositionUpdate&&e.handleCompositionUpdate(...p)),onCompositionend:t[3]||(t[3]=(...p)=>e.handleCompositionEnd&&e.handleCompositionEnd(...p)),onInput:t[4]||(t[4]=(...p)=>e.onInput&&e.onInput(...p)),onChange:t[5]||(t[5]=qe(()=>{},["stop"])),onClick:t[6]||(t[6]=qe((...p)=>e.toggleMenu&&e.toggleMenu(...p),["stop"]))},null,46,g8),e.filterable?(x(),B("span",{key:0,ref:"calculatorRef","aria-hidden":"true",class:T(e.nsSelect.e("input-calculator")),textContent:ke(e.states.inputValue)},null,10,b8)):te("v-if",!0)],2),e.shouldShowPlaceholder?(x(),B("div",{key:1,class:T([e.nsSelect.e("selected-item"),e.nsSelect.e("placeholder"),e.nsSelect.is("transparent",!e.hasModelValue||e.expanded&&!e.states.inputValue)])},[e.hasModelValue?ee(e.$slots,"label",{key:0,index:e.getOption(e.modelValue).index,label:e.currentPlaceholder,value:e.modelValue},()=>[H("span",null,ke(e.currentPlaceholder),1)]):(x(),B("span",y8,ke(e.currentPlaceholder),1))],2)):te("v-if",!0)],2),H("div",{ref:"suffixRef",class:T(e.nsSelect.e("suffix"))},[e.iconComponent&&!e.showClearBtn?(x(),oe(u,{key:0,class:T([e.nsSelect.e("caret"),e.nsSelect.e("icon"),e.iconReverse])},{default:Z(()=>[(x(),oe(ot(e.iconComponent)))]),_:1},8,["class"])):te("v-if",!0),e.showClearBtn&&e.clearIcon?(x(),oe(u,{key:1,class:T([e.nsSelect.e("caret"),e.nsSelect.e("icon"),e.nsSelect.e("clear")]),onClick:e.handleClearClick},{default:Z(()=>[(x(),oe(ot(e.clearIcon)))]),_:1},8,["class","onClick"])):te("v-if",!0),e.validateState&&e.validateIcon&&e.needStatusIcon?(x(),oe(u,{key:2,class:T([e.nsInput.e("icon"),e.nsInput.e("validateIcon"),e.nsInput.is("loading",e.validateState==="validating")])},{default:Z(()=>[(x(),oe(ot(e.validateIcon)))]),_:1},8,["class"])):te("v-if",!0)],2)],2)]),content:Z(()=>[U(g,{ref:"menuRef"},{default:Z(()=>[e.$slots.header?(x(),B("div",{key:0,class:T(e.nsSelect.be("dropdown","header")),onClick:t[8]||(t[8]=qe(()=>{},["stop"]))},[ee(e.$slots,"header")],2)):te("v-if",!0),st(U(h,{id:e.contentId,ref:"scrollbarRef",tag:"ul","wrap-class":e.nsSelect.be("dropdown","wrap"),"view-class":e.nsSelect.be("dropdown","list"),class:T([e.nsSelect.is("empty",e.filteredOptionsCount===0)]),role:"listbox","aria-label":e.ariaLabel,"aria-orientation":"vertical",onScroll:e.popupScroll},{default:Z(()=>[e.showNewOption?(x(),oe(c,{key:0,value:e.states.inputValue,created:!0},null,8,["value"])):te("v-if",!0),U(f,null,{default:Z(()=>[ee(e.$slots,"default",{},()=>[(x(!0),B(Fe,null,ht(e.options,(p,m)=>(x(),B(Fe,{key:m},[e.getOptions(p)?.length?(x(),oe(d,{key:0,label:e.getLabel(p),disabled:e.getDisabled(p)},{default:Z(()=>[(x(!0),B(Fe,null,ht(e.getOptions(p),b=>(x(),oe(c,rt({key:e.getValue(b)},{ref_for:!0},e.getOptionProps(b)),null,16))),128))]),_:2},1032,["label","disabled"])):(x(),oe(c,rt({key:1,ref_for:!0},e.getOptionProps(p)),null,16))],64))),128))])]),_:3})]),_:3},8,["id","wrap-class","view-class","class","aria-label","onScroll"]),[[Ot,e.states.options.size>0&&!e.loading]]),e.$slots.loading&&e.loading?(x(),B("div",{key:1,class:T(e.nsSelect.be("dropdown","loading"))},[ee(e.$slots,"loading")],2)):e.loading||e.filteredOptionsCount===0?(x(),B("div",{key:2,class:T(e.nsSelect.be("dropdown","empty"))},[ee(e.$slots,"empty",{},()=>[H("span",null,ke(e.emptyText),1)])],2)):te("v-if",!0),e.$slots.footer?(x(),B("div",{key:3,class:T(e.nsSelect.be("dropdown","footer")),onClick:t[9]||(t[9]=qe(()=>{},["stop"]))},[ee(e.$slots,"footer")],2)):te("v-if",!0)]),_:3},512)]),_:3},8,["visible","placement","teleported","popper-class","popper-style","popper-options","fallback-placements","effect","transition","persistent","append-to","show-arrow","offset","onBeforeShow"])],16)),[[v,e.handleClickOutside,e.popperRef]])}var C8=yn(m8,[["render",w8]]);const $l=nt(C8,{Option:gh,OptionGroup:bh}),Oc=Xt(gh),S8=Xt(bh),k8=(e,t)=>{const n=e.subtract(1,"month").endOf("month").date();return yl(t).map((a,o)=>n-(t-o-1))},E8=e=>yl(e.daysInMonth()).map((t,n)=>n+1),x8=e=>yl(e.length/7).map(t=>{const n=t*7;return e.slice(n,n+7)}),T8=Ce({selectedDay:{type:q(Object)},range:{type:q(Array)},date:{type:q(Object),required:!0},hideHeader:{type:Boolean}}),$8={pick:e=>et(e)};var Yu={exports:{}},O8=Yu.exports,Wb;function I8(){return Wb||(Wb=1,(function(e,t){(function(n,a){e.exports=a()})(O8,(function(){return function(n,a,o){var l=a.prototype,s=function(f){return f&&(f.indexOf?f:f.s)},r=function(f,h,g,v,p){var m=f.name?f:f.$locale(),b=s(m[h]),k=s(m[g]),w=b||k.map((function(S){return S.slice(0,v)}));if(!p)return w;var C=m.weekStart;return w.map((function(S,E){return w[(E+(C||0))%7]}))},u=function(){return o.Ls[o.locale()]},c=function(f,h){return f.formats[h]||(function(g){return g.replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,(function(v,p,m){return p||m.slice(1)}))})(f.formats[h.toUpperCase()])},d=function(){var f=this;return{months:function(h){return h?h.format("MMMM"):r(f,"months")},monthsShort:function(h){return h?h.format("MMM"):r(f,"monthsShort","months",3)},firstDayOfWeek:function(){return f.$locale().weekStart||0},weekdays:function(h){return h?h.format("dddd"):r(f,"weekdays")},weekdaysMin:function(h){return h?h.format("dd"):r(f,"weekdaysMin","weekdays",2)},weekdaysShort:function(h){return h?h.format("ddd"):r(f,"weekdaysShort","weekdays",3)},longDateFormat:function(h){return c(f.$locale(),h)},meridiem:this.$locale().meridiem,ordinal:this.$locale().ordinal}};l.localeData=function(){return d.bind(this)()},o.localeData=function(){var f=u();return{firstDayOfWeek:function(){return f.weekStart||0},weekdays:function(){return o.weekdays()},weekdaysShort:function(){return o.weekdaysShort()},weekdaysMin:function(){return o.weekdaysMin()},months:function(){return o.months()},monthsShort:function(){return o.monthsShort()},longDateFormat:function(h){return c(f,h)},meridiem:f.meridiem,ordinal:f.ordinal}},o.months=function(){return r(u(),"months")},o.monthsShort=function(){return r(u(),"monthsShort","months",3)},o.weekdays=function(f){return r(u(),"weekdays",null,null,f)},o.weekdaysShort=function(f){return r(u(),"weekdaysShort","weekdays",3,f)},o.weekdaysMin=function(f){return r(u(),"weekdaysMin","weekdays",2,f)}}}))})(Yu)),Yu.exports}var N8=I8();const hS=al(N8),M8=(e,t)=>{tt.extend(hS);const n=tt.localeData().firstDayOfWeek(),{t:a,lang:o}=bt(),l=tt().locale(o.value),s=y(()=>!!e.range&&!!e.range.length),r=y(()=>{let h=[];if(s.value){const[g,v]=e.range,p=yl(v.date()-g.date()+1).map(k=>({text:g.date()+k,type:"current"}));let m=p.length%7;m=m===0?0:7-m;const b=yl(m).map((k,w)=>({text:w+1,type:"next"}));h=p.concat(b)}else{const g=e.date.startOf("month").day(),v=k8(e.date,(g-n+7)%7).map(b=>({text:b,type:"prev"})),p=E8(e.date).map(b=>({text:b,type:"current"}));h=[...v,...p];const m=yl(7-(h.length%7||7)).map((b,k)=>({text:k+1,type:"next"}));h=h.concat(m)}return x8(h)}),u=y(()=>{const h=n;return h===0?Xd.map(g=>a(`el.datepicker.weeks.${g}`)):Xd.slice(h).concat(Xd.slice(0,h)).map(g=>a(`el.datepicker.weeks.${g}`))}),c=(h,g)=>{switch(g){case"prev":return e.date.startOf("month").subtract(1,"month").date(h);case"next":return e.date.startOf("month").add(1,"month").date(h);case"current":return e.date.date(h)}};return{now:l,isInRange:s,rows:r,weekDays:u,getFormattedDate:c,handlePickDay:({text:h,type:g})=>{t("pick",c(h,g))},getSlotData:({text:h,type:g})=>{const v=c(h,g);return{isSelected:v.isSame(e.selectedDay),type:`${g}-month`,day:v.format("YYYY-MM-DD"),date:v.toDate()}}}},P8={key:0},R8=["onClick"];var A8=le({name:"DateTable",__name:"date-table",props:T8,emits:$8,setup(e,{expose:t,emit:n}){const a=e,{isInRange:o,now:l,rows:s,weekDays:r,getFormattedDate:u,handlePickDay:c,getSlotData:d}=M8(a,n),f=fe("calendar-table"),h=fe("calendar-day"),g=({text:v,type:p})=>{const m=[p];if(p==="current"){const b=u(v,p);b.isSame(a.selectedDay,"day")&&m.push(h.is("selected")),b.isSame(l,"day")&&m.push(h.is("today"))}return m};return t({getFormattedDate:u}),(v,p)=>(x(),B("table",{class:T([i(f).b(),i(f).is("range",i(o))]),cellspacing:"0",cellpadding:"0"},[e.hideHeader?te("v-if",!0):(x(),B("thead",P8,[H("tr",null,[(x(!0),B(Fe,null,ht(i(r),m=>(x(),B("th",{key:m,scope:"col"},ke(m),1))),128))])])),H("tbody",null,[(x(!0),B(Fe,null,ht(i(s),(m,b)=>(x(),B("tr",{key:b,class:T({[i(f).e("row")]:!0,[i(f).em("row","hide-border")]:b===0&&e.hideHeader})},[(x(!0),B(Fe,null,ht(m,(k,w)=>(x(),B("td",{key:w,class:T(g(k)),onClick:C=>i(c)(k)},[H("div",{class:T(i(h).b())},[ee(v.$slots,"date-cell",{data:i(d)(k)},()=>[H("span",null,ke(k.text),1)])],2)],10,R8))),128))],2))),128))])],2))}}),jb=A8;const _8=(e,t)=>{const n=e.endOf("month"),a=t.startOf("month"),o=n.isSame(a,"week")?a.add(1,"week"):a;return[[e,n],[o.startOf("week"),t]]},L8=(e,t)=>{const n=e.endOf("month"),a=e.add(1,"month").startOf("month"),o=n.isSame(a,"week")?a.add(1,"week"):a,l=o.endOf("month"),s=t.startOf("month"),r=l.isSame(s,"week")?s.add(1,"week"):s;return[[e,n],[o.startOf("week"),l],[r.startOf("week"),t]]},D8=(e,t,n)=>{const{lang:a}=bt(),o=R(),l=tt().locale(a.value),s=y({get(){return e.modelValue?u.value:o.value},set(b){if(!b)return;o.value=b;const k=b.toDate();t(pn,k),t(Qe,k)}}),r=y(()=>{if(!e.range||!ye(e.range)||e.range.length!==2||e.range.some(w=>!wl(w)))return[];const[b,k]=e.range.map(w=>tt(w).locale(a.value));return b.isAfter(k)?(ut(n,"end time should be greater than start time"),[]):b.isSame(k,"month")?g(b,k):b.add(1,"month").month()!==k.month()?(ut(n,"start time and end time interval must not exceed two months"),[]):g(b,k)}),u=y(()=>e.modelValue?tt(e.modelValue).locale(a.value):s.value||(r.value.length?r.value[0][0]:l)),c=y(()=>u.value.subtract(1,"month").date(1)),d=y(()=>u.value.add(1,"month").date(1)),f=y(()=>u.value.subtract(1,"year").date(1)),h=y(()=>u.value.add(1,"year").date(1)),g=(b,k)=>{const w=b.startOf("week"),C=k.endOf("week"),S=w.get("month"),E=C.get("month");return S===E?[[w,C]]:(S+1)%12===E?_8(w,C):S+2===E||(S+1)%11===E?L8(w,C):(ut(n,"start time and end time interval must not exceed two months"),[])},v=b=>{s.value=b},p=b=>{const k={"prev-month":c.value,"next-month":d.value,"prev-year":f.value,"next-year":h.value,today:l}[b];k.isSame(u.value,"day")||v(k)};return{calculateValidatedDateRange:g,date:u,realSelectedDay:s,pickDay:v,selectDate:p,validatedRange:r,handleDateChange:b=>{b==="today"?p("today"):v(b)}}},B8=Ce({date:{type:q(Object),required:!0},formatter:{type:q(Function)}}),V8={"date-change":e=>et(e)||_e(e)};var F8=le({name:"SelectController",__name:"select-controller",props:B8,emits:V8,setup(e,{emit:t}){const n=e,a=t,o=fe("calendar-select"),{t:l,lang:s}=bt(),r=Array.from({length:12},(v,p)=>{const m=p+1;return{value:m,label:Be(n.formatter)?n.formatter(m,"month"):m}}),u=y(()=>n.date.year()),c=y(()=>n.date.month()+1),d=y(()=>{const v=[];for(let p=-10;p<10;p++){const m=u.value+p;if(m>0){const b=Be(n.formatter)?n.formatter(m,"year"):m;v.push({value:m,label:b})}}return v}),f=v=>{a("date-change",tt(new Date(v,c.value-1,1)).locale(s.value))},h=v=>{a("date-change",tt(new Date(u.value,v-1,1)).locale(s.value))},g=()=>{a("date-change","today")};return(v,p)=>(x(),B(Fe,null,[U(i($l),{"model-value":u.value,size:"small",class:T(i(o).e("year")),"validate-event":!1,options:d.value,onChange:f},null,8,["model-value","class","options"]),U(i($l),{"model-value":c.value,size:"small",class:T(i(o).e("month")),"validate-event":!1,options:i(r),onChange:h},null,8,["model-value","class","options"]),U(i(Sn),{size:"small",onClick:g},{default:Z(()=>[mt(ke(i(l)("el.datepicker.today")),1)]),_:1})],64))}}),z8=F8;const Yb="ElCalendar";var H8=le({name:Yb,__name:"calendar",props:vD,emits:hD,setup(e,{expose:t,emit:n}){const a=fe("calendar"),{calculateValidatedDateRange:o,date:l,pickDay:s,realSelectedDay:r,selectDate:u,validatedRange:c,handleDateChange:d}=D8(e,n,Yb),{t:f}=bt(),h=y(()=>{const g=`el.datepicker.month${l.value.format("M")}`;return`${l.value.year()} ${f("el.datepicker.year")} ${f(g)}`});return t({selectedDay:r,pickDay:s,selectDate:u,calculateValidatedDateRange:o}),(g,v)=>(x(),B("div",{class:T(i(a).b())},[H("div",{class:T(i(a).e("header"))},[ee(g.$slots,"header",{date:h.value},()=>[H("div",{class:T(i(a).e("title"))},ke(h.value),3),i(c).length===0&&e.controllerType==="button"?(x(),B("div",{key:0,class:T(i(a).e("button-group"))},[U(i(UC),null,{default:Z(()=>[U(i(Sn),{size:"small",onClick:v[0]||(v[0]=p=>i(u)("prev-month"))},{default:Z(()=>[mt(ke(i(f)("el.datepicker.prevMonth")),1)]),_:1}),U(i(Sn),{size:"small",onClick:v[1]||(v[1]=p=>i(u)("today"))},{default:Z(()=>[mt(ke(i(f)("el.datepicker.today")),1)]),_:1}),U(i(Sn),{size:"small",onClick:v[2]||(v[2]=p=>i(u)("next-month"))},{default:Z(()=>[mt(ke(i(f)("el.datepicker.nextMonth")),1)]),_:1})]),_:1})],2)):i(c).length===0&&e.controllerType==="select"?(x(),B("div",{key:1,class:T(i(a).e("select-controller"))},[U(z8,{date:i(l),formatter:e.formatter,onDateChange:i(d)},null,8,["date","formatter","onDateChange"])],2)):te("v-if",!0)])],2),i(c).length===0?(x(),B("div",{key:0,class:T(i(a).e("body"))},[U(jb,{date:i(l),"selected-day":i(r),onPick:i(s)},Qn({_:2},[g.$slots["date-cell"]?{name:"date-cell",fn:Z(p=>[ee(g.$slots,"date-cell",Lo(Do(p)))]),key:"0"}:void 0]),1032,["date","selected-day","onPick"])],2)):(x(),B("div",{key:1,class:T(i(a).e("body"))},[(x(!0),B(Fe,null,ht(i(c),(p,m)=>(x(),oe(jb,{key:m,date:p[0],"selected-day":i(r),range:p,"hide-header":m!==0,onPick:i(s)},Qn({_:2},[g.$slots["date-cell"]?{name:"date-cell",fn:Z(b=>[ee(g.$slots,"date-cell",rt({ref_for:!0},b))]),key:"0"}:void 0]),1032,["date","selected-day","range","hide-header","onPick"]))),128))],2))],2))}}),K8=H8;const W8=nt(K8),j8=Ce({header:{type:String,default:""},footer:{type:String,default:""},bodyStyle:{type:q([String,Object,Array]),default:""},headerClass:String,bodyClass:String,footerClass:String,shadow:{type:String,values:["always","hover","never"],default:void 0}});var Y8=le({name:"ElCard",__name:"card",props:j8,setup(e){const t=nl("card"),n=fe("card");return(a,o)=>(x(),B("div",{class:T([i(n).b(),i(n).is(`${e.shadow||i(t)?.shadow||"always"}-shadow`)])},[a.$slots.header||e.header?(x(),B("div",{key:0,class:T([i(n).e("header"),e.headerClass])},[ee(a.$slots,"header",{},()=>[mt(ke(e.header),1)])],2)):te("v-if",!0),H("div",{class:T([i(n).e("body"),e.bodyClass]),style:He(e.bodyStyle)},[ee(a.$slots,"default")],6),a.$slots.footer||e.footer?(x(),B("div",{key:1,class:T([i(n).e("footer"),e.footerClass])},[ee(a.$slots,"footer",{},()=>[mt(ke(e.footer),1)])],2)):te("v-if",!0)],2))}}),U8=Y8;const q8=nt(U8),G8=Ce({initialIndex:{type:Number,default:0},height:{type:String,default:""},trigger:{type:String,values:["hover","click"],default:"hover"},autoplay:{type:Boolean,default:!0},interval:{type:Number,default:3e3},indicatorPosition:{type:String,values:["","none","outside"],default:""},arrow:{type:String,values:["always","hover","never"],default:"hover"},type:{type:String,values:["","card"],default:""},cardScale:{type:Number,default:.83},loop:{type:Boolean,default:!0},direction:{type:String,values:["horizontal","vertical"],default:"horizontal"},pauseOnHover:{type:Boolean,default:!0},motionBlur:Boolean}),X8={change:(e,t)=>[e,t].every(ze)},mS=Symbol("carouselContextKey"),vi="ElCarouselItem",Z8=Ce({name:{type:String,default:""},label:{type:[String,Number],default:""}}),Ub=300,J8=(e,t,n)=>{const{children:a,addChild:o,removeChild:l,ChildrenSorter:s}=Cd(it(),vi),r=sn(),u=R(-1),c=R(null),d=R(!1),f=R(),h=R(0),g=R(!0),v=y(()=>e.arrow!=="never"&&!i(b)),p=y(()=>a.value.some(Q=>Q.props.label.toString().length>0)),m=y(()=>e.type==="card"),b=y(()=>e.direction==="vertical"),k=y(()=>e.height!=="auto"?{height:e.height}:{height:`${h.value}px`,overflow:"hidden"}),w=vl(Q=>{N(Q)},Ub,{trailing:!0}),C=vl(Q=>{P(Q)},Ub),S=Q=>g.value?u.value<=1?Q<=1:Q>1:!0;function E(){c.value&&(clearInterval(c.value),c.value=null)}function O(){e.interval<=0||!e.autoplay||c.value||(c.value=setInterval(()=>$(),e.interval))}const $=()=>{u.valueie.props.name===Q);ge.length>0&&(Q=a.value.indexOf(ge[0]))}if(Q=Number(Q),Number.isNaN(Q)||Q!==Math.floor(Q)){ut(n,"index must be integer.");return}const ve=a.value.length,ue=u.value;Q<0?u.value=e.loop?ve-1:0:Q>=ve?u.value=e.loop?0:ve-1:u.value=Q,ue===u.value&&I(ue),D()}function I(Q){a.value.forEach((ve,ue)=>{ve.translateItem(ue,u.value,Q)})}function _(Q,ve){const ue=i(a),ge=ue.length;if(ge===0||!Q.states.inStage)return!1;const ie=ve+1,ae=ve-1,ne=ge-1,z=ue[ne].states.active,J=ue[0].states.active,se=ue[ie]?.states?.active,ce=ue[ae]?.states?.active;return ve===ne&&J||se?"left":ve===0&&z||ce?"right":!1}function A(){d.value=!0,e.pauseOnHover&&E()}function F(){d.value=!1,O()}function K(Q){i(b)||a.value.forEach((ve,ue)=>{Q===_(ve,ue)&&(ve.states.hover=!0)})}function Y(){i(b)||a.value.forEach(Q=>{Q.states.hover=!1})}function W(Q){u.value=Q}function P(Q){e.trigger==="hover"&&Q!==u.value&&(u.value=Q)}function M(){N(u.value-1)}function L(){N(u.value+1)}function D(){E(),(!e.pauseOnHover||!d.value)&&O()}function V(Q){e.height==="auto"&&(h.value=Q)}function G(){const Q=r.default?.();if(!Q)return null;const ve=va(Q).filter(ue=>zt(ue)&&ue.type.name===vi);return ve?.length===2&&e.loop&&!m.value?(g.value=!0,ve):(g.value=!1,null)}re(()=>u.value,(Q,ve)=>{I(ve),g.value&&(Q=Q%2,ve=ve%2),ve>-1&&t(vt,Q,ve)});const j=y({get:()=>g.value?u.value%2:u.value,set:Q=>u.value=Q});re(()=>e.autoplay,Q=>{Q?O():E()}),re(()=>e.loop,()=>{N(u.value)}),re(()=>e.interval,()=>{D()});const X=jt();return ct(()=>{re(()=>a.value,()=>{a.value.length>0&&N(e.initialIndex)},{immediate:!0}),X.value=Ut(f.value,()=>{I()}),O()}),Rt(()=>{E(),f.value&&X.value&&X.value.stop()}),gt(mS,{root:f,isCardType:m,isVertical:b,items:a,loop:e.loop,cardScale:e.cardScale,addItem:o,removeItem:l,setActiveItem:N,setContainerHeight:V}),{root:f,activeIndex:u,exposeActiveIndex:j,arrowDisplay:v,hasLabel:p,hover:d,isCardType:m,items:a,isVertical:b,containerStyle:k,isItemsTwoLength:g,handleButtonEnter:K,handleButtonLeave:Y,handleIndicatorClick:W,handleMouseEnter:A,handleMouseLeave:F,setActiveItem:N,prev:M,next:L,PlaceholderItem:G,isTwoLengthShow:S,ItemsSorter:s,throttledArrowClick:w,throttledIndicatorHover:C}},Q8=["aria-label"],eB=["aria-label"],tB=["onMouseenter","onClick"],nB=["aria-label"],aB={key:0},oB={key:2,xmlns:"http://www.w3.org/2000/svg",version:"1.1",style:{display:"none"}},qb="ElCarousel";var lB=le({name:qb,__name:"carousel",props:G8,emits:X8,setup(e,{expose:t,emit:n}){const a=e,{root:o,activeIndex:l,exposeActiveIndex:s,arrowDisplay:r,hasLabel:u,hover:c,isCardType:d,items:f,isVertical:h,containerStyle:g,handleButtonEnter:v,handleButtonLeave:p,handleIndicatorClick:m,handleMouseEnter:b,handleMouseLeave:k,setActiveItem:w,prev:C,next:S,PlaceholderItem:E,isTwoLengthShow:O,ItemsSorter:$,throttledArrowClick:N,throttledIndicatorHover:I}=J8(a,n,qb),_=fe("carousel"),{t:A}=bt(),F=y(()=>{const P=[_.b(),_.m(a.direction)];return i(d)&&P.push(_.m("card")),P.push(_.is("vertical-outside",i(h)&&a.indicatorPosition==="outside")),P}),K=y(()=>{const P=[_.e("indicators"),_.em("indicators",a.direction)];return i(u)&&P.push(_.em("indicators","labels")),a.indicatorPosition==="outside"&&P.push(_.em("indicators","outside")),i(h)&&P.push(_.em("indicators","right")),P});function Y(P){if(!a.motionBlur)return;const M=i(h)?`${_.namespace.value}-transitioning-vertical`:`${_.namespace.value}-transitioning`;P.currentTarget.classList.add(M)}function W(P){if(!a.motionBlur)return;const M=i(h)?`${_.namespace.value}-transitioning-vertical`:`${_.namespace.value}-transitioning`;P.currentTarget.classList.remove(M)}return t({activeIndex:s,setActiveItem:w,prev:C,next:S}),(P,M)=>(x(),B("div",{ref_key:"root",ref:o,class:T(F.value),onMouseenter:M[6]||(M[6]=qe((...L)=>i(b)&&i(b)(...L),["stop"])),onMouseleave:M[7]||(M[7]=qe((...L)=>i(k)&&i(k)(...L),["stop"]))},[i(r)?(x(),oe(Mn,{key:0,name:"carousel-arrow-left",persisted:""},{default:Z(()=>[st(H("button",{type:"button",class:T([i(_).e("arrow"),i(_).em("arrow","left")]),"aria-label":i(A)("el.carousel.leftArrow"),onMouseenter:M[0]||(M[0]=L=>i(v)("left")),onMouseleave:M[1]||(M[1]=(...L)=>i(p)&&i(p)(...L)),onClick:M[2]||(M[2]=qe(L=>i(N)(i(l)-1),["stop"]))},[U(i(Le),null,{default:Z(()=>[U(i(Uo))]),_:1})],42,Q8),[[Ot,(e.arrow==="always"||i(c))&&(e.loop||i(l)>0)]])]),_:1})):te("v-if",!0),i(r)?(x(),oe(Mn,{key:1,name:"carousel-arrow-right",persisted:""},{default:Z(()=>[st(H("button",{type:"button",class:T([i(_).e("arrow"),i(_).em("arrow","right")]),"aria-label":i(A)("el.carousel.rightArrow"),onMouseenter:M[3]||(M[3]=L=>i(v)("right")),onMouseleave:M[4]||(M[4]=(...L)=>i(p)&&i(p)(...L)),onClick:M[5]||(M[5]=qe(L=>i(N)(i(l)+1),["stop"]))},[U(i(Le),null,{default:Z(()=>[U(i(Yn))]),_:1})],42,eB),[[Ot,(e.arrow==="always"||i(c))&&(e.loop||i(l)[e.indicatorPosition!=="none"?(x(),B("ul",{key:0,class:T(K.value)},[(x(!0),B(Fe,null,ht(i(f),(L,D)=>st((x(),B("li",{key:D,class:T([i(_).e("indicator"),i(_).em("indicator",e.direction),i(_).is("active",D===i(l))]),onMouseenter:V=>i(I)(D),onClick:qe(V=>i(m)(D),["stop"])},[H("button",{class:T(i(_).e("button")),"aria-label":i(A)("el.carousel.indicator",{index:D+1})},[i(u)?(x(),B("span",aB,ke(L.props.label),1)):te("v-if",!0)],10,nB)],42,tB)),[[Ot,i(O)(D)]])),128))],2)):te("v-if",!0)]),_:1}),e.motionBlur?(x(),B("svg",oB,[...M[8]||(M[8]=[H("defs",null,[H("filter",{id:"elCarouselHorizontal"},[H("feGaussianBlur",{in:"SourceGraphic",stdDeviation:"12,0"})]),H("filter",{id:"elCarouselVertical"},[H("feGaussianBlur",{in:"SourceGraphic",stdDeviation:"0,10"})])],-1)])])):te("v-if",!0)],34))}}),sB=lB;const rB=e=>{const t=Re(mS),n=it();t||ut(vi,"usage: "),n||ut(vi,"compositional hook can only be invoked inside setups");const a=R(),o=R(!1),l=R(0),s=R(1),r=R(!1),u=R(!1),c=R(!1),d=R(!1),{isCardType:f,isVertical:h,cardScale:g}=t;function v(C,S,E){const O=E-1,$=S-1,N=S+1,I=E/2;return S===0&&C===O?-1:S===O&&C===0?E:C<$&&S-C>=I?E+1:C>N&&C-S>=I?-2:C}function p(C,S){const E=i(h)?t.root.value?.offsetHeight||0:t.root.value?.offsetWidth||0;return c.value?E*((2-g)*(C-S)+1)/4:C{const O=i(f),$=t.items.value.length??NaN,N=C===S;!O&&!St(E)&&(d.value=N||C===E),!N&&$>2&&t.loop&&(C=v(C,S,$));const I=i(h);r.value=N,O?(c.value=Math.round(Math.abs(C-S))<=1,l.value=p(C,S),s.value=i(r)?1:g):l.value=m(C,S,I),u.value=!0,N&&a.value&&t.setContainerHeight(a.value.offsetHeight)};function k(){if(t&&i(f)){const C=t.items.value.findIndex(({uid:S})=>S===n.uid);t.setActiveItem(C)}}const w={props:e,states:Nt({hover:o,translate:l,scale:s,active:r,ready:u,inStage:c,animating:d}),uid:n.uid,getVnode:()=>n.vnode,translateItem:b};return t.addItem(w),Rt(()=>{t.removeItem(w)}),{carouselItemRef:a,active:r,animating:d,hover:o,inStage:c,isVertical:h,translate:l,isCardType:f,scale:s,ready:u,handleItemClick:k}};var iB=le({name:vi,__name:"carousel-item",props:Z8,setup(e){const t=e,n=fe("carousel"),{carouselItemRef:a,active:o,animating:l,hover:s,inStage:r,isVertical:u,translate:c,isCardType:d,scale:f,ready:h,handleItemClick:g}=rB(t),v=y(()=>[n.e("item"),n.is("active",o.value),n.is("in-stage",r.value),n.is("hover",s.value),n.is("animating",l.value),{[n.em("item","card")]:d.value,[n.em("item","card-vertical")]:d.value&&u.value}]),p=y(()=>({transform:[`${`translate${i(u)?"Y":"X"}`}(${i(c)}px)`,`scale(${i(f)})`].join(" ")}));return(m,b)=>st((x(),B("div",{ref_key:"carouselItemRef",ref:a,class:T(v.value),style:He(p.value),onClick:b[0]||(b[0]=(...k)=>i(g)&&i(g)(...k))},[i(d)?st((x(),B("div",{key:0,class:T(i(n).e("mask"))},null,2)),[[Ot,!i(o)]]):te("v-if",!0),ee(m.$slots,"default")],6)),[[Ot,i(h)]])}}),gS=iB;const uB=nt(sB,{CarouselItem:gS}),cB=Xt(gS),bS=Ce({modelValue:{type:q([Number,String,Array,Object])},options:{type:q(Array),default:()=>[]},props:{type:q(Object),default:()=>({})}}),dB={expandTrigger:"click",multiple:!1,checkStrictly:!1,emitPath:!0,lazy:!1,lazyLoad:Pt,value:"value",label:"label",children:"children",leaf:"leaf",disabled:"disabled",hoverThreshold:500,checkOnClickNode:!1,checkOnClickLeaf:!0,showPrefix:!0},fB=Ce({...bS,border:{type:Boolean,default:!0},renderLabel:{type:Function}}),Gb=e=>!0,pB={[Qe]:Gb,[vt]:Gb,close:()=>!0,"expand-change":e=>e},vB=e=>y(()=>({...dB,...e.props})),yS={modelValue:{type:[Number,String,Boolean],default:void 0},label:{type:[String,Boolean,Number,Object],default:void 0},value:{type:[String,Boolean,Number,Object],default:void 0},indeterminate:Boolean,disabled:{type:Boolean,default:void 0},checked:Boolean,name:{type:String,default:void 0},trueValue:{type:[String,Number],default:void 0},falseValue:{type:[String,Number],default:void 0},trueLabel:{type:[String,Number],default:void 0},falseLabel:{type:[String,Number],default:void 0},id:{type:String,default:void 0},border:Boolean,size:bn,tabindex:[String,Number],validateEvent:{type:Boolean,default:!0},ariaLabel:String,...Un(["ariaControls"])},wS={[Qe]:e=>_e(e)||ze(e)||Dt(e),change:e=>_e(e)||ze(e)||Dt(e)},mr=Symbol("checkboxGroupContextKey"),hB=Ce({modelValue:{type:q(Array),default:()=>[]},disabled:{type:Boolean,default:void 0},min:Number,max:Number,size:bn,fill:String,textColor:String,tag:{type:String,default:"div"},validateEvent:{type:Boolean,default:!0},options:{type:q(Array)},props:{type:q(Object),default:()=>CS},type:{type:String,values:["checkbox","button"],default:"checkbox"},...Un(["ariaLabel"])}),mB={[Qe]:e=>ye(e),change:e=>ye(e)},CS={label:"label",value:"value",disabled:"disabled"},gB=({model:e,isChecked:t})=>{const n=Re(mr,void 0),a=Re(vs,void 0),o=y(()=>{const l=n?.max?.value,s=n?.min?.value;return!St(l)&&e.value.length>=l&&!t.value||!St(s)&&e.value.length<=s&&t.value});return{isDisabled:tn(y(()=>n===void 0?a?.disabled??o.value:n.disabled?.value||o.value)),isLimitDisabled:o}},bB=(e,{model:t,isLimitExceeded:n,hasOwnLabel:a,isDisabled:o,isLabeledByFormItem:l})=>{const s=Re(mr,void 0),{formItem:r}=On(),{emit:u}=it();function c(v){return[!0,e.trueValue,e.trueLabel].includes(v)?e.trueValue??e.trueLabel??!0:e.falseValue??e.falseLabel??!1}function d(v,p){u(vt,c(v),p)}function f(v){if(n.value)return;const p=v.target;u(vt,c(p.checked),v)}async function h(v){n.value||!a.value&&!o.value&&l.value&&(v.composedPath().some(p=>p.tagName==="LABEL")||(t.value=c([!1,e.falseValue,e.falseLabel].includes(t.value)),await Oe(),d(t.value,v)))}const g=y(()=>s?.validateEvent||e.validateEvent);return re(()=>e.modelValue,()=>{g.value&&r?.validate("change").catch(v=>ut(v))}),{handleChange:f,onClickRoot:h}},yB=e=>{const t=R(!1),{emit:n}=it(),a=Re(mr,void 0),o=y(()=>St(a)===!1),l=R(!1),s=y({get(){return o.value?a?.modelValue?.value:e.modelValue??t.value},set(r){o.value&&ye(r)?(l.value=a?.max?.value!==void 0&&r.length>a?.max.value&&r.length>s.value.length,l.value===!1&&a?.changeEvent?.(r)):(n(Qe,r),t.value=r)}});return{model:s,isGroup:o,isLimitExceeded:l}},wB=(e,t,{model:n})=>{const a=Re(mr,void 0),o=R(!1),l=y(()=>la(e.value)?e.label:e.value),s=y(()=>{const r=n.value;return Dt(r)?r:ye(r)?et(l.value)?r.map(Ht).some(u=>Jt(u,l.value)):r.map(Ht).includes(l.value):r!=null?r===e.trueValue||r===e.trueLabel:!!r});return{checkboxButtonSize:vn(y(()=>a?.size?.value),{prop:!0}),isChecked:s,isFocused:o,checkboxSize:vn(y(()=>a?.size?.value)),hasOwnLabel:y(()=>!!t.default||!la(l.value)),actualValue:l}},SS=(e,t)=>{const{formItem:n}=On(),{model:a,isGroup:o,isLimitExceeded:l}=yB(e),{isFocused:s,isChecked:r,checkboxButtonSize:u,checkboxSize:c,hasOwnLabel:d,actualValue:f}=wB(e,t,{model:a}),{isDisabled:h}=gB({model:a,isChecked:r}),{inputId:g,isLabeledByFormItem:v}=ya(e,{formItemContext:n,disableIdGeneration:d,disableIdManagement:o}),{handleChange:p,onClickRoot:m}=bB(e,{model:a,isLimitExceeded:l,hasOwnLabel:d,isDisabled:h,isLabeledByFormItem:v});return(()=>{function k(){ye(a.value)&&!a.value.includes(f.value)?a.value.push(f.value):a.value=e.trueValue??e.trueLabel??!0}e.checked&&k()})(),co({from:"label act as value",replacement:"value",version:"3.0.0",scope:"el-checkbox",ref:"https://element-plus.org/en-US/component/checkbox.html"},y(()=>o.value&&la(e.value))),co({from:"true-label",replacement:"true-value",version:"3.0.0",scope:"el-checkbox",ref:"https://element-plus.org/en-US/component/checkbox.html"},y(()=>!!e.trueLabel)),co({from:"false-label",replacement:"false-value",version:"3.0.0",scope:"el-checkbox",ref:"https://element-plus.org/en-US/component/checkbox.html"},y(()=>!!e.falseLabel)),{inputId:g,isLabeledByFormItem:v,isChecked:r,isDisabled:h,isFocused:s,checkboxButtonSize:u,checkboxSize:c,hasOwnLabel:d,model:a,actualValue:f,handleChange:p,onClickRoot:m}},CB=["id","indeterminate","name","tabindex","disabled"];var SB=le({name:"ElCheckbox",__name:"checkbox",props:yS,emits:wS,setup(e){const t=e,{inputId:n,isLabeledByFormItem:a,isChecked:o,isDisabled:l,isFocused:s,checkboxSize:r,hasOwnLabel:u,model:c,actualValue:d,handleChange:f,onClickRoot:h}=SS(t,sn()),g=y(()=>t.trueValue||t.falseValue||t.trueLabel||t.falseLabel?{"true-value":t.trueValue??t.trueLabel??!0,"false-value":t.falseValue??t.falseLabel??!1}:{value:d.value}),v=fe("checkbox"),p=y(()=>[v.b(),v.m(r.value),v.is("disabled",l.value),v.is("bordered",t.border),v.is("checked",o.value)]),m=y(()=>[v.e("input"),v.is("disabled",l.value),v.is("checked",o.value),v.is("indeterminate",t.indeterminate),v.is("focus",s.value)]);return(b,k)=>(x(),oe(ot(!i(u)&&i(a)?"span":"label"),{for:!i(u)&&i(a)?null:i(n),class:T(p.value),"aria-controls":e.indeterminate?e.ariaControls:null,"aria-checked":e.indeterminate?"mixed":void 0,"aria-label":e.ariaLabel,onClick:i(h)},{default:Z(()=>[H("span",{class:T(m.value)},[st(H("input",rt({id:i(n),"onUpdate:modelValue":k[0]||(k[0]=w=>Yt(c)?c.value=w:null),class:i(v).e("original"),type:"checkbox",indeterminate:e.indeterminate,name:e.name,tabindex:e.tabindex,disabled:i(l)},g.value,{onChange:k[1]||(k[1]=(...w)=>i(f)&&i(f)(...w)),onFocus:k[2]||(k[2]=w=>s.value=!0),onBlur:k[3]||(k[3]=w=>s.value=!1),onClick:k[4]||(k[4]=qe(()=>{},["stop"]))}),null,16,CB),[[xw,i(c)]]),H("span",{class:T(i(v).e("inner"))},null,2)],2),i(u)?(x(),B("span",{key:0,class:T(i(v).e("label"))},[ee(b.$slots,"default"),b.$slots.default?te("v-if",!0):(x(),B(Fe,{key:0},[mt(ke(e.label),1)],64))],2)):te("v-if",!0)]),_:3},8,["for","class","aria-controls","aria-checked","aria-label","onClick"]))}}),kS=SB;const kB=["name","tabindex","disabled"];var EB=le({name:"ElCheckboxButton",__name:"checkbox-button",props:yS,emits:wS,setup(e){const t=e,{isFocused:n,isChecked:a,isDisabled:o,checkboxButtonSize:l,model:s,actualValue:r,handleChange:u}=SS(t,sn()),c=y(()=>t.trueValue||t.falseValue||t.trueLabel||t.falseLabel?{"true-value":t.trueValue??t.trueLabel??!0,"false-value":t.falseValue??t.falseLabel??!1}:{value:r.value}),d=Re(mr,void 0),f=fe("checkbox"),h=y(()=>{const v=d?.fill?.value??"";return{backgroundColor:v,borderColor:v,color:d?.textColor?.value??"",boxShadow:v?`-1px 0 0 0 ${v}`:void 0}}),g=y(()=>[f.b("button"),f.bm("button",l.value),f.is("disabled",o.value),f.is("checked",a.value),f.is("focus",n.value)]);return(v,p)=>(x(),B("label",{class:T(g.value)},[st(H("input",rt({"onUpdate:modelValue":p[0]||(p[0]=m=>Yt(s)?s.value=m:null),class:i(f).be("button","original"),type:"checkbox",name:e.name,tabindex:e.tabindex,disabled:i(o)},c.value,{onChange:p[1]||(p[1]=(...m)=>i(u)&&i(u)(...m)),onFocus:p[2]||(p[2]=m=>n.value=!0),onBlur:p[3]||(p[3]=m=>n.value=!1),onClick:p[4]||(p[4]=qe(()=>{},["stop"]))}),null,16,kB),[[xw,i(s)]]),v.$slots.default||e.label?(x(),B("span",{key:0,class:T(i(f).be("button","inner")),style:He(i(a)?h.value:void 0)},[ee(v.$slots,"default",{},()=>[mt(ke(e.label),1)])],6)):te("v-if",!0)],2))}}),yh=EB,xB=le({name:"ElCheckboxGroup",__name:"checkbox-group",props:hB,emits:mB,setup(e,{emit:t}){const n=e,a=t,o=fe("checkbox"),l=tn(),{formItem:s}=On(),{inputId:r,isLabeledByFormItem:u}=ya(n,{formItemContext:s}),c=async v=>{a(Qe,v),await Oe(),a(vt,v)},d=y({get(){return n.modelValue},set(v){c(v)}}),f=y(()=>({...CS,...n.props})),h=v=>{const{label:p,value:m,disabled:b}=f.value,k={label:v[p],value:v[m],disabled:v[b]};return{...Ri(v,[p,m,b]),...k}},g=y(()=>n.type==="button"?yh:kS);return gt(mr,{...Wo(En(n),["size","min","max","validateEvent","fill","textColor"]),disabled:l,modelValue:d,changeEvent:c}),re(()=>n.modelValue,(v,p)=>{n.validateEvent&&!Jt(v,p)&&s?.validate("change").catch(m=>ut(m))}),(v,p)=>(x(),oe(ot(e.tag),{id:i(r),class:T(i(o).b("group")),role:"group","aria-label":i(u)?void 0:e.ariaLabel||"checkbox-group","aria-labelledby":i(u)?i(s)?.labelId:void 0},{default:Z(()=>[ee(v.$slots,"default",{},()=>[(x(!0),B(Fe,null,ht(e.options,(m,b)=>(x(),oe(ot(g.value),rt({key:b},{ref_for:!0},h(m)),null,16))),128))])]),_:3},8,["id","class","aria-label","aria-labelledby"]))}}),ES=xB;const ja=nt(kS,{CheckboxButton:yh,CheckboxGroup:ES}),TB=Xt(yh),wh=Xt(ES),xS=Ce({modelValue:{type:[String,Number,Boolean],default:void 0},size:bn,disabled:{type:Boolean,default:void 0},label:{type:[String,Number,Boolean],default:void 0},value:{type:[String,Number,Boolean],default:void 0},name:{type:String,default:void 0}}),$B=Ce({...xS,border:Boolean}),TS={[Qe]:e=>_e(e)||ze(e)||Dt(e),[vt]:e=>_e(e)||ze(e)||Dt(e)},$S=Symbol("radioGroupKey"),OB=Ce({...xS}),OS={label:"label",value:"value",disabled:"disabled"},IB=Ce({id:{type:String,default:void 0},size:bn,disabled:{type:Boolean,default:void 0},modelValue:{type:[String,Number,Boolean],default:void 0},fill:{type:String,default:""},textColor:{type:String,default:""},name:{type:String,default:void 0},validateEvent:{type:Boolean,default:!0},options:{type:q(Array)},props:{type:q(Object),default:()=>OS},type:{type:String,values:["radio","button"],default:"radio"},...Un(["ariaLabel"])}),NB=TS,IS=(e,t)=>{const n=R(),a=Re($S,void 0),o=y(()=>!!a),l=y(()=>la(e.value)?e.label:e.value),s=y({get(){return o.value?a.modelValue:e.modelValue},set(f){o.value?a.changeEvent(f):t&&t(Qe,f),n.value.checked=e.modelValue===l.value}}),r=vn(y(()=>a?.size)),u=tn(y(()=>a?.disabled)),c=R(!1),d=y(()=>u.value||o.value&&s.value!==l.value?-1:0);return co({from:"label act as value",replacement:"value",version:"3.0.0",scope:"el-radio",ref:"https://element-plus.org/en-US/component/radio.html"},y(()=>o.value&&la(e.value))),{radioRef:n,isGroup:o,radioGroup:a,focus:c,size:r,disabled:u,tabIndex:d,modelValue:s,actualValue:l}},MB=["value","name","disabled","checked"];var PB=le({name:"ElRadio",__name:"radio",props:$B,emits:TS,setup(e,{emit:t}){const n=e,a=t,o=fe("radio"),{radioRef:l,radioGroup:s,focus:r,size:u,disabled:c,modelValue:d,actualValue:f}=IS(n,a);function h(){Oe(()=>a(vt,d.value))}return(g,v)=>(x(),B("label",{class:T([i(o).b(),i(o).is("disabled",i(c)),i(o).is("focus",i(r)),i(o).is("bordered",e.border),i(o).is("checked",i(d)===i(f)),i(o).m(i(u))])},[H("span",{class:T([i(o).e("input"),i(o).is("disabled",i(c)),i(o).is("checked",i(d)===i(f))])},[st(H("input",{ref_key:"radioRef",ref:l,"onUpdate:modelValue":v[0]||(v[0]=p=>Yt(d)?d.value=p:null),class:T(i(o).e("original")),value:i(f),name:e.name||i(s)?.name,disabled:i(c),checked:i(d)===i(f),type:"radio",onFocus:v[1]||(v[1]=p=>r.value=!0),onBlur:v[2]||(v[2]=p=>r.value=!1),onChange:h,onClick:v[3]||(v[3]=qe(()=>{},["stop"]))},null,42,MB),[[Tw,i(d)]]),H("span",{class:T(i(o).e("inner"))},null,2)],2),H("span",{class:T(i(o).e("label")),onKeydown:v[4]||(v[4]=qe(()=>{},["stop"]))},[ee(g.$slots,"default",{},()=>[mt(ke(e.label),1)])],34)],2))}}),NS=PB;const RB=["value","name","disabled"];var AB=le({name:"ElRadioButton",__name:"radio-button",props:OB,setup(e){const t=e,n=fe("radio"),{radioRef:a,focus:o,size:l,disabled:s,modelValue:r,radioGroup:u,actualValue:c}=IS(t),d=y(()=>({backgroundColor:u?.fill||"",borderColor:u?.fill||"",boxShadow:u?.fill?`-1px 0 0 0 ${u.fill}`:"",color:u?.textColor||""}));return(f,h)=>(x(),B("label",{class:T([i(n).b("button"),i(n).is("active",i(r)===i(c)),i(n).is("disabled",i(s)),i(n).is("focus",i(o)),i(n).bm("button",i(l))])},[st(H("input",{ref_key:"radioRef",ref:a,"onUpdate:modelValue":h[0]||(h[0]=g=>Yt(r)?r.value=g:null),class:T(i(n).be("button","original-radio")),value:i(c),type:"radio",name:e.name||i(u)?.name,disabled:i(s),onFocus:h[1]||(h[1]=g=>o.value=!0),onBlur:h[2]||(h[2]=g=>o.value=!1),onClick:h[3]||(h[3]=qe(()=>{},["stop"]))},null,42,RB),[[Tw,i(r)]]),H("span",{class:T(i(n).be("button","inner")),style:He(i(r)===i(c)?d.value:{}),onKeydown:h[4]||(h[4]=qe(()=>{},["stop"]))},[ee(f.$slots,"default",{},()=>[mt(ke(e.label),1)])],38)],2))}}),Ch=AB;const _B=["id","aria-label","aria-labelledby"];var LB=le({name:"ElRadioGroup",__name:"radio-group",props:IB,emits:NB,setup(e,{emit:t}){const n=e,a=t,o=fe("radio"),l=Pn(),s=R(),{formItem:r}=On(),{inputId:u,isLabeledByFormItem:c}=ya(n,{formItemContext:r}),d=p=>{a(Qe,p),Oe(()=>a(vt,p))};ct(()=>{const p=s.value.querySelectorAll("[type=radio]"),m=p[0];!Array.from(p).some(b=>b.checked)&&m&&(m.tabIndex=0)});const f=y(()=>n.name||l.value),h=y(()=>({...OS,...n.props})),g=p=>{const{label:m,value:b,disabled:k}=h.value,w={label:p[m],value:p[b],disabled:p[k]};return{...Ri(p,[m,b,k]),...w}},v=y(()=>n.type==="button"?Ch:NS);return gt($S,Nt({...En(n),changeEvent:d,name:f})),re(()=>n.modelValue,(p,m)=>{n.validateEvent&&!Jt(p,m)&&r?.validate("change").catch(b=>ut(b))}),(p,m)=>(x(),B("div",{id:i(u),ref_key:"radioGroupRef",ref:s,class:T(i(o).b("group")),role:"radiogroup","aria-label":i(c)?void 0:e.ariaLabel||"radio-group","aria-labelledby":i(c)?i(r).labelId:void 0},[ee(p.$slots,"default",{},()=>[(x(!0),B(Fe,null,ht(e.options,(b,k)=>(x(),oe(ot(v.value),rt({key:k},{ref_for:!0},g(b)),null,16))),128))])],10,_B))}}),MS=LB;const PS=nt(NS,{RadioButton:Ch,RadioGroup:MS}),DB=Xt(MS),BB=Xt(Ch),$d=Symbol();function VB(e){return!!(ye(e)?e.every(({type:t})=>t===un):e?.type===un)}var FB=le({name:"NodeContent",props:{node:{type:Object,required:!0}},setup(e){const t=fe("cascader-node"),{renderLabelFn:n}=Re($d),{node:a}=e,{data:o,label:l}=a,s=()=>{const r=n?.({node:a,data:o});return VB(r)?l:r??l};return()=>U("span",{class:t.e("label")},[s()])}});const zB=["id","aria-haspopup","aria-owns","aria-expanded","tabindex"];var HB=le({name:"ElCascaderNode",__name:"node",props:{node:{type:Object,required:!0},menuId:String},emits:["expand"],setup(e,{emit:t}){const n=e,a=t,o=Re($d),l=fe("cascader-node"),s=y(()=>o.isHoverMenu),r=y(()=>o.config.multiple),u=y(()=>o.config.checkStrictly),c=y(()=>o.config.showPrefix),d=y(()=>o.checkedNodes[0]?.uid),f=y(()=>n.node.isDisabled),h=y(()=>n.node.isLeaf),g=y(()=>u.value&&!h.value||!f.value),v=y(()=>m(o.expandingNode)),p=y(()=>u.value&&o.checkedNodes.some(m)),m=N=>{const{level:I,uid:_}=n.node;return N?.pathNodes[I-1]?.uid===_},b=()=>{v.value||o.expandNode(n.node)},k=N=>{const{node:I}=n;N!==I.checked&&o.handleCheckChange(I,N)},w=()=>{o.lazyLoad(n.node,()=>{h.value||b()})},C=N=>{s.value&&(S(),!h.value&&a("expand",N))},S=()=>{const{node:N}=n;!g.value||N.loading||(N.loaded?b():w())},E=()=>{h.value&&!f.value&&!u.value&&!r.value?$(!0):(o.config.checkOnClickNode&&(r.value||u.value)||h.value&&o.config.checkOnClickLeaf)&&!f.value?O(!n.node.checked):s.value||S()},O=N=>{u.value?(k(N),n.node.loaded&&b()):$(N)},$=N=>{n.node.loaded?(k(N),!u.value&&b()):w()};return(N,I)=>(x(),B("li",{id:`${e.menuId}-${e.node.uid}`,role:"menuitem","aria-haspopup":!h.value,"aria-owns":h.value?void 0:e.menuId,"aria-expanded":v.value,tabindex:g.value?-1:void 0,class:T([i(l).b(),i(l).is("selectable",u.value),i(l).is("active",e.node.checked),i(l).is("disabled",!g.value),v.value&&"in-active-path",p.value&&"in-checked-path"]),onMouseenter:C,onFocus:C,onClick:E},[te(" prefix "),r.value&&c.value?(x(),oe(i(ja),{key:0,"model-value":e.node.checked,indeterminate:e.node.indeterminate,disabled:f.value,onClick:I[0]||(I[0]=qe(()=>{},["stop"])),"onUpdate:modelValue":O},null,8,["model-value","indeterminate","disabled"])):u.value&&c.value?(x(),oe(i(PS),{key:1,"model-value":d.value,label:e.node.uid,disabled:f.value,"onUpdate:modelValue":O,onClick:I[1]||(I[1]=qe(()=>{},["stop"]))},{default:Z(()=>[te(` - Add an empty element to avoid render label, - do not use empty fragment here for https://github.com/vuejs/vue-next/pull/2485 - `),I[2]||(I[2]=H("span",null,null,-1))]),_:1},8,["model-value","label","disabled"])):h.value&&e.node.checked?(x(),oe(i(Le),{key:2,class:T(i(l).e("prefix"))},{default:Z(()=>[U(i(Ui))]),_:1},8,["class"])):te("v-if",!0),te(" content "),U(i(FB),{node:e.node},null,8,["node"]),te(" postfix "),h.value?te("v-if",!0):(x(),B(Fe,{key:3},[e.node.loading?(x(),oe(i(Le),{key:0,class:T([i(l).is("loading"),i(l).e("postfix")])},{default:Z(()=>[U(i(wo))]),_:1},8,["class"])):(x(),oe(i(Le),{key:1,class:T(["arrow-right",i(l).e("postfix")])},{default:Z(()=>[U(i(Yn))]),_:1},8,["class"]))],64))],42,zB))}}),KB=HB,WB=le({name:"ElCascaderMenu",__name:"menu",props:{nodes:{type:Array,required:!0},index:{type:Number,required:!0}},setup(e){const t=e,n=it(),a=fe("cascader-menu"),{t:o}=bt(),l=Pn();let s,r;const u=Re($d),c=R(),d=y(()=>!t.nodes.length),f=y(()=>!u.initialLoaded),h=y(()=>`${l.value}-${t.index}`),g=b=>{s=b.target},v=b=>{if(!(!u.isHoverMenu||!s||!c.value))if(s.contains(b.target)){p();const k=n.vnode.el,{left:w}=k.getBoundingClientRect(),{offsetWidth:C,offsetHeight:S}=k,E=b.clientX-w,O=s.offsetTop,$=O+s.offsetHeight,N=k.querySelector(`.${a.e("wrap")}`)?.scrollTop||0;c.value.innerHTML=` - - - `}else r||(r=window.setTimeout(m,u.config.hoverThreshold))},p=()=>{r&&(clearTimeout(r),r=void 0)},m=()=>{c.value&&(c.value.innerHTML="",p())};return(b,k)=>(x(),oe(i(Ka),{key:h.value,tag:"ul",role:"menu",class:T(i(a).b()),"wrap-class":i(a).e("wrap"),"view-class":[i(a).e("list"),i(a).is("empty",d.value)],onMousemove:v,onMouseleave:m},{default:Z(()=>[(x(!0),B(Fe,null,ht(e.nodes,w=>(x(),oe(KB,{key:w.uid,node:w,"menu-id":h.value,onExpand:g},null,8,["node","menu-id"]))),128)),f.value?(x(),B("div",{key:0,class:T(i(a).e("empty-text"))},[U(i(Le),{size:"14",class:T(i(a).is("loading"))},{default:Z(()=>[U(i(wo))]),_:1},8,["class"]),mt(" "+ke(i(o)("el.cascader.loading")),1)],2)):d.value?(x(),B("div",{key:1,class:T(i(a).e("empty-text"))},[ee(b.$slots,"empty",{},()=>[mt(ke(i(o)("el.cascader.noData")),1)])],2)):i(u)?.isHoverMenu?(x(),B(Fe,{key:2},[te(" eslint-disable vue/html-self-closing "),(x(),B("svg",{ref_key:"hoverZone",ref:c,class:T(i(a).e("hover-zone"))},null,2))],2112)):te("v-if",!0),te(" eslint-enable vue/html-self-closing ")]),_:3},8,["class","wrap-class","view-class"]))}}),jB=WB;let YB=0;const UB=e=>{const t=[e];let{parent:n}=e;for(;n;)t.unshift(n),n=n.parent;return t};var Sp=class kp{constructor(t,n,a,o=!1){this.data=t,this.config=n,this.parent=a,this.root=o,this.uid=YB++,this.checked=!1,this.indeterminate=!1,this.loading=!1;const{value:l,label:s,children:r}=n,u=t[r],c=UB(this);this.level=o?0:a?a.level+1:1,this.value=t[l],this.label=t[s],this.pathNodes=c,this.pathValues=c.map(d=>d.value),this.pathLabels=c.map(d=>d.label),this.childrenData=u,this.children=(u||[]).map(d=>new kp(d,n,this)),this.loaded=!n.lazy||this.isLeaf||!Jn(u),this.text=""}get isDisabled(){const{data:t,parent:n,config:a}=this,{disabled:o,checkStrictly:l}=a;return(Be(o)?o(t,this):!!t[o])||!l&&!!n?.isDisabled}get isLeaf(){const{data:t,config:n,childrenData:a,loaded:o}=this,{lazy:l,leaf:s}=n,r=Be(s)?s(t,this):t[s];return St(r)?l&&!o?!1:!(ye(a)&&a.length):!!r}get valueByOption(){return this.config.emitPath?this.pathValues:this.value}appendChild(t){const{childrenData:n,children:a}=this,o=new kp(t,this.config,this);return ye(n)?n.push(t):this.childrenData=[t],a.push(o),o}calcText(t,n){const a=t?this.pathLabels.join(n):this.label;return this.text=a,a}broadcast(t){this.children.forEach(n=>{n&&(n.broadcast(t),n.onParentCheck?.(t))})}emit(){const{parent:t}=this;t&&(t.onChildCheck?.(),t.emit())}onParentCheck(t){this.isDisabled||this.setCheckState(t)}onChildCheck(){const{children:t}=this,n=t.filter(o=>!o.isDisabled),a=n.length?n.every(o=>o.checked):!1;this.setCheckState(a)}setCheckState(t){const n=this.children.length,a=this.children.reduce((o,l)=>o+(l.checked?1:l.indeterminate?.5:0),0);this.checked=this.loaded&&this.children.filter(o=>!o.isDisabled).every(o=>o.loaded&&o.checked)&&t,this.indeterminate=this.loaded&&a!==n&&a>0}doCheck(t){if(this.checked===t)return;const{checkStrictly:n,multiple:a}=this.config;n||!a?this.checked=t:(this.broadcast(t),this.setCheckState(t),this.emit())}};const Ep=(e,t)=>e.reduce((n,a)=>(a.isLeaf?n.push(a):(!t&&n.push(a),n=n.concat(Ep(a.children,t))),n),[]);var Xb=class{constructor(e,t){this.config=t;const n=(e||[]).map(a=>new Sp(a,this.config));this.nodes=n,this.allNodes=Ep(n,!1),this.leafNodes=Ep(n,!0)}getNodes(){return this.nodes}getFlattedNodes(e){return e?this.leafNodes:this.allNodes}appendNode(e,t){const n=t?t.appendChild(e):new Sp(e,this.config);t||this.nodes.push(n),this.appendAllNodesAndLeafNodes(n)}appendNodes(e,t){e.length>0?e.forEach(n=>this.appendNode(n,t)):t&&t.isLeaf&&this.leafNodes.push(t)}appendAllNodesAndLeafNodes(e){this.allNodes.push(e),e.isLeaf&&this.leafNodes.push(e),e.children&&e.children.forEach(t=>{this.appendAllNodesAndLeafNodes(t)})}getNodeByValue(e,t=!1){return la(e)?null:this.getFlattedNodes(t).find(n=>Jt(n.value,e)||Jt(n.pathValues,e))||null}getSameNode(e){return e&&this.getFlattedNodes(!1).find(({value:t,level:n})=>Jt(e.value,t)&&e.level===n)||null}};const Zb=e=>{if(!e)return 0;const t=e.id.split("-");return Number(t[t.length-2])},qB=e=>{if(!e)return;const t=e.querySelector("input");t?t.click():T1(e)&&e.click()},GB=(e,t)=>{const n=t.slice(0),a=n.map(l=>l.uid),o=e.reduce((l,s)=>{const r=a.indexOf(s.uid);return r>-1&&(l.push(s),n.splice(r,1),a.splice(r,1)),l},[]);return o.push(...n),o};var XB=le({name:"ElCascaderPanel",__name:"index",props:fB,emits:pB,setup(e,{expose:t,emit:n}){const a=e,o=n;let l=!1;const s=fe("cascader"),r=vB(a),u=sn();let c;const d=R(!0),f=R(!1),h=R([]),g=R(),v=R([]),p=R(),m=R([]),b=y(()=>r.value.expandTrigger==="hover"),k=y(()=>a.renderLabel||u.default),w=()=>{const{options:P}=a,M=r.value;l=!1,c=new Xb(P,M),v.value=[c.getNodes()],M.lazy&&Jn(a.options)?(d.value=!1,C(void 0,L=>{L&&(c=new Xb(L,M),v.value=[c.getNodes()]),d.value=!0,A(!1,!0)})):A(!1,!0)},C=(P,M)=>{const L=r.value;P=P||new Sp({},L,void 0,!0),P.loading=!0;const D=G=>{const j=P,X=j.root?null:j;j.loading=!1,j.loaded=!0,j.childrenData=j.childrenData||[],G&&c?.appendNodes(G,X),G&&M?.(G),P.level===0&&(f.value=!0)},V=()=>{P.loading=!1,P.loaded=!1,P.level===0&&(d.value=!0)};L.lazyLoad(P,D,V)},S=(P,M)=>{const{level:L}=P,D=v.value.slice(0,L);let V;P.isLeaf?V=P.pathNodes[L-2]:(V=P,D.push(P.children)),p.value?.uid!==V?.uid&&(p.value=P,v.value=D,!M&&o("expand-change",P?.pathValues||[]))},E=(P,M,L=!0)=>{const{checkStrictly:D,multiple:V}=r.value,G=m.value[0];l=!0,!V&&G?.doCheck(!1),P.doCheck(M),_(),L&&!V&&!D&&o("close"),!L&&!V&&O(P)},O=P=>{P&&(P=P.parent,O(P),P&&S(P))},$=P=>c?.getFlattedNodes(P),N=P=>$(P)?.filter(({checked:M})=>M!==!1),I=()=>{m.value.forEach(P=>P.doCheck(!1)),_(),v.value=v.value.slice(0,1),p.value=void 0,o("expand-change",[])},_=()=>{const{checkStrictly:P,multiple:M}=r.value,L=m.value,D=GB(L,N(!P)),V=D.map(G=>G.valueByOption);m.value=D,g.value=M?V:V[0]??null},A=(P=!1,M=!1)=>{const{modelValue:L}=a,{lazy:D,multiple:V,checkStrictly:G}=r.value,j=!G;if(!(!d.value||l||!M&&Jt(L,g.value)))if(D&&!P){const X=lb(xM(Kn(L))).map(Q=>c?.getNodeByValue(Q)).filter(Q=>!!Q&&!Q.loaded&&!Q.loading);X.length?X.forEach(Q=>{C(Q,()=>A(!1,M))}):A(!0,M)}else F(lb((V?Kn(L):[L]).map(X=>c?.getNodeByValue(X,j))),M),g.value=Vo(L??void 0)},F=(P,M=!0)=>{const{checkStrictly:L}=r.value,D=m.value,V=P.filter(X=>!!X&&(L||X.isLeaf)),G=c?.getSameNode(p.value),j=M&&G||V[0];j?j.pathNodes.forEach(X=>S(X,!0)):p.value=void 0,D.forEach(X=>X.doCheck(!1)),Nt(V).forEach(X=>X.doCheck(!0)),m.value=V,Oe(K)},K=()=>{It&&h.value.forEach(P=>{const M=P?.$el;if(M){const L=M.querySelector(`.${s.namespace.value}-scrollbar__wrap`);let D=M.querySelector(`.${s.b("node")}.in-active-path`);if(!D){const V=M.querySelectorAll(`.${s.b("node")}.${s.is("active")}`);D=V[V.length-1]}Hv(L,D)}})},Y=P=>{const M=P.target,L=Ft(P);switch(L){case we.up:case we.down:P.preventDefault(),Lu($1(M,L===we.up?-1:1,`.${s.b("node")}[tabindex="-1"]`));break;case we.left:{P.preventDefault();const D=h.value[Zb(M)-1]?.$el.querySelector(`.${s.b("node")}[aria-expanded="true"]`);Lu(D);break}case we.right:{P.preventDefault();const D=h.value[Zb(M)+1]?.$el.querySelector(`.${s.b("node")}[tabindex="-1"]`);Lu(D);break}case we.enter:case we.numpadEnter:qB(M);break}};gt($d,Nt({config:r,expandingNode:p,checkedNodes:m,isHoverMenu:b,initialLoaded:d,renderLabelFn:k,lazyLoad:C,expandNode:S,handleCheckChange:E})),re(r,(P,M)=>{Jt(P,M)||w()},{immediate:!0}),re(()=>a.options,w,{deep:!0}),re(()=>a.modelValue,()=>{l=!1,A()},{deep:!0}),re(()=>g.value,P=>{Jt(P,a.modelValue)||(o(Qe,P),o(vt,P))});const W=()=>{f.value||w()};return dv(()=>h.value=[]),ct(()=>!Jn(a.modelValue)&&A()),t({menuList:h,menus:v,checkedNodes:m,handleKeyDown:Y,handleCheckChange:E,getFlattedNodes:$,getCheckedNodes:N,clearCheckedNodes:I,calculateCheckedValue:_,scrollToExpandingNode:K,loadLazyRootNodes:W}),(P,M)=>(x(),B("div",{class:T([i(s).b("panel"),i(s).is("bordered",e.border)]),onKeydown:Y},[(x(!0),B(Fe,null,ht(v.value,(L,D)=>(x(),oe(jB,{key:D,ref_for:!0,ref:V=>h.value[D]=V,index:D,nodes:[...L]},{empty:Z(()=>[ee(P.$slots,"empty")]),_:3},8,["index","nodes"]))),128))],34))}}),ZB=XB;const RS=nt(ZB),JB=Ce({...bS,size:bn,placeholder:String,disabled:{type:Boolean,default:void 0},clearable:Boolean,clearIcon:{type:Bt,default:xo},filterable:Boolean,filterMethod:{type:q(Function),default:(e,t)=>e.text.includes(t)},separator:{type:String,default:" / "},showAllLevels:{type:Boolean,default:!0},collapseTags:Boolean,maxCollapseTags:{type:Number,default:1},collapseTagsTooltip:Boolean,maxCollapseTagsTooltipHeight:{type:[String,Number]},debounce:{type:Number,default:300},beforeFilter:{type:q(Function),default:()=>!0},placement:{type:q(String),values:So,default:"bottom-start"},fallbackPlacements:{type:q(Array),default:["bottom-start","bottom","top-start","top","right","left"]},popperClass:Lt.popperClass,popperStyle:Lt.popperStyle,teleported:Lt.teleported,effect:{type:q(String),default:"light"},tagType:{...qo.type,default:"info"},tagEffect:{...qo.effect,default:"light"},validateEvent:{type:Boolean,default:!0},persistent:{type:Boolean,default:!0},showCheckedStrategy:{type:String,values:["parent","child"],default:"child"},checkOnClickNode:Boolean,showPrefix:{type:Boolean,default:!0},...ps}),Jb=e=>!0,QB={[Qe]:Jb,[vt]:Jb,focus:e=>e instanceof FocusEvent,blur:e=>e instanceof FocusEvent,clear:()=>!0,visibleChange:e=>Dt(e),expandChange:e=>!!e,removeTag:e=>!!e},eV=["placeholder"],tV=["onClick"];var nV=le({name:"ElCascader",__name:"cascader",props:JB,emits:QB,setup(e,{expose:t,emit:n}){const a={modifiers:[{name:"arrowPosition",enabled:!0,phase:"main",fn:({state:De})=>{const{modifiersData:Je,placement:lt}=De;["right","left","bottom","top"].includes(lt)||Je.arrow&&(Je.arrow.x=35)},requires:["arrow"]}]},o=e,l=n,s=Zo(),r=sn();let u=0,c=0;const d=fe("cascader"),f=fe("input"),h={small:7,default:11,large:15},{t:g}=bt(),{formItem:v}=On(),p=tn(),{valueOnClear:m}=Yi(o),{isComposing:b,handleComposition:k}=ji({afterComposition(De){const Je=De.target?.value;Ue(Je)}}),w=R(),C=R(),S=R(),E=R(),O=R(),$=R(),N=R(!1),I=R(!1),_=R(!1),A=R(""),F=R(""),K=R([]),Y=R([]),W=y(()=>o.props.multiple?o.collapseTags?K.value.slice(0,o.maxCollapseTags):K.value:[]),P=y(()=>o.props.multiple?o.collapseTags?K.value.slice(o.maxCollapseTags):[]:[]),M=y(()=>s.style),L=y(()=>o.placeholder??g("el.cascader.placeholder")),D=y(()=>F.value||K.value.length>0||b.value?"":L.value),V=vn(),G=y(()=>V.value==="small"?"small":"default"),j=y(()=>!!o.props.multiple),X=y(()=>!o.filterable||j.value),Q=y(()=>j.value?F.value:A.value),ve=y(()=>O.value?.checkedNodes||[]),{wrapperRef:ue,isFocused:ge,handleBlur:ie}=tl(S,{disabled:p,beforeBlur(De){return w.value?.isFocusInsideContent(De)||C.value?.isFocusInsideContent(De)},afterBlur(){o.validateEvent&&v?.validate?.("blur").catch(De=>ut(De))}}),ae=y(()=>!o.clearable||p.value||_.value||!I.value&&!ge.value?!1:!!ve.value.length),ne=y(()=>{const{showAllLevels:De,separator:Je}=o,lt=ve.value;return lt.length?j.value?"":lt[0].calcText(De,Je):""}),z=y(()=>v?.validateState||""),J=y({get(){return Vo(o.modelValue)},set(De){const Je=De??m.value;l(Qe,Je),l(vt,Je),o.validateEvent&&v?.validate("change").catch(lt=>ut(lt))}}),se=y(()=>[d.b(),d.m(V.value),d.is("disabled",p.value),s.class]),ce=y(()=>[f.e("icon"),"icon-arrow-down",d.is("reverse",N.value)]),he=y(()=>d.is("focus",ge.value)),Se=y(()=>w.value?.popperRef?.contentRef),Ie=De=>{ge.value&&ie(new FocusEvent("blur",De)),Ne(!1)},Ne=De=>{p.value||(De=De??!N.value,De!==N.value&&(N.value=De,S.value?.input?.setAttribute("aria-expanded",`${De}`),De?(Te(),O.value&&Oe(O.value.scrollToExpandingNode)):o.filterable&&ft(),l("visibleChange",De)))},Te=()=>{Oe(()=>{w.value?.updatePopper()})},pe=()=>{_.value=!1},Ee=De=>{const{showAllLevels:Je,separator:lt}=o;return{node:De,key:De.uid,text:De.calcText(Je,lt),hitState:!1,closable:!p.value&&!De.isDisabled}},me=De=>{const Je=De.node;Je.doCheck(!1),O.value?.calculateCheckedValue(),l("removeTag",Je.valueByOption)},Pe=()=>{switch(o.showCheckedStrategy){case"child":return ve.value;case"parent":{const De=We(!1),Je=De.map(lt=>lt.value);return De.filter(lt=>!lt.parent||!Je.includes(lt.parent.value))}default:return[]}},Ke=()=>{if(!j.value)return;const De=Pe(),Je=[];De.forEach(lt=>Je.push(Ee(lt))),K.value=Je},Ge=()=>{const{filterMethod:De,showAllLevels:Je,separator:lt}=o,hn=O.value?.getFlattedNodes(!o.props.checkStrictly)?.filter(Vt=>Vt.isDisabled?!1:(Vt.calcText(Je,lt),De(Vt,Q.value)));j.value&&K.value.forEach(Vt=>{Vt.hitState=!1}),_.value=!0,Y.value=hn,Te()},Me=()=>{let De;_.value&&$.value?De=$.value.$el.querySelector(`.${d.e("suggestion-item")}`):De=O.value?.$el.querySelector(`.${d.b("node")}[tabindex="-1"]`),De&&(De.focus(),!_.value&&De.click())},Ae=()=>{const De=S.value?.input,Je=E.value,lt=$.value?.$el;if(!(!It||!De)){if(lt){const hn=lt.querySelector(`.${d.e("suggestion-list")}`);hn.style.minWidth=`${De.offsetWidth}px`}if(Je){const{offsetHeight:hn}=Je,Vt=K.value.length>0?`${Math.max(hn,u)-2}px`:`${u}px`;if(De.style.height=Vt,r.prefix){const dn=S.value?.$el.querySelector(`.${f.e("prefix")}`);let Xe=0;dn&&(Xe=dn.offsetWidth,Xe>0&&(Xe+=h[V.value||"default"])),Je.style.left=`${Xe}px`}else Je.style.left="0";Te()}}},We=De=>O.value?.getCheckedNodes(De),xt=De=>{Te(),l("expandChange",De)},je=De=>{if(!b.value)switch(Ft(De)){case we.enter:case we.numpadEnter:Ne();break;case we.down:Ne(!0),Oe(Me),De.preventDefault();break;case we.esc:N.value===!0&&(De.preventDefault(),De.stopPropagation(),Ne(!1));break;case we.tab:Ne(!1);break}},at=()=>{O.value?.clearCheckedNodes(),!N.value&&o.filterable&&ft(),Ne(!1),l("clear")},ft=()=>{const{value:De}=ne;A.value=De,F.value=De},yt=De=>{const{checked:Je}=De;j.value?O.value?.handleCheckChange(De,!Je,!1):(!Je&&O.value?.handleCheckChange(De,!0,!1),Ne(!1))},be=De=>{const Je=De.target,lt=Ft(De);switch(lt){case we.up:case we.down:De.preventDefault(),Lu($1(Je,lt===we.up?-1:1,`.${d.e("suggestion-item")}[tabindex="-1"]`));break;case we.enter:case we.numpadEnter:Je.click();break}},Ve=()=>{const De=K.value[K.value.length-1];c=F.value?0:c+1,!(!De||!c||o.collapseTags&&K.value.length>1)&&(De.hitState?me(De):De.hitState=!0)},de=Li(()=>{const{value:De}=Q;if(!De)return;const Je=o.beforeFilter(De);Jl(Je)?Je.then(Ge).catch(()=>{}):Je!==!1?Ge():pe()},y(()=>o.debounce)),Ue=(De,Je)=>{!N.value&&Ne(!0),!Je?.isComposing&&(De?de():pe())},kt=De=>Number.parseFloat(cP(f.cssVarName("input-height"),De).value)-2,qt=()=>{S.value?.focus()},xn=()=>{S.value?.blur()};return re(_,Te),re([ve,p,()=>o.collapseTags,()=>o.maxCollapseTags],Ke),re(K,()=>{Oe(()=>Ae())}),re(V,async()=>{await Oe();const De=S.value.input;u=kt(De)||u,Ae()}),re(ne,ft,{immediate:!0}),re(()=>N.value,De=>{De&&o.props.lazy&&o.props.lazyLoad&&O.value?.loadLazyRootNodes()}),ct(()=>{const De=S.value.input,Je=kt(De);u=De.offsetHeight||Je,Ut(De,Ae)}),t({getCheckedNodes:We,cascaderPanelRef:O,togglePopperVisible:Ne,contentRef:Se,presentText:ne,focus:qt,blur:xn}),(De,Je)=>(x(),oe(i($n),{ref_key:"tooltipRef",ref:w,visible:N.value,teleported:e.teleported,"popper-class":[i(d).e("dropdown"),e.popperClass],"popper-style":e.popperStyle,"popper-options":a,"fallback-placements":e.fallbackPlacements,"stop-popper-mouse-event":!1,"gpu-acceleration":!1,placement:e.placement,transition:`${i(d).namespace.value}-zoom-in-top`,effect:e.effect,pure:"",persistent:e.persistent,onHide:pe},{default:Z(()=>[st((x(),B("div",{ref_key:"wrapperRef",ref:ue,class:T(se.value),style:He(M.value),onClick:Je[8]||(Je[8]=()=>Ne(X.value?void 0:!0)),onKeydown:je,onMouseenter:Je[9]||(Je[9]=lt=>I.value=!0),onMouseleave:Je[10]||(Je[10]=lt=>I.value=!1)},[U(i(Wn),{ref_key:"inputRef",ref:S,modelValue:A.value,"onUpdate:modelValue":Je[1]||(Je[1]=lt=>A.value=lt),placeholder:D.value,readonly:X.value,disabled:i(p),"validate-event":!1,size:i(V),class:T(he.value),tabindex:j.value&&e.filterable&&!i(p)?-1:void 0,onCompositionstart:i(k),onCompositionupdate:i(k),onCompositionend:i(k),onInput:Ue},Qn({suffix:Z(()=>[ae.value?(x(),oe(i(Le),{key:"clear",class:T([i(f).e("icon"),"icon-circle-close"]),onClick:qe(at,["stop"])},{default:Z(()=>[(x(),oe(ot(e.clearIcon)))]),_:1},8,["class"])):(x(),oe(i(Le),{key:"arrow-down",class:T(ce.value),onClick:Je[0]||(Je[0]=qe(lt=>Ne(),["stop"]))},{default:Z(()=>[U(i(Eo))]),_:1},8,["class"]))]),_:2},[De.$slots.prefix?{name:"prefix",fn:Z(()=>[ee(De.$slots,"prefix")]),key:"0"}:void 0]),1032,["modelValue","placeholder","readonly","disabled","size","class","tabindex","onCompositionstart","onCompositionupdate","onCompositionend"]),j.value?(x(),B("div",{key:0,ref_key:"tagWrapper",ref:E,class:T([i(d).e("tags"),i(d).is("validate",!!z.value)])},[ee(De.$slots,"tag",{data:K.value,deleteTag:me},()=>[(x(!0),B(Fe,null,ht(W.value,lt=>(x(),oe(i(Fo),{key:lt.key,type:e.tagType,size:G.value,effect:e.tagEffect,hit:lt.hitState,closable:lt.closable,"disable-transitions":"",onClose:hn=>me(lt)},{default:Z(()=>[H("span",null,ke(lt.text),1)]),_:2},1032,["type","size","effect","hit","closable","onClose"]))),128))]),e.collapseTags&&K.value.length>e.maxCollapseTags?(x(),oe(i($n),{key:0,ref_key:"tagTooltipRef",ref:C,disabled:N.value||!e.collapseTagsTooltip,"fallback-placements":["bottom","top","right","left"],placement:"bottom","popper-class":e.popperClass,"popper-style":e.popperStyle,effect:e.effect,persistent:e.persistent},{default:Z(()=>[U(i(Fo),{closable:!1,size:G.value,type:e.tagType,effect:e.tagEffect,"disable-transitions":""},{default:Z(()=>[H("span",{class:T(i(d).e("tags-text"))}," + "+ke(K.value.length-e.maxCollapseTags),3)]),_:1},8,["size","type","effect"])]),content:Z(()=>[U(i(Ka),{"max-height":e.maxCollapseTagsTooltipHeight},{default:Z(()=>[H("div",{class:T(i(d).e("collapse-tags"))},[(x(!0),B(Fe,null,ht(P.value,(lt,hn)=>(x(),B("div",{key:hn,class:T(i(d).e("collapse-tag"))},[(x(),oe(i(Fo),{key:lt.key,class:"in-tooltip",type:e.tagType,size:G.value,effect:e.tagEffect,hit:lt.hitState,closable:lt.closable,"disable-transitions":"",onClose:Vt=>me(lt)},{default:Z(()=>[H("span",null,ke(lt.text),1)]),_:2},1032,["type","size","effect","hit","closable","onClose"]))],2))),128))],2)]),_:1},8,["max-height"])]),_:1},8,["disabled","popper-class","popper-style","effect","persistent"])):te("v-if",!0),e.filterable&&!i(p)?st((x(),B("input",{key:1,"onUpdate:modelValue":Je[2]||(Je[2]=lt=>F.value=lt),type:"text",class:T(i(d).e("search-input")),placeholder:ne.value?"":L.value,onInput:Je[3]||(Je[3]=lt=>Ue(F.value,lt)),onClick:Je[4]||(Je[4]=qe(lt=>Ne(!0),["stop"])),onKeydown:Zt(Ve,["delete"]),onCompositionstart:Je[5]||(Je[5]=(...lt)=>i(k)&&i(k)(...lt)),onCompositionupdate:Je[6]||(Je[6]=(...lt)=>i(k)&&i(k)(...lt)),onCompositionend:Je[7]||(Je[7]=(...lt)=>i(k)&&i(k)(...lt))},null,42,eV)),[[Ew,F.value]]):te("v-if",!0)],2)):te("v-if",!0)],38)),[[i(Tl),Ie,Se.value]])]),content:Z(()=>[De.$slots.header?(x(),B("div",{key:0,class:T(i(d).e("header")),onClick:Je[11]||(Je[11]=qe(()=>{},["stop"]))},[ee(De.$slots,"header")],2)):te("v-if",!0),st(U(i(RS),{ref_key:"cascaderPanelRef",ref:O,modelValue:J.value,"onUpdate:modelValue":Je[12]||(Je[12]=lt=>J.value=lt),options:e.options,props:o.props,border:!1,"render-label":De.$slots.default,onExpandChange:xt,onClose:Je[13]||(Je[13]=lt=>De.$nextTick(()=>Ne(!1)))},{empty:Z(()=>[ee(De.$slots,"empty")]),_:3},8,["modelValue","options","props","render-label"]),[[Ot,!_.value]]),e.filterable?st((x(),oe(i(Ka),{key:1,ref_key:"suggestionPanel",ref:$,tag:"ul",class:T(i(d).e("suggestion-panel")),"view-class":i(d).e("suggestion-list"),onKeydown:be},{default:Z(()=>[Y.value.length?(x(!0),B(Fe,{key:0},ht(Y.value,lt=>(x(),B("li",{key:lt.uid,class:T([i(d).e("suggestion-item"),i(d).is("checked",lt.checked)]),tabindex:-1,onClick:hn=>yt(lt)},[ee(De.$slots,"suggestion-item",{item:lt},()=>[H("span",null,ke(lt.text),1),lt.checked?(x(),oe(i(Le),{key:0},{default:Z(()=>[U(i(Ui))]),_:1})):te("v-if",!0)])],10,tV))),128)):ee(De.$slots,"empty",{key:1},()=>[H("li",{class:T(i(d).e("empty-text"))},ke(i(g)("el.cascader.noMatch")),3)])]),_:3},8,["class","view-class"])),[[Ot,_.value]]):te("v-if",!0),De.$slots.footer?(x(),B("div",{key:2,class:T(i(d).e("footer")),onClick:Je[14]||(Je[14]=qe(()=>{},["stop"]))},[ee(De.$slots,"footer")],2)):te("v-if",!0)]),_:3},8,["visible","teleported","popper-class","popper-style","fallback-placements","placement","transition","effect","persistent"]))}}),aV=nV;const oV=nt(aV),lV=Ce({checked:Boolean,disabled:Boolean,type:{type:String,values:["primary","success","info","warning","danger"],default:"primary"}}),sV={"update:checked":e=>Dt(e),[vt]:e=>Dt(e)};var rV=le({name:"ElCheckTag",__name:"check-tag",props:lV,emits:sV,setup(e,{emit:t}){const n=e,a=t,o=fe("check-tag"),l=y(()=>[o.b(),o.is("checked",n.checked),o.is("disabled",n.disabled),o.m(n.type||"primary")]),s=()=>{if(n.disabled)return;const r=!n.checked;a(vt,r),a("update:checked",r)};return(r,u)=>(x(),B("span",{class:T(l.value),onClick:s},[ee(r.$slots,"default")],2))}}),iV=rV;const uV=nt(iV),cV=Ce({tag:{type:String,default:"div"},span:{type:Number,default:24},offset:{type:Number,default:0},pull:{type:Number,default:0},push:{type:Number,default:0},xs:{type:q([Number,Object]),default:()=>Qt({})},sm:{type:q([Number,Object]),default:()=>Qt({})},md:{type:q([Number,Object]),default:()=>Qt({})},lg:{type:q([Number,Object]),default:()=>Qt({})},xl:{type:q([Number,Object]),default:()=>Qt({})}}),dV=["start","center","end","space-around","space-between","space-evenly"],fV=["top","middle","bottom"],pV=Ce({tag:{type:String,default:"div"},gutter:{type:Number,default:0},justify:{type:String,values:dV,default:"start"},align:{type:String,values:fV}}),AS=Symbol("rowContextKey");var vV=le({name:"ElRow",__name:"row",props:pV,setup(e){const t=e,n=fe("row");gt(AS,{gutter:y(()=>t.gutter)});const a=y(()=>{const l={};return t.gutter&&(l.marginRight=l.marginLeft=`-${t.gutter/2}px`),l}),o=y(()=>[n.b(),n.is(`justify-${t.justify}`,t.justify!=="start"),n.is(`align-${t.align}`,!!t.align)]);return(l,s)=>(x(),oe(ot(e.tag),{class:T(o.value),style:He(a.value)},{default:Z(()=>[ee(l.$slots,"default")]),_:3},8,["class","style"]))}}),hV=vV;const mV=nt(hV);var gV=le({name:"ElCol",__name:"col",props:cV,setup(e){const t=e,{gutter:n}=Re(AS,{gutter:y(()=>0)}),a=fe("col"),o=y(()=>{const s={};return n.value&&(s.paddingLeft=s.paddingRight=`${n.value/2}px`),s}),l=y(()=>{const s=[];return["span","offset","pull","push"].forEach(r=>{const u=t[r];ze(u)&&(r==="span"?s.push(a.b(`${t[r]}`)):u>0&&s.push(a.b(`${r}-${t[r]}`)))}),["xs","sm","md","lg","xl"].forEach(r=>{ze(t[r])?s.push(a.b(`${r}-${t[r]}`)):et(t[r])&&Object.entries(t[r]).forEach(([u,c])=>{s.push(u!=="span"?a.b(`${r}-${u}-${c}`):a.b(`${r}-${c}`))})}),n.value&&s.push(a.is("guttered")),[a.b(),s]});return(s,r)=>(x(),oe(ot(e.tag),{class:T(l.value),style:He(o.value)},{default:Z(()=>[ee(s.$slots,"default")]),_:3},8,["class","style"]))}}),bV=gV;const yV=nt(bV),Qb=e=>ze(e)||_e(e)||ye(e),wV=Ce({accordion:Boolean,modelValue:{type:q([Array,String,Number]),default:()=>Qt([])},expandIconPosition:{type:q([String]),default:"right"},beforeCollapse:{type:q(Function)}}),CV={[Qe]:Qb,[vt]:Qb},_S=Symbol("collapseContextKey"),SV=Ce({title:{type:String,default:""},name:{type:q([String,Number]),default:void 0},icon:{type:Bt,default:Yn},disabled:Boolean});var kV=le({name:"ElCollapseTransition",__name:"collapse-transition",setup(e){const t=fe("collapse-transition"),n=o=>{o.style.maxHeight="",o.style.overflow=o.dataset.oldOverflow,o.style.paddingTop=o.dataset.oldPaddingTop,o.style.paddingBottom=o.dataset.oldPaddingBottom},a={beforeEnter(o){o.dataset||(o.dataset={}),o.dataset.oldPaddingTop=o.style.paddingTop,o.dataset.oldPaddingBottom=o.style.paddingBottom,o.style.height&&(o.dataset.elExistsHeight=o.style.height),o.style.maxHeight=0,o.style.paddingTop=0,o.style.paddingBottom=0},enter(o){requestAnimationFrame(()=>{o.dataset.oldOverflow=o.style.overflow,o.dataset.elExistsHeight?o.style.maxHeight=o.dataset.elExistsHeight:o.scrollHeight!==0?o.style.maxHeight=`${o.scrollHeight}px`:o.style.maxHeight=0,o.style.paddingTop=o.dataset.oldPaddingTop,o.style.paddingBottom=o.dataset.oldPaddingBottom,o.style.overflow="hidden"})},afterEnter(o){o.style.maxHeight="",o.style.overflow=o.dataset.oldOverflow},enterCancelled(o){n(o)},beforeLeave(o){o.dataset||(o.dataset={}),o.dataset.oldPaddingTop=o.style.paddingTop,o.dataset.oldPaddingBottom=o.style.paddingBottom,o.dataset.oldOverflow=o.style.overflow,o.style.maxHeight=`${o.scrollHeight}px`,o.style.overflow="hidden"},leave(o){o.scrollHeight!==0&&(o.style.maxHeight=0,o.style.paddingTop=0,o.style.paddingBottom=0)},afterLeave(o){n(o)},leaveCancelled(o){n(o)}};return(o,l)=>(x(),oe(Mn,rt({name:i(t).b()},JE(a)),{default:Z(()=>[ee(o.$slots,"default")]),_:3},16,["name"]))}}),EV=kV;const Od=nt(EV),ey="ElCollapse",xV=(e,t)=>{const n=R(Cn(e.modelValue)),a=s=>{n.value=s;const r=e.accordion?n.value[0]:n.value;t(Qe,r),t(vt,r)},o=s=>{if(e.accordion)a([n.value[0]===s?"":s]);else{const r=[...n.value],u=r.indexOf(s);u>-1?r.splice(u,1):r.push(s),a(r)}},l=async s=>{const{beforeCollapse:r}=e;if(!r){o(s);return}const u=r(s);[Jl(u),Dt(u)].includes(!0)||Gt(ey,"beforeCollapse must return type `Promise` or `boolean`"),Jl(u)?u.then(c=>{c!==!1&&o(s)}).catch(c=>{ut(ey,`some error occurred: ${c}`)}):u&&o(s)};return re(()=>e.modelValue,()=>n.value=Cn(e.modelValue),{deep:!0}),gt(_S,{activeNames:n,handleItemClick:l}),{activeNames:n,setActiveNames:a}},TV=e=>{const t=fe("collapse");return{rootKls:y(()=>[t.b(),t.b(`icon-position-${e.expandIconPosition}`)])}};var $V=le({name:"ElCollapse",__name:"collapse",props:wV,emits:CV,setup(e,{expose:t,emit:n}){const a=e,{activeNames:o,setActiveNames:l}=xV(a,n),{rootKls:s}=TV(a);return t({activeNames:o,setActiveNames:l}),(r,u)=>(x(),B("div",{class:T(i(s))},[ee(r.$slots,"default")],2))}}),OV=$V;const IV=e=>{const t=Re(_S),{namespace:n}=fe("collapse"),a=R(!1),o=R(!1),l=Jv(),s=y(()=>l.current++),r=y(()=>e.name??`${n.value}-id-${l.prefix}-${i(s)}`),u=y(()=>t?.activeNames.value.includes(i(r)));return{focusing:a,id:s,isActive:u,handleFocus:()=>{setTimeout(()=>{o.value?o.value=!1:a.value=!0},50)},handleHeaderClick:h=>{e.disabled||h.target?.closest("input, textarea, select")||(t?.handleItemClick(i(r)),a.value=!1,o.value=!0)},handleEnterClick:h=>{h.target?.closest("input, textarea, select")||(h.preventDefault(),t?.handleItemClick(i(r)))}}},NV=(e,{focusing:t,isActive:n,id:a})=>{const o=fe("collapse"),l=y(()=>[o.b("item"),o.is("active",i(n)),o.is("disabled",e.disabled)]),s=y(()=>[o.be("item","header"),o.is("active",i(n)),{focusing:i(t)&&!e.disabled}]),r=y(()=>[o.be("item","arrow"),o.is("active",i(n))]);return{itemTitleKls:y(()=>[o.be("item","title")]),arrowKls:r,headKls:s,rootKls:l,itemWrapperKls:y(()=>o.be("item","wrap")),itemContentKls:y(()=>o.be("item","content")),scopedContentId:y(()=>o.b(`content-${i(a)}`)),scopedHeadId:y(()=>o.b(`head-${i(a)}`))}},MV=["id","aria-expanded","aria-controls","aria-describedby","tabindex","aria-disabled"],PV=["id","aria-hidden","aria-labelledby"];var RV=le({name:"ElCollapseItem",__name:"collapse-item",props:SV,setup(e,{expose:t}){const n=e,{focusing:a,id:o,isActive:l,handleFocus:s,handleHeaderClick:r,handleEnterClick:u}=IV(n),{arrowKls:c,headKls:d,rootKls:f,itemTitleKls:h,itemWrapperKls:g,itemContentKls:v,scopedContentId:p,scopedHeadId:m}=NV(n,{focusing:a,isActive:l,id:o});return t({isActive:l}),(b,k)=>(x(),B("div",{class:T(i(f))},[H("div",{id:i(m),class:T(i(d)),"aria-expanded":i(l),"aria-controls":i(p),"aria-describedby":i(p),tabindex:e.disabled?void 0:0,"aria-disabled":e.disabled,role:"button",onClick:k[0]||(k[0]=(...w)=>i(r)&&i(r)(...w)),onKeydown:k[1]||(k[1]=Zt(qe((...w)=>i(u)&&i(u)(...w),["stop"]),["space","enter"])),onFocus:k[2]||(k[2]=(...w)=>i(s)&&i(s)(...w)),onBlur:k[3]||(k[3]=w=>a.value=!1)},[H("span",{class:T(i(h))},[ee(b.$slots,"title",{isActive:i(l)},()=>[mt(ke(e.title),1)])],2),ee(b.$slots,"icon",{isActive:i(l)},()=>[U(i(Le),{class:T(i(c))},{default:Z(()=>[(x(),oe(ot(e.icon)))]),_:1},8,["class"])])],42,MV),U(i(Od),null,{default:Z(()=>[st(H("div",{id:i(p),role:"region",class:T(i(g)),"aria-hidden":!i(l),"aria-labelledby":i(m)},[H("div",{class:T(i(v))},[ee(b.$slots,"default")],2)],10,PV),[[Ot,i(l)]])]),_:3})],2))}}),LS=RV;const AV=nt(OV,{CollapseItem:LS}),_V=Xt(LS),DS=Ce({modelValue:{type:q(String),default:void 0},border:{type:Boolean,default:!0},showAlpha:Boolean,colorFormat:{type:q(String)},disabled:Boolean,predefine:{type:q(Array)},validateEvent:{type:Boolean,default:!0}}),LV={[Qe]:e=>_e(e)||cn(e)},BS=Symbol("colorCommonPickerKey"),VS=Symbol("colorPickerPanelContextKey"),FS=Ce({color:{type:q(Object),required:!0},vertical:Boolean,disabled:Boolean}),DV=FS,ty=e=>{let t=0,n=e;for(;n;)t+=n.offsetTop,n=n.offsetParent;return t},xp=(e,t)=>Math.abs(ty(e)-ty(t)),zS=e=>{let t,n;return e.type==="touchend"?(n=e.changedTouches[0].clientY,t=e.changedTouches[0].clientX):e.type.startsWith("touch")?(n=e.touches[0].clientY,t=e.touches[0].clientX):(n=e.clientY,t=e.clientX),{clientX:t,clientY:n}};let hf=!1;function Tp(e,t){if(!It)return;const n=function(l){t.drag?.(l)},a=function(l){document.removeEventListener("mousemove",n),document.removeEventListener("mouseup",a),document.removeEventListener("touchmove",n),document.removeEventListener("touchend",a),document.onselectstart=null,document.ondragstart=null,hf=!1,t.end?.(l)},o=function(l){hf||(document.onselectstart=()=>!1,document.ondragstart=()=>!1,document.addEventListener("mousemove",n),document.addEventListener("mouseup",a),document.addEventListener("touchmove",n),document.addEventListener("touchend",a),hf=!0,t.start?.(l))};e.addEventListener("mousedown",o),e.addEventListener("touchstart",o,{passive:!1})}const HS=(e,{key:t,minValue:n,maxValue:a})=>{const o=it(),l=jt(),s=jt(),r=y(()=>e.color.get(t));function u(h){e.disabled||(h.target!==l.value&&c(h),l.value?.focus())}function c(h){if(!s.value||!l.value||e.disabled)return;const g=o.vnode.el.getBoundingClientRect(),{clientX:v,clientY:p}=zS(h);let m;if(e.vertical){let b=p-g.top;b=Math.max(l.value.offsetHeight/2,b),b=Math.min(b,g.height-l.value.offsetHeight/2),m=Math.round((b-l.value.offsetHeight/2)/(g.height-l.value.offsetHeight)*a)}else{let b=v-g.left;b=Math.max(l.value.offsetWidth/2,b),b=Math.min(b,g.width-l.value.offsetWidth/2),m=Math.round((b-l.value.offsetWidth/2)/(g.width-l.value.offsetWidth)*a)}e.color.set(t,m)}function d(h){if(e.disabled)return;const{shiftKey:g}=h,v=Ft(h),p=g?10:1,m=t==="hue"?-1:1;let b=!0;switch(v){case we.left:case we.down:f(-p*m);break;case we.right:case we.up:f(p*m);break;case we.home:e.color.set(t,t==="hue"?a:n);break;case we.end:e.color.set(t,t==="hue"?n:a);break;case we.pageDown:f(-4*m);break;case we.pageUp:f(4*m);break;default:b=!1;break}b&&h.preventDefault()}function f(h){let g=r.value+h;g=ga?a:g,e.color.set(t,g)}return{thumb:l,bar:s,currentValue:r,handleDrag:c,handleClick:u,handleKeydown:d}},KS=(e,{namespace:t,maxValue:n,bar:a,thumb:o,currentValue:l,handleDrag:s,getBackground:r})=>{const u=it(),c=fe(t),d=R(0),f=R(0),h=R();function g(){if(!o.value||e.vertical)return 0;const w=u.vnode.el,C=l.value;return w?Math.round(C*(w.offsetWidth-o.value.offsetWidth/2)/n):0}function v(){if(!o.value)return 0;const w=u.vnode.el;if(!e.vertical)return 0;const C=l.value;return w?Math.round(C*(w.offsetHeight-o.value.offsetHeight/2)/n):0}function p(){d.value=g(),f.value=v(),h.value=r?.()}ct(()=>{if(!a.value||!o.value)return;const w={drag:C=>{s(C)},end:C=>{s(C)}};Tp(a.value,w),Tp(o.value,w),p()}),re(l,()=>p()),re(()=>e.color.value,()=>p());const m=y(()=>[c.b(),c.is("vertical",e.vertical),c.is("disabled",e.disabled)]),b=y(()=>c.e("bar")),k=y(()=>c.e("thumb"));return{rootKls:m,barKls:b,barStyle:y(()=>({background:h.value})),thumbKls:k,thumbStyle:y(()=>({left:en(d.value),top:en(f.value)})),thumbLeft:d,thumbTop:f,update:p}},BV=["aria-label","aria-valuenow","aria-valuetext","aria-orientation","tabindex","aria-disabled"],ny=0,mf=100;var VV=le({name:"ElColorAlphaSlider",__name:"alpha-slider",props:FS,setup(e,{expose:t}){const n=e,{currentValue:a,bar:o,thumb:l,handleDrag:s,handleClick:r,handleKeydown:u}=HS(n,{key:"alpha",minValue:ny,maxValue:mf}),{rootKls:c,barKls:d,barStyle:f,thumbKls:h,thumbStyle:g,update:v}=KS(n,{namespace:"color-alpha-slider",maxValue:mf,currentValue:a,bar:o,thumb:l,handleDrag:s,getBackground:k}),{t:p}=bt(),m=y(()=>p("el.colorpicker.alphaLabel")),b=y(()=>p("el.colorpicker.alphaDescription",{alpha:a.value,color:n.color.value}));function k(){if(n.color&&n.color.value){const{r:w,g:C,b:S}=n.color.toRgb();return`linear-gradient(to right, rgba(${w}, ${C}, ${S}, 0) 0%, rgba(${w}, ${C}, ${S}, 1) 100%)`}return""}return t({update:v,bar:o,thumb:l}),(w,C)=>(x(),B("div",{class:T(i(c))},[H("div",{ref_key:"bar",ref:o,class:T(i(d)),style:He(i(f)),onClick:C[0]||(C[0]=(...S)=>i(r)&&i(r)(...S))},null,6),H("div",{ref_key:"thumb",ref:l,class:T(i(h)),style:He(i(g)),"aria-label":m.value,"aria-valuenow":i(a),"aria-valuetext":b.value,"aria-orientation":e.vertical?"vertical":"horizontal","aria-valuemin":ny,"aria-valuemax":mf,role:"slider",tabindex:e.disabled?void 0:0,"aria-disabled":e.disabled,onKeydown:C[1]||(C[1]=(...S)=>i(u)&&i(u)(...S))},null,46,BV)],2))}}),FV=VV;const zV=["aria-label","aria-valuenow","aria-valuetext","aria-orientation","tabindex","aria-disabled"],ay=0,gf=360;var HV=le({name:"ElColorHueSlider",__name:"hue-slider",props:DV,setup(e,{expose:t}){const n=e,{currentValue:a,bar:o,thumb:l,handleDrag:s,handleClick:r,handleKeydown:u}=HS(n,{key:"hue",minValue:ay,maxValue:gf}),{rootKls:c,barKls:d,thumbKls:f,thumbStyle:h,thumbTop:g,update:v}=KS(n,{namespace:"color-hue-slider",maxValue:gf,currentValue:a,bar:o,thumb:l,handleDrag:s}),{t:p}=bt(),m=y(()=>p("el.colorpicker.hueLabel")),b=y(()=>p("el.colorpicker.hueDescription",{hue:a.value,color:n.color.value}));return t({bar:o,thumb:l,thumbTop:g,update:v}),(k,w)=>(x(),B("div",{class:T(i(c))},[H("div",{ref_key:"bar",ref:o,class:T(i(d)),onClick:w[0]||(w[0]=(...C)=>i(r)&&i(r)(...C))},null,2),H("div",{ref_key:"thumb",ref:l,class:T(i(f)),style:He(i(h)),"aria-label":m.value,"aria-valuenow":i(a),"aria-valuetext":b.value,"aria-orientation":e.vertical?"vertical":"horizontal","aria-valuemin":ay,"aria-valuemax":gf,role:"slider",tabindex:e.disabled?void 0:0,"aria-disabled":e.disabled,onKeydown:w[1]||(w[1]=(...C)=>i(u)&&i(u)(...C))},null,46,zV)],2))}}),KV=HV;const WV=Ce({colors:{type:q(Array),required:!0},color:{type:q(Object),required:!0},enableAlpha:{type:Boolean,required:!0},disabled:Boolean});var Ic=class{constructor(e={}){this._hue=0,this._saturation=100,this._value=100,this._alpha=100,this._tiny=new on,this._isValid=!1,this.enableAlpha=!1,this.format="",this.value="";for(const t in e)Tt(e,t)&&(this[t]=e[t]);e.value?this.fromString(e.value):this.doOnChange()}set(e,t){if(arguments.length===1&&typeof e=="object"){for(const n in e)Tt(e,n)&&this.set(n,e[n]);return}this[`_${e}`]=t,this._isValid=!0,this.doOnChange()}get(e){return["hue","saturation","value","alpha"].includes(e)?Math.round(this[`_${e}`]):this[`_${e}`]}toRgb(){return this._isValid?this._tiny.toRgb():{r:255,g:255,b:255,a:0}}fromString(e){const t=new on(e);if(this._isValid=t.isValid,t.isValid){const{h:n,s:a,v:o,a:l}=t.toHsv();this._hue=n,this._saturation=a*100,this._value=o*100,this._alpha=l*100}else this._hue=0,this._saturation=100,this._value=100,this._alpha=100;this.doOnChange()}clear(){this._isValid=!1,this.value="",this._hue=0,this._saturation=100,this._value=100,this._alpha=100}compare(e){const t=new on({h:e._hue,s:e._saturation/100,v:e._value/100,a:e._alpha/100});return this._tiny.equals(t)}doOnChange(){const{_hue:e,_saturation:t,_value:n,_alpha:a,format:o,enableAlpha:l}=this;let s=o||(l?"rgb":"hex");o==="hex"&&l&&(s="hex8"),this._tiny=new on({h:e,s:t/100,v:n/100,a:a/100}),this.value=this._isValid?this._tiny.toString(s):""}};const jV=e=>{const{currentColor:t}=Re(VS),n=R(o(e.colors,e.color));re(()=>t.value,l=>{const s=new Ic({value:l,enableAlpha:e.enableAlpha});n.value.forEach(r=>{r.selected=s.compare(r)})}),ia(()=>{n.value=o(e.colors,e.color)});function a(l){e.color.fromString(e.colors[l])}function o(l,s){return l.map(r=>{const u=new Ic({value:r,enableAlpha:e.enableAlpha});return u.selected=u.compare(s),u})}return{rgbaColors:n,handleSelect:a}},YV=e=>{const t=fe("color-predefine"),n=y(()=>[t.b(),t.is("disabled",e.disabled)]),a=y(()=>t.e("colors"));function o(l){return[t.e("color-selector"),t.is("alpha",l.get("alpha")<100),{selected:l.selected}]}return{rootKls:n,colorsKls:a,colorSelectorKls:o}},UV=["disabled","aria-label","onClick"];var qV=le({name:"ElColorPredefine",__name:"predefine",props:WV,setup(e){const t=e,{rgbaColors:n,handleSelect:a}=jV(t),{rootKls:o,colorsKls:l,colorSelectorKls:s}=YV(t),{t:r}=bt(),u=c=>r("el.colorpicker.predefineDescription",{value:c});return(c,d)=>(x(),B("div",{class:T(i(o))},[H("div",{class:T(i(l))},[(x(!0),B(Fe,null,ht(i(n),(f,h)=>(x(),B("button",{key:e.colors[h],type:"button",disabled:e.disabled,"aria-label":u(f.value),class:T(i(s)(f)),onClick:g=>i(a)(h)},[H("div",{style:He({backgroundColor:f.value})},null,4)],10,UV))),128))],2)],2))}}),GV=qV;const XV=Ce({color:{type:q(Object),required:!0},disabled:Boolean}),ZV=e=>{const t=it(),n=R(),a=R(0),o=R(0),l=R("hsl(0, 100%, 50%)"),s=y(()=>e.color.get("saturation")),r=y(()=>e.color.get("value")),u=y(()=>e.color.get("hue"));function c(v){e.disabled||(v.target!==n.value&&d(v),n.value?.focus({preventScroll:!0}))}function d(v){if(e.disabled)return;const p=t.vnode.el.getBoundingClientRect(),{clientX:m,clientY:b}=zS(v);let k=m-p.left,w=b-p.top;k=Math.max(0,k),k=Math.min(k,p.width),w=Math.max(0,w),w=Math.min(w,p.height),o.value=k,a.value=w,e.color.set({saturation:k/p.width*100,value:100-w/p.height*100})}function f(v){if(e.disabled)return;const{shiftKey:p}=v,m=Ft(v),b=p?10:1;let k=!0;switch(m){case we.left:h(-b);break;case we.right:h(b);break;case we.up:g(b);break;case we.down:g(-b);break;default:k=!1;break}k&&v.preventDefault()}function h(v){let p=s.value+v;p=p<0?0:p>100?100:p,e.color.set("saturation",p)}function g(v){let p=r.value+v;p=p<0?0:p>100?100:p,e.color.set("value",p)}return{cursorRef:n,cursorTop:a,cursorLeft:o,background:l,saturation:s,brightness:r,hue:u,handleClick:c,handleDrag:d,handleKeydown:f}},JV=(e,{cursorTop:t,cursorLeft:n,background:a,handleDrag:o})=>{const l=it(),s=fe("color-svpanel");function r(){const u=e.color.get("saturation"),c=e.color.get("value"),{clientWidth:d,clientHeight:f}=l.vnode.el;n.value=u*d/100,t.value=(100-c)*f/100,a.value=`hsl(${e.color.get("hue")}, 100%, 50%)`}return ct(()=>{Tp(l.vnode.el,{drag:u=>{o(u)},end:u=>{o(u)}}),r()}),re([()=>e.color.get("hue"),()=>e.color.get("value"),()=>e.color.value],()=>r()),{rootKls:y(()=>s.b()),cursorKls:y(()=>s.e("cursor")),rootStyle:y(()=>({backgroundColor:a.value})),cursorStyle:y(()=>({top:en(t.value),left:en(n.value)})),update:r}},QV=["tabindex","aria-disabled","aria-label","aria-valuenow","aria-valuetext"];var e6=le({name:"ElSvPanel",__name:"sv-panel",props:XV,setup(e,{expose:t}){const n=e,{cursorRef:a,cursorTop:o,cursorLeft:l,background:s,saturation:r,brightness:u,handleClick:c,handleDrag:d,handleKeydown:f}=ZV(n),{rootKls:h,cursorKls:g,rootStyle:v,cursorStyle:p,update:m}=JV(n,{cursorTop:o,cursorLeft:l,background:s,handleDrag:d}),{t:b}=bt(),k=y(()=>b("el.colorpicker.svLabel")),w=y(()=>b("el.colorpicker.svDescription",{saturation:r.value,brightness:u.value,color:n.color.value}));return t({update:m}),(C,S)=>(x(),B("div",{class:T(i(h)),style:He(i(v)),onClick:S[1]||(S[1]=(...E)=>i(c)&&i(c)(...E))},[H("div",{ref_key:"cursorRef",ref:a,class:T(i(g)),style:He(i(p)),tabindex:e.disabled?void 0:0,"aria-disabled":e.disabled,role:"slider","aria-valuemin":"0,0","aria-valuemax":"100,100","aria-label":k.value,"aria-valuenow":`${i(r)},${i(u)}`,"aria-valuetext":w.value,onKeydown:S[0]||(S[0]=(...E)=>i(f)&&i(f)(...E))},null,46,QV)],6))}}),t6=e6;const WS=(e,t)=>{const n=Nt(new Ic({enableAlpha:e.showAlpha,format:e.colorFormat||"",value:e.modelValue}));return re(()=>[e.colorFormat,e.showAlpha],()=>{n.enableAlpha=e.showAlpha,n.format=e.colorFormat||n.format,n.doOnChange(),t(Qe,n.value)}),{color:n}};var n6=le({name:"ElColorPickerPanel",__name:"color-picker-panel",props:DS,emits:LV,setup(e,{expose:t,emit:n}){const a=e,o=n,l=fe("color-picker-panel"),{formItem:s}=On(),r=tn(),u=R(),c=R(),d=R(),f=R(),h=R(""),{color:g}=Re(BS,()=>WS(a,o),!0);function v(){g.fromString(h.value),g.value!==h.value&&(h.value=g.value)}function p(){a.validateEvent&&s?.validate?.("blur").catch(b=>ut(b))}function m(){u.value?.update(),c.value?.update(),d.value?.update()}return ct(()=>{a.modelValue&&(h.value=g.value),Oe(m)}),re(()=>a.modelValue,b=>{b!==g.value&&(b?g.fromString(b):g.clear())}),re(()=>g.value,b=>{o(Qe,b),h.value=b,a.validateEvent&&s?.validate("change").catch(k=>ut(k))}),gt(VS,{currentColor:y(()=>g.value)}),t({color:g,inputRef:f,update:m}),(b,k)=>(x(),B("div",{class:T([i(l).b(),i(l).is("disabled",i(r)),i(l).is("border",e.border)]),onFocusout:p},[H("div",{class:T(i(l).e("wrapper"))},[U(KV,{ref_key:"hueRef",ref:u,class:"hue-slider",color:i(g),vertical:"",disabled:i(r)},null,8,["color","disabled"]),U(t6,{ref_key:"svRef",ref:c,color:i(g),disabled:i(r)},null,8,["color","disabled"])],2),e.showAlpha?(x(),oe(FV,{key:0,ref_key:"alphaRef",ref:d,color:i(g),disabled:i(r)},null,8,["color","disabled"])):te("v-if",!0),e.predefine?(x(),oe(GV,{key:1,ref:"predefine","enable-alpha":e.showAlpha,color:i(g),colors:e.predefine,disabled:i(r)},null,8,["enable-alpha","color","colors","disabled"])):te("v-if",!0),H("div",{class:T(i(l).e("footer"))},[U(i(Wn),{ref_key:"inputRef",ref:f,modelValue:h.value,"onUpdate:modelValue":k[0]||(k[0]=w=>h.value=w),"validate-event":!1,size:"small",disabled:i(r),onChange:v},null,8,["modelValue","disabled"]),ee(b.$slots,"footer")],2)],34))}}),a6=n6;const jS=nt(a6),o6=Ce({persistent:{type:Boolean,default:!0},modelValue:{type:q(String),default:void 0},id:String,showAlpha:Boolean,colorFormat:{type:q(String)},disabled:{type:Boolean,default:void 0},clearable:{type:Boolean,default:!0},size:bn,popperClass:Lt.popperClass,popperStyle:Lt.popperStyle,tabindex:{type:[String,Number],default:0},teleported:Lt.teleported,appendTo:Lt.appendTo,predefine:{type:q(Array)},validateEvent:{type:Boolean,default:!0},...ps,...Un(["ariaLabel"])}),l6={[Qe]:e=>_e(e)||cn(e),[vt]:e=>_e(e)||cn(e),activeChange:e=>_e(e)||cn(e),focus:e=>e instanceof FocusEvent,blur:e=>e instanceof FocusEvent,clear:()=>!0},s6=["id","aria-label","aria-labelledby","aria-description","aria-disabled","tabindex"];var r6=le({name:"ElColorPicker",__name:"color-picker",props:o6,emits:l6,setup(e,{expose:t,emit:n}){const a=e,o=n,{t:l}=bt(),s=fe("color"),{formItem:r}=On(),u=vn(),c=tn(),{valueOnClear:d,isEmptyValue:f}=Yi(a,null),h=WS(a,o),{inputId:g,isLabeledByFormItem:v}=ya(a,{formItemContext:r}),p=R(),m=R(),b=R(),k=R(!1),w=R(!1);let C=!0;const{isFocused:S,handleFocus:E,handleBlur:O}=tl(m,{disabled:c,beforeBlur(ae){return p.value?.isFocusInsideContent(ae)},afterBlur(){W(!1),D(),a.validateEvent&&r?.validate?.("blur").catch(ae=>ut(ae))}}),$=XM(()=>b.value?.color??h.color),N=y(()=>Wo(a,Object.keys(DS))),I=y(()=>!a.modelValue&&!w.value?"transparent":Y($,a.showAlpha)),_=y(()=>!a.modelValue&&!w.value?"":$.value),A=y(()=>v.value?void 0:a.ariaLabel||l("el.colorpicker.defaultLabel")),F=y(()=>v.value?r?.labelId:void 0),K=y(()=>[s.b("picker"),s.is("disabled",c.value),s.bm("picker",u.value),s.is("focused",S.value)]);function Y(ae,ne){const{r:z,g:J,b:se,a:ce}=ae.toRgb();return ne?`rgba(${z}, ${J}, ${se}, ${ce})`:`rgb(${z}, ${J}, ${se})`}function W(ae){k.value=ae}const P=bo(W,100,{leading:!0});function M(){c.value||W(!0)}function L(){P(!1),D()}function D(){Oe(()=>{a.modelValue?$.fromString(a.modelValue):($.value="",Oe(()=>{w.value=!1}))})}function V(){c.value||(k.value&&D(),P(!k.value))}function G(){const ae=f($.value)?d.value:$.value;o(Qe,ae),o(vt,ae),a.validateEvent&&r?.validate("change").catch(ne=>ut(ne)),P(!1),Oe(()=>{const ne=new Ic({enableAlpha:a.showAlpha,format:a.colorFormat||"",value:a.modelValue});$.compare(ne)||D()})}function j(){P(!1),o(Qe,d.value),o(vt,d.value),a.modelValue!==d.value&&a.validateEvent&&r?.validate("change").catch(ae=>ut(ae)),D(),o("clear")}function X(){b?.value?.inputRef?.focus()}function Q(){k.value&&(L(),S.value&&ge())}function ve(ae){ae.preventDefault(),ae.stopPropagation(),W(!1),D()}function ue(ae){switch(Ft(ae)){case we.enter:case we.numpadEnter:case we.space:ae.preventDefault(),ae.stopPropagation(),M();break;case we.esc:ve(ae);break}}function ge(){m.value.focus()}function ie(){m.value.blur()}return re(()=>_.value,ae=>{C&&o("activeChange",ae),C=!0}),re(()=>$.value,()=>{!a.modelValue&&!w.value&&(w.value=!0)}),re(()=>a.modelValue,ae=>{ae?ae&&ae!==$.value&&(C=!1,$.fromString(ae)):w.value=!1}),re(()=>k.value,()=>{b.value&&Oe(b.value.update)}),gt(BS,h),t({color:$,show:M,hide:L,focus:ge,blur:ie}),(ae,ne)=>(x(),oe(i($n),{ref_key:"popper",ref:p,visible:k.value,"show-arrow":!1,"fallback-placements":["bottom","top","right","left"],offset:0,"gpu-acceleration":!1,"popper-class":[i(s).be("picker","panel"),e.popperClass],"popper-style":e.popperStyle,"stop-popper-mouse-event":!1,pure:"",loop:"",role:"dialog",effect:"light",trigger:"click",teleported:e.teleported,transition:`${i(s).namespace.value}-zoom-in-top`,persistent:e.persistent,"append-to":e.appendTo,onShow:X,onHide:ne[2]||(ne[2]=z=>W(!1))},{content:Z(()=>[st((x(),oe(i(jS),rt({ref_key:"pickerPanelRef",ref:b},N.value,{border:!1,"validate-event":!1,onKeydown:Zt(ve,["esc"])}),{footer:Z(()=>[H("div",null,[e.clearable?(x(),oe(i(Sn),{key:0,class:T(i(s).be("footer","link-btn")),text:"",size:"small",onClick:j},{default:Z(()=>[mt(ke(i(l)("el.colorpicker.clear")),1)]),_:1},8,["class"])):te("v-if",!0),U(i(Sn),{plain:"",size:"small",class:T(i(s).be("footer","btn")),onClick:G},{default:Z(()=>[mt(ke(i(l)("el.colorpicker.confirm")),1)]),_:1},8,["class"])])]),_:1},16)),[[i(Tl),Q,m.value]])]),default:Z(()=>[H("div",rt({id:i(g),ref_key:"triggerRef",ref:m},ae.$attrs,{class:K.value,role:"button","aria-label":A.value,"aria-labelledby":F.value,"aria-description":i(l)("el.colorpicker.description",{color:e.modelValue||""}),"aria-disabled":i(c),tabindex:i(c)?void 0:e.tabindex,onKeydown:ue,onFocus:ne[0]||(ne[0]=(...z)=>i(E)&&i(E)(...z)),onBlur:ne[1]||(ne[1]=(...z)=>i(O)&&i(O)(...z))}),[H("div",{class:T(i(s).be("picker","trigger")),onClick:V},[H("span",{class:T([i(s).be("picker","color"),i(s).is("alpha",e.showAlpha)])},[H("span",{class:T(i(s).be("picker","color-inner")),style:He({backgroundColor:I.value})},[st(U(i(Le),{class:T([i(s).be("picker","icon"),i(s).is("icon-arrow-down")])},{default:Z(()=>[U(i(Eo))]),_:1},8,["class"]),[[Ot,e.modelValue||w.value]]),st(U(i(Le),{class:T([i(s).be("picker","empty"),i(s).is("icon-close")])},{default:Z(()=>[U(i(Ia))]),_:1},8,["class"]),[[Ot,!e.modelValue&&!w.value]])],6)],2)],2)],16,s6)]),_:1},8,["visible","popper-class","popper-style","teleported","transition","persistent","append-to"]))}}),i6=r6;const u6=nt(i6);var c6=le({name:"ElContainer",__name:"container",props:{direction:{type:String,required:!1}},setup(e){const t=e,n=sn(),a=fe("container"),o=y(()=>t.direction==="vertical"?!0:t.direction==="horizontal"?!1:n&&n.default?n.default().some(l=>{const s=l.type.name;return s==="ElHeader"||s==="ElFooter"}):!1);return(l,s)=>(x(),B("section",{class:T([i(a).b(),i(a).is("vertical",o.value)])},[ee(l.$slots,"default")],2))}}),d6=c6,f6=le({name:"ElAside",__name:"aside",props:{width:{type:[String,null],required:!1,default:null}},setup(e){const t=e,n=fe("aside"),a=y(()=>t.width?n.cssVarBlock({width:t.width}):{});return(o,l)=>(x(),B("aside",{class:T(i(n).b()),style:He(a.value)},[ee(o.$slots,"default")],6))}}),YS=f6,p6=le({name:"ElFooter",__name:"footer",props:{height:{type:[String,null],required:!1,default:null}},setup(e){const t=e,n=fe("footer"),a=y(()=>t.height?n.cssVarBlock({height:t.height}):{});return(o,l)=>(x(),B("footer",{class:T(i(n).b()),style:He(a.value)},[ee(o.$slots,"default")],6))}}),US=p6,v6=le({name:"ElHeader",__name:"header",props:{height:{type:[String,null],required:!1,default:null}},setup(e){const t=e,n=fe("header"),a=y(()=>t.height?n.cssVarBlock({height:t.height}):{});return(o,l)=>(x(),B("header",{class:T(i(n).b()),style:He(a.value)},[ee(o.$slots,"default")],6))}}),qS=v6,h6=le({name:"ElMain",__name:"main",setup(e){const t=fe("main");return(n,a)=>(x(),B("main",{class:T(i(t).b())},[ee(n.$slots,"default")],2))}}),GS=h6;const m6=nt(d6,{Aside:YS,Footer:US,Header:qS,Main:GS}),g6=Xt(YS),b6=Xt(US),y6=Xt(qS),w6=Xt(GS),C6=Ce({format:{type:String,default:"HH:mm:ss"},prefix:String,suffix:String,title:String,value:{type:q([Number,Object]),default:0},valueStyle:{type:q([String,Object,Array])}}),S6={finish:()=>!0,[vt]:e=>ze(e)},k6=Ce({decimalSeparator:{type:String,default:"."},groupSeparator:{type:String,default:","},precision:{type:Number,default:0},formatter:Function,value:{type:q([Number,Object]),default:0},prefix:String,suffix:String,title:String,valueStyle:{type:q([String,Object,Array])}});var E6=le({name:"ElStatistic",__name:"statistic",props:k6,setup(e,{expose:t}){const n=e,a=fe("statistic"),o=y(()=>{const{value:l,formatter:s,precision:r,decimalSeparator:u,groupSeparator:c}=n;if(Be(s))return s(l);if(!ze(l)||Number.isNaN(l))return l;let[d,f=""]=String(l).split(".");return f=f.padEnd(r,"0").slice(0,r>0?r:0),d=d.replace(/\B(?=(\d{3})+(?!\d))/g,c),[d,f].join(f?u:"")});return t({displayValue:o}),(l,s)=>(x(),B("div",{class:T(i(a).b())},[l.$slots.title||e.title?(x(),B("div",{key:0,class:T(i(a).e("head"))},[ee(l.$slots,"title",{},()=>[mt(ke(e.title),1)])],2)):te("v-if",!0),H("div",{class:T(i(a).e("content"))},[l.$slots.prefix||e.prefix?(x(),B("div",{key:0,class:T(i(a).e("prefix"))},[ee(l.$slots,"prefix",{},()=>[H("span",null,ke(e.prefix),1)])],2)):te("v-if",!0),H("span",{class:T(i(a).e("number")),style:He(e.valueStyle)},ke(o.value),7),l.$slots.suffix||e.suffix?(x(),B("div",{key:1,class:T(i(a).e("suffix"))},[ee(l.$slots,"suffix",{},()=>[H("span",null,ke(e.suffix),1)])],2)):te("v-if",!0)],2)],2))}}),x6=E6;const XS=nt(x6),T6=[["Y",1e3*60*60*24*365],["M",1e3*60*60*24*30],["D",1e3*60*60*24],["H",1e3*60*60],["m",1e3*60],["s",1e3],["S",1]],oy=e=>ze(e)?new Date(e).getTime():e.valueOf(),ly=(e,t)=>{let n=e;return T6.reduce((a,[o,l])=>{const s=new RegExp(`${o}+(?![^\\[\\]]*\\])`,"g");if(s.test(a)){const r=Math.floor(n/l);return n-=r*l,a.replace(s,u=>String(r).padStart(u.length,"0"))}return a},t).replace(/\[([^\]]*)]/g,"$1")};var $6=le({name:"ElCountdown",__name:"countdown",props:C6,emits:S6,setup(e,{expose:t,emit:n}){const a=e,o=n;let l;const s=R(0),r=y(()=>ly(s.value,a.format)),u=f=>ly(f,a.format),c=()=>{l&&(jo(l),l=void 0)},d=()=>{const f=oy(a.value),h=()=>{let g=f-Date.now();o(vt,g),g<=0?(g=0,c(),o("finish")):l=Fa(h),s.value=g};l=Fa(h)};return ct(()=>{s.value=oy(a.value)-Date.now(),re(()=>[a.value,a.format],()=>{c(),d()},{immediate:!0})}),Rt(()=>{c()}),t({displayValue:r}),(f,h)=>(x(),oe(i(XS),{value:s.value,title:e.title,prefix:e.prefix,suffix:e.suffix,"value-style":e.valueStyle,formatter:u},Qn({_:2},[ht(f.$slots,(g,v)=>({name:v,fn:Z(()=>[ee(f.$slots,v)])}))]),1032,["value","title","prefix","suffix","value-style"]))}}),O6=$6;const I6=nt(O6),N6=Ce({valueFormat:String,dateFormat:String,timeFormat:String,disabled:{type:Boolean,default:void 0},modelValue:{type:q([Date,Array,String,Number]),default:""},defaultValue:{type:q([Date,Array])},defaultTime:{type:q([Date,Array])},isRange:Boolean,...vh,disabledDate:{type:Function},cellClassName:{type:Function},shortcuts:{type:Array,default:()=>[]},arrowControl:Boolean,unlinkPanels:Boolean,showNow:{type:Boolean,default:!0},showConfirm:Boolean,showFooter:Boolean,showWeekNumber:Boolean,type:{type:q(String),default:"date"},clearable:{type:Boolean,default:!0},border:{type:Boolean,default:!0},editable:{type:Boolean,default:!0}}),Sh=Symbol("rootPickerContextKey"),Ji="ElIsDefaultFormat",M6=["date","dates","year","years","month","months","week","range"],kh=Ce({cellClassName:{type:q(Function)},disabledDate:{type:q(Function)},date:{type:q(Object),required:!0},minDate:{type:q(Object)},maxDate:{type:q(Object)},parsedValue:{type:q([Object,Array])},rangeState:{type:q(Object),default:()=>({endDate:null,selecting:!1})},disabled:Boolean}),ZS=Ce({type:{type:q(String),required:!0,values:bT},dateFormat:String,timeFormat:String,showNow:{type:Boolean,default:!0},showConfirm:Boolean,showFooter:{type:Boolean,default:!0},showWeekNumber:Boolean,border:Boolean,disabled:Boolean,editable:{type:Boolean,default:!0}}),Eh=Ce({unlinkPanels:Boolean,visible:{type:Boolean,default:!0},showConfirm:Boolean,showFooter:{type:Boolean,default:!0},border:Boolean,disabled:Boolean,parsedValue:{type:q(Array)}}),xh=e=>({type:String,values:M6,default:e}),P6=Ce({...ZS,parsedValue:{type:q([Object,Array])},visible:{type:Boolean,default:!0},format:{type:String,default:""}}),hi=e=>{if(!ye(e))return!1;const[t,n]=e;return tt.isDayjs(t)&&tt.isDayjs(n)&&tt(t).isValid()&&tt(n).isValid()&&t.isSameOrBefore(n)},Id=(e,{lang:t,step:n=1,unit:a,unlinkPanels:o})=>{let l;if(ye(e)){let[s,r]=e.map(u=>tt(u).locale(t));return o||(r=s.add(n,a)),[s,r]}else e?l=tt(e):l=tt();return l=l.locale(t),[l,l.add(n,a)]},R6=(e,t,{columnIndexOffset:n,startDate:a,nextEndDate:o,now:l,unit:s,relativeDateGetter:r,setCellMetadata:u,setRowMetadata:c})=>{for(let d=0;d{const o=tt().locale(a).startOf("month").month(n).year(t).hour(e.hour()).minute(e.minute()).second(e.second());return yl(o.daysInMonth()).map(l=>o.add(l,"day").toDate())},nr=(e,t,n,a,o)=>{const l=tt().year(t).month(n).startOf("month").hour(e.hour()).minute(e.minute()).second(e.second()),s=Nc(e,t,n,a).find(r=>!o?.(r));return s?tt(s).locale(a):l.locale(a)},Mc=(e,t,n)=>{const a=e.year();if(!n?.(e.toDate()))return e.locale(t);const o=e.month();if(!Nc(e,a,o,t).every(n))return nr(e,a,o,t,n);for(let l=0;l<12;l++)if(!Nc(e,a,l,t).every(n))return nr(e,a,l,t,n);return e},ar=(e,t,n,a)=>{if(ye(e))return e.map(o=>ar(o,t,n,a));if(_e(e)){const o=a?.value?tt(e):tt(e,t);if(!o.isValid())return o}return tt(e,t).locale(n)},A6=Ce({...kh,showWeekNumber:Boolean,selectionMode:xh("date")}),_6=["changerange","pick","select"],Pc=(e="")=>["normal","today"].includes(e),L6=(e,t)=>{const{lang:n}=bt(),a=R(),o=R(),l=R(),s=R(),r=R([[],[],[],[],[],[]]);let u=!1;const c=e.date.$locale().weekStart||7,d=e.date.locale("en").localeData().weekdaysShort().map(L=>L.toLowerCase()),f=y(()=>c>3?7-c:-c),h=y(()=>{const L=e.date.startOf("month");return L.subtract(L.day()||7,"day")}),g=y(()=>d.concat(d).slice(c,c+7)),v=y(()=>gc(i(C)).some(L=>L.isCurrent)),p=y(()=>{const L=e.date.startOf("month");return{startOfMonthDay:L.day()||7,dateCountOfMonth:L.daysInMonth(),dateCountOfLastMonth:L.subtract(1,"month").daysInMonth()}}),m=y(()=>e.selectionMode==="dates"?Kn(e.parsedValue):[]),b=(L,{count:D,rowIndex:V,columnIndex:G})=>{const{startOfMonthDay:j,dateCountOfMonth:X,dateCountOfLastMonth:Q}=i(p),ve=i(f);if(V>=0&&V<=1){const ue=j+ve<0?7+j+ve:j+ve;if(G+V*7>=ue)return L.text=D,!0;L.text=Q-(ue-G%7)+1+V*7,L.type="prev-month"}else return D<=X?L.text=D:(L.text=D-X,L.type="next-month"),!0;return!1},k=(L,{columnIndex:D,rowIndex:V},G)=>{const{disabledDate:j,cellClassName:X}=e,Q=i(m),ve=b(L,{count:G,rowIndex:V,columnIndex:D}),ue=L.dayjs.toDate();return L.selected=Q.find(ge=>ge.isSame(L.dayjs,"day")),L.isSelected=!!L.selected,L.isCurrent=E(L),L.disabled=j?.(ue),L.customClass=X?.(ue),ve},w=L=>{if(e.selectionMode==="week"){const[D,V]=e.showWeekNumber?[1,7]:[0,6],G=M(L[D+1]);L[D].inRange=G,L[D].start=G,L[V].inRange=G,L[V].end=G}},C=y(()=>{const{minDate:L,maxDate:D,rangeState:V,showWeekNumber:G}=e,j=i(f),X=i(r),Q="day";let ve=1;if(R6({row:6,column:7},X,{startDate:L,columnIndexOffset:G?1:0,nextEndDate:V.endDate||D||V.selecting&&L||null,now:tt().locale(i(n)).startOf(Q),unit:Q,relativeDateGetter:ue=>i(h).add(ue-j,Q),setCellMetadata:(...ue)=>{k(...ue,ve)&&(ve+=1)},setRowMetadata:w}),G)for(let ue=0;ue<6;ue++)X[ue][1].dayjs&&(X[ue][0]={type:"week",text:X[ue][1].dayjs.week()});return X});re(()=>e.date,async()=>{i(a)?.contains(document.activeElement)&&(await Oe(),await S())});const S=async()=>i(o)?.focus(),E=L=>e.selectionMode==="date"&&Pc(L.type)&&O(L,e.parsedValue),O=(L,D)=>D?tt(D).locale(i(n)).isSame(e.date.date(Number(L.text)),"day"):!1,$=(L,D)=>{const V=i(p).startOfMonthDay,G=i(f),j=V+G<0?7+V+G:V+G,X=L*7+(D-(e.showWeekNumber?1:0));return e.date.startOf("month").subtract(j,"day").add(X,"day")},N=L=>{if(!e.rangeState.selecting)return;let D=L.target;if(D.tagName==="SPAN"&&(D=D.parentNode?.parentNode),D.tagName==="DIV"&&(D=D.parentNode),D.tagName!=="TD")return;const V=D.parentNode.rowIndex-1,G=D.cellIndex;i(C)[V][G].disabled||(V!==i(l)||G!==i(s))&&(l.value=V,s.value=G,t("changerange",{selecting:!0,endDate:$(V,G)}))},I=L=>!i(v)&&L?.text===1&&Pc(L.type)||L.isCurrent,_=L=>{u||i(v)||e.selectionMode!=="date"||P(L,!0)},A=L=>{L.target.closest("td")&&(u=!0)},F=L=>{L.target.closest("td")&&(u=!1)},K=L=>{!e.rangeState.selecting||!e.minDate?(t("pick",{minDate:L,maxDate:null}),t("select",!0)):(L>=e.minDate?t("pick",{minDate:e.minDate,maxDate:L}):t("pick",{minDate:L,maxDate:e.minDate}),t("select",!1))},Y=L=>{const D=L.week(),V=`${L.year()}w${D}`;t("pick",{year:L.year(),week:D,value:V,date:L.startOf("week")})},W=(L,D)=>{t("pick",D?Kn(e.parsedValue).filter(V=>V?.valueOf()!==L.valueOf()):Kn(e.parsedValue).concat([L]))},P=(L,D=!1)=>{if(e.disabled)return;const V=L.target.closest("td");if(!V)return;const G=V.parentNode.rowIndex-1,j=V.cellIndex,X=i(C)[G][j];if(X.disabled||X.type==="week")return;const Q=$(G,j);switch(e.selectionMode){case"range":K(Q);break;case"date":t("pick",Q,D);break;case"week":Y(Q);break;case"dates":W(Q,!!X.selected);break}},M=L=>{if(e.selectionMode!=="week")return!1;let D=e.date.startOf("day");if(L.type==="prev-month"&&(D=D.subtract(1,"month")),L.type==="next-month"&&(D=D.add(1,"month")),D=D.date(Number.parseInt(L.text,10)),e.parsedValue&&!ye(e.parsedValue)){const V=(e.parsedValue.day()-c+7)%7-1;return e.parsedValue.subtract(V,"day").isSame(D,"day")}return!1};return{WEEKS:g,rows:C,tbodyRef:a,currentCellRef:o,focus:S,isCurrent:E,isWeekActive:M,isSelectedCell:I,handlePickDate:P,handleMouseUp:F,handleMouseDown:A,handleMouseMove:N,handleFocus:_}},D6=(e,{isCurrent:t,isWeekActive:n})=>{const a=fe("date-table"),{t:o}=bt(),l=y(()=>[a.b(),a.is("week-mode",e.selectionMode==="week"&&!e.disabled)]),s=y(()=>o("el.datepicker.dateTablePrompt")),r=c=>{const d=[];return Pc(c.type)&&!c.disabled?(d.push("available"),c.type==="today"&&d.push("today")):d.push(c.type),t(c)&&d.push("current"),c.inRange&&(Pc(c.type)||e.selectionMode==="week")&&(d.push("in-range"),c.start&&d.push("start-date"),c.end&&d.push("end-date")),(c.disabled||e.disabled)&&d.push("disabled"),c.selected&&d.push("selected"),c.customClass&&d.push(c.customClass),d.join(" ")},u=c=>[a.e("row"),{current:n(c)}];return{tableKls:l,tableLabel:s,weekHeaderClass:a.e("week-header"),getCellClasses:r,getRowKls:u,t:o}},B6=Ce({cell:{type:q(Object)}});var Th=le({name:"ElDatePickerCell",props:B6,setup(e){const t=fe("date-table-cell"),{slots:n}=Re(Sh);return()=>{const{cell:a}=e;return ee(n,"default",{...a},()=>[U("div",{class:t.b()},[U("span",{class:t.e("text")},[a?.renderText??a?.text])])])}}});const V6=["aria-label"],F6=["aria-label"],z6=["aria-current","aria-selected","tabindex","aria-disabled"];var H6=le({__name:"basic-date-table",props:A6,emits:_6,setup(e,{expose:t,emit:n}){const a=e,{WEEKS:o,rows:l,tbodyRef:s,currentCellRef:r,focus:u,isCurrent:c,isWeekActive:d,isSelectedCell:f,handlePickDate:h,handleMouseUp:g,handleMouseDown:v,handleMouseMove:p,handleFocus:m}=L6(a,n),{tableLabel:b,tableKls:k,getCellClasses:w,getRowKls:C,weekHeaderClass:S,t:E}=D6(a,{isCurrent:c,isWeekActive:d});let O=!1;return Rt(()=>{O=!0}),t({focus:u}),($,N)=>(x(),B("table",{"aria-label":i(b),class:T(i(k)),cellspacing:"0",cellpadding:"0",role:"grid",onClick:N[1]||(N[1]=(...I)=>i(h)&&i(h)(...I)),onMousemove:N[2]||(N[2]=(...I)=>i(p)&&i(p)(...I)),onMousedown:N[3]||(N[3]=(...I)=>i(v)&&i(v)(...I)),onMouseup:N[4]||(N[4]=(...I)=>i(g)&&i(g)(...I))},[H("tbody",{ref_key:"tbodyRef",ref:s},[H("tr",null,[$.showWeekNumber?(x(),B("th",{key:0,scope:"col",class:T(i(S))},null,2)):te("v-if",!0),(x(!0),B(Fe,null,ht(i(o),(I,_)=>(x(),B("th",{key:_,"aria-label":i(E)("el.datepicker.weeksFull."+I),scope:"col"},ke(i(E)("el.datepicker.weeks."+I)),9,F6))),128))]),(x(!0),B(Fe,null,ht(i(l),(I,_)=>(x(),B("tr",{key:_,class:T(i(C)($.showWeekNumber?I[2]:I[1]))},[(x(!0),B(Fe,null,ht(I,(A,F)=>(x(),B("td",{key:`${_}.${F}`,ref_for:!0,ref:K=>!i(O)&&i(f)(A)&&(r.value=K),class:T(i(w)(A)),"aria-current":A.isCurrent?"date":void 0,"aria-selected":A.isCurrent,tabindex:$.disabled?void 0:i(f)(A)?0:-1,"aria-disabled":$.disabled,onFocus:N[0]||(N[0]=(...K)=>i(m)&&i(m)(...K))},[U(i(Th),{cell:A},null,8,["cell"])],42,z6))),128))],2))),128))],512)],42,V6))}}),$p=H6;const K6=Ce({...kh,selectionMode:xh("month")}),W6=["aria-label"],j6=["aria-selected","aria-label","tabindex","onKeydown"];var Y6=le({__name:"basic-month-table",props:K6,emits:["changerange","pick","select"],setup(e,{expose:t,emit:n}){const a=e,o=n,l=fe("month-table"),{t:s,lang:r}=bt(),u=R(),c=R(),d=R(a.date.locale("en").localeData().monthsShort().map(C=>C.toLowerCase())),f=R([[],[],[]]),h=R(),g=R(),v=y(()=>{const C=f.value,S=tt().locale(r.value).startOf("month");for(let E=0;E<3;E++){const O=C[E];for(let $=0;$<4;$++){const N=O[$]||={row:E,column:$,type:"normal",inRange:!1,start:!1,end:!1,text:-1,disabled:!1,isSelected:!1,customClass:void 0,date:void 0,dayjs:void 0,isCurrent:void 0,selected:void 0,renderText:void 0,timestamp:void 0};N.type="normal";const I=E*4+$,_=a.date.startOf("year").month(I),A=a.rangeState.endDate||a.maxDate||a.rangeState.selecting&&a.minDate||null;N.inRange=!!(a.minDate&&_.isSameOrAfter(a.minDate,"month")&&A&&_.isSameOrBefore(A,"month"))||!!(a.minDate&&_.isSameOrBefore(a.minDate,"month")&&A&&_.isSameOrAfter(A,"month")),a.minDate?.isSameOrAfter(A)?(N.start=!!(A&&_.isSame(A,"month")),N.end=a.minDate&&_.isSame(a.minDate,"month")):(N.start=!!(a.minDate&&_.isSame(a.minDate,"month")),N.end=!!(A&&_.isSame(A,"month"))),S.isSame(_)&&(N.type="today");const F=_.toDate();N.text=I,N.disabled=a.disabledDate?.(F)||!1,N.date=F,N.customClass=a.cellClassName?.(F),N.dayjs=_,N.timestamp=_.valueOf(),N.isSelected=b(N)}}return C}),p=()=>{c.value?.focus()},m=C=>{const S={},E=a.date.year(),O=new Date,$=C.text;return S.disabled=a.disabled||(a.disabledDate?Nc(a.date,E,$,r.value).every(a.disabledDate):!1),S.current=Kn(a.parsedValue).some(N=>tt.isDayjs(N)&&N.year()===E&&N.month()===$),S.today=O.getFullYear()===E&&O.getMonth()===$,C.customClass&&(S[C.customClass]=!0),C.inRange&&(S["in-range"]=!0,C.start&&(S["start-date"]=!0),C.end&&(S["end-date"]=!0)),S},b=C=>{const S=a.date.year(),E=C.text;return Kn(a.date).some(O=>O.year()===S&&O.month()===E)},k=C=>{if(!a.rangeState.selecting)return;let S=C.target;if(S.tagName==="SPAN"&&(S=S.parentNode?.parentNode),S.tagName==="DIV"&&(S=S.parentNode),S.tagName!=="TD")return;const E=S.parentNode.rowIndex,O=S.cellIndex;v.value[E][O].disabled||(E!==h.value||O!==g.value)&&(h.value=E,g.value=O,o("changerange",{selecting:!0,endDate:a.date.startOf("year").month(E*4+O)}))},w=C=>{if(a.disabled)return;const S=C.target?.closest("td");if(S?.tagName!=="TD"||fo(S,"disabled"))return;const E=S.cellIndex,O=S.parentNode.rowIndex*4+E,$=a.date.startOf("year").month(O);if(a.selectionMode==="months"){if(C.type==="keydown"){o("pick",Kn(a.parsedValue),!1);return}const N=nr(a.date,a.date.year(),O,r.value,a.disabledDate);o("pick",fo(S,"current")?Kn(a.parsedValue).filter(I=>I?.year()!==N.year()||I?.month()!==N.month()):Kn(a.parsedValue).concat([tt(N)]))}else a.selectionMode==="range"?a.rangeState.selecting?(a.minDate&&$>=a.minDate?o("pick",{minDate:a.minDate,maxDate:$}):o("pick",{minDate:$,maxDate:a.minDate}),o("select",!1)):(o("pick",{minDate:$,maxDate:null}),o("select",!0)):o("pick",O)};return re(()=>a.date,async()=>{u.value?.contains(document.activeElement)&&(await Oe(),c.value?.focus())}),t({focus:p}),(C,S)=>(x(),B("table",{role:"grid","aria-label":i(s)("el.datepicker.monthTablePrompt"),class:T(i(l).b()),onClick:w,onMousemove:k},[H("tbody",{ref_key:"tbodyRef",ref:u},[(x(!0),B(Fe,null,ht(v.value,(E,O)=>(x(),B("tr",{key:O},[(x(!0),B(Fe,null,ht(E,($,N)=>(x(),B("td",{key:N,ref_for:!0,ref:I=>$.isSelected&&(c.value=I),class:T(m($)),"aria-selected":!!$.isSelected,"aria-label":i(s)(`el.datepicker.month${+$.text+1}`),tabindex:$.isSelected?0:-1,onKeydown:[Zt(qe(w,["prevent","stop"]),["space"]),Zt(qe(w,["prevent","stop"]),["enter"])]},[U(i(Th),{cell:{...$,renderText:i(s)("el.datepicker.months."+d.value[$.text])}},null,8,["cell"])],42,j6))),128))]))),128))],512)],42,W6))}}),mi=Y6;const U6=Ce({...kh,selectionMode:xh("year")}),q6=["aria-label"],G6=["aria-selected","aria-label","tabindex","onKeydown"];var X6=le({__name:"basic-year-table",props:U6,emits:["changerange","pick","select"],setup(e,{expose:t,emit:n}){const a=(S,E)=>{const O=tt(String(S)).locale(E).startOf("year");return yl(O.endOf("year").dayOfYear()).map($=>O.add($,"day").toDate())},o=e,l=n,s=fe("year-table"),{t:r,lang:u}=bt(),c=R(),d=R(),f=y(()=>Math.floor(o.date.year()/10)*10),h=R([[],[],[]]),g=R(),v=R(),p=y(()=>{const S=h.value,E=tt().locale(u.value).startOf("year");for(let O=0;O<3;O++){const $=S[O];for(let N=0;N<4&&!(O*4+N>=10);N++){let I=$[N];I||(I={row:O,column:N,type:"normal",inRange:!1,start:!1,end:!1,text:-1,disabled:!1,isSelected:!1,customClass:void 0,date:void 0,dayjs:void 0,isCurrent:void 0,selected:void 0,renderText:void 0,timestamp:void 0}),I.type="normal";const _=O*4+N+f.value,A=tt().year(_),F=o.rangeState.endDate||o.maxDate||o.rangeState.selecting&&o.minDate||null;I.inRange=!!(o.minDate&&A.isSameOrAfter(o.minDate,"year")&&F&&A.isSameOrBefore(F,"year"))||!!(o.minDate&&A.isSameOrBefore(o.minDate,"year")&&F&&A.isSameOrAfter(F,"year")),o.minDate?.isSameOrAfter(F)?(I.start=!!(F&&A.isSame(F,"year")),I.end=!!(o.minDate&&A.isSame(o.minDate,"year"))):(I.start=!!(o.minDate&&A.isSame(o.minDate,"year")),I.end=!!(F&&A.isSame(F,"year"))),E.isSame(A)&&(I.type="today"),I.text=_;const K=A.toDate();I.disabled=o.disabledDate?.(K)||!1,I.date=K,I.customClass=o.cellClassName?.(K),I.dayjs=A,I.timestamp=A.valueOf(),I.isSelected=k(I),$[N]=I}}return S}),m=()=>{d.value?.focus()},b=S=>{const E={},O=tt().locale(u.value),$=S.text;return E.disabled=o.disabled||(o.disabledDate?a($,u.value).every(o.disabledDate):!1),E.today=O.year()===$,E.current=Kn(o.parsedValue).some(N=>N.year()===$),S.customClass&&(E[S.customClass]=!0),S.inRange&&(E["in-range"]=!0,S.start&&(E["start-date"]=!0),S.end&&(E["end-date"]=!0)),E},k=S=>{const E=S.text;return Kn(o.date).some(O=>O.year()===E)},w=S=>{if(o.disabled)return;const E=S.target?.closest("td");if(!E||!E.textContent||fo(E,"disabled"))return;const O=E.cellIndex,$=E.parentNode.rowIndex*4+O+f.value,N=tt().year($);if(o.selectionMode==="range")o.rangeState.selecting?(o.minDate&&N>=o.minDate?l("pick",{minDate:o.minDate,maxDate:N}):l("pick",{minDate:N,maxDate:o.minDate}),l("select",!1)):(l("pick",{minDate:N,maxDate:null}),l("select",!0));else if(o.selectionMode==="years"){if(S.type==="keydown"){l("pick",Kn(o.parsedValue),!1);return}const I=Mc(N.startOf("year"),u.value,o.disabledDate);l("pick",fo(E,"current")?Kn(o.parsedValue).filter(_=>_?.year()!==$):Kn(o.parsedValue).concat([I]))}else l("pick",$)},C=S=>{if(!o.rangeState.selecting)return;const E=S.target?.closest("td");if(!E)return;const O=E.parentNode.rowIndex,$=E.cellIndex;p.value[O][$].disabled||(O!==g.value||$!==v.value)&&(g.value=O,v.value=$,l("changerange",{selecting:!0,endDate:tt().year(f.value).add(O*4+$,"year")}))};return re(()=>o.date,async()=>{c.value?.contains(document.activeElement)&&(await Oe(),d.value?.focus())}),t({focus:m}),(S,E)=>(x(),B("table",{role:"grid","aria-label":i(r)("el.datepicker.yearTablePrompt"),class:T(i(s).b()),onClick:w,onMousemove:C},[H("tbody",{ref_key:"tbodyRef",ref:c},[(x(!0),B(Fe,null,ht(p.value,(O,$)=>(x(),B("tr",{key:$},[(x(!0),B(Fe,null,ht(O,(N,I)=>(x(),B("td",{key:`${$}_${I}`,ref_for:!0,ref:_=>N.isSelected&&(d.value=_),class:T(["available",b(N)]),"aria-selected":N.isSelected,"aria-label":String(N.text),tabindex:N.isSelected?0:-1,onKeydown:[Zt(qe(w,["prevent","stop"]),["space"]),Zt(qe(w,["prevent","stop"]),["enter"])]},[U(i(Th),{cell:N},null,8,["cell"])],42,G6))),128))]))),128))],512)],42,q6))}}),gi=X6;const Z6=["disabled","onClick"],J6=["aria-label","disabled"],Q6=["aria-label","disabled"],eF=["tabindex","aria-disabled"],tF=["tabindex","aria-disabled"],nF=["aria-label","disabled"],aF=["aria-label","disabled"];var oF=le({__name:"panel-date-pick",props:P6,emits:["pick","set-picker-option","panel-change"],setup(e,{emit:t}){const n=(be,Ve,de)=>!0,a=e,o=t,l=fe("picker-panel"),s=fe("date-picker"),r=Zo(),u=sn(),{t:c,lang:d}=bt(),f=Re(Wa),h=Re(Ji,void 0),{shortcuts:g,disabledDate:v,cellClassName:p,defaultTime:m}=f.props,b=_t(f.props,"defaultValue"),k=R(),w=R(tt().locale(d.value)),C=R(!1);let S=!1;const E=y(()=>tt(m).locale(d.value)),O=y(()=>w.value.month()),$=y(()=>w.value.year()),N=R([]),I=R(null),_=R(null),A=be=>N.value.length>0?n(be,N.value,a.format||"HH:mm:ss"):!0,F=be=>m&&!Ie.value&&!C.value&&!S?E.value.year(be.year()).month(be.month()).date(be.date()):ie.value?be.millisecond(0):be.startOf("day"),K=(be,...Ve)=>{be?ye(be)?o("pick",be.map(F),...Ve):o("pick",F(be),...Ve):o("pick",be,...Ve),I.value=null,_.value=null,C.value=!1,S=!1},Y=async(be,Ve)=>{if(V.value==="date"&&tt.isDayjs(be)){const de=Er(a.parsedValue);let Ue=de?de.year(be.year()).month(be.month()).date(be.date()):be;A(Ue),w.value=Ue,K(Ue,ie.value||Ve)}else V.value==="week"?K(be.date):V.value==="dates"&&K(be,!0)},W=be=>{const Ve=be?"add":"subtract";w.value=w.value[Ve](1,"month"),yt("month")},P=be=>{const Ve=w.value,de=be?"add":"subtract";w.value=M.value==="year"?Ve[de](10,"year"):Ve[de](1,"year"),yt("year")},M=R("date"),L=y(()=>{const be=c("el.datepicker.year");if(M.value==="year"){const Ve=Math.floor($.value/10)*10;return be?`${Ve} ${be} - ${Ve+9} ${be}`:`${Ve} - ${Ve+9}`}return`${$.value} ${be}`}),D=be=>{const Ve=Be(be.value)?be.value():be.value;if(Ve){S=!0,K(tt(Ve).locale(d.value));return}be.onClick&&be.onClick({attrs:r,slots:u,emit:o})},V=y(()=>{const{type:be}=a;return["week","month","months","year","years","dates"].includes(be)?be:"date"}),G=y(()=>V.value==="dates"||V.value==="months"||V.value==="years"),j=y(()=>V.value==="date"?M.value:V.value),X=y(()=>!!g.length),Q=async(be,Ve)=>{V.value==="month"?(w.value=nr(w.value,w.value.year(),be,d.value,v),K(w.value,!1)):V.value==="months"?K(be,Ve??!0):(w.value=nr(w.value,w.value.year(),be,d.value,v),M.value="date",["month","year","date","week"].includes(V.value)&&(K(w.value,!0),await Oe(),xt())),yt("month")},ve=async(be,Ve)=>{V.value==="year"?(w.value=Mc(w.value.startOf("year").year(be),d.value,v),K(w.value,!1)):V.value==="years"?K(be,Ve??!0):(w.value=Mc(w.value.year(be),d.value,v),M.value="month",["month","year","date","week"].includes(V.value)&&(K(w.value,!0),await Oe(),xt())),yt("year")},ue=tn(),ge=async be=>{ue.value||(M.value=be,await Oe(),xt())},ie=y(()=>a.type==="datetime"||a.type==="datetimerange"),ae=y(()=>{const be=ie.value||V.value==="dates",Ve=V.value==="years",de=V.value==="months",Ue=M.value==="date",kt=M.value==="year",qt=M.value==="month";return be&&Ue||Ve&&kt||de&&qt}),ne=y(()=>!G.value&&a.showNow||a.showConfirm),z=y(()=>v?a.parsedValue?ye(a.parsedValue)?v(a.parsedValue[0].toDate()):v(a.parsedValue.toDate()):!0:!1),J=()=>{if(G.value)K(a.parsedValue);else{let be=Er(a.parsedValue);if(!be){const Ve=tt(m).locale(d.value),de=We();be=Ve.year(de.year()).month(de.month()).date(de.date())}w.value=be,K(be)}},se=y(()=>v?v(tt().locale(d.value).toDate()):!1),ce=()=>{const be=tt().locale(d.value).toDate();C.value=!0,(!v||!v(be))&&A(be)&&(w.value=tt().locale(d.value),K(w.value))},he=y(()=>a.timeFormat||XC(a.format)||tr),Se=y(()=>a.dateFormat||GC(a.format)||pl),Ie=y(()=>{if(_.value)return _.value;if(!(!a.parsedValue&&!b.value))return(Er(a.parsedValue)||w.value).format(he.value)}),Ne=y(()=>{if(I.value)return I.value;if(!(!a.parsedValue&&!b.value))return(Er(a.parsedValue)||w.value).format(Se.value)}),Te=R(!1),pe=()=>{Te.value=!0},Ee=()=>{Te.value=!1},me=be=>({hour:be.hour(),minute:be.minute(),second:be.second(),year:be.year(),month:be.month(),date:be.date()}),Pe=(be,Ve,de)=>{const{hour:Ue,minute:kt,second:qt}=me(be),xn=Er(a.parsedValue);w.value=xn?xn.hour(Ue).minute(kt).second(qt):be,K(w.value,!0),de||(Te.value=Ve)},Ke=be=>{const Ve=tt(be,he.value).locale(d.value);if(Ve.isValid()&&A(Ve)){const{year:de,month:Ue,date:kt}=me(w.value);w.value=Ve.year(de).month(Ue).date(kt),_.value=null,Te.value=!1,K(w.value,!0)}},Ge=be=>{const Ve=ar(be,Se.value,d.value,h);if(Ve.isValid()){if(v&&v(Ve.toDate()))return;const{hour:de,minute:Ue,second:kt}=me(w.value);w.value=Ve.hour(de).minute(Ue).second(kt),I.value=null,K(w.value,!0)}},Me=be=>tt.isDayjs(be)&&be.isValid()&&(v?!v(be.toDate()):!0),Ae=be=>ar(be,a.format,d.value,h),We=()=>{const be=tt(b.value).locale(d.value);if(!b.value){const Ve=E.value;return tt().hour(Ve.hour()).minute(Ve.minute()).second(Ve.second()).locale(d.value)}return be},xt=()=>{["week","month","year","date"].includes(V.value)&&k.value?.focus()},je=()=>{xt(),V.value==="week"&&ft(we.down)},at=be=>{const Ve=Ft(be);[we.up,we.down,we.left,we.right,we.home,we.end,we.pageUp,we.pageDown].includes(Ve)&&(ft(Ve),be.stopPropagation(),be.preventDefault()),[we.enter,we.space,we.numpadEnter].includes(Ve)&&I.value===null&&_.value===null&&(be.preventDefault(),K(w.value,!1))},ft=be=>{const{up:Ve,down:de,left:Ue,right:kt,home:qt,end:xn,pageUp:De,pageDown:Je}=we,lt={year:{[Ve]:-4,[de]:4,[Ue]:-1,[kt]:1,offset:(Vt,dn)=>Vt.setFullYear(Vt.getFullYear()+dn)},month:{[Ve]:-4,[de]:4,[Ue]:-1,[kt]:1,offset:(Vt,dn)=>Vt.setMonth(Vt.getMonth()+dn)},week:{[Ve]:-1,[de]:1,[Ue]:-1,[kt]:1,offset:(Vt,dn)=>Vt.setDate(Vt.getDate()+dn*7)},date:{[Ve]:-7,[de]:7,[Ue]:-1,[kt]:1,[qt]:Vt=>-Vt.getDay(),[xn]:Vt=>-Vt.getDay()+6,[De]:Vt=>-new Date(Vt.getFullYear(),Vt.getMonth(),0).getDate(),[Je]:Vt=>new Date(Vt.getFullYear(),Vt.getMonth()+1,0).getDate(),offset:(Vt,dn)=>Vt.setDate(Vt.getDate()+dn)}},hn=w.value.toDate();for(;Math.abs(w.value.diff(hn,"year",!0))<1;){const Vt=lt[j.value];if(!Vt)return;if(Vt.offset(hn,Be(Vt[be])?Vt[be](hn):Vt[be]??0),v&&v(hn))break;const dn=tt(hn).locale(d.value);w.value=dn,o("pick",dn,!0);break}},yt=be=>{o("panel-change",w.value.toDate(),be,M.value)};return re(()=>V.value,be=>{if(["month","year"].includes(be)){M.value=be;return}else if(be==="years"){M.value="year";return}else if(be==="months"){M.value="month";return}M.value="date"},{immediate:!0}),re(()=>b.value,be=>{be&&(w.value=We())},{immediate:!0}),re(()=>a.parsedValue,be=>{if(be){if(G.value||ye(be))return;w.value=be}else w.value=We()},{immediate:!0}),o("set-picker-option",["isValidValue",Me]),o("set-picker-option",["parseUserInput",Ae]),o("set-picker-option",["handleFocusPicker",je]),(be,Ve)=>(x(),B("div",{class:T([i(l).b(),i(s).b(),i(l).is("border",be.border),i(l).is("disabled",i(ue)),{"has-sidebar":be.$slots.sidebar||X.value,"has-time":ie.value}])},[H("div",{class:T(i(l).e("body-wrapper"))},[ee(be.$slots,"sidebar",{class:T(i(l).e("sidebar"))}),X.value?(x(),B("div",{key:0,class:T(i(l).e("sidebar"))},[(x(!0),B(Fe,null,ht(i(g),(de,Ue)=>(x(),B("button",{key:Ue,type:"button",disabled:i(ue),class:T(i(l).e("shortcut")),onClick:kt=>D(de)},ke(de.text),11,Z6))),128))],2)):te("v-if",!0),H("div",{class:T(i(l).e("body"))},[ie.value?(x(),B("div",{key:0,class:T(i(s).e("time-header"))},[H("span",{class:T(i(s).e("editor-wrap"))},[U(i(Wn),{placeholder:i(c)("el.datepicker.selectDate"),"model-value":Ne.value,size:"small","validate-event":!1,disabled:i(ue),readonly:!be.editable,onInput:Ve[0]||(Ve[0]=de=>I.value=de),onChange:Ge},null,8,["placeholder","model-value","disabled","readonly"])],2),st((x(),B("span",{class:T(i(s).e("editor-wrap"))},[U(i(Wn),{placeholder:i(c)("el.datepicker.selectTime"),"model-value":Ie.value,size:"small","validate-event":!1,disabled:i(ue),readonly:!be.editable,onFocus:pe,onInput:Ve[1]||(Ve[1]=de=>_.value=de),onChange:Ke},null,8,["placeholder","model-value","disabled","readonly"]),U(i(Tc),{visible:Te.value,format:he.value,"parsed-value":w.value,onPick:Pe},null,8,["visible","format","parsed-value"])],2)),[[i(Tl),Ee]])],2)):te("v-if",!0),st(H("div",{class:T([i(s).e("header"),(M.value==="year"||M.value==="month")&&i(s).em("header","bordered")])},[H("span",{class:T(i(s).e("prev-btn"))},[H("button",{type:"button","aria-label":i(c)("el.datepicker.prevYear"),class:T(["d-arrow-left",i(l).e("icon-btn")]),disabled:i(ue),onClick:Ve[2]||(Ve[2]=de=>P(!1))},[ee(be.$slots,"prev-year",{},()=>[U(i(Le),null,{default:Z(()=>[U(i(kl))]),_:1})])],10,J6),st(H("button",{type:"button","aria-label":i(c)("el.datepicker.prevMonth"),class:T([i(l).e("icon-btn"),"arrow-left"]),disabled:i(ue),onClick:Ve[3]||(Ve[3]=de=>W(!1))},[ee(be.$slots,"prev-month",{},()=>[U(i(Le),null,{default:Z(()=>[U(i(Uo))]),_:1})])],10,Q6),[[Ot,M.value==="date"]])],2),H("span",{role:"button",class:T(i(s).e("header-label")),"aria-live":"polite",tabindex:be.disabled?void 0:0,"aria-disabled":be.disabled,onKeydown:Ve[4]||(Ve[4]=Zt(de=>ge("year"),["enter"])),onClick:Ve[5]||(Ve[5]=de=>ge("year"))},ke(L.value),43,eF),st(H("span",{role:"button","aria-live":"polite",tabindex:be.disabled?void 0:0,"aria-disabled":be.disabled,class:T([i(s).e("header-label"),{active:M.value==="month"}]),onKeydown:Ve[6]||(Ve[6]=Zt(de=>ge("month"),["enter"])),onClick:Ve[7]||(Ve[7]=de=>ge("month"))},ke(i(c)(`el.datepicker.month${O.value+1}`)),43,tF),[[Ot,M.value==="date"]]),H("span",{class:T(i(s).e("next-btn"))},[st(H("button",{type:"button","aria-label":i(c)("el.datepicker.nextMonth"),class:T([i(l).e("icon-btn"),"arrow-right"]),disabled:i(ue),onClick:Ve[8]||(Ve[8]=de=>W(!0))},[ee(be.$slots,"next-month",{},()=>[U(i(Le),null,{default:Z(()=>[U(i(Yn))]),_:1})])],10,nF),[[Ot,M.value==="date"]]),H("button",{type:"button","aria-label":i(c)("el.datepicker.nextYear"),class:T([i(l).e("icon-btn"),"d-arrow-right"]),disabled:i(ue),onClick:Ve[9]||(Ve[9]=de=>P(!0))},[ee(be.$slots,"next-year",{},()=>[U(i(Le),null,{default:Z(()=>[U(i(El))]),_:1})])],10,aF)],2)],2),[[Ot,M.value!=="time"]]),H("div",{class:T(i(l).e("content")),onKeydown:at},[M.value==="date"?(x(),oe($p,{key:0,ref_key:"currentViewRef",ref:k,"selection-mode":V.value,date:w.value,"parsed-value":be.parsedValue,"disabled-date":i(v),disabled:i(ue),"cell-class-name":i(p),"show-week-number":be.showWeekNumber,onPick:Y},null,8,["selection-mode","date","parsed-value","disabled-date","disabled","cell-class-name","show-week-number"])):te("v-if",!0),M.value==="year"?(x(),oe(gi,{key:1,ref_key:"currentViewRef",ref:k,"selection-mode":V.value,date:w.value,"disabled-date":i(v),disabled:i(ue),"parsed-value":be.parsedValue,"cell-class-name":i(p),onPick:ve},null,8,["selection-mode","date","disabled-date","disabled","parsed-value","cell-class-name"])):te("v-if",!0),M.value==="month"?(x(),oe(mi,{key:2,ref_key:"currentViewRef",ref:k,"selection-mode":V.value,date:w.value,"parsed-value":be.parsedValue,"disabled-date":i(v),disabled:i(ue),"cell-class-name":i(p),onPick:Q},null,8,["selection-mode","date","parsed-value","disabled-date","disabled","cell-class-name"])):te("v-if",!0)],34)],2)],2),be.showFooter&&ae.value&&ne.value?(x(),B("div",{key:0,class:T(i(l).e("footer"))},[st(U(i(Sn),{text:"",size:"small",class:T(i(l).e("link-btn")),disabled:se.value,onClick:ce},{default:Z(()=>[mt(ke(i(c)("el.datepicker.now")),1)]),_:1},8,["class","disabled"]),[[Ot,!G.value&&be.showNow]]),be.showConfirm?(x(),oe(i(Sn),{key:0,plain:"",size:"small",class:T(i(l).e("link-btn")),disabled:z.value,onClick:J},{default:Z(()=>[mt(ke(i(c)("el.datepicker.confirm")),1)]),_:1},8,["class","disabled"])):te("v-if",!0)],2)):te("v-if",!0)],2))}}),lF=oF;const sF=Ce({...ZS,...Eh}),rF=e=>{const{emit:t}=it(),n=Zo(),a=sn();return l=>{const s=Be(l.value)?l.value():l.value;if(s){t("pick",[tt(s[0]).locale(e.value),tt(s[1]).locale(e.value)]);return}l.onClick&&l.onClick({attrs:n,slots:a,emit:t})}},$h=(e,{defaultValue:t,defaultTime:n,leftDate:a,rightDate:o,step:l,unit:s,sortDates:r})=>{const{emit:u}=it(),{pickerNs:c}=Re(Sh),d=fe("date-range-picker"),{t:f,lang:h}=bt(),g=rF(h),v=R(),p=R(),m=R({endDate:null,selecting:!1}),b=E=>{m.value=E},k=(E=!1)=>{const O=i(v),$=i(p);hi([O,$])&&u("pick",[O,$],E)},w=E=>{m.value.selecting=E,E||(m.value.endDate=null)},C=E=>{if(ye(E)&&E.length===2){const[O,$]=E;v.value=O,a.value=O,p.value=$,r(i(v),i(p))}else S()},S=()=>{let[E,O]=Id(i(t),{lang:i(h),step:l,unit:s,unlinkPanels:e.unlinkPanels});const $=I=>I.diff(I.startOf("d"),"ms"),N=i(n);if(N){let I=0,_=0;if(ye(N)){const[A,F]=N.map(tt);I=$(A),_=$(F)}else{const A=$(tt(N));I=A,_=A}E=E.startOf("d").add(I,"ms"),O=O.startOf("d").add(_,"ms")}v.value=void 0,p.value=void 0,a.value=E,o.value=O};return re(t,E=>{E&&S()},{immediate:!0}),re(()=>e.parsedValue,E=>{(!E?.length||!Jt(E,[v.value,p.value]))&&C(E)},{immediate:!0}),re(()=>e.visible,()=>{e.visible&&C(e.parsedValue)},{immediate:!0}),{minDate:v,maxDate:p,rangeState:m,lang:h,ppNs:c,drpNs:d,handleChangeRange:b,handleRangeConfirm:k,handleShortcutClick:g,onSelect:w,parseValue:C,t:f}},iF=(e,t,n,a)=>{const o=R("date"),l=R(),s=R("date"),r=R(),{disabledDate:u}=Re(Wa).props,{t:c,lang:d}=bt(),f=y(()=>n.value.year()),h=y(()=>n.value.month()),g=y(()=>a.value.year()),v=y(()=>a.value.month());function p(S,E){const O=c("el.datepicker.year");if(S.value==="year"){const $=Math.floor(E.value/10)*10;return O?`${$} ${O} - ${$+9} ${O}`:`${$} - ${$+9}`}return`${E.value} ${O}`}function m(S){S?.focus()}async function b(S,E){if(e.disabled)return;const O=S==="left"?o:s,$=S==="left"?l:r;O.value=E,await Oe(),m($.value)}async function k(S,E,O){if(e.disabled)return;const $=E==="left",N=$?n:a,I=$?a:n,_=$?o:s,A=$?l:r;S==="year"&&(N.value=Mc(N.value.year(O),d.value,u)),S==="month"&&(N.value=nr(N.value,N.value.year(),O,d.value,u)),e.unlinkPanels||(I.value=E==="left"?N.value.add(1,"month"):N.value.subtract(1,"month")),_.value=S==="year"?"month":"date",await Oe(),m(A.value),w(S)}function w(S){t("panel-change",[n.value.toDate(),a.value.toDate()],S)}function C(S,E,O){const $=O?"add":"subtract";return S==="year"?E[$](10,"year"):E[$](1,"year")}return{leftCurrentView:o,rightCurrentView:s,leftCurrentViewRef:l,rightCurrentViewRef:r,leftYear:f,rightYear:g,leftMonth:h,rightMonth:v,leftYearLabel:y(()=>p(o,f)),rightYearLabel:y(()=>p(s,g)),showLeftPicker:S=>b("left",S),showRightPicker:S=>b("right",S),handleLeftYearPick:S=>k("year","left",S),handleRightYearPick:S=>k("year","right",S),handleLeftMonthPick:S=>k("month","left",S),handleRightMonthPick:S=>k("month","right",S),handlePanelChange:w,adjustDateByView:C}},uF=["disabled","onClick"],cF=["aria-label","disabled"],dF=["aria-label","disabled"],fF=["disabled","aria-label"],pF=["disabled","aria-label"],vF=["tabindex","aria-disabled"],hF=["tabindex","aria-disabled"],mF=["disabled","aria-label"],gF=["disabled","aria-label"],bF=["aria-label","disabled"],yF=["disabled","aria-label"],wF=["tabindex","aria-disabled"],CF=["tabindex","aria-disabled"],ku="month";var SF=le({__name:"panel-date-range",props:sF,emits:["pick","set-picker-option","calendar-change","panel-change","clear"],setup(e,{emit:t}){const n=e,a=t,o=Re(Wa),l=Re(Ji,void 0),{disabledDate:s,cellClassName:r,defaultTime:u,clearable:c}=o.props,d=_t(o.props,"format"),f=_t(o.props,"shortcuts"),h=_t(o.props,"defaultValue"),{lang:g}=bt(),v=R(tt().locale(g.value)),p=R(tt().locale(g.value).add(1,ku)),{minDate:m,maxDate:b,rangeState:k,ppNs:w,drpNs:C,handleChangeRange:S,handleRangeConfirm:E,handleShortcutClick:O,onSelect:$,parseValue:N,t:I}=$h(n,{defaultValue:h,defaultTime:u,leftDate:v,rightDate:p,unit:ku,sortDates:dn});re(()=>n.visible,Xe=>{!Xe&&k.value.selecting&&(N(n.parsedValue),$(!1))});const _=R({min:null,max:null}),A=R({min:null,max:null}),{leftCurrentView:F,rightCurrentView:K,leftCurrentViewRef:Y,rightCurrentViewRef:W,leftYear:P,rightYear:M,leftMonth:L,rightMonth:D,leftYearLabel:V,rightYearLabel:G,showLeftPicker:j,showRightPicker:X,handleLeftYearPick:Q,handleRightYearPick:ve,handleLeftMonthPick:ue,handleRightMonthPick:ge,handlePanelChange:ie,adjustDateByView:ae}=iF(n,a,v,p),ne=y(()=>!!f.value.length),z=y(()=>_.value.min!==null?_.value.min:m.value?m.value.format(Se.value):""),J=y(()=>_.value.max!==null?_.value.max:b.value||m.value?(b.value||m.value).format(Se.value):""),se=y(()=>A.value.min!==null?A.value.min:m.value?m.value.format(he.value):""),ce=y(()=>A.value.max!==null?A.value.max:b.value||m.value?(b.value||m.value).format(he.value):""),he=y(()=>n.timeFormat||XC(d.value||"")||tr),Se=y(()=>n.dateFormat||GC(d.value||"")||pl),Ie=Xe=>hi(Xe)&&(s?!s(Xe[0].toDate())&&!s(Xe[1].toDate()):!0),Ne=()=>{v.value=ae(F.value,v.value,!1),n.unlinkPanels||(p.value=v.value.add(1,"month")),ie("year")},Te=()=>{v.value=v.value.subtract(1,"month"),n.unlinkPanels||(p.value=v.value.add(1,"month")),ie("month")},pe=()=>{n.unlinkPanels?p.value=ae(K.value,p.value,!0):(v.value=ae(K.value,v.value,!0),p.value=v.value.add(1,"month")),ie("year")},Ee=()=>{n.unlinkPanels?p.value=p.value.add(1,"month"):(v.value=v.value.add(1,"month"),p.value=v.value.add(1,"month")),ie("month")},me=()=>{v.value=ae(F.value,v.value,!0),ie("year")},Pe=()=>{v.value=v.value.add(1,"month"),ie("month")},Ke=()=>{p.value=ae(K.value,p.value,!1),ie("year")},Ge=()=>{p.value=p.value.subtract(1,"month"),ie("month")},Me=y(()=>{const Xe=(L.value+1)%12,Ze=L.value+1>=12?1:0;return n.unlinkPanels&&new Date(P.value+Ze,Xe)n.unlinkPanels&&M.value*12+D.value-(P.value*12+L.value+1)>=12),We=tn(),xt=y(()=>!(m.value&&b.value&&!k.value.selecting&&hi([m.value,b.value])&&!We.value)),je=y(()=>n.type==="datetime"||n.type==="datetimerange"),at=(Xe,Ze)=>{if(Xe)return u?tt(u[Ze]||u).locale(g.value).year(Xe.year()).month(Xe.month()).date(Xe.date()):Xe},ft=(Xe,Ze=!0)=>{const pt=Xe.minDate,qn=Xe.maxDate,Ja=at(pt,0),Na=at(qn,1);b.value===Na&&m.value===Ja||(a("calendar-change",[pt.toDate(),qn&&qn.toDate()]),b.value=Na,m.value=Ja,!je.value&&Ze&&(Ze=!Ja||!Na),E(Ze))},yt=R(!1),be=R(!1),Ve=()=>{yt.value=!1},de=()=>{be.value=!1},Ue=(Xe,Ze)=>{_.value[Ze]=Xe;const pt=tt(Xe,Se.value).locale(g.value);if(pt.isValid()){if(s&&s(pt.toDate()))return;Ze==="min"?(v.value=pt,m.value=(m.value||v.value).year(pt.year()).month(pt.month()).date(pt.date()),!n.unlinkPanels&&(!b.value||b.value.isBefore(m.value))&&(p.value=pt.add(1,"month"),b.value=m.value.add(1,"month"))):(p.value=pt,b.value=(b.value||p.value).year(pt.year()).month(pt.month()).date(pt.date()),!n.unlinkPanels&&(!m.value||m.value.isAfter(b.value))&&(v.value=pt.subtract(1,"month"),m.value=b.value.subtract(1,"month"))),dn(m.value,b.value),E(!0)}},kt=(Xe,Ze)=>{_.value[Ze]=null},qt=(Xe,Ze)=>{A.value[Ze]=Xe;const pt=tt(Xe,he.value).locale(g.value);pt.isValid()&&(Ze==="min"?(yt.value=!0,m.value=(m.value||v.value).hour(pt.hour()).minute(pt.minute()).second(pt.second()),v.value=m.value):(be.value=!0,b.value=(b.value||p.value).hour(pt.hour()).minute(pt.minute()).second(pt.second()),p.value=b.value))},xn=(Xe,Ze)=>{A.value[Ze]=null,Ze==="min"?(v.value=m.value,yt.value=!1,(!b.value||b.value.isBefore(m.value))&&(b.value=m.value)):(p.value=b.value,be.value=!1,b.value&&b.value.isBefore(m.value)&&(m.value=b.value)),E(!0)},De=(Xe,Ze,pt)=>{A.value.min||(Xe&&(m.value=(m.value||v.value).hour(Xe.hour()).minute(Xe.minute()).second(Xe.second())),pt||(yt.value=Ze),(!b.value||b.value.isBefore(m.value))&&(b.value=m.value,p.value=Xe,Oe(()=>{N(n.parsedValue)})),E(!0))},Je=(Xe,Ze,pt)=>{A.value.max||(Xe&&(b.value=(b.value||p.value).hour(Xe.hour()).minute(Xe.minute()).second(Xe.second())),pt||(be.value=Ze),b.value&&b.value.isBefore(m.value)&&(m.value=b.value),E(!0))},lt=()=>{hn(),a("clear")},hn=()=>{let Xe=null;o?.emptyValues&&(Xe=o.emptyValues.valueOnClear.value),v.value=Id(i(h),{lang:i(g),unit:"month",unlinkPanels:n.unlinkPanels})[0],p.value=v.value.add(1,"month"),b.value=void 0,m.value=void 0,E(!0),a("pick",Xe)},Vt=Xe=>ar(Xe,d.value||"",g.value,l);function dn(Xe,Ze){if(n.unlinkPanels&&Ze){const pt=Xe?.year()||0,qn=Xe?.month()||0,Ja=Ze.year(),Na=Ze.month();p.value=pt===Ja&&qn===Na?Ze.add(1,ku):Ze}else p.value=v.value.add(1,ku),Ze&&(p.value=p.value.hour(Ze.hour()).minute(Ze.minute()).second(Ze.second()))}return a("set-picker-option",["isValidValue",Ie]),a("set-picker-option",["parseUserInput",Vt]),a("set-picker-option",["handleClear",hn]),(Xe,Ze)=>(x(),B("div",{class:T([i(w).b(),i(C).b(),i(w).is("border",Xe.border),i(w).is("disabled",i(We)),{"has-sidebar":Xe.$slots.sidebar||ne.value,"has-time":je.value}])},[H("div",{class:T(i(w).e("body-wrapper"))},[ee(Xe.$slots,"sidebar",{class:T(i(w).e("sidebar"))}),ne.value?(x(),B("div",{key:0,class:T(i(w).e("sidebar"))},[(x(!0),B(Fe,null,ht(f.value,(pt,qn)=>(x(),B("button",{key:qn,type:"button",disabled:i(We),class:T(i(w).e("shortcut")),onClick:Ja=>i(O)(pt)},ke(pt.text),11,uF))),128))],2)):te("v-if",!0),H("div",{class:T(i(w).e("body"))},[je.value?(x(),B("div",{key:0,class:T(i(C).e("time-header"))},[H("span",{class:T(i(C).e("editors-wrap"))},[H("span",{class:T(i(C).e("time-picker-wrap"))},[U(i(Wn),{size:"small",disabled:i(k).selecting||i(We),placeholder:i(I)("el.datepicker.startDate"),class:T(i(C).e("editor")),"model-value":z.value,"validate-event":!1,readonly:!Xe.editable,onInput:Ze[0]||(Ze[0]=pt=>Ue(pt,"min")),onChange:Ze[1]||(Ze[1]=pt=>kt(pt,"min"))},null,8,["disabled","placeholder","class","model-value","readonly"])],2),st((x(),B("span",{class:T(i(C).e("time-picker-wrap"))},[U(i(Wn),{size:"small",class:T(i(C).e("editor")),disabled:i(k).selecting||i(We),placeholder:i(I)("el.datepicker.startTime"),"model-value":se.value,"validate-event":!1,readonly:!Xe.editable,onFocus:Ze[2]||(Ze[2]=pt=>yt.value=!0),onInput:Ze[3]||(Ze[3]=pt=>qt(pt,"min")),onChange:Ze[4]||(Ze[4]=pt=>xn(pt,"min"))},null,8,["class","disabled","placeholder","model-value","readonly"]),U(i(Tc),{visible:yt.value,format:he.value,"datetime-role":"start","parsed-value":i(m)||v.value,onPick:De},null,8,["visible","format","parsed-value"])],2)),[[i(Tl),Ve]])],2),H("span",null,[U(i(Le),null,{default:Z(()=>[U(i(Yn))]),_:1})]),H("span",{class:T([i(C).e("editors-wrap"),"is-right"])},[H("span",{class:T(i(C).e("time-picker-wrap"))},[U(i(Wn),{size:"small",class:T(i(C).e("editor")),disabled:i(k).selecting||i(We),placeholder:i(I)("el.datepicker.endDate"),"model-value":J.value,readonly:!i(m)||!Xe.editable,"validate-event":!1,onInput:Ze[5]||(Ze[5]=pt=>Ue(pt,"max")),onChange:Ze[6]||(Ze[6]=pt=>kt(pt,"max"))},null,8,["class","disabled","placeholder","model-value","readonly"])],2),st((x(),B("span",{class:T(i(C).e("time-picker-wrap"))},[U(i(Wn),{size:"small",class:T(i(C).e("editor")),disabled:i(k).selecting||i(We),placeholder:i(I)("el.datepicker.endTime"),"model-value":ce.value,readonly:!i(m)||!Xe.editable,"validate-event":!1,onFocus:Ze[7]||(Ze[7]=pt=>i(m)&&(be.value=!0)),onInput:Ze[8]||(Ze[8]=pt=>qt(pt,"max")),onChange:Ze[9]||(Ze[9]=pt=>xn(pt,"max"))},null,8,["class","disabled","placeholder","model-value","readonly"]),U(i(Tc),{"datetime-role":"end",visible:be.value,format:he.value,"parsed-value":i(b)||p.value,onPick:Je},null,8,["visible","format","parsed-value"])],2)),[[i(Tl),de]])],2)],2)):te("v-if",!0),H("div",{class:T([[i(w).e("content"),i(C).e("content")],"is-left"])},[H("div",{class:T(i(C).e("header"))},[H("button",{type:"button",class:T([i(w).e("icon-btn"),"d-arrow-left"]),"aria-label":i(I)("el.datepicker.prevYear"),disabled:i(We),onClick:Ne},[ee(Xe.$slots,"prev-year",{},()=>[U(i(Le),null,{default:Z(()=>[U(i(kl))]),_:1})])],10,cF),st(H("button",{type:"button",class:T([i(w).e("icon-btn"),"arrow-left"]),"aria-label":i(I)("el.datepicker.prevMonth"),disabled:i(We),onClick:Te},[ee(Xe.$slots,"prev-month",{},()=>[U(i(Le),null,{default:Z(()=>[U(i(Uo))]),_:1})])],10,dF),[[Ot,i(F)==="date"]]),Xe.unlinkPanels?(x(),B("button",{key:0,type:"button",disabled:!Ae.value||i(We),class:T([[i(w).e("icon-btn"),i(w).is("disabled",!Ae.value||i(We))],"d-arrow-right"]),"aria-label":i(I)("el.datepicker.nextYear"),onClick:me},[ee(Xe.$slots,"next-year",{},()=>[U(i(Le),null,{default:Z(()=>[U(i(El))]),_:1})])],10,fF)):te("v-if",!0),Xe.unlinkPanels&&i(F)==="date"?(x(),B("button",{key:1,type:"button",disabled:!Me.value||i(We),class:T([[i(w).e("icon-btn"),i(w).is("disabled",!Me.value||i(We))],"arrow-right"]),"aria-label":i(I)("el.datepicker.nextMonth"),onClick:Pe},[ee(Xe.$slots,"next-month",{},()=>[U(i(Le),null,{default:Z(()=>[U(i(Yn))]),_:1})])],10,pF)):te("v-if",!0),H("div",null,[H("span",{role:"button",class:T(i(C).e("header-label")),"aria-live":"polite",tabindex:Xe.disabled?void 0:0,"aria-disabled":Xe.disabled,onKeydown:Ze[10]||(Ze[10]=Zt(pt=>i(j)("year"),["enter"])),onClick:Ze[11]||(Ze[11]=pt=>i(j)("year"))},ke(i(V)),43,vF),st(H("span",{role:"button","aria-live":"polite",tabindex:Xe.disabled?void 0:0,"aria-disabled":Xe.disabled,class:T([i(C).e("header-label"),{active:i(F)==="month"}]),onKeydown:Ze[12]||(Ze[12]=Zt(pt=>i(j)("month"),["enter"])),onClick:Ze[13]||(Ze[13]=pt=>i(j)("month"))},ke(i(I)(`el.datepicker.month${v.value.month()+1}`)),43,hF),[[Ot,i(F)==="date"]])])],2),i(F)==="date"?(x(),oe($p,{key:0,ref_key:"leftCurrentViewRef",ref:Y,"selection-mode":"range",date:v.value,"min-date":i(m),"max-date":i(b),"range-state":i(k),"disabled-date":i(s),"cell-class-name":i(r),"show-week-number":Xe.showWeekNumber,disabled:i(We),onChangerange:i(S),onPick:ft,onSelect:i($)},null,8,["date","min-date","max-date","range-state","disabled-date","cell-class-name","show-week-number","disabled","onChangerange","onSelect"])):te("v-if",!0),i(F)==="year"?(x(),oe(gi,{key:1,ref_key:"leftCurrentViewRef",ref:Y,"selection-mode":"year",date:v.value,"disabled-date":i(s),"parsed-value":Xe.parsedValue,disabled:i(We),onPick:i(Q)},null,8,["date","disabled-date","parsed-value","disabled","onPick"])):te("v-if",!0),i(F)==="month"?(x(),oe(mi,{key:2,ref_key:"leftCurrentViewRef",ref:Y,"selection-mode":"month",date:v.value,"parsed-value":Xe.parsedValue,"disabled-date":i(s),disabled:i(We),onPick:i(ue)},null,8,["date","parsed-value","disabled-date","disabled","onPick"])):te("v-if",!0)],2),H("div",{class:T([[i(w).e("content"),i(C).e("content")],"is-right"])},[H("div",{class:T(i(C).e("header"))},[Xe.unlinkPanels?(x(),B("button",{key:0,type:"button",disabled:!Ae.value||i(We),class:T([[i(w).e("icon-btn"),i(w).is("disabled",!Ae.value||i(We))],"d-arrow-left"]),"aria-label":i(I)("el.datepicker.prevYear"),onClick:Ke},[ee(Xe.$slots,"prev-year",{},()=>[U(i(Le),null,{default:Z(()=>[U(i(kl))]),_:1})])],10,mF)):te("v-if",!0),Xe.unlinkPanels&&i(K)==="date"?(x(),B("button",{key:1,type:"button",disabled:!Me.value||i(We),class:T([[i(w).e("icon-btn"),i(w).is("disabled",!Me.value||i(We))],"arrow-left"]),"aria-label":i(I)("el.datepicker.prevMonth"),onClick:Ge},[ee(Xe.$slots,"prev-month",{},()=>[U(i(Le),null,{default:Z(()=>[U(i(Uo))]),_:1})])],10,gF)):te("v-if",!0),H("button",{type:"button","aria-label":i(I)("el.datepicker.nextYear"),class:T([i(w).e("icon-btn"),"d-arrow-right"]),disabled:i(We),onClick:pe},[ee(Xe.$slots,"next-year",{},()=>[U(i(Le),null,{default:Z(()=>[U(i(El))]),_:1})])],10,bF),st(H("button",{type:"button",class:T([i(w).e("icon-btn"),"arrow-right"]),disabled:i(We),"aria-label":i(I)("el.datepicker.nextMonth"),onClick:Ee},[ee(Xe.$slots,"next-month",{},()=>[U(i(Le),null,{default:Z(()=>[U(i(Yn))]),_:1})])],10,yF),[[Ot,i(K)==="date"]]),H("div",null,[H("span",{role:"button",class:T(i(C).e("header-label")),"aria-live":"polite",tabindex:Xe.disabled?void 0:0,"aria-disabled":Xe.disabled,onKeydown:Ze[14]||(Ze[14]=Zt(pt=>i(X)("year"),["enter"])),onClick:Ze[15]||(Ze[15]=pt=>i(X)("year"))},ke(i(G)),43,wF),st(H("span",{role:"button","aria-live":"polite",tabindex:Xe.disabled?void 0:0,"aria-disabled":Xe.disabled,class:T([i(C).e("header-label"),{active:i(K)==="month"}]),onKeydown:Ze[16]||(Ze[16]=Zt(pt=>i(X)("month"),["enter"])),onClick:Ze[17]||(Ze[17]=pt=>i(X)("month"))},ke(i(I)(`el.datepicker.month${p.value.month()+1}`)),43,CF),[[Ot,i(K)==="date"]])])],2),i(K)==="date"?(x(),oe($p,{key:0,ref_key:"rightCurrentViewRef",ref:W,"selection-mode":"range",date:p.value,"min-date":i(m),"max-date":i(b),"range-state":i(k),"disabled-date":i(s),"cell-class-name":i(r),"show-week-number":Xe.showWeekNumber,disabled:i(We),onChangerange:i(S),onPick:ft,onSelect:i($)},null,8,["date","min-date","max-date","range-state","disabled-date","cell-class-name","show-week-number","disabled","onChangerange","onSelect"])):te("v-if",!0),i(K)==="year"?(x(),oe(gi,{key:1,ref_key:"rightCurrentViewRef",ref:W,"selection-mode":"year",date:p.value,"disabled-date":i(s),"parsed-value":Xe.parsedValue,disabled:i(We),onPick:i(ve)},null,8,["date","disabled-date","parsed-value","disabled","onPick"])):te("v-if",!0),i(K)==="month"?(x(),oe(mi,{key:2,ref_key:"rightCurrentViewRef",ref:W,"selection-mode":"month",date:p.value,"parsed-value":Xe.parsedValue,"disabled-date":i(s),disabled:i(We),onPick:i(ge)},null,8,["date","parsed-value","disabled-date","disabled","onPick"])):te("v-if",!0)],2)],2)],2),Xe.showFooter&&je.value&&(Xe.showConfirm||i(c))?(x(),B("div",{key:0,class:T(i(w).e("footer"))},[i(c)?(x(),oe(i(Sn),{key:0,text:"",size:"small",class:T(i(w).e("link-btn")),onClick:lt},{default:Z(()=>[mt(ke(i(I)("el.datepicker.clear")),1)]),_:1},8,["class"])):te("v-if",!0),Xe.showConfirm?(x(),oe(i(Sn),{key:1,plain:"",size:"small",class:T(i(w).e("link-btn")),disabled:xt.value,onClick:Ze[18]||(Ze[18]=pt=>i(E)(!1))},{default:Z(()=>[mt(ke(i(I)("el.datepicker.confirm")),1)]),_:1},8,["class","disabled"])):te("v-if",!0)],2)):te("v-if",!0)],2))}}),kF=SF;const EF=Ce({...Eh}),xF=["pick","set-picker-option","calendar-change"],TF=({unlinkPanels:e,leftDate:t,rightDate:n})=>{const{t:a}=bt();return{leftPrevYear:()=>{t.value=t.value.subtract(1,"year"),e.value||(n.value=n.value.subtract(1,"year"))},rightNextYear:()=>{e.value||(t.value=t.value.add(1,"year")),n.value=n.value.add(1,"year")},leftNextYear:()=>{t.value=t.value.add(1,"year")},rightPrevYear:()=>{n.value=n.value.subtract(1,"year")},leftLabel:y(()=>`${t.value.year()} ${a("el.datepicker.year")}`),rightLabel:y(()=>`${n.value.year()} ${a("el.datepicker.year")}`),leftYear:y(()=>t.value.year()),rightYear:y(()=>n.value.year()===t.value.year()?t.value.year()+1:n.value.year())}},$F=["disabled","onClick"],OF=["disabled"],IF=["disabled"],NF=["disabled"],MF=["disabled"],Eu="year";var PF=le({name:"DatePickerMonthRange",__name:"panel-month-range",props:EF,emits:xF,setup(e,{emit:t}){const n=e,a=t,{lang:o}=bt(),l=Re(Wa),s=Re(Ji,void 0),{shortcuts:r,disabledDate:u,cellClassName:c}=l.props,d=_t(l.props,"format"),f=_t(l.props,"defaultValue"),h=R(tt().locale(o.value)),g=R(tt().locale(o.value).add(1,Eu)),{minDate:v,maxDate:p,rangeState:m,ppNs:b,drpNs:k,handleChangeRange:w,handleRangeConfirm:C,handleShortcutClick:S,onSelect:E,parseValue:O}=$h(n,{defaultValue:f,leftDate:h,rightDate:g,unit:Eu,sortDates:V}),$=y(()=>!!r.length),{leftPrevYear:N,rightNextYear:I,leftNextYear:_,rightPrevYear:A,leftLabel:F,rightLabel:K,leftYear:Y,rightYear:W}=TF({unlinkPanels:_t(n,"unlinkPanels"),leftDate:h,rightDate:g}),P=y(()=>n.unlinkPanels&&W.value>Y.value+1),M=(j,X=!0)=>{const Q=j.minDate,ve=j.maxDate;p.value===ve&&v.value===Q||(a("calendar-change",[Q.toDate(),ve&&ve.toDate()]),p.value=ve,v.value=Q,X&&C())},L=()=>{let j=null;l?.emptyValues&&(j=l.emptyValues.valueOnClear.value),h.value=Id(i(f),{lang:i(o),unit:"year",unlinkPanels:n.unlinkPanels})[0],g.value=h.value.add(1,"year"),a("pick",j)},D=j=>ar(j,d.value,o.value,s);function V(j,X){n.unlinkPanels&&X?g.value=(j?.year()||0)===X.year()?X.add(1,Eu):X:g.value=h.value.add(1,Eu)}const G=tn();return re(()=>n.visible,j=>{!j&&m.value.selecting&&(O(n.parsedValue),E(!1))}),a("set-picker-option",["isValidValue",hi]),a("set-picker-option",["parseUserInput",D]),a("set-picker-option",["handleClear",L]),(j,X)=>(x(),B("div",{class:T([i(b).b(),i(k).b(),i(b).is("border",j.border),i(b).is("disabled",i(G)),{"has-sidebar":!!j.$slots.sidebar||$.value}])},[H("div",{class:T(i(b).e("body-wrapper"))},[ee(j.$slots,"sidebar",{class:T(i(b).e("sidebar"))}),$.value?(x(),B("div",{key:0,class:T(i(b).e("sidebar"))},[(x(!0),B(Fe,null,ht(i(r),(Q,ve)=>(x(),B("button",{key:ve,type:"button",class:T(i(b).e("shortcut")),disabled:i(G),onClick:ue=>i(S)(Q)},ke(Q.text),11,$F))),128))],2)):te("v-if",!0),H("div",{class:T(i(b).e("body"))},[H("div",{class:T([[i(b).e("content"),i(k).e("content")],"is-left"])},[H("div",{class:T(i(k).e("header"))},[H("button",{type:"button",class:T([i(b).e("icon-btn"),"d-arrow-left"]),disabled:i(G),onClick:X[0]||(X[0]=(...Q)=>i(N)&&i(N)(...Q))},[ee(j.$slots,"prev-year",{},()=>[U(i(Le),null,{default:Z(()=>[U(i(kl))]),_:1})])],10,OF),j.unlinkPanels?(x(),B("button",{key:0,type:"button",disabled:!P.value||i(G),class:T([[i(b).e("icon-btn"),i(b).is("disabled",!P.value||i(G))],"d-arrow-right"]),onClick:X[1]||(X[1]=(...Q)=>i(_)&&i(_)(...Q))},[ee(j.$slots,"next-year",{},()=>[U(i(Le),null,{default:Z(()=>[U(i(El))]),_:1})])],10,IF)):te("v-if",!0),H("div",null,ke(i(F)),1)],2),U(mi,{"selection-mode":"range",date:h.value,"min-date":i(v),"max-date":i(p),"range-state":i(m),"disabled-date":i(u),disabled:i(G),"cell-class-name":i(c),onChangerange:i(w),onPick:M,onSelect:i(E)},null,8,["date","min-date","max-date","range-state","disabled-date","disabled","cell-class-name","onChangerange","onSelect"])],2),H("div",{class:T([[i(b).e("content"),i(k).e("content")],"is-right"])},[H("div",{class:T(i(k).e("header"))},[j.unlinkPanels?(x(),B("button",{key:0,type:"button",disabled:!P.value||i(G),class:T([[i(b).e("icon-btn"),i(b).is("disabled",!P.value||i(G))],"d-arrow-left"]),onClick:X[2]||(X[2]=(...Q)=>i(A)&&i(A)(...Q))},[ee(j.$slots,"prev-year",{},()=>[U(i(Le),null,{default:Z(()=>[U(i(kl))]),_:1})])],10,NF)):te("v-if",!0),H("button",{type:"button",class:T([i(b).e("icon-btn"),"d-arrow-right"]),disabled:i(G),onClick:X[3]||(X[3]=(...Q)=>i(I)&&i(I)(...Q))},[ee(j.$slots,"next-year",{},()=>[U(i(Le),null,{default:Z(()=>[U(i(El))]),_:1})])],10,MF),H("div",null,ke(i(K)),1)],2),U(mi,{"selection-mode":"range",date:g.value,"min-date":i(v),"max-date":i(p),"range-state":i(m),"disabled-date":i(u),disabled:i(G),"cell-class-name":i(c),onChangerange:i(w),onPick:M,onSelect:i(E)},null,8,["date","min-date","max-date","range-state","disabled-date","disabled","cell-class-name","onChangerange","onSelect"])],2)],2)],2)],2))}}),RF=PF;const AF=Ce({...Eh}),_F=["pick","set-picker-option","calendar-change"],LF=({unlinkPanels:e,leftDate:t,rightDate:n})=>({leftPrevYear:()=>{t.value=t.value.subtract(10,"year"),e.value||(n.value=n.value.subtract(10,"year"))},rightNextYear:()=>{e.value||(t.value=t.value.add(10,"year")),n.value=n.value.add(10,"year")},leftNextYear:()=>{t.value=t.value.add(10,"year")},rightPrevYear:()=>{n.value=n.value.subtract(10,"year")},leftLabel:y(()=>{const r=Math.floor(t.value.year()/10)*10;return`${r}-${r+9}`}),rightLabel:y(()=>{const r=Math.floor(n.value.year()/10)*10;return`${r}-${r+9}`}),leftYear:y(()=>Math.floor(t.value.year()/10)*10+9),rightYear:y(()=>Math.floor(n.value.year()/10)*10)}),DF=["disabled","onClick"],BF=["disabled"],VF=["disabled"],FF=["disabled"],zF=["disabled"],Ss=10,xr="year";var HF=le({name:"DatePickerYearRange",__name:"panel-year-range",props:AF,emits:_F,setup(e,{emit:t}){const n=e,a=t,{lang:o}=bt(),l=R(tt().locale(o.value)),s=R(tt().locale(o.value).add(Ss,xr)),r=Re(Ji,void 0),u=Re(Wa),{shortcuts:c,disabledDate:d,cellClassName:f}=u.props,h=_t(u.props,"format"),g=_t(u.props,"defaultValue"),{minDate:v,maxDate:p,rangeState:m,ppNs:b,drpNs:k,handleChangeRange:w,handleRangeConfirm:C,handleShortcutClick:S,onSelect:E,parseValue:O}=$h(n,{defaultValue:g,leftDate:l,rightDate:s,step:Ss,unit:xr,sortDates:ve}),{leftPrevYear:$,rightNextYear:N,leftNextYear:I,rightPrevYear:_,leftLabel:A,rightLabel:F,leftYear:K,rightYear:Y}=LF({unlinkPanels:_t(n,"unlinkPanels"),leftDate:l,rightDate:s}),W=tn(),P=y(()=>!!c.length),M=y(()=>[b.b(),k.b(),b.is("border",n.border),b.is("disabled",W.value),{"has-sidebar":!!sn().sidebar||P.value}]),L=y(()=>({content:[b.e("content"),k.e("content"),"is-left"],arrowLeftBtn:[b.e("icon-btn"),"d-arrow-left"],arrowRightBtn:[b.e("icon-btn"),b.is("disabled",!V.value||W.value),"d-arrow-right"]})),D=y(()=>({content:[b.e("content"),k.e("content"),"is-right"],arrowLeftBtn:[b.e("icon-btn"),b.is("disabled",!V.value||W.value),"d-arrow-left"],arrowRightBtn:[b.e("icon-btn"),"d-arrow-right"]})),V=y(()=>n.unlinkPanels&&Y.value>K.value+1),G=(ue,ge=!0)=>{const ie=ue.minDate,ae=ue.maxDate;p.value===ae&&v.value===ie||(a("calendar-change",[ie.toDate(),ae&&ae.toDate()]),p.value=ae,v.value=ie,ge&&C())},j=ue=>ar(ue,h.value,o.value,r),X=ue=>hi(ue)&&(d?!d(ue[0].toDate())&&!d(ue[1].toDate()):!0),Q=()=>{let ue=null;u?.emptyValues&&(ue=u.emptyValues.valueOnClear.value);const ge=Id(i(g),{lang:i(o),step:Ss,unit:xr,unlinkPanels:n.unlinkPanels});l.value=ge[0],s.value=ge[1],a("pick",ue)};function ve(ue,ge){if(n.unlinkPanels&&ge){const ie=ue?.year()||0,ae=ge.year();s.value=ie+Ss>ae?ge.add(Ss,xr):ge}else s.value=l.value.add(Ss,xr)}return re(()=>n.visible,ue=>{!ue&&m.value.selecting&&(O(n.parsedValue),E(!1))}),a("set-picker-option",["isValidValue",X]),a("set-picker-option",["parseUserInput",j]),a("set-picker-option",["handleClear",Q]),(ue,ge)=>(x(),B("div",{class:T(M.value)},[H("div",{class:T(i(b).e("body-wrapper"))},[ee(ue.$slots,"sidebar",{class:T(i(b).e("sidebar"))}),P.value?(x(),B("div",{key:0,class:T(i(b).e("sidebar"))},[(x(!0),B(Fe,null,ht(i(c),(ie,ae)=>(x(),B("button",{key:ae,type:"button",class:T(i(b).e("shortcut")),disabled:i(W),onClick:ne=>i(S)(ie)},ke(ie.text),11,DF))),128))],2)):te("v-if",!0),H("div",{class:T(i(b).e("body"))},[H("div",{class:T(L.value.content)},[H("div",{class:T(i(k).e("header"))},[H("button",{type:"button",class:T(L.value.arrowLeftBtn),disabled:i(W),onClick:ge[0]||(ge[0]=(...ie)=>i($)&&i($)(...ie))},[ee(ue.$slots,"prev-year",{},()=>[U(i(Le),null,{default:Z(()=>[U(i(kl))]),_:1})])],10,BF),ue.unlinkPanels?(x(),B("button",{key:0,type:"button",disabled:!V.value||i(W),class:T(L.value.arrowRightBtn),onClick:ge[1]||(ge[1]=(...ie)=>i(I)&&i(I)(...ie))},[ee(ue.$slots,"next-year",{},()=>[U(i(Le),null,{default:Z(()=>[U(i(El))]),_:1})])],10,VF)):te("v-if",!0),H("div",null,ke(i(A)),1)],2),U(gi,{"selection-mode":"range",date:l.value,"min-date":i(v),"max-date":i(p),"range-state":i(m),"disabled-date":i(d),disabled:i(W),"cell-class-name":i(f),onChangerange:i(w),onPick:G,onSelect:i(E)},null,8,["date","min-date","max-date","range-state","disabled-date","disabled","cell-class-name","onChangerange","onSelect"])],2),H("div",{class:T(D.value.content)},[H("div",{class:T(i(k).e("header"))},[ue.unlinkPanels?(x(),B("button",{key:0,type:"button",disabled:!V.value||i(W),class:T(D.value.arrowLeftBtn),onClick:ge[2]||(ge[2]=(...ie)=>i(_)&&i(_)(...ie))},[ee(ue.$slots,"prev-year",{},()=>[U(i(Le),null,{default:Z(()=>[U(i(kl))]),_:1})])],10,FF)):te("v-if",!0),H("button",{type:"button",class:T(D.value.arrowRightBtn),disabled:i(W),onClick:ge[3]||(ge[3]=(...ie)=>i(N)&&i(N)(...ie))},[ee(ue.$slots,"next-year",{},()=>[U(i(Le),null,{default:Z(()=>[U(i(El))]),_:1})])],10,zF),H("div",null,ke(i(F)),1)],2),U(gi,{"selection-mode":"range",date:s.value,"min-date":i(v),"max-date":i(p),"range-state":i(m),"disabled-date":i(d),disabled:i(W),"cell-class-name":i(f),onChangerange:i(w),onPick:G,onSelect:i(E)},null,8,["date","min-date","max-date","range-state","disabled-date","disabled","cell-class-name","onChangerange","onSelect"])],2)],2)],2)],2))}}),KF=HF;const WF=function(e){switch(e){case"daterange":case"datetimerange":return kF;case"monthrange":return RF;case"yearrange":return KF;default:return lF}};var Uu={exports:{}},jF=Uu.exports,sy;function YF(){return sy||(sy=1,(function(e,t){(function(n,a){e.exports=a()})(jF,(function(){return function(n,a){var o=a.prototype,l=o.format;o.format=function(s){var r=this,u=this.$locale();if(!this.isValid())return l.bind(this)(s);var c=this.$utils(),d=(s||"YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g,(function(f){switch(f){case"Q":return Math.ceil((r.$M+1)/3);case"Do":return u.ordinal(r.$D);case"gggg":return r.weekYear();case"GGGG":return r.isoWeekYear();case"wo":return u.ordinal(r.week(),"W");case"w":case"ww":return c.s(r.week(),f==="w"?1:2,"0");case"W":case"WW":return c.s(r.isoWeek(),f==="W"?1:2,"0");case"k":case"kk":return c.s(String(r.$H===0?24:r.$H),f==="k"?1:2,"0");case"X":return Math.floor(r.$d.getTime()/1e3);case"x":return r.$d.getTime();case"z":return"["+r.offsetName()+"]";case"zzz":return"["+r.offsetName("long")+"]";default:return f}}));return l.bind(this)(d)}}}))})(Uu)),Uu.exports}var UF=YF();const qF=al(UF);var qu={exports:{}},GF=qu.exports,ry;function XF(){return ry||(ry=1,(function(e,t){(function(n,a){e.exports=a()})(GF,(function(){var n="week",a="year";return function(o,l,s){var r=l.prototype;r.week=function(u){if(u===void 0&&(u=null),u!==null)return this.add(7*(u-this.week()),"day");var c=this.$locale().yearStart||1;if(this.month()===11&&this.date()>25){var d=s(this).startOf(a).add(1,a).date(c),f=s(this).endOf(n);if(d.isBefore(f))return 1}var h=s(this).startOf(a).date(c).startOf(n).subtract(1,"millisecond"),g=this.diff(h,n,!0);return g<0?s(this).startOf("week").week():Math.ceil(g)},r.weeks=function(u){return u===void 0&&(u=null),this.week(u)}}}))})(qu)),qu.exports}var ZF=XF();const JF=al(ZF);var Gu={exports:{}},QF=Gu.exports,iy;function ez(){return iy||(iy=1,(function(e,t){(function(n,a){e.exports=a()})(QF,(function(){return function(n,a){a.prototype.weekYear=function(){var o=this.month(),l=this.week(),s=this.year();return l===1&&o===11?s+1:o===0&&l>=52?s-1:s}}}))})(Gu)),Gu.exports}var tz=ez();const nz=al(tz);var Xu={exports:{}},az=Xu.exports,uy;function oz(){return uy||(uy=1,(function(e,t){(function(n,a){e.exports=a()})(az,(function(){return function(n,a,o){a.prototype.dayOfYear=function(l){var s=Math.round((o(this).startOf("day")-o(this).startOf("year"))/864e5)+1;return l==null?s:this.add(l-s,"day")}}}))})(Xu)),Xu.exports}var lz=oz();const sz=al(lz);var Zu={exports:{}},rz=Zu.exports,cy;function iz(){return cy||(cy=1,(function(e,t){(function(n,a){e.exports=a()})(rz,(function(){return function(n,a){a.prototype.isSameOrAfter=function(o,l){return this.isSame(o,l)||this.isAfter(o,l)}}}))})(Zu)),Zu.exports}var uz=iz();const cz=al(uz);var Ju={exports:{}},dz=Ju.exports,dy;function fz(){return dy||(dy=1,(function(e,t){(function(n,a){e.exports=a()})(dz,(function(){return function(n,a){a.prototype.isSameOrBefore=function(o,l){return this.isSame(o,l)||this.isBefore(o,l)}}}))})(Ju)),Ju.exports}var pz=fz();const vz=al(pz);function hz(e){return typeof e=="function"||Object.prototype.toString.call(e)==="[object Object]"&&!zt(e)}tt.extend(hS);tt.extend(qF);tt.extend(mh);tt.extend(JF);tt.extend(nz);tt.extend(sz);tt.extend(cz);tt.extend(vz);var mz=le({name:"ElDatePickerPanel",install:null,inheritAttrs:!1,props:N6,emits:[Qe,"calendar-change","panel-change","visible-change","clear"],setup(e,{slots:t,emit:n,attrs:a}){const o=fe("picker-panel");St(Re(Wa,void 0))&>(Wa,{props:Nt({...En(e)})}),gt(Sh,{slots:t,pickerNs:o});const{parsedValue:l,onCalendarChange:s,onPanelChange:r,onSetPickerOption:u,onPick:c}=Re(qC,()=>QC(e,n),!0);return()=>U(WF(e.type),rt(Ri(a,"onPick"),e,{parsedValue:l.value,"onSet-picker-option":u,"onCalendar-change":s,"onPanel-change":r,onClear:()=>n("clear"),onPick:c}),hz(t)?t:{default:()=>[t]})}});const JS=nt(mz),gz=Ce({...hh,type:{type:q(String),default:"date"}});function bz(e){return typeof e=="function"||Object.prototype.toString.call(e)==="[object Object]"&&!zt(e)}var yz=le({name:"ElDatePicker",install:null,props:gz,emits:[Qe],setup(e,{expose:t,emit:n,slots:a}){gt(Ji,y(()=>!e.format)),gt(ph,Nt(_t(e,"popperOptions")));const o=R();t({focus:()=>{o.value?.focus()},blur:()=>{o.value?.blur()},handleOpen:()=>{o.value?.handleOpen()},handleClose:()=>{o.value?.handleClose()}});const l=s=>{n(Qe,s)};return()=>{const s=e.format??(mD[e.type]||pl);return U(eS,rt(e,{format:s,type:e.type,ref:o,"onUpdate:modelValue":l}),{default:r=>U(JS,rt({disabled:e.disabled,editable:e.editable,border:!1},r),bz(a)?a:{default:()=>[a]}),"range-separator":a["range-separator"]})}}});const wz=nt(yz),Cz=Ce({border:Boolean,column:{type:Number,default:3},direction:{type:String,values:["horizontal","vertical"],default:"horizontal"},size:bn,title:{type:String,default:""},extra:{type:String,default:""},labelWidth:{type:[String,Number]}}),QS="ElDescriptionsItem",Sz=Ce({label:{type:String,default:""},span:{type:Number,default:1},rowspan:{type:Number,default:1},width:{type:[String,Number],default:""},minWidth:{type:[String,Number],default:""},labelWidth:{type:[String,Number]},align:{type:String,values:Jm,default:"left"},labelAlign:{type:String,values:Jm},className:{type:String,default:""},labelClassName:{type:String,default:""}}),ek=le({name:QS,props:Sz}),Oh=Symbol("elDescriptions"),kz=Ce({row:{type:q(Array),default:()=>[]}});var Tr=le({name:"ElDescriptionsCell",props:{cell:{type:Object},tag:{type:String,default:"td"},type:{type:String}},setup(){return{descriptions:Re(Oh,{})}},render(){const e=PA(this.cell),t=(this.cell?.dirs||[]).map(p=>{const{dir:m,arg:b,modifiers:k,value:w}=p;return[m,w,b,k]}),{border:n,direction:a}=this.descriptions,o=a==="vertical",l=()=>this.cell?.children?.label?.()||e.label,s=()=>this.cell?.children?.default?.(),r=e.span,u=e.rowspan,c=e.align?`is-${e.align}`:"",d=e.labelAlign?`is-${e.labelAlign}`:c,f=e.className,h=e.labelClassName,g={width:en(this.type==="label"?e.labelWidth??this.descriptions.labelWidth??e.width:e.width),minWidth:en(e.minWidth)},v=fe("descriptions");switch(this.type){case"label":return st(Ye(this.tag,{style:g,class:[v.e("cell"),v.e("label"),v.is("bordered-label",n),v.is("vertical-label",o),d,h],colSpan:o?r:1,rowspan:o?1:u},l()),t);case"content":return st(Ye(this.tag,{style:g,class:[v.e("cell"),v.e("content"),v.is("bordered-content",n),v.is("vertical-content",o),c,f],colSpan:o?r:r*2-1,rowspan:o?u*2-1:u},s()),t);default:{const p=l(),m={},b=en(e.labelWidth??this.descriptions.labelWidth);return b&&(m.width=b,m.display="inline-block"),st(Ye("td",{style:g,class:[v.e("cell"),c],colSpan:r,rowspan:u},[cn(p)?void 0:Ye("span",{style:m,class:[v.e("label"),h]},p),Ye("span",{class:[v.e("content"),f]},s())]),t)}}}});const Ez={key:1};var xz=le({name:"ElDescriptionsRow",__name:"descriptions-row",props:kz,setup(e){const t=Re(Oh,{});return(n,a)=>i(t).direction==="vertical"?(x(),B(Fe,{key:0},[H("tr",null,[(x(!0),B(Fe,null,ht(e.row,(o,l)=>(x(),oe(i(Tr),{key:`tr1-${l}`,cell:o,tag:"th",type:"label"},null,8,["cell"]))),128))]),H("tr",null,[(x(!0),B(Fe,null,ht(e.row,(o,l)=>(x(),oe(i(Tr),{key:`tr2-${l}`,cell:o,tag:"td",type:"content"},null,8,["cell"]))),128))])],64)):(x(),B("tr",Ez,[(x(!0),B(Fe,null,ht(e.row,(o,l)=>(x(),B(Fe,{key:`tr3-${l}`},[i(t).border?(x(),B(Fe,{key:0},[U(i(Tr),{cell:o,tag:"td",type:"label"},null,8,["cell"]),U(i(Tr),{cell:o,tag:"td",type:"content"},null,8,["cell"])],64)):(x(),oe(i(Tr),{key:1,cell:o,tag:"td",type:"both"},null,8,["cell"]))],64))),128))]))}}),Tz=xz,$z=le({name:"ElDescriptions",__name:"description",props:Cz,setup(e){const t=e,n=fe("descriptions"),a=vn(),o=sn();gt(Oh,t);const l=y(()=>[n.b(),n.m(a.value)]),s=(u,c,d,f=!1)=>(u.props||(u.props={}),c>d&&(u.props.span=d),f&&(u.props.span=c),u),r=()=>{if(!o.default)return[];const u=va(o.default()).filter(v=>v?.type?.name===QS),c=[];let d=[],f=t.column,h=0;const g=[];return u.forEach((v,p)=>{const m=v.props?.span||1,b=v.props?.rowspan||1,k=c.length;if(g[k]||=0,b>1)for(let w=1;w0&&(f-=g[k],g[k]=0),pf?f:m),p===u.length-1){const w=t.column-h%t.column;d.push(s(v,w,f,!0)),c.push(d);return}m(x(),B("div",{class:T(l.value)},[e.title||e.extra||u.$slots.title||u.$slots.extra?(x(),B("div",{key:0,class:T(i(n).e("header"))},[H("div",{class:T(i(n).e("title"))},[ee(u.$slots,"title",{},()=>[mt(ke(e.title),1)])],2),H("div",{class:T(i(n).e("extra"))},[ee(u.$slots,"extra",{},()=>[mt(ke(e.extra),1)])],2)],2)):te("v-if",!0),H("div",{class:T(i(n).e("body"))},[H("table",{class:T([i(n).e("table"),i(n).is("bordered",e.border)])},[H("tbody",null,[(x(!0),B(Fe,null,ht(r(),(d,f)=>(x(),oe(Tz,{key:f,row:d},null,8,["row"]))),128))])],2)],2)],2))}}),Oz=$z;const Iz=nt(Oz,{DescriptionsItem:ek}),Nz=Xt(ek),tk=Ce({center:Boolean,alignCenter:{type:Boolean,default:void 0},closeIcon:{type:Bt},draggable:{type:Boolean,default:void 0},overflow:{type:Boolean,default:void 0},fullscreen:Boolean,headerClass:String,bodyClass:String,footerClass:String,showClose:{type:Boolean,default:!0},title:{type:String,default:""},ariaLevel:{type:String,default:"2"}}),Mz={close:()=>!0},nk=Ce({...tk,appendToBody:Boolean,appendTo:{type:_i.to.type,default:"body"},beforeClose:{type:q(Function)},destroyOnClose:Boolean,closeOnClickModal:{type:Boolean,default:!0},closeOnPressEscape:{type:Boolean,default:!0},lockScroll:{type:Boolean,default:!0},modal:{type:Boolean,default:!0},modalPenetrable:Boolean,openDelay:{type:Number,default:0},closeDelay:{type:Number,default:0},top:{type:String},modelValue:Boolean,modalClass:String,headerClass:String,bodyClass:String,footerClass:String,width:{type:[String,Number]},zIndex:{type:Number},trapFocus:Boolean,headerAriaLevel:{type:String,default:"2"},transition:{type:q([String,Object]),default:void 0}}),ak={open:()=>!0,opened:()=>!0,close:()=>!0,closed:()=>!0,[Qe]:e=>Dt(e),openAutoFocus:()=>!0,closeAutoFocus:()=>!0},Pz=Ce({mask:{type:Boolean,default:!0},customMaskEvent:Boolean,overlayClass:{type:q([String,Array,Object])},zIndex:{type:q([String,Number])}}),Rz={click:e=>e instanceof MouseEvent},Az="overlay";var _z=le({name:"ElOverlay",props:Pz,emits:Rz,setup(e,{slots:t,emit:n}){const a=fe(Az),o=u=>{n("click",u)},{onClick:l,onMousedown:s,onMouseup:r}=Zv(e.customMaskEvent?void 0:o);return()=>e.mask?U("div",{class:[a.b(),e.overlayClass],style:{zIndex:e.zIndex},onClick:l,onMousedown:s,onMouseup:r},[ee(t,"default")],Ma.STYLE|Ma.CLASS|Ma.PROPS,["onClick","onMouseup","onMousedown"]):Ye("div",{class:e.overlayClass,style:{zIndex:e.zIndex,position:"fixed",top:"0px",right:"0px",bottom:"0px",left:"0px"}},[ee(t,"default")])}});const Ih=_z,ok=Symbol("dialogInjectionKey"),bf="dialog-fade",Lz="ElDialog",lk=(e,t)=>{const n=it().emit,{nextZIndex:a}=zi();let o="";const l=Pn(),s=Pn(),r=R(!1),u=R(!1),c=R(!1),d=R(e.zIndex??a()),f=R(!1);let h,g;const v=nl(),p=y(()=>v.value?.namespace??Kr),m=y(()=>v.value?.dialog),b=y(()=>{const D={},V=`--${p.value}-dialog`;if(!e.fullscreen){e.top&&(D[`${V}-margin-top`]=e.top);const G=en(e.width);G&&(D[`${V}-width`]=G)}return D}),k=y(()=>(e.draggable??m.value?.draggable??!1)&&!e.fullscreen),w=y(()=>e.alignCenter??m.value?.alignCenter??!1),C=y(()=>e.overflow??m.value?.overflow??!1),S=y(()=>w.value?{display:"flex"}:{}),E=y(()=>{const D=e.transition??m.value?.transition??bf,V={name:D,onAfterEnter:O,onBeforeLeave:N,onAfterLeave:$};if(et(D)){const G={...D},j=(X,Q)=>ve=>{ye(X)?X.forEach(ue=>{Be(ue)&&ue(ve)}):Be(X)&&X(ve),Q()};return G.onAfterEnter=j(G.onAfterEnter,O),G.onBeforeLeave=j(G.onBeforeLeave,N),G.onAfterLeave=j(G.onAfterLeave,$),G.name||(G.name=bf,ut(Lz,`transition.name is missing when using object syntax, fallback to '${bf}'`)),G}return V});function O(){n("opened")}function $(){n("closed"),n(Qe,!1),e.destroyOnClose&&(c.value=!1),f.value=!1}function N(){f.value=!0,n("close")}function I(){g?.(),h?.(),e.openDelay&&e.openDelay>0?{stop:h}=qs(()=>K(),e.openDelay):K()}function _(){h?.(),g?.(),e.closeDelay&&e.closeDelay>0?{stop:g}=qs(()=>Y(),e.closeDelay):Y()}function A(){function D(V){V||(u.value=!0,r.value=!1)}e.beforeClose?e.beforeClose(D):_()}function F(){e.closeOnClickModal&&A()}function K(){It&&(r.value=!0)}function Y(){r.value=!1}function W(){n("openAutoFocus")}function P(){n("closeAutoFocus")}function M(D){D.detail?.focusReason==="pointer"&&D.preventDefault()}e.lockScroll&&hd(r);function L(){e.closeOnPressEscape&&A()}return re(()=>e.zIndex,()=>{d.value=e.zIndex??a()}),re(()=>e.modelValue,D=>{D?(u.value=!1,f.value=!1,I(),c.value=!0,d.value=e.zIndex??a(),Oe(()=>{n("open"),t.value&&(t.value.parentElement.scrollTop=0,t.value.parentElement.scrollLeft=0,t.value.scrollTop=0)})):r.value&&_()}),re(()=>e.fullscreen,D=>{t.value&&(D?(o=t.value.style.transform,t.value.style.transform=""):t.value.style.transform=o)}),ct(()=>{e.modelValue&&(r.value=!0,c.value=!0,I())}),{afterEnter:O,afterLeave:$,beforeLeave:N,handleClose:A,onModalClick:F,close:_,doClose:Y,onOpenAutoFocus:W,onCloseAutoFocus:P,onCloseRequested:L,onFocusoutPrevented:M,titleId:l,bodyId:s,closed:u,style:b,overlayDialogStyle:S,rendered:c,visible:r,zIndex:d,transitionConfig:E,_draggable:k,_alignCenter:w,_overflow:C,closing:f}},Nh=(...e)=>t=>{e.forEach(n=>{n.value=t})},Dz=["aria-level"],Bz=["aria-label"],Vz=["id"];var Fz=le({name:"ElDialogContent",__name:"dialog-content",props:tk,emits:Mz,setup(e,{expose:t}){const{t:n}=bt(),{Close:a}=CC,o=e,{dialogRef:l,headerRef:s,bodyId:r,ns:u,style:c}=Re(ok),{focusTrapRef:d}=Re(PC),f=Nh(d,l),h=y(()=>!!o.draggable),{resetPosition:g,updatePosition:v,isDragging:p}=M1(l,s,h,y(()=>!!o.overflow)),m=y(()=>[u.b(),u.is("fullscreen",o.fullscreen),u.is("draggable",h.value),u.is("dragging",p.value),u.is("align-center",!!o.alignCenter),{[u.m("center")]:o.center}]);return t({resetPosition:g,updatePosition:v}),(b,k)=>(x(),B("div",{ref:i(f),class:T(m.value),style:He(i(c)),tabindex:"-1"},[H("header",{ref_key:"headerRef",ref:s,class:T([i(u).e("header"),e.headerClass,{"show-close":e.showClose}])},[ee(b.$slots,"header",{},()=>[H("span",{role:"heading","aria-level":e.ariaLevel,class:T(i(u).e("title"))},ke(e.title),11,Dz)]),e.showClose?(x(),B("button",{key:0,"aria-label":i(n)("el.dialog.close"),class:T(i(u).e("headerbtn")),type:"button",onClick:k[0]||(k[0]=w=>b.$emit("close"))},[U(i(Le),{class:T(i(u).e("close"))},{default:Z(()=>[(x(),oe(ot(e.closeIcon||i(a))))]),_:1},8,["class"])],10,Bz)):te("v-if",!0)],2),H("div",{id:i(r),class:T([i(u).e("body"),e.bodyClass])},[ee(b.$slots,"default")],10,Vz),b.$slots.footer?(x(),B("footer",{key:0,class:T([i(u).e("footer"),e.footerClass])},[ee(b.$slots,"footer")],2)):te("v-if",!0)],6))}}),zz=Fz;const Hz=["aria-label","aria-labelledby","aria-describedby"];var Kz=le({name:"ElDialog",inheritAttrs:!1,__name:"dialog",props:nk,emits:ak,setup(e,{expose:t}){const n=e,a=sn();co({scope:"el-dialog",from:"the title slot",replacement:"the header slot",version:"3.0.0",ref:"https://element-plus.org/en-US/component/dialog.html#slots"},y(()=>!!a.title));const o=fe("dialog"),l=R(),s=R(),r=R(),{visible:u,titleId:c,bodyId:d,style:f,overlayDialogStyle:h,rendered:g,transitionConfig:v,zIndex:p,_draggable:m,_alignCenter:b,_overflow:k,handleClose:w,onModalClick:C,onOpenAutoFocus:S,onCloseAutoFocus:E,onCloseRequested:O,onFocusoutPrevented:$,closing:N}=lk(n,l);gt(ok,{dialogRef:l,headerRef:s,bodyId:d,ns:o,rendered:g,style:f});const I=Zv(C),_=y(()=>n.modalPenetrable&&!n.modal&&!n.fullscreen);return t({visible:u,dialogContentRef:r,resetPosition:()=>{r.value?.resetPosition()},handleClose:w}),(F,K)=>(x(),oe(i(vr),{to:e.appendTo,disabled:e.appendTo!=="body"?!1:!e.appendToBody},{default:Z(()=>[U(Mn,rt(i(v),{persisted:""}),{default:Z(()=>[st(U(i(Ih),{"custom-mask-event":"",mask:e.modal,"overlay-class":[e.modalClass??"",`${i(o).namespace.value}-modal-dialog`,i(o).is("penetrable",_.value)],"z-index":i(p)},{default:Z(()=>[H("div",{role:"dialog","aria-modal":"true","aria-label":e.title||void 0,"aria-labelledby":e.title?void 0:i(c),"aria-describedby":i(d),class:T([`${i(o).namespace.value}-overlay-dialog`,i(o).is("closing",i(N))]),style:He(i(h)),onClick:K[0]||(K[0]=(...Y)=>i(I).onClick&&i(I).onClick(...Y)),onMousedown:K[1]||(K[1]=(...Y)=>i(I).onMousedown&&i(I).onMousedown(...Y)),onMouseup:K[2]||(K[2]=(...Y)=>i(I).onMouseup&&i(I).onMouseup(...Y))},[U(i(hr),{loop:"",trapped:i(u),"focus-start-el":"container",onFocusAfterTrapped:i(S),onFocusAfterReleased:i(E),onFocusoutPrevented:i($),onReleaseRequested:i(O)},{default:Z(()=>[i(g)?(x(),oe(zz,rt({key:0,ref_key:"dialogContentRef",ref:r},F.$attrs,{center:e.center,"align-center":i(b),"close-icon":e.closeIcon,draggable:i(m),overflow:i(k),fullscreen:e.fullscreen,"header-class":e.headerClass,"body-class":e.bodyClass,"footer-class":e.footerClass,"show-close":e.showClose,title:e.title,"aria-level":e.headerAriaLevel,onClose:i(w)}),Qn({header:Z(()=>[F.$slots.title?ee(F.$slots,"title",{key:1}):ee(F.$slots,"header",{key:0,close:i(w),titleId:i(c),titleClass:i(o).e("title")})]),default:Z(()=>[ee(F.$slots,"default")]),_:2},[F.$slots.footer?{name:"footer",fn:Z(()=>[ee(F.$slots,"footer")]),key:"0"}:void 0]),1040,["center","align-center","close-icon","draggable","overflow","fullscreen","header-class","body-class","footer-class","show-close","title","aria-level","onClose"])):te("v-if",!0)]),_:3},8,["trapped","onFocusAfterTrapped","onFocusAfterReleased","onFocusoutPrevented","onReleaseRequested"])],46,Hz)]),_:3},8,["mask","overlay-class","z-index"]),[[Ot,i(u)]])]),_:3},16)]),_:3},8,["to","disabled"]))}}),Wz=Kz;const jz=nt(Wz),Yz=Ce({direction:{type:String,values:["horizontal","vertical"],default:"horizontal"},contentPosition:{type:String,values:["left","center","right"],default:"center"},borderStyle:{type:q(String),default:"solid"}});var Uz=le({name:"ElDivider",__name:"divider",props:Yz,setup(e){const t=e,n=fe("divider"),a=y(()=>n.cssVar({"border-style":t.borderStyle}));return(o,l)=>(x(),B("div",{class:T([i(n).b(),i(n).m(e.direction)]),style:He(a.value),role:"separator"},[o.$slots.default&&e.direction!=="vertical"?(x(),B("div",{key:0,class:T([i(n).e("text"),i(n).is(e.contentPosition)])},[ee(o.$slots,"default")],2)):te("v-if",!0)],6))}}),qz=Uz;const sk=nt(qz),Gz=Ce({...nk,direction:{type:String,default:"rtl",values:["ltr","rtl","ttb","btt"]},resizable:Boolean,size:{type:[String,Number],default:"30%"},withHeader:{type:Boolean,default:!0},modalFade:{type:Boolean,default:!0},headerAriaLevel:{type:String,default:"2"}}),Xz={...ak,"resize-start":(e,t)=>e instanceof MouseEvent&&typeof t=="number",resize:(e,t)=>e instanceof MouseEvent&&typeof t=="number","resize-end":(e,t)=>e instanceof MouseEvent&&typeof t=="number"};function Zz(e,t,n){const{width:a,height:o}=Dv(),l=y(()=>["ltr","rtl"].includes(e.direction)),s=y(()=>["ltr","ttb"].includes(e.direction)?1:-1),r=y(()=>l.value?a.value:o.value),u=y(()=>C1(c.value+s.value*d.value,4,r.value)),c=R(0),d=R(0),f=R(!1),h=R(!1);let g=[],v=[];const p=()=>{const C=t.value?.closest('[aria-modal="true"]');return C?l.value?C.offsetWidth:C.offsetHeight:100};re(()=>[e.size,e.resizable],()=>{h.value=!1,c.value=0,d.value=0,k()});const m=C=>{e.resizable&&(h.value||(c.value=p(),h.value=!0),g=[C.pageX,C.pageY],f.value=!0,n("resize-start",C,c.value),v.push(At(window,"mouseup",k),At(window,"mousemove",b)))},b=C=>{const{pageX:S,pageY:E}=C,O=S-g[0],$=E-g[1];d.value=l.value?O:$,n("resize",C,u.value)},k=C=>{f.value&&(g=[],c.value=u.value,d.value=0,f.value=!1,v.forEach(S=>S?.()),v=[],C&&n("resize-end",C,c.value))},w=At(t,"mousedown",m);return Rt(()=>{w(),k()}),{size:y(()=>h.value?`${u.value}px`:en(e.size)),isResizing:f,isHorizontal:l}}const Jz=["aria-label","aria-labelledby","aria-describedby"],Qz=["id","aria-level"],e5=["aria-label"],t5=["id"];var n5=le({name:"ElDrawer",inheritAttrs:!1,__name:"drawer",props:Gz,emits:Xz,setup(e,{expose:t,emit:n}){const a=e,o=n,l=sn();co({scope:"el-drawer",from:"the title slot",replacement:"the header slot",version:"3.0.0",ref:"https://element-plus.org/en-US/component/drawer.html#slots"},y(()=>!!l.title));const s=R(),r=R(),u=R(),c=fe("drawer"),{t:d}=bt(),{afterEnter:f,afterLeave:h,beforeLeave:g,visible:v,rendered:p,titleId:m,bodyId:b,zIndex:k,onModalClick:w,onOpenAutoFocus:C,onCloseAutoFocus:S,onFocusoutPrevented:E,onCloseRequested:O,handleClose:$}=lk(a,s),{isHorizontal:N,size:I,isResizing:_}=Zz(a,u,o),A=y(()=>a.modalPenetrable&&!a.modal);return t({handleClose:$,afterEnter:f,afterLeave:h}),(F,K)=>(x(),oe(i(vr),{to:e.appendTo,disabled:e.appendTo!=="body"?!1:!e.appendToBody},{default:Z(()=>[U(Mn,{name:i(c).b("fade"),onAfterEnter:i(f),onAfterLeave:i(h),onBeforeLeave:i(g),persisted:""},{default:Z(()=>[st(U(i(Ih),{mask:e.modal,"overlay-class":[i(c).is("drawer"),e.modalClass??"",`${i(c).namespace.value}-modal-drawer`,i(c).is("penetrable",A.value)],"z-index":i(k),onClick:i(w)},{default:Z(()=>[U(i(hr),{loop:"",trapped:i(v),"focus-trap-el":s.value,"focus-start-el":r.value,onFocusAfterTrapped:i(C),onFocusAfterReleased:i(S),onFocusoutPrevented:i(E),onReleaseRequested:i(O)},{default:Z(()=>[H("div",rt({ref_key:"drawerRef",ref:s,"aria-modal":"true","aria-label":e.title||void 0,"aria-labelledby":e.title?void 0:i(m),"aria-describedby":i(b)},F.$attrs,{class:[i(c).b(),e.direction,i(v)&&"open",i(c).is("dragging",i(_))],style:{[i(N)?"width":"height"]:i(I)},role:"dialog",onClick:K[1]||(K[1]=qe(()=>{},["stop"]))}),[H("span",{ref_key:"focusStartRef",ref:r,class:T(i(c).e("sr-focus")),tabindex:"-1"},null,2),e.withHeader?(x(),B("header",{key:0,class:T([i(c).e("header"),e.headerClass])},[F.$slots.title?ee(F.$slots,"title",{key:1},()=>[te(" DEPRECATED SLOT ")]):ee(F.$slots,"header",{key:0,close:i($),titleId:i(m),titleClass:i(c).e("title")},()=>[H("span",{id:i(m),role:"heading","aria-level":e.headerAriaLevel,class:T(i(c).e("title"))},ke(e.title),11,Qz)]),e.showClose?(x(),B("button",{key:2,"aria-label":i(d)("el.drawer.close"),class:T(i(c).e("close-btn")),type:"button",onClick:K[0]||(K[0]=(...Y)=>i($)&&i($)(...Y))},[U(i(Le),{class:T(i(c).e("close"))},{default:Z(()=>[U(i(Ia))]),_:1},8,["class"])],10,e5)):te("v-if",!0)],2)):te("v-if",!0),i(p)?(x(),B("div",{key:1,id:i(b),class:T([i(c).e("body"),e.bodyClass])},[ee(F.$slots,"default")],10,t5)):te("v-if",!0),F.$slots.footer?(x(),B("div",{key:2,class:T([i(c).e("footer"),e.footerClass])},[ee(F.$slots,"footer")],2)):te("v-if",!0),e.resizable?(x(),B("div",{key:3,ref_key:"draggerRef",ref:u,style:He({zIndex:i(k)}),class:T(i(c).e("dragger"))},null,6)):te("v-if",!0)],16,Jz)]),_:3},8,["trapped","focus-trap-el","focus-start-el","onFocusAfterTrapped","onFocusAfterReleased","onFocusoutPrevented","onReleaseRequested"])]),_:3},8,["mask","overlay-class","z-index","onClick"]),[[Ot,i(v)]])]),_:3},8,["name","onAfterEnter","onAfterLeave","onBeforeLeave"])]),_:3},8,["to","disabled"]))}}),a5=n5;const o5=nt(a5),Qu=Ce({trigger:{...ho.trigger,type:q([String,Array])},triggerKeys:{type:q(Array),default:()=>[we.enter,we.numpadEnter,we.space,we.down]},virtualTriggering:ho.virtualTriggering,virtualRef:ho.virtualRef,effect:{...Lt.effect,default:"light"},type:{type:q(String)},placement:{type:q(String),default:"bottom"},popperOptions:{type:q(Object),default:()=>({})},id:String,size:{type:String,default:""},splitButton:Boolean,hideOnClick:{type:Boolean,default:!0},loop:{type:Boolean,default:!0},showArrow:{type:Boolean,default:!0},showTimeout:{type:Number,default:150},hideTimeout:{type:Number,default:150},tabindex:{type:q([Number,String]),default:0},maxHeight:{type:q([Number,String]),default:""},popperClass:Lt.popperClass,popperStyle:Lt.popperStyle,disabled:Boolean,role:{type:String,values:SC,default:"menu"},buttonProps:{type:q(Object)},teleported:Lt.teleported,appendTo:Lt.appendTo,persistent:{type:Boolean,default:!0}}),rk=Ce({command:{type:[Object,String,Number],default:()=>({})},disabled:Boolean,divided:Boolean,textValue:String,icon:{type:Bt}}),l5=Ce({onKeydown:{type:q(Function)}}),Nd=Symbol("elDropdown"),ik="elDropdown";var s5=le({inheritAttrs:!1});function r5(e,t,n,a,o,l){return ee(e.$slots,"default")}var i5=yn(s5,[["render",r5]]),u5=le({name:"ElCollectionItem",inheritAttrs:!1});function c5(e,t,n,a,o,l){return ee(e.$slots,"default")}var d5=yn(u5,[["render",c5]]);const uk="data-el-collection-item",f5=e=>{const t=`El${e}Collection`,n=`${t}Item`,a=Symbol(t),o=Symbol(n);return{COLLECTION_INJECTION_KEY:a,COLLECTION_ITEM_INJECTION_KEY:o,ElCollection:Object.assign({},i5,{name:t,setup(){const l=R(),s=new Map;gt(a,{itemMap:s,getItems:(()=>{const u=i(l);if(!u)return[];const c=Array.from(u.querySelectorAll(`[${uk}]`));return[...s.values()].sort((d,f)=>c.indexOf(d.ref)-c.indexOf(f.ref))}),collectionRef:l})}}),ElCollectionItem:Object.assign({},d5,{name:n,setup(l,{attrs:s}){const r=R(),u=Re(a,void 0);gt(o,{collectionItemRef:r}),ct(()=>{const c=i(r);c&&u.itemMap.set(c,{ref:c,...s})}),Rt(()=>{const c=i(r);u.itemMap.delete(c)})}})}},p5=Ce({style:{type:q([String,Array,Object])},currentTabId:{type:q(String)},defaultCurrentTabId:String,loop:Boolean,dir:{type:String,values:["ltr","rtl"],default:"ltr"},orientation:{type:q(String)},onBlur:Function,onFocus:Function,onMousedown:Function}),{ElCollection:v5,ElCollectionItem:h5,COLLECTION_INJECTION_KEY:ck,COLLECTION_ITEM_INJECTION_KEY:m5}=f5("RovingFocusGroup"),Mh=Symbol("elRovingFocusGroup"),dk=Symbol("elRovingFocusGroupItem"),g5={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"},b5=(e,t)=>e,y5=(e,t,n)=>{const a=b5(Ft(e));return g5[a]},w5=(e,t)=>e.map((n,a)=>e[(a+t)%e.length]),fy=e=>{const{activeElement:t}=document;for(const n of e)if(n===t||(n.focus(),t!==document.activeElement))return},py="currentTabIdChange",vy="rovingFocusGroup.entryFocus",C5={bubbles:!1,cancelable:!0};var S5=le({name:"ElRovingFocusGroupImpl",inheritAttrs:!1,props:p5,emits:[py,"entryFocus"],setup(e,{emit:t}){const n=R((e.currentTabId||e.defaultCurrentTabId)??null),a=R(!1),o=R(!1),l=R(),{getItems:s}=Re(ck,void 0),r=y(()=>[{outline:"none"},e.style]),u=p=>{t(py,p)},c=()=>{a.value=!0},d=wn(p=>{e.onMousedown?.(p)},()=>{o.value=!0}),f=wn(p=>{e.onFocus?.(p)},p=>{const m=!i(o),{target:b,currentTarget:k}=p;if(b===k&&m&&!i(a)){const w=new Event(vy,C5);if(k?.dispatchEvent(w),!w.defaultPrevented){const C=s().filter(S=>S.focusable);fy([C.find(S=>S.active),C.find(S=>S.id===i(n)),...C].filter(Boolean).map(S=>S.ref))}}o.value=!1}),h=wn(p=>{e.onBlur?.(p)},()=>{a.value=!1}),g=(...p)=>{t("entryFocus",...p)},v=p=>{const m=y5(p);if(m){p.preventDefault();let b=s().filter(k=>k.focusable).map(k=>k.ref);switch(m){case"last":b.reverse();break;case"prev":case"next":{m==="prev"&&b.reverse();const k=b.indexOf(p.currentTarget);b=e.loop?w5(b,k+1):b.slice(k+1);break}}Oe(()=>{fy(b)})}};gt(Mh,{currentTabbedId:es(n),loop:_t(e,"loop"),tabIndex:y(()=>i(a)?-1:0),rovingFocusGroupRef:l,rovingFocusGroupRootStyle:r,orientation:_t(e,"orientation"),dir:_t(e,"dir"),onItemFocus:u,onItemShiftTab:c,onBlur:h,onFocus:f,onMousedown:d,onKeydown:v}),re(()=>e.currentTabId,p=>{n.value=p??null}),At(l,vy,g)}});function k5(e,t,n,a,o,l){return ee(e.$slots,"default")}var E5=yn(S5,[["render",k5]]),x5=le({name:"ElRovingFocusGroup",components:{ElFocusGroupCollection:v5,ElRovingFocusGroupImpl:E5}});function T5(e,t,n,a,o,l){const s=$t("el-roving-focus-group-impl"),r=$t("el-focus-group-collection");return x(),oe(r,null,{default:Z(()=>[U(s,Lo(Do(e.$attrs)),{default:Z(()=>[ee(e.$slots,"default")]),_:3},16)]),_:3})}var $5=yn(x5,[["render",T5]]),O5=le({components:{ElRovingFocusCollectionItem:h5},props:{focusable:{type:Boolean,default:!0},active:Boolean},emits:["mousedown","focus","keydown"],setup(e,{emit:t}){const{currentTabbedId:n,onItemFocus:a,onItemShiftTab:o,onKeydown:l}=Re(Mh,void 0),s=Pn(),r=R(),u=wn(h=>{t("mousedown",h)},h=>{e.focusable?a(i(s)):h.preventDefault()}),c=wn(h=>{t("focus",h)},()=>{a(i(s))}),d=wn(h=>{t("keydown",h)},h=>{const{shiftKey:g,target:v,currentTarget:p}=h;if(Ft(h)===we.tab&&g){o();return}v===p&&l(h)}),f=y(()=>n.value===i(s));return gt(dk,{rovingFocusGroupItemRef:r,tabIndex:y(()=>i(f)?0:-1),handleMousedown:u,handleFocus:c,handleKeydown:d}),{id:s,handleKeydown:d,handleFocus:c,handleMousedown:u}}});function I5(e,t,n,a,o,l){const s=$t("el-roving-focus-collection-item");return x(),oe(s,{id:e.id,focusable:e.focusable,active:e.active},{default:Z(()=>[ee(e.$slots,"default")]),_:3},8,["id","focusable","active"])}var N5=yn(O5,[["render",I5]]),M5=$5;const{ButtonGroup:P5}=Sn;var R5=le({name:"ElDropdown",components:{ElButton:Sn,ElButtonGroup:P5,ElScrollbar:Ka,ElTooltip:$n,ElRovingFocusGroup:M5,ElOnlyChild:TC,ElIcon:Le,ArrowDown:Eo},props:Qu,emits:["visible-change","click","command"],setup(e,{emit:t}){const n=it(),a=fe("dropdown"),{t:o}=bt(),l=R(),s=R(),r=R(),u=R(),c=R(null),d=R(null),f=R(!1),h=y(()=>({maxHeight:en(e.maxHeight)})),g=y(()=>[a.m(C.value)]),v=y(()=>Cn(e.trigger)),p=Pn().value,m=y(()=>e.id||p);function b(){r.value?.onClose(void 0,0)}function k(){r.value?.onClose()}function w(){r.value?.onOpen()}const C=vn();function S(...F){t("command",...F)}function E(){}function O(){const F=i(u);v.value.includes("hover")&&F?.focus({preventScroll:!0}),d.value=null}function $(F){d.value=F}function N(){t("visible-change",!0)}function I(F){f.value=F?.type==="keydown",u.value?.focus()}function _(){t("visible-change",!1)}return gt(Nd,{contentRef:u,role:y(()=>e.role),triggerId:m,isUsingKeyboard:f,onItemEnter:E,onItemLeave:O,handleClose:k}),gt(ik,{instance:n,dropdownSize:C,handleClick:b,commandHandler:S,trigger:_t(e,"trigger"),hideOnClick:_t(e,"hideOnClick")}),{t:o,ns:a,scrollbar:c,wrapStyle:h,dropdownTriggerKls:g,dropdownSize:C,triggerId:m,currentTabId:d,handleCurrentTabIdChange:$,handlerMainButtonClick:F=>{t("click",F)},handleClose:k,handleOpen:w,handleBeforeShowTooltip:N,handleShowTooltip:I,handleBeforeHideTooltip:_,popperRef:r,contentRef:u,triggeringElementRef:l,referenceElementRef:s}}});function A5(e,t,n,a,o,l){const s=$t("el-roving-focus-group"),r=$t("el-scrollbar"),u=$t("el-only-child"),c=$t("el-tooltip"),d=$t("el-button"),f=$t("arrow-down"),h=$t("el-icon"),g=$t("el-button-group");return x(),B("div",{class:T([e.ns.b(),e.ns.is("disabled",e.disabled)])},[U(c,{ref:"popperRef",role:e.role,effect:e.effect,"fallback-placements":["bottom","top"],"popper-options":e.popperOptions,"gpu-acceleration":!1,placement:e.placement,"popper-class":[e.ns.e("popper"),e.popperClass],"popper-style":e.popperStyle,trigger:e.trigger,"trigger-keys":e.triggerKeys,"trigger-target-el":e.contentRef,"show-arrow":e.showArrow,"show-after":e.trigger==="hover"?e.showTimeout:0,"hide-after":e.trigger==="hover"?e.hideTimeout:0,"virtual-ref":e.virtualRef??e.triggeringElementRef,"virtual-triggering":e.virtualTriggering||e.splitButton,disabled:e.disabled,transition:`${e.ns.namespace.value}-zoom-in-top`,teleported:e.teleported,"append-to":e.appendTo,pure:"","focus-on-target":"",persistent:e.persistent,onBeforeShow:e.handleBeforeShowTooltip,onShow:e.handleShowTooltip,onBeforeHide:e.handleBeforeHideTooltip},Qn({content:Z(()=>[U(r,{ref:"scrollbar","wrap-style":e.wrapStyle,tag:"div","view-class":e.ns.e("list")},{default:Z(()=>[U(s,{loop:e.loop,"current-tab-id":e.currentTabId,orientation:"horizontal",onCurrentTabIdChange:e.handleCurrentTabIdChange},{default:Z(()=>[ee(e.$slots,"dropdown")]),_:3},8,["loop","current-tab-id","onCurrentTabIdChange"])]),_:3},8,["wrap-style","view-class"])]),_:2},[e.splitButton?void 0:{name:"default",fn:Z(()=>[U(u,{id:e.triggerId,ref:"triggeringElementRef",role:"button",tabindex:e.tabindex},{default:Z(()=>[ee(e.$slots,"default")]),_:3},8,["id","tabindex"])]),key:"0"}]),1032,["role","effect","popper-options","placement","popper-class","popper-style","trigger","trigger-keys","trigger-target-el","show-arrow","show-after","hide-after","virtual-ref","virtual-triggering","disabled","transition","teleported","append-to","persistent","onBeforeShow","onShow","onBeforeHide"]),e.splitButton?(x(),oe(g,{key:0},{default:Z(()=>[U(d,rt({ref:"referenceElementRef"},e.buttonProps,{size:e.dropdownSize,type:e.type,disabled:e.disabled,tabindex:e.tabindex,onClick:e.handlerMainButtonClick}),{default:Z(()=>[ee(e.$slots,"default")]),_:3},16,["size","type","disabled","tabindex","onClick"]),U(d,rt({id:e.triggerId,ref:"triggeringElementRef"},e.buttonProps,{role:"button",size:e.dropdownSize,type:e.type,class:e.ns.e("caret-button"),disabled:e.disabled,tabindex:e.tabindex,"aria-label":e.t("el.dropdown.toggleDropdown")}),{default:Z(()=>[U(h,{class:T(e.ns.e("icon"))},{default:Z(()=>[U(f)]),_:1},8,["class"])]),_:1},16,["id","size","type","class","disabled","tabindex","aria-label"])]),_:3})):te("v-if",!0)],2)}var _5=yn(R5,[["render",A5]]),L5=le({name:"DropdownItemImpl",components:{ElIcon:Le},props:rk,emits:["pointermove","pointerleave","click","clickimpl"],setup(e,{emit:t}){const n=fe("dropdown"),{role:a}=Re(Nd,void 0),{collectionItemRef:o}=Re(m5,void 0),{rovingFocusGroupItemRef:l,tabIndex:s,handleFocus:r,handleKeydown:u,handleMousedown:c}=Re(dk,void 0),d=Nh(o,l),f=y(()=>a.value==="menu"?"menuitem":a.value==="navigation"?"link":"button"),h=wn(g=>{const v=Ft(g);if([we.enter,we.numpadEnter,we.space].includes(v))return g.preventDefault(),g.stopImmediatePropagation(),t("clickimpl",g),!0},u);return{ns:n,itemRef:d,dataset:{[uk]:""},role:f,tabIndex:s,handleFocus:r,handleKeydown:h,handleMousedown:c}}});const D5=["aria-disabled","tabindex","role"];function B5(e,t,n,a,o,l){const s=$t("el-icon");return x(),B(Fe,null,[e.divided?(x(),B("li",{key:0,role:"separator",class:T(e.ns.bem("menu","item","divided"))},null,2)):te("v-if",!0),H("li",rt({ref:e.itemRef},{...e.dataset,...e.$attrs},{"aria-disabled":e.disabled,class:[e.ns.be("menu","item"),e.ns.is("disabled",e.disabled)],tabindex:e.tabIndex,role:e.role,onClick:t[0]||(t[0]=r=>e.$emit("clickimpl",r)),onFocus:t[1]||(t[1]=(...r)=>e.handleFocus&&e.handleFocus(...r)),onKeydown:t[2]||(t[2]=qe((...r)=>e.handleKeydown&&e.handleKeydown(...r),["self"])),onMousedown:t[3]||(t[3]=(...r)=>e.handleMousedown&&e.handleMousedown(...r)),onPointermove:t[4]||(t[4]=r=>e.$emit("pointermove",r)),onPointerleave:t[5]||(t[5]=r=>e.$emit("pointerleave",r))}),[e.icon||e.$slots.icon?(x(),oe(s,{key:0},{default:Z(()=>[ee(e.$slots,"icon",{},()=>[(x(),oe(ot(e.icon)))])]),_:3})):te("v-if",!0),ee(e.$slots,"default")],16,D5)],64)}var V5=yn(L5,[["render",B5]]);const fk=()=>{const e=Re(ik,{});return{elDropdown:e,_elDropdownSize:y(()=>e?.dropdownSize)}};var F5=le({name:"ElDropdownItem",components:{ElRovingFocusItem:N5,ElDropdownItemImpl:V5},inheritAttrs:!1,props:rk,emits:["pointermove","pointerleave","click"],setup(e,{emit:t,attrs:n}){const{elDropdown:a}=fk(),o=it(),{onItemEnter:l,onItemLeave:s}=Re(Nd,void 0),r=wn(c=>(t("pointermove",c),c.defaultPrevented),Ag(c=>{if(e.disabled){s(c);return}const d=c.currentTarget;d===document.activeElement||d.contains(document.activeElement)||(l(c),c.defaultPrevented||d?.focus({preventScroll:!0}))})),u=wn(c=>(t("pointerleave",c),c.defaultPrevented),Ag(s));return{handleClick:wn(c=>{if(!e.disabled)return t("click",c),c.type!=="keydown"&&c.defaultPrevented},c=>{if(e.disabled){c.stopImmediatePropagation();return}a?.hideOnClick?.value&&a.handleClick?.(),a.commandHandler?.(e.command,o,c)}),handlePointerMove:r,handlePointerLeave:u,propsAndAttrs:y(()=>({...e,...n}))}}});function z5(e,t,n,a,o,l){const s=$t("el-dropdown-item-impl"),r=$t("el-roving-focus-item");return x(),oe(r,{focusable:!e.disabled},{default:Z(()=>[U(s,rt(e.propsAndAttrs,{onPointerleave:e.handlePointerLeave,onPointermove:e.handlePointerMove,onClickimpl:e.handleClick}),Qn({default:Z(()=>[ee(e.$slots,"default")]),_:2},[e.$slots.icon?{name:"icon",fn:Z(()=>[ee(e.$slots,"icon")]),key:"0"}:void 0]),1040,["onPointerleave","onPointermove","onClickimpl"])]),_:3},8,["focusable"])}var pk=yn(F5,[["render",z5]]),H5=le({name:"ElDropdownMenu",props:l5,setup(e){const t=fe("dropdown"),{_elDropdownSize:n}=fk(),a=n.value,{contentRef:o,role:l,triggerId:s,isUsingKeyboard:r,handleClose:u}=Re(Nd,void 0),{rovingFocusGroupRef:c,rovingFocusGroupRootStyle:d,onBlur:f,onFocus:h,onKeydown:g,onMousedown:v}=Re(Mh,void 0),{collectionRef:p}=Re(ck,void 0),m=y(()=>[t.b("menu"),t.bm("menu",a?.value)]),b=Nh(o,c,p),k=wn(C=>{e.onKeydown?.(C)},C=>{const{currentTarget:S,target:E}=C,O=Ft(C);if(S.contains(E),we.tab===O)return u();g(C)});function w(C){r.value&&h(C)}return{size:a,rovingFocusGroupRootStyle:d,dropdownKls:m,role:l,triggerId:s,dropdownListWrapperRef:b,handleKeydown:k,onBlur:f,handleFocus:w,onMousedown:v}}});const K5=["role","aria-labelledby"];function W5(e,t,n,a,o,l){return x(),B("ul",{ref:e.dropdownListWrapperRef,class:T(e.dropdownKls),style:He(e.rovingFocusGroupRootStyle),tabindex:-1,role:e.role,"aria-labelledby":e.triggerId,onFocusin:t[0]||(t[0]=(...s)=>e.handleFocus&&e.handleFocus(...s)),onFocusout:t[1]||(t[1]=(...s)=>e.onBlur&&e.onBlur(...s)),onKeydown:t[2]||(t[2]=qe((...s)=>e.handleKeydown&&e.handleKeydown(...s),["self"])),onMousedown:t[3]||(t[3]=qe((...s)=>e.onMousedown&&e.onMousedown(...s),["self"]))},[ee(e.$slots,"default")],46,K5)}var vk=yn(H5,[["render",W5]]);const j5=nt(_5,{DropdownItem:pk,DropdownMenu:vk}),Y5=Xt(pk),U5=Xt(vk),q5=Ce({image:{type:String,default:""},imageSize:Number,description:{type:String,default:""}}),G5={viewBox:"0 0 79 86",version:"1.1",xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink"},X5=["id"],Z5=["stop-color"],J5=["stop-color"],Q5=["id"],eH=["stop-color"],tH=["stop-color"],nH=["id"],aH={stroke:"none","stroke-width":"1",fill:"none","fill-rule":"evenodd"},oH={transform:"translate(-1268.000000, -535.000000)"},lH={transform:"translate(1268.000000, 535.000000)"},sH=["fill"],rH=["fill"],iH={transform:"translate(34.500000, 31.500000) scale(-1, 1) rotate(-25.000000) translate(-34.500000, -31.500000) translate(7.000000, 10.000000)"},uH=["fill"],cH=["fill"],dH=["fill"],fH=["fill"],pH=["fill"],vH={transform:"translate(53.000000, 45.000000)"},hH=["fill","xlink:href"],mH=["fill","mask"],gH=["fill"];var bH=le({name:"ImgEmpty",__name:"img-empty",setup(e){const t=fe("empty"),n=Pn();return(a,o)=>(x(),B("svg",G5,[H("defs",null,[H("linearGradient",{id:`linearGradient-1-${i(n)}`,x1:"38.8503086%",y1:"0%",x2:"61.1496914%",y2:"100%"},[H("stop",{"stop-color":`var(${i(t).cssVarBlockName("fill-color-1")})`,offset:"0%"},null,8,Z5),H("stop",{"stop-color":`var(${i(t).cssVarBlockName("fill-color-4")})`,offset:"100%"},null,8,J5)],8,X5),H("linearGradient",{id:`linearGradient-2-${i(n)}`,x1:"0%",y1:"9.5%",x2:"100%",y2:"90.5%"},[H("stop",{"stop-color":`var(${i(t).cssVarBlockName("fill-color-1")})`,offset:"0%"},null,8,eH),H("stop",{"stop-color":`var(${i(t).cssVarBlockName("fill-color-6")})`,offset:"100%"},null,8,tH)],8,Q5),H("rect",{id:`path-3-${i(n)}`,x:"0",y:"0",width:"17",height:"36"},null,8,nH)]),H("g",aH,[H("g",oH,[H("g",lH,[H("path",{d:"M39.5,86 C61.3152476,86 79,83.9106622 79,81.3333333 C79,78.7560045 57.3152476,78 35.5,78 C13.6847524,78 0,78.7560045 0,81.3333333 C0,83.9106622 17.6847524,86 39.5,86 Z",fill:`var(${i(t).cssVarBlockName("fill-color-3")})`},null,8,sH),H("polygon",{fill:`var(${i(t).cssVarBlockName("fill-color-7")})`,transform:"translate(27.500000, 51.500000) scale(1, -1) translate(-27.500000, -51.500000) ",points:"13 58 53 58 42 45 2 45"},null,8,rH),H("g",iH,[H("polygon",{fill:`var(${i(t).cssVarBlockName("fill-color-7")})`,transform:"translate(11.500000, 5.000000) scale(1, -1) translate(-11.500000, -5.000000) ",points:"2.84078316e-14 3 18 3 23 7 5 7"},null,8,uH),H("polygon",{fill:`var(${i(t).cssVarBlockName("fill-color-5")})`,points:"-3.69149156e-15 7 38 7 38 43 -3.69149156e-15 43"},null,8,cH),H("rect",{fill:`url(#linearGradient-1-${i(n)})`,transform:"translate(46.500000, 25.000000) scale(-1, 1) translate(-46.500000, -25.000000) ",x:"38",y:"7",width:"17",height:"36"},null,8,dH),H("polygon",{fill:`var(${i(t).cssVarBlockName("fill-color-2")})`,transform:"translate(39.500000, 3.500000) scale(-1, 1) translate(-39.500000, -3.500000) ",points:"24 7 41 7 55 -3.63806207e-12 38 -3.63806207e-12"},null,8,fH)]),H("rect",{fill:`url(#linearGradient-2-${i(n)})`,x:"13",y:"45",width:"40",height:"36"},null,8,pH),H("g",vH,[H("use",{fill:`var(${i(t).cssVarBlockName("fill-color-8")})`,transform:"translate(8.500000, 18.000000) scale(-1, 1) translate(-8.500000, -18.000000) ","xlink:href":`#path-3-${i(n)}`},null,8,hH),H("polygon",{fill:`var(${i(t).cssVarBlockName("fill-color-9")})`,mask:`url(#mask-4-${i(n)})`,transform:"translate(12.000000, 9.000000) scale(-1, 1) translate(-12.000000, -9.000000) ",points:"7 0 24 0 20 18 7 16.5"},null,8,mH)]),H("polygon",{fill:`var(${i(t).cssVarBlockName("fill-color-2")})`,transform:"translate(66.000000, 51.500000) scale(-1, 1) translate(-66.000000, -51.500000) ",points:"62 45 79 45 70 58 53 58"},null,8,gH)])])])]))}}),yH=bH;const wH=["src"],CH={key:1};var SH=le({name:"ElEmpty",__name:"empty",props:q5,setup(e){const t=e,{t:n}=bt(),a=fe("empty"),o=y(()=>t.description||n("el.table.emptyText")),l=y(()=>({width:en(t.imageSize)}));return(s,r)=>(x(),B("div",{class:T(i(a).b())},[H("div",{class:T(i(a).e("image")),style:He(l.value)},[e.image?(x(),B("img",{key:0,src:e.image,ondragstart:"return false"},null,8,wH)):ee(s.$slots,"image",{key:1},()=>[U(yH)])],6),H("div",{class:T(i(a).e("description"))},[s.$slots.description?ee(s.$slots,"description",{key:0}):(x(),B("p",CH,ke(o.value),1))],2),s.$slots.default?(x(),B("div",{key:0,class:T(i(a).e("bottom"))},[ee(s.$slots,"default")],2)):te("v-if",!0)],2))}}),kH=SH;const hk=nt(kH),EH=Ce({hideOnClickModal:Boolean,src:{type:String,default:""},fit:{type:String,values:["","contain","cover","fill","none","scale-down"],default:""},loading:{type:String,values:["eager","lazy"]},lazy:Boolean,scrollContainer:{type:q([String,Object])},previewSrcList:{type:q(Array),default:()=>Qt([])},previewTeleported:Boolean,zIndex:{type:Number},initialIndex:{type:Number,default:0},infinite:{type:Boolean,default:!0},closeOnPressEscape:{type:Boolean,default:!0},zoomRate:{type:Number,default:1.2},scale:{type:Number,default:1},minScale:{type:Number,default:.2},maxScale:{type:Number,default:7},showProgress:Boolean,crossorigin:{type:q(String)}}),xH={load:e=>e instanceof Event,error:e=>e instanceof Event,switch:e=>ze(e),close:()=>!0,show:()=>!0},TH=Ce({urlList:{type:q(Array),default:()=>Qt([])},zIndex:{type:Number},initialIndex:{type:Number,default:0},infinite:{type:Boolean,default:!0},hideOnClickModal:Boolean,teleported:Boolean,closeOnPressEscape:{type:Boolean,default:!0},zoomRate:{type:Number,default:1.2},scale:{type:Number,default:1},minScale:{type:Number,default:.2},maxScale:{type:Number,default:7},showProgress:Boolean,crossorigin:{type:q(String)}}),$H={close:()=>!0,error:e=>e instanceof Event,switch:e=>ze(e),rotate:e=>ze(e)},OH=["src","crossorigin"];var IH=le({name:"ElImageViewer",__name:"image-viewer",props:TH,emits:$H,setup(e,{expose:t,emit:n}){const a={CONTAIN:{name:"contain",icon:uo(g3)},ORIGINAL:{name:"original",icon:uo(D3)}},o=e,l=n;let s;const{t:r}=bt(),u=fe("image-viewer"),{nextZIndex:c}=zi(),d=R(),f=R(),h=iE(),g=y(()=>{const{scale:ie,minScale:ae,maxScale:ne}=o;return C1(ie,ae,ne)}),v=R(!0),p=R(!1),m=R(!1),b=R(o.initialIndex),k=jt(a.CONTAIN),w=R({scale:g.value,deg:0,offsetX:0,offsetY:0,enableTransition:!1}),C=R(o.zIndex??c());hd(m,{ns:u});const S=y(()=>{const{urlList:ie}=o;return ie.length<=1}),E=y(()=>b.value===0),O=y(()=>b.value===o.urlList.length-1),$=y(()=>o.urlList[b.value]),N=y(()=>[u.e("btn"),u.e("prev"),u.is("disabled",!o.infinite&&E.value)]),I=y(()=>[u.e("btn"),u.e("next"),u.is("disabled",!o.infinite&&O.value)]),_=y(()=>{const{scale:ie,deg:ae,offsetX:ne,offsetY:z,enableTransition:J}=w.value;let se=ne/ie,ce=z/ie;const he=ae*Math.PI/180,Se=Math.cos(he),Ie=Math.sin(he);se=se*Se+ce*Ie,ce=ce*Se-ne/ie*Ie;const Ne={transform:`scale(${ie}) rotate(${ae}deg) translate(${se}px, ${ce}px)`,transition:J?"transform .3s":""};return k.value.name===a.CONTAIN.name&&(Ne.maxWidth=Ne.maxHeight="100%"),Ne}),A=y(()=>`${b.value+1} / ${o.urlList.length}`);function F(){Y(),s?.(),m.value=!1,l("close")}function K(){const ie=vl(ne=>{switch(Ft(ne)){case we.esc:o.closeOnPressEscape&&F();break;case we.space:V();break;case we.left:j();break;case we.up:Q("zoomIn");break;case we.right:X();break;case we.down:Q("zoomOut");break}}),ae=vl(ne=>{Q((ne.deltaY||ne.deltaX)<0?"zoomIn":"zoomOut",{zoomRate:o.zoomRate,enableTransition:!1})});h.run(()=>{At(document,"keydown",ie),At(d,"wheel",ae)})}function Y(){h.stop()}function W(){v.value=!1}function P(ie){p.value=!0,v.value=!1,l("error",ie),ie.target.alt=r("el.image.error")}function M(ie){if(v.value||ie.button!==0||!d.value)return;w.value.enableTransition=!1;const{offsetX:ae,offsetY:ne}=w.value,z=ie.pageX,J=ie.pageY,se=vl(Se=>{w.value={...w.value,offsetX:ae+Se.pageX-z,offsetY:ne+Se.pageY-J}}),ce=At(document,"mousemove",se),he=At(document,"mouseup",()=>{ce(),he()});ie.preventDefault()}function L(ie){if(v.value||!d.value||ie.touches.length!==1)return;w.value.enableTransition=!1;const{offsetX:ae,offsetY:ne}=w.value,{pageX:z,pageY:J}=ie.touches[0],se=vl(Se=>{const Ie=Se.touches[0];w.value={...w.value,offsetX:ae+Ie.pageX-z,offsetY:ne+Ie.pageY-J}}),ce=At(document,"touchmove",se),he=At(document,"touchend",()=>{ce(),he()});ie.preventDefault()}function D(){w.value={scale:g.value,deg:0,offsetX:0,offsetY:0,enableTransition:!1}}function V(){if(v.value||p.value)return;const ie=si(a),ae=Object.values(a),ne=k.value.name;k.value=a[ie[(ae.findIndex(z=>z.name===ne)+1)%ie.length]],D()}function G(ie){p.value=!1;const ae=o.urlList.length;b.value=(ie+ae)%ae}function j(){E.value&&!o.infinite||G(b.value-1)}function X(){O.value&&!o.infinite||G(b.value+1)}function Q(ie,ae={}){if(v.value||p.value)return;const{minScale:ne,maxScale:z}=o,{zoomRate:J,rotateDeg:se,enableTransition:ce}={zoomRate:o.zoomRate,rotateDeg:90,enableTransition:!0,...ae};switch(ie){case"zoomOut":w.value.scale>ne&&(w.value.scale=Number.parseFloat((w.value.scale/J).toFixed(3)));break;case"zoomIn":w.value.scale0)return ie.preventDefault(),!1}}return re(()=>g.value,ie=>{w.value.scale=ie}),re($,()=>{Oe(()=>{f.value?.complete||(v.value=!0)})}),re(b,ie=>{D(),l("switch",ie)}),ct(()=>{m.value=!0,K(),s=At("wheel",ge,{passive:!1})}),t({setActiveItem:G}),(ie,ae)=>(x(),oe(i(vr),{to:"body",disabled:!e.teleported},{default:Z(()=>[U(Mn,{name:"viewer-fade",appear:""},{default:Z(()=>[H("div",{ref_key:"wrapper",ref:d,tabindex:-1,class:T(i(u).e("wrapper")),style:He({zIndex:C.value})},[U(i(hr),{loop:"",trapped:"","focus-trap-el":d.value,"focus-start-el":"container",onFocusoutPrevented:ve,onReleaseRequested:ue},{default:Z(()=>[H("div",{class:T(i(u).e("mask")),onClick:ae[0]||(ae[0]=qe(ne=>e.hideOnClickModal&&F(),["self"]))},null,2),te(" CLOSE "),H("span",{class:T([i(u).e("btn"),i(u).e("close")]),onClick:F},[U(i(Le),null,{default:Z(()=>[U(i(Ia))]),_:1})],2),te(" ARROW "),S.value?te("v-if",!0):(x(),B(Fe,{key:0},[H("span",{class:T(N.value),onClick:j},[U(i(Le),null,{default:Z(()=>[U(i(Uo))]),_:1})],2),H("span",{class:T(I.value),onClick:X},[U(i(Le),null,{default:Z(()=>[U(i(Yn))]),_:1})],2)],64)),ie.$slots.progress||e.showProgress?(x(),B("div",{key:1,class:T([i(u).e("btn"),i(u).e("progress")])},[ee(ie.$slots,"progress",{activeIndex:b.value,total:e.urlList.length},()=>[mt(ke(A.value),1)])],2)):te("v-if",!0),te(" ACTIONS "),H("div",{class:T([i(u).e("btn"),i(u).e("actions")])},[H("div",{class:T(i(u).e("actions__inner"))},[ee(ie.$slots,"toolbar",{actions:Q,prev:j,next:X,reset:V,activeIndex:b.value,setActiveItem:G},()=>[U(i(Le),{onClick:ae[1]||(ae[1]=ne=>Q("zoomOut"))},{default:Z(()=>[U(i(Q3))]),_:1}),U(i(Le),{onClick:ae[2]||(ae[2]=ne=>Q("zoomIn"))},{default:Z(()=>[U(i(wC))]),_:1}),H("i",{class:T(i(u).e("actions__divider"))},null,2),U(i(Le),{onClick:V},{default:Z(()=>[(x(),oe(ot(k.value.icon)))]),_:1}),H("i",{class:T(i(u).e("actions__divider"))},null,2),U(i(Le),{onClick:ae[3]||(ae[3]=ne=>Q("anticlockwise"))},{default:Z(()=>[U(i(R3))]),_:1}),U(i(Le),{onClick:ae[4]||(ae[4]=ne=>Q("clockwise"))},{default:Z(()=>[U(i(_3))]),_:1})])],2)],2),te(" CANVAS "),H("div",{class:T(i(u).e("canvas"))},[p.value&&ie.$slots["viewer-error"]?ee(ie.$slots,"viewer-error",{key:0,activeIndex:b.value,src:$.value}):(x(),B("img",{ref_key:"imgRef",ref:f,key:$.value,src:$.value,style:He(_.value),class:T(i(u).e("img")),crossorigin:e.crossorigin,onLoad:W,onError:P,onMousedown:M,onTouchstart:L},null,46,OH))],2),ee(ie.$slots,"default")]),_:3},8,["focus-trap-el"])],6)]),_:3})]),_:3},8,["disabled"]))}}),NH=IH;const mk=nt(NH),MH=["src","loading","crossorigin"],PH={key:0};var RH=le({name:"ElImage",inheritAttrs:!1,__name:"image",props:EH,emits:xH,setup(e,{expose:t,emit:n}){const a=e,o=n,{t:l}=bt(),s=fe("image"),r=Zo(),u=y(()=>Us(Object.entries(r).filter(([P])=>/^(data-|on[A-Z])/i.test(P)||["id","style"].includes(P)))),c=fd({excludeListeners:!0,excludeKeys:y(()=>Object.keys(u.value))}),d=R(),f=R(!1),h=R(!0),g=R(!1),v=R(),p=R(),m=It&&"loading"in HTMLImageElement.prototype;let b;const k=y(()=>[s.e("inner"),C.value&&s.e("preview"),h.value&&s.is("loading")]),w=y(()=>{const{fit:P}=a;return It&&P?{objectFit:P}:{}}),C=y(()=>{const{previewSrcList:P}=a;return ye(P)&&P.length>0}),S=y(()=>{const{previewSrcList:P,initialIndex:M}=a;let L=M;return M>P.length-1&&(L=0),L}),E=y(()=>a.loading==="eager"?!1:!m&&a.loading==="lazy"||a.lazy),O=()=>{It&&(h.value=!0,f.value=!1,d.value=a.src)};function $(P){h.value=!1,f.value=!1,o("load",P)}function N(P){h.value=!1,f.value=!0,o("error",P)}function I(P){P&&(O(),F())}const _=k1(I,200,!0);async function A(){if(!It)return;await Oe();const{scrollContainer:P}=a;if(oa(P))p.value=P;else if(_e(P)&&P!=="")p.value=document.querySelector(P)??void 0;else if(v.value){const L=zv(v.value);p.value=Ai(L)?void 0:L}const{stop:M}=fP(v,([L])=>{_(L.isIntersecting)},{root:p});b=M}function F(){!It||!_||(b?.(),p.value=void 0,b=void 0)}function K(){C.value&&(g.value=!0,o("show"))}function Y(){g.value=!1,o("close")}function W(P){o("switch",P)}return re(()=>a.src,()=>{E.value?(h.value=!0,f.value=!1,F(),A()):O()}),ct(()=>{E.value?A():O()}),t({showPreview:K}),(P,M)=>(x(),B("div",rt({ref_key:"container",ref:v},u.value,{class:[i(s).b(),P.$attrs.class]}),[f.value?ee(P.$slots,"error",{key:0},()=>[H("div",{class:T(i(s).e("error"))},ke(i(l)("el.image.error")),3)]):(x(),B(Fe,{key:1},[d.value!==void 0?(x(),B("img",rt({key:0},i(c),{src:d.value,loading:e.loading,style:w.value,class:k.value,crossorigin:e.crossorigin,onClick:K,onLoad:$,onError:N}),null,16,MH)):te("v-if",!0),h.value?(x(),B("div",{key:1,class:T(i(s).e("wrapper"))},[ee(P.$slots,"placeholder",{},()=>[H("div",{class:T(i(s).e("placeholder"))},null,2)])],2)):te("v-if",!0)],64)),C.value?(x(),B(Fe,{key:2},[g.value?(x(),oe(i(mk),{key:0,"z-index":e.zIndex,"initial-index":S.value,infinite:e.infinite,"zoom-rate":e.zoomRate,"min-scale":e.minScale,"max-scale":e.maxScale,"show-progress":e.showProgress,"url-list":e.previewSrcList,scale:e.scale,crossorigin:e.crossorigin,"hide-on-click-modal":e.hideOnClickModal,teleported:e.previewTeleported,"close-on-press-escape":e.closeOnPressEscape,onClose:Y,onSwitch:W},Qn({toolbar:Z(L=>[ee(P.$slots,"toolbar",Lo(Do(L)))]),default:Z(()=>[P.$slots.viewer?(x(),B("div",PH,[ee(P.$slots,"viewer")])):te("v-if",!0)]),_:2},[P.$slots.progress?{name:"progress",fn:Z(L=>[ee(P.$slots,"progress",Lo(Do(L)))]),key:"0"}:void 0,P.$slots["viewer-error"]?{name:"viewer-error",fn:Z(L=>[ee(P.$slots,"viewer-error",Lo(Do(L)))]),key:"1"}:void 0]),1032,["z-index","initial-index","infinite","zoom-rate","min-scale","max-scale","show-progress","url-list","scale","crossorigin","hide-on-click-modal","teleported","close-on-press-escape"])):te("v-if",!0)],64)):te("v-if",!0)],16))}}),AH=RH;const _H=nt(AH),LH=Ce({id:{type:String,default:void 0},step:{type:Number,default:1},stepStrictly:Boolean,max:{type:Number,default:Number.MAX_SAFE_INTEGER},min:{type:Number,default:Number.MIN_SAFE_INTEGER},modelValue:{type:[Number,null]},readonly:Boolean,disabled:{type:Boolean,default:void 0},size:bn,controls:{type:Boolean,default:!0},controlsPosition:{type:String,default:"",values:["","right"]},valueOnClear:{type:q([String,Number,null]),validator:e=>e===null||ze(e)||["min","max"].includes(e),default:null},name:String,placeholder:String,precision:{type:Number,validator:e=>e>=0&&e===Number.parseInt(`${e}`,10)},validateEvent:{type:Boolean,default:!0},...Un(["ariaLabel"]),inputmode:{type:q(String),default:void 0},align:{type:q(String),default:"center"},disabledScientific:Boolean}),DH={[vt]:(e,t)=>t!==e,blur:e=>e instanceof FocusEvent,focus:e=>e instanceof FocusEvent,[pn]:e=>ze(e)||cn(e),[Qe]:e=>ze(e)||cn(e)},BH=["aria-label"],VH=["aria-label"];var FH=le({name:"ElInputNumber",__name:"input-number",props:LH,emits:DH,setup(e,{expose:t,emit:n}){const a=e,o=n,{t:l}=bt(),s=fe("input-number"),r=R(),u=Nt({currentValue:a.modelValue,userInput:null}),{formItem:c}=On(),d=y(()=>ze(a.modelValue)&&a.modelValue<=a.min),f=y(()=>ze(a.modelValue)&&a.modelValue>=a.max),h=y(()=>{const P=k(a.step);return St(a.precision)?Math.max(k(a.modelValue),P):(P>a.precision&&ut("InputNumber","precision should not be less than the decimal places of step"),a.precision)}),g=y(()=>a.controls&&a.controlsPosition==="right"),v=vn(),p=tn(),m=y(()=>{if(u.userInput!==null)return u.userInput;let P=u.currentValue;if(cn(P))return"";if(ze(P)){if(Number.isNaN(P))return"";St(a.precision)||(P=P.toFixed(a.precision))}return P}),b=(P,M)=>{if(St(M)&&(M=h.value),M===0)return Math.round(P);let L=String(P);const D=L.indexOf(".");if(D===-1||!L.replace(".","").split("")[D+M])return P;const V=L.length;return L.charAt(V-1)==="5"&&(L=`${L.slice(0,Math.max(0,V-1))}6`),Number.parseFloat(Number(L).toFixed(M))},k=P=>{if(cn(P))return 0;const M=P.toString(),L=M.indexOf(".");let D=0;return L!==-1&&(D=M.length-L-1),D},w=(P,M=1)=>ze(P)?P>=Number.MAX_SAFE_INTEGER&&M===1?(ut("InputNumber","The value has reached the maximum safe integer limit."),P):P<=Number.MIN_SAFE_INTEGER&&M===-1?(ut("InputNumber","The value has reached the minimum safe integer limit."),P):b(P+a.step*M):u.currentValue,C=P=>{const M=Ft(P),L=_1(P);if(a.disabledScientific&&["e","E"].includes(L)){P.preventDefault();return}switch(M){case we.up:P.preventDefault(),S();break;case we.down:P.preventDefault(),E();break}},S=()=>{a.readonly||p.value||f.value||($(w(Number(m.value)||0)),o(pn,u.currentValue),Y())},E=()=>{a.readonly||p.value||d.value||($(w(Number(m.value)||0,-1)),o(pn,u.currentValue),Y())},O=(P,M)=>{const{max:L,min:D,step:V,precision:G,stepStrictly:j,valueOnClear:X}=a;LL||QL?L:D,M&&o(Qe,Q)),Q},$=(P,M=!0)=>{const L=u.currentValue,D=O(P);if(!M){o(Qe,D);return}u.userInput=null,!(L===D&&P)&&(o(Qe,D),L!==D&&o(vt,D,L),a.validateEvent&&c?.validate?.("change").catch(V=>ut(V)),u.currentValue=D)},N=P=>{u.userInput=P;const M=P===""?null:Number(P);o(pn,M),$(M,!1)},I=P=>{const M=P!==""?Number(P):"";(ze(M)&&!Number.isNaN(M)||P==="")&&$(M),Y(),u.userInput=null},_=()=>{r.value?.focus?.()},A=()=>{r.value?.blur?.()},F=P=>{o("focus",P)},K=P=>{u.userInput=null,u.currentValue===null&&r.value?.input&&(r.value.input.value=""),o("blur",P),a.validateEvent&&c?.validate?.("blur").catch(M=>ut(M))},Y=()=>{u.currentValue!==a.modelValue&&(u.currentValue=a.modelValue)},W=P=>{document.activeElement===P.target&&P.preventDefault()};return re(()=>a.modelValue,(P,M)=>{const L=O(P,!0);u.userInput===null&&L!==M&&(u.currentValue=L)},{immediate:!0}),re(()=>a.precision,()=>{u.currentValue=O(a.modelValue)}),ct(()=>{const{min:P,max:M,modelValue:L}=a,D=r.value?.input;if(D.setAttribute("role","spinbutton"),Number.isFinite(M)?D.setAttribute("aria-valuemax",String(M)):D.removeAttribute("aria-valuemax"),Number.isFinite(P)?D.setAttribute("aria-valuemin",String(P)):D.removeAttribute("aria-valuemin"),D.setAttribute("aria-valuenow",u.currentValue||u.currentValue===0?String(u.currentValue):""),D.setAttribute("aria-disabled",String(p.value)),!ze(L)&&L!=null){let V=Number(L);Number.isNaN(V)&&(V=null),o(Qe,V)}D.addEventListener("wheel",W,{passive:!1})}),Ya(()=>{r.value?.input?.setAttribute("aria-valuenow",`${u.currentValue??""}`)}),t({focus:_,blur:A}),(P,M)=>(x(),B("div",{class:T([i(s).b(),i(s).m(i(v)),i(s).is("disabled",i(p)),i(s).is("without-controls",!e.controls),i(s).is("controls-right",g.value),i(s).is(e.align,!!e.align)]),onDragstart:M[0]||(M[0]=qe(()=>{},["prevent"]))},[e.controls?st((x(),B("span",{key:0,role:"button","aria-label":i(l)("el.inputNumber.decrease"),class:T([i(s).e("decrease"),i(s).is("disabled",d.value)]),onKeydown:Zt(E,["enter"])},[ee(P.$slots,"decrease-icon",{},()=>[U(i(Le),null,{default:Z(()=>[g.value?(x(),oe(i(Eo),{key:0})):(x(),oe(i(k3),{key:1}))]),_:1})])],42,BH)),[[i(xc),E]]):te("v-if",!0),e.controls?st((x(),B("span",{key:1,role:"button","aria-label":i(l)("el.inputNumber.increase"),class:T([i(s).e("increase"),i(s).is("disabled",f.value)]),onKeydown:Zt(S,["enter"])},[ee(P.$slots,"increase-icon",{},()=>[U(i(Le),null,{default:Z(()=>[g.value?(x(),oe(i(Sd),{key:0})):(x(),oe(i(bC),{key:1}))]),_:1})])],42,VH)),[[i(xc),S]]):te("v-if",!0),U(i(Wn),{id:e.id,ref_key:"input",ref:r,type:"number",step:e.step,"model-value":m.value,placeholder:e.placeholder,readonly:e.readonly,disabled:i(p),size:i(v),max:e.max,min:e.min,name:e.name,"aria-label":e.ariaLabel,"validate-event":!1,inputmode:e.inputmode,onKeydown:C,onBlur:K,onFocus:F,onInput:N,onChange:I},Qn({_:2},[P.$slots.prefix?{name:"prefix",fn:Z(()=>[ee(P.$slots,"prefix")]),key:"0"}:void 0,P.$slots.suffix?{name:"suffix",fn:Z(()=>[ee(P.$slots,"suffix")]),key:"1"}:void 0]),1032,["id","step","model-value","placeholder","readonly","disabled","size","max","min","name","aria-label","inputmode"])],34))}}),zH=FH;const gk=nt(zH),HH=Ce({modelValue:{type:q(Array)},max:Number,tagType:{...qo.type,default:"info"},tagEffect:qo.effect,effect:{type:q(String),default:"light"},trigger:{type:q(String),default:we.enter},draggable:Boolean,delimiter:{type:[String,RegExp],default:""},size:bn,clearable:Boolean,clearIcon:{type:Bt,default:xo},disabled:{type:Boolean,default:void 0},validateEvent:{type:Boolean,default:!0},readonly:Boolean,autofocus:Boolean,id:{type:String,default:void 0},tabindex:{type:[String,Number],default:0},maxlength:{type:[String,Number]},minlength:{type:[String,Number]},placeholder:String,autocomplete:{type:q(String),default:"off"},saveOnBlur:{type:Boolean,default:!0},collapseTags:Boolean,collapseTagsTooltip:Boolean,maxCollapseTags:{type:Number,default:1},ariaLabel:String}),KH={[Qe]:e=>ye(e)||St(e),[vt]:e=>ye(e)||St(e),[pn]:e=>_e(e),"add-tag":e=>_e(e)||ye(e),"remove-tag":(e,t)=>_e(e)&&ze(t),"drag-tag":(e,t,n)=>ze(e)&&ze(t)&&_e(n),focus:e=>e instanceof FocusEvent,blur:e=>e instanceof FocusEvent,clear:()=>!0};function WH({wrapperRef:e,handleDragged:t,afterDragged:n}){const a=fe("input-tag"),o=jt(),l=R(!1);let s,r,u,c;function d(v){return`.${a.e("inner")} .${a.namespace.value}-tag:nth-child(${v+1})`}function f(v,p){s=p,r=e.value.querySelector(d(p)),r&&(r.style.opacity="0.5"),v.dataTransfer.effectAllowed="move"}function h(v,p){if(u=p,v.preventDefault(),v.dataTransfer.dropEffect="move",St(s)||s===p){l.value=!1;return}const m=e.value.querySelector(d(p)).getBoundingClientRect(),b=s+1!==p,k=s-1!==p,w=v.clientX-m.left,C=b?k?.5:1:-1,S=k?b?.5:0:1;w<=m.width*C?c="before":w>m.width*S?c="after":c=void 0;const E=e.value.querySelector(`.${a.e("inner")}`),O=E.getBoundingClientRect(),$=Number.parseFloat(Ro(E,"gap"))/2,N=m.top-O.top;let I=-9999;if(c==="before")I=Math.max(m.left-O.left-$,Math.floor(-$/2));else if(c==="after"){const _=m.right-O.left;I=_+(O.width===_?Math.floor($/2):$)}N1(o.value,{top:`${N}px`,left:`${I}px`}),l.value=!!c}function g(v){v.preventDefault(),r&&(r.style.opacity=""),c&&!St(s)&&!St(u)&&s!==u&&t(s,u,c),l.value=!1,s=void 0,r=null,u=void 0,c=void 0,n?.()}return{dropIndicatorRef:o,showDropIndicator:l,handleDragStart:f,handleDragOver:h,handleDragEnd:g}}function jH(){const e=R(!1);return{hovering:e,handleMouseEnter:()=>{e.value=!0},handleMouseLeave:()=>{e.value=!1}}}function YH({props:e,emit:t,formItem:n}){const a=tn(),o=vn(),l=jt(),s=R(),r=R(),u=y(()=>["small"].includes(o.value)?"small":"default"),c=y(()=>e.modelValue?.length?void 0:e.placeholder),d=y(()=>!(e.readonly||a.value)),f=y(()=>St(e.max)?!1:(e.modelValue?.length??0)>=e.max),h=y(()=>e.collapseTags?e.modelValue?.slice(0,e.maxCollapseTags):e.modelValue),g=y(()=>e.collapseTags?e.modelValue?.slice(e.maxCollapseTags):[]),v=W=>{const P=[...e.modelValue??[],...Cn(W)];t(Qe,P),t(vt,P),t("add-tag",W),s.value=void 0},p=W=>{const P=W.split(e.delimiter),M=P.length>1?P.map(L=>L.trim()).filter(Boolean):[];if(e.max){const L=e.max-(e.modelValue?.length??0);M.splice(L)}return M.length===1?M[0]:M},m=W=>{const P=W.clipboardData?.getData("text");if(e.readonly||f.value||!e.delimiter||!P)return;const{selectionStart:M=0,selectionEnd:L=0,value:D}=W.target,V=D.slice(0,M)+P+D.slice(L),G=p(V);G.length&&(v(G),t(pn,V),W.preventDefault())},b=W=>{if(f.value){s.value=void 0;return}if(!A.value){if(e.delimiter&&s.value){const P=p(s.value);P.length&&v(P)}t(pn,W.target.value)}},k=W=>{if(!A.value)switch(Ft(W)){case e.trigger:W.preventDefault(),W.stopPropagation(),C();break;case we.numpadEnter:e.trigger===we.enter&&(W.preventDefault(),W.stopPropagation(),C());break;case we.backspace:!s.value&&e.modelValue?.length&&(W.preventDefault(),W.stopPropagation(),S(e.modelValue.length-1));break}},w=W=>{A.value||!O1()||Ft(W)===we.space&&e.trigger===we.space&&(W.preventDefault(),W.stopPropagation(),C())},C=()=>{const W=s.value?.trim();!W||f.value||v(W)},S=W=>{const P=(e.modelValue??[]).slice(),[M]=P.splice(W,1);t(Qe,P),t(vt,P),t("remove-tag",M,W)},E=()=>{s.value=void 0,t(Qe,void 0),t(vt,void 0),t("clear")},O=(W,P,M)=>{const L=(e.modelValue??[]).slice(),[D]=L.splice(W,1),V=P>W&&M==="before"?-1:P{l.value?.focus()},N=()=>{l.value?.blur()},{wrapperRef:I,isFocused:_}=tl(l,{disabled:a,beforeBlur(W){return r.value?.isFocusInsideContent(W)},afterBlur(){e.saveOnBlur?C():s.value=void 0,e.validateEvent&&n?.validate?.("blur").catch(W=>ut(W))}}),{isComposing:A,handleCompositionStart:F,handleCompositionUpdate:K,handleCompositionEnd:Y}=ji({afterComposition:b});return re(()=>e.modelValue,()=>{e.validateEvent&&n?.validate?.(vt).catch(W=>ut(W))}),{inputRef:l,wrapperRef:I,tagTooltipRef:r,isFocused:_,isComposing:A,inputValue:s,size:o,tagSize:u,placeholder:c,closable:d,disabled:a,inputLimit:f,showTagList:h,collapseTagList:g,handleDragged:O,handlePaste:m,handleInput:b,handleKeydown:k,handleKeyup:w,handleAddTag:C,handleRemoveTag:S,handleClear:E,handleCompositionStart:F,handleCompositionUpdate:K,handleCompositionEnd:Y,focus:$,blur:N}}function UH({props:e,isFocused:t,hovering:n,disabled:a,inputValue:o,size:l,validateState:s,validateIcon:r,needStatusIcon:u}){const c=Zo(),d=sn(),f=fe("input-tag"),h=fe("input"),g=R(),v=R(),p=y(()=>[f.b(),f.is("focused",t.value),f.is("hovering",n.value),f.is("disabled",a.value),f.m(l.value),f.e("wrapper"),c.class]),m=y(()=>[c.style]),b=y(()=>[f.e("inner"),f.is("draggable",e.draggable),f.is("left-space",!e.modelValue?.length&&!d.prefix),f.is("right-space",!e.modelValue?.length&&!w.value)]),k=y(()=>e.clearable&&!a.value&&!e.readonly&&(e.modelValue?.length||o.value)&&(t.value||n.value)),w=y(()=>d.suffix||k.value||s.value&&r.value&&u.value),C=Nt({innerWidth:0,collapseItemWidth:0}),S=()=>{if(!v.value)return 0;const N=window.getComputedStyle(v.value);return Number.parseFloat(N.gap||"6px")},E=()=>{C.innerWidth=Number.parseFloat(window.getComputedStyle(v.value).width)},O=()=>{C.collapseItemWidth=g.value.getBoundingClientRect().width},$=y(()=>{if(!e.collapseTags)return{};const N=S(),I=N+ad,_=g.value&&e.maxCollapseTags===1?C.innerWidth-C.collapseItemWidth-N-I:C.innerWidth-I;return{maxWidth:`${Math.max(_,0)}px`}});return Ut(v,E),Ut(g,O),{ns:f,nsInput:h,containerKls:p,containerStyle:m,innerKls:b,showClear:k,showSuffix:w,tagStyle:$,collapseItemRef:g,innerRef:v}}const qH=["id","minlength","maxlength","disabled","readonly","autocomplete","tabindex","placeholder","autofocus","ariaLabel"],GH=["textContent"];var XH=le({name:"ElInputTag",inheritAttrs:!1,__name:"input-tag",props:HH,emits:KH,setup(e,{expose:t,emit:n}){const a=e,o=n,l=fd(),s=sn(),{form:r,formItem:u}=On(),{inputId:c}=ya(a,{formItemContext:u}),d=y(()=>r?.statusIcon??!1),f=y(()=>u?.validateState||""),h=y(()=>f.value&&Ed[f.value]),{inputRef:g,wrapperRef:v,tagTooltipRef:p,isFocused:m,inputValue:b,size:k,tagSize:w,placeholder:C,closable:S,disabled:E,showTagList:O,collapseTagList:$,handleDragged:N,handlePaste:I,handleInput:_,handleKeydown:A,handleKeyup:F,handleRemoveTag:K,handleClear:Y,handleCompositionStart:W,handleCompositionUpdate:P,handleCompositionEnd:M,focus:L,blur:D}=YH({props:a,emit:o,formItem:u}),{hovering:V,handleMouseEnter:G,handleMouseLeave:j}=jH(),{calculatorRef:X,inputStyle:Q}=Bv(),{dropIndicatorRef:ve,showDropIndicator:ue,handleDragStart:ge,handleDragOver:ie,handleDragEnd:ae}=WH({wrapperRef:v,handleDragged:N,afterDragged:L}),{ns:ne,nsInput:z,containerKls:J,containerStyle:se,innerKls:ce,showClear:he,showSuffix:Se,tagStyle:Ie,collapseItemRef:Ne,innerRef:Te}=UH({props:a,hovering:V,isFocused:m,inputValue:b,disabled:E,size:k,validateState:f,validateIcon:h,needStatusIcon:d});return t({focus:L,blur:D}),(pe,Ee)=>(x(),B("div",{ref_key:"wrapperRef",ref:v,class:T(i(J)),style:He(i(se)),onMouseenter:Ee[9]||(Ee[9]=(...me)=>i(G)&&i(G)(...me)),onMouseleave:Ee[10]||(Ee[10]=(...me)=>i(j)&&i(j)(...me))},[i(s).prefix?(x(),B("div",{key:0,class:T(i(ne).e("prefix"))},[ee(pe.$slots,"prefix")],2)):te("v-if",!0),H("div",{ref_key:"innerRef",ref:Te,class:T(i(ce))},[(x(!0),B(Fe,null,ht(i(O),(me,Pe)=>(x(),oe(i(Fo),{key:Pe,size:i(w),closable:i(S),type:e.tagType,effect:e.tagEffect,draggable:i(S)&&e.draggable,style:He(i(Ie)),"disable-transitions":"",onClose:Ke=>i(K)(Pe),onDragstart:Ke=>i(ge)(Ke,Pe),onDragover:Ke=>i(ie)(Ke,Pe),onDragend:i(ae),onDrop:Ee[0]||(Ee[0]=qe(()=>{},["stop"]))},{default:Z(()=>[ee(pe.$slots,"tag",{value:me,index:Pe},()=>[mt(ke(me),1)])]),_:2},1032,["size","closable","type","effect","draggable","style","onClose","onDragstart","onDragover","onDragend"]))),128)),e.collapseTags&&e.modelValue&&e.modelValue.length>e.maxCollapseTags?(x(),oe(i($n),{key:0,ref_key:"tagTooltipRef",ref:p,disabled:!e.collapseTagsTooltip,"fallback-placements":["bottom","top","right","left"],effect:e.effect,placement:"bottom"},{default:Z(()=>[H("div",{ref_key:"collapseItemRef",ref:Ne,class:T(i(ne).e("collapse-tag"))},[U(i(Fo),{closable:!1,size:i(w),type:e.tagType,effect:e.tagEffect,"disable-transitions":""},{default:Z(()=>[mt(" + "+ke(e.modelValue.length-e.maxCollapseTags),1)]),_:1},8,["size","type","effect"])],2)]),content:Z(()=>[H("div",{class:T(i(ne).e("input-tag-list"))},[(x(!0),B(Fe,null,ht(i($),(me,Pe)=>(x(),oe(i(Fo),{key:Pe,size:i(w),closable:i(S),type:e.tagType,effect:e.tagEffect,"disable-transitions":"",onClose:Ke=>i(K)(Pe+e.maxCollapseTags)},{default:Z(()=>[ee(pe.$slots,"tag",{value:me,index:Pe+e.maxCollapseTags},()=>[mt(ke(me),1)])]),_:2},1032,["size","closable","type","effect","onClose"]))),128))],2)]),_:3},8,["disabled","effect"])):te("v-if",!0),H("div",{class:T(i(ne).e("input-wrapper"))},[st(H("input",rt({id:i(c),ref_key:"inputRef",ref:g,"onUpdate:modelValue":Ee[1]||(Ee[1]=me=>Yt(b)?b.value=me:null)},i(l),{type:"text",minlength:e.minlength,maxlength:e.maxlength,disabled:i(E),readonly:e.readonly,autocomplete:e.autocomplete,tabindex:e.tabindex,placeholder:i(C),autofocus:e.autofocus,ariaLabel:e.ariaLabel,class:i(ne).e("input"),style:i(Q),onCompositionstart:Ee[2]||(Ee[2]=(...me)=>i(W)&&i(W)(...me)),onCompositionupdate:Ee[3]||(Ee[3]=(...me)=>i(P)&&i(P)(...me)),onCompositionend:Ee[4]||(Ee[4]=(...me)=>i(M)&&i(M)(...me)),onPaste:Ee[5]||(Ee[5]=(...me)=>i(I)&&i(I)(...me)),onInput:Ee[6]||(Ee[6]=(...me)=>i(_)&&i(_)(...me)),onKeydown:Ee[7]||(Ee[7]=(...me)=>i(A)&&i(A)(...me)),onKeyup:Ee[8]||(Ee[8]=(...me)=>i(F)&&i(F)(...me))}),null,16,qH),[[Ew,i(b)]]),H("span",{ref_key:"calculatorRef",ref:X,"aria-hidden":"true",class:T(i(ne).e("input-calculator")),textContent:ke(i(b))},null,10,GH)],2),st(H("div",{ref_key:"dropIndicatorRef",ref:ve,class:T(i(ne).e("drop-indicator"))},null,2),[[Ot,i(ue)]])],2),i(Se)?(x(),B("div",{key:1,class:T(i(ne).e("suffix"))},[ee(pe.$slots,"suffix"),i(he)?(x(),oe(i(Le),{key:0,class:T([i(ne).e("icon"),i(ne).e("clear")]),onMousedown:qe(i(Pt),["prevent"]),onClick:i(Y)},{default:Z(()=>[(x(),oe(ot(e.clearIcon)))]),_:1},8,["class","onMousedown","onClick"])):te("v-if",!0),f.value&&h.value&&d.value?(x(),oe(i(Le),{key:1,class:T([i(z).e("icon"),i(z).e("validateIcon"),i(z).is("loading",f.value==="validating")])},{default:Z(()=>[(x(),oe(ot(h.value)))]),_:1},8,["class"])):te("v-if",!0)],2)):te("v-if",!0)],38))}}),ZH=XH;const JH=nt(ZH),QH=Ce({type:{type:String,values:["primary","success","warning","info","danger","default"],default:void 0},underline:{type:[Boolean,String],values:[!0,!1,"always","never","hover"],default:void 0},disabled:Boolean,href:{type:String,default:""},target:{type:String,default:"_self"},icon:{type:Bt}}),eK={click:e=>e instanceof MouseEvent},tK=["href","target"];var nK=le({name:"ElLink",__name:"link",props:QH,emits:eK,setup(e,{emit:t}){const n=e,a=t,o=nl("link");co({scope:"el-link",from:"The underline option (boolean)",replacement:"'always' | 'hover' | 'never'",version:"3.0.0",ref:"https://element-plus.org/en-US/component/link.html#underline"},y(()=>Dt(n.underline)));const l=fe("link"),s=y(()=>[l.b(),l.m(n.type??o.value?.type??"default"),l.is("disabled",n.disabled),l.is("underline",r.value==="always"),l.is("hover-underline",r.value==="hover"&&!n.disabled)]),r=y(()=>Dt(n.underline)?n.underline?"hover":"never":n.underline??o.value?.underline??"hover");function u(c){n.disabled||a("click",c)}return(c,d)=>(x(),B("a",{class:T(s.value),href:e.disabled||!e.href?void 0:e.href,target:e.disabled||!e.href?void 0:e.target,onClick:u},[e.icon?(x(),oe(i(Le),{key:0},{default:Z(()=>[(x(),oe(ot(e.icon)))]),_:1})):te("v-if",!0),c.$slots.default?(x(),B("span",{key:1,class:T(i(l).e("inner"))},[ee(c.$slots,"default")],2)):te("v-if",!0),c.$slots.icon?ee(c.$slots,"icon",{key:2}):te("v-if",!0)],10,tK))}}),aK=nK;const oK=nt(aK),Ph="rootMenu",Rc="subMenu:";function bk(e,t){const n=y(()=>{let a=e.parent;const o=[t.value];for(;a.type.name!=="ElMenu";)a.props.index&&o.unshift(a.props.index),a=a.parent;return o});return{parentMenu:y(()=>{let a=e.parent;for(;a&&!["ElMenu","ElSubMenu"].includes(a.type.name);)a=a.parent;return a}),indexPath:n}}function lK(e){return y(()=>{const t=e.backgroundColor;return t?new on(t).shade(20).toString():""})}const yk=(e,t)=>{const n=fe("menu");return y(()=>n.cssVarBlock({"text-color":e.textColor||"","hover-text-color":e.textColor||"","bg-color":e.backgroundColor||"","hover-bg-color":lK(e).value||"","active-color":e.activeTextColor||"",level:`${t}`}))},sK=Ce({index:{type:String,required:!0},showTimeout:Number,hideTimeout:Number,popperClass:String,popperStyle:{type:q([String,Object])},disabled:Boolean,teleported:{type:Boolean,default:void 0},popperOffset:Number,expandCloseIcon:{type:Bt},expandOpenIcon:{type:Bt},collapseCloseIcon:{type:Bt},collapseOpenIcon:{type:Bt}}),yf="ElSubMenu";var Rh=le({name:yf,props:sK,setup(e,{slots:t,expose:n}){const a=it(),{indexPath:o,parentMenu:l}=bk(a,y(()=>e.index)),s=fe("menu"),r=fe("sub-menu"),u=Re(Ph);u||Gt(yf,"can not inject root menu");const c=Re(`${Rc}${l.value.uid}`);c||Gt(yf,"can not inject sub menu");const d=R({}),f=R({});let h;const g=R(!1),v=R(),p=R(),m=y(()=>c.level===0),b=y(()=>$.value==="horizontal"&&m.value?"bottom-start":"right-start"),k=y(()=>$.value==="horizontal"&&m.value||$.value==="vertical"&&!u.props.collapse?e.expandCloseIcon&&e.expandOpenIcon?E.value?e.expandOpenIcon:e.expandCloseIcon:Eo:e.collapseCloseIcon&&e.collapseOpenIcon?E.value?e.collapseOpenIcon:e.collapseCloseIcon:Yn),w=y(()=>{const G=e.teleported;return St(G)?m.value:G}),C=y(()=>u.props.collapse?`${s.namespace.value}-zoom-in-left`:`${s.namespace.value}-zoom-in-top`),S=y(()=>$.value==="horizontal"&&m.value?["bottom-start","bottom-end","top-start","top-end","right-start","left-start"]:["right-start","right","right-end","left-start","bottom-start","bottom-end","top-start","top-end"]),E=y(()=>u.openedMenus.includes(e.index)),O=y(()=>[...Object.values(d.value),...Object.values(f.value)].some(({active:G})=>G)),$=y(()=>u.props.mode),N=y(()=>u.props.persistent),I=Nt({index:e.index,indexPath:o,active:O}),_=yk(u.props,c.level+1),A=y(()=>e.popperOffset??u.props.popperOffset),F=y(()=>e.popperClass??u.props.popperClass),K=y(()=>e.popperStyle??u.props.popperStyle),Y=y(()=>e.showTimeout??u.props.showTimeout),W=y(()=>e.hideTimeout??u.props.hideTimeout),P=()=>p.value?.popperRef?.popperInstanceRef?.destroy(),M=G=>{G||P()},L=()=>{u.props.menuTrigger==="hover"&&u.props.mode==="horizontal"||u.props.collapse&&u.props.mode==="vertical"||e.disabled||u.handleSubMenuClick({index:e.index,indexPath:o.value,active:O.value})},D=(G,j=Y.value)=>{if(G.type!=="focus"){if(u.props.menuTrigger==="click"&&u.props.mode==="horizontal"||!u.props.collapse&&u.props.mode==="vertical"||e.disabled){c.mouseInChild.value=!0;return}c.mouseInChild.value=!0,h?.(),{stop:h}=qs(()=>{u.openMenu(e.index,o.value)},j),w.value&&l.value.vnode.el?.dispatchEvent(new MouseEvent("mouseenter")),G.type==="mouseenter"&&G.target&&Oe(()=>{Bi(G.target,{preventScroll:!0})})}},V=(G=!1)=>{if(u.props.menuTrigger==="click"&&u.props.mode==="horizontal"||!u.props.collapse&&u.props.mode==="vertical"){c.mouseInChild.value=!1;return}h?.(),c.mouseInChild.value=!1,{stop:h}=qs(()=>!g.value&&u.closeMenu(e.index,o.value),W.value),w.value&&G&&c.handleMouseleave?.(!0)};re(()=>u.props.collapse,G=>M(!!G));{const G=X=>{f.value[X.index]=X},j=X=>{delete f.value[X.index]};gt(`${Rc}${a.uid}`,{addSubMenu:G,removeSubMenu:j,handleMouseleave:V,mouseInChild:g,level:c.level+1})}return n({opened:E}),ct(()=>{u.addSubMenu(I),c.addSubMenu(I)}),Rt(()=>{c.removeSubMenu(I),u.removeSubMenu(I)}),()=>{const G=[t.title?.(),Ye(Le,{class:r.e("icon-arrow"),style:{transform:E.value?e.expandCloseIcon&&e.expandOpenIcon||e.collapseCloseIcon&&e.collapseOpenIcon&&u.props.collapse?"none":"rotateZ(180deg)":"none"}},{default:()=>_e(k.value)?Ye(a.appContext.components[k.value]):Ye(k.value)})],j=u.isMenuPopup?Ye($n,{ref:p,visible:E.value,effect:"light",pure:!0,offset:A.value,showArrow:!1,persistent:N.value,popperClass:F.value,popperStyle:K.value,placement:b.value,teleported:w.value,fallbackPlacements:S.value,transition:C.value,gpuAcceleration:!1},{content:()=>Ye("div",{class:[s.m($.value),s.m("popup-container"),F.value],onMouseenter:X=>D(X,100),onMouseleave:()=>V(!0),onFocus:X=>D(X,100)},[Ye("ul",{class:[s.b(),s.m("popup"),s.m(`popup-${b.value}`)],style:_.value},[t.default?.()])]),default:()=>Ye("div",{class:r.e("title"),onClick:L},G)}):Ye(Fe,{},[Ye("div",{class:r.e("title"),ref:v,onClick:L},G),Ye(Od,{},{default:()=>st(Ye("ul",{role:"menu",class:[s.b(),s.m("inline")],style:_.value},[t.default?.()]),[[Ot,E.value]])})]);return Ye("li",{class:[r.b(),r.is("active",O.value),r.is("opened",E.value),r.is("disabled",e.disabled)],role:"menuitem",ariaHaspopup:!0,ariaExpanded:E.value,onMouseenter:D,onMouseleave:()=>V(),onFocus:D},[j])}}}),rK=class{constructor(e,t){this.parent=e,this.domNode=t,this.subIndex=0,this.subIndex=0,this.init()}init(){this.subMenuItems=this.domNode.querySelectorAll("li"),this.addListeners()}gotoSubIndex(e){e===this.subMenuItems.length?e=0:e<0&&(e=this.subMenuItems.length-1),this.subMenuItems[e].focus(),this.subIndex=e}addListeners(){const e=this.parent.domNode;Array.prototype.forEach.call(this.subMenuItems,t=>{t.addEventListener("keydown",n=>{const a=Ft(n);let o=!1;switch(a){case we.down:this.gotoSubIndex(this.subIndex+1),o=!0;break;case we.up:this.gotoSubIndex(this.subIndex-1),o=!0;break;case we.tab:_u(e,"mouseleave");break;case we.enter:case we.numpadEnter:case we.space:o=!0,n.currentTarget.click();break}return o&&(n.preventDefault(),n.stopPropagation()),!1})})}},iK=class{constructor(e,t){this.domNode=e,this.submenu=null,this.submenu=null,this.init(t)}init(e){this.domNode.setAttribute("tabindex","0");const t=this.domNode.querySelector(`.${e}-menu`);t&&(this.submenu=new rK(this,t)),this.addListeners()}addListeners(){this.domNode.addEventListener("keydown",e=>{const t=Ft(e);let n=!1;switch(t){case we.down:_u(e.currentTarget,"mouseenter"),this.submenu&&this.submenu.gotoSubIndex(0),n=!0;break;case we.up:_u(e.currentTarget,"mouseenter"),this.submenu&&this.submenu.gotoSubIndex(this.submenu.subMenuItems.length-1),n=!0;break;case we.tab:_u(e.currentTarget,"mouseleave");break;case we.enter:case we.numpadEnter:case we.space:n=!0,e.currentTarget.click();break}n&&e.preventDefault()})}},uK=class{constructor(e,t){this.domNode=e,this.init(t)}init(e){const t=this.domNode.childNodes;Array.from(t).forEach(n=>{n.nodeType===1&&new iK(n,e)})}},cK=le({name:"ElMenuCollapseTransition",__name:"menu-collapse-transition",setup(e){const t=fe("menu"),n={onBeforeEnter:a=>a.style.opacity="0.2",onEnter(a,o){ka(a,`${t.namespace.value}-opacity-transition`),a.style.opacity="1",o()},onAfterEnter(a){jn(a,`${t.namespace.value}-opacity-transition`),a.style.opacity=""},onBeforeLeave(a){a.dataset||(a.dataset={}),fo(a,t.m("collapse"))?(jn(a,t.m("collapse")),a.dataset.oldOverflow=a.style.overflow,a.dataset.scrollWidth=a.clientWidth.toString(),ka(a,t.m("collapse"))):(ka(a,t.m("collapse")),a.dataset.oldOverflow=a.style.overflow,a.dataset.scrollWidth=a.clientWidth.toString(),jn(a,t.m("collapse"))),a.style.width=`${a.scrollWidth}px`,a.style.overflow="hidden"},onLeave(a){ka(a,"horizontal-collapse-transition"),a.style.width=`${a.dataset.scrollWidth}px`}};return(a,o)=>(x(),oe(Mn,rt({mode:"out-in"},n),{default:Z(()=>[ee(a.$slots,"default")]),_:3},16))}}),dK=cK;const fK=Ce({mode:{type:String,values:["horizontal","vertical"],default:"vertical"},defaultActive:{type:String,default:""},defaultOpeneds:{type:q(Array),default:()=>Qt([])},uniqueOpened:Boolean,router:Boolean,menuTrigger:{type:String,values:["hover","click"],default:"hover"},collapse:Boolean,backgroundColor:String,textColor:String,activeTextColor:String,closeOnClickOutside:Boolean,collapseTransition:{type:Boolean,default:!0},ellipsis:{type:Boolean,default:!0},popperOffset:{type:Number,default:6},ellipsisIcon:{type:Bt,default:()=>T3},popperEffect:{type:q(String),default:"dark"},popperClass:String,popperStyle:{type:q([String,Object])},showTimeout:{type:Number,default:300},hideTimeout:{type:Number,default:300},persistent:{type:Boolean,default:!0}}),wf=e=>ye(e)&&e.every(t=>_e(t)),pK={close:(e,t)=>_e(e)&&wf(t),open:(e,t)=>_e(e)&&wf(t),select:(e,t,n,a)=>_e(e)&&wf(t)&&et(n)&&(St(a)||a instanceof Promise)},hy=64;var vK=le({name:"ElMenu",props:fK,emits:pK,setup(e,{emit:t,slots:n,expose:a}){const o=it(),l=o.appContext.config.globalProperties.$router,s=R(),r=R(),u=fe("menu"),c=fe("sub-menu");let d=hy;const f=R(-1),h=R(e.defaultOpeneds&&!e.collapse?e.defaultOpeneds.slice(0):[]),g=R(e.defaultActive),v=R({}),p=R({}),m=y(()=>e.mode==="horizontal"||e.mode==="vertical"&&e.collapse),b=()=>{const P=g.value&&v.value[g.value];!P||e.mode==="horizontal"||e.collapse||P.indexPath.forEach(M=>{const L=p.value[M];L&&k(M,L.indexPath)})},k=(P,M)=>{h.value.includes(P)||(e.uniqueOpened&&(h.value=h.value.filter(L=>M.includes(L))),h.value.push(P),t("open",P,M))},w=P=>{const M=h.value.indexOf(P);M!==-1&&h.value.splice(M,1)},C=(P,M)=>{w(P),t("close",P,M)},S=({index:P,indexPath:M})=>{h.value.includes(P)?C(P,M):k(P,M)},E=P=>{(e.mode==="horizontal"||e.collapse)&&(h.value=[]);const{index:M,indexPath:L}=P;if(!(cn(M)||cn(L)))if(e.router&&l){const D=P.route||M,V=l.push(D).then(G=>(G||(g.value=M),G));t("select",M,L,{index:M,indexPath:L,route:D},V)}else g.value=M,t("select",M,L,{index:M,indexPath:L})},O=P=>{const M=v.value;g.value=(M[P]||g.value&&M[g.value]||M[e.defaultActive])?.index??P},$=P=>{const M=getComputedStyle(P),L=Number.parseInt(M.marginLeft,10),D=Number.parseInt(M.marginRight,10);return P.offsetWidth+L+D||0},N=()=>{if(!s.value)return-1;const P=Array.from(s.value.childNodes).filter(X=>X.nodeName!=="#comment"&&(X.nodeName!=="#text"||X.nodeValue)),M=getComputedStyle(s.value),L=Number.parseInt(M.paddingLeft,10),D=Number.parseInt(M.paddingRight,10),V=s.value.clientWidth-L-D;let G=0,j=0;return P.forEach((X,Q)=>{G+=$(X),G<=V-d&&(j=Q+1)}),j===P.length?-1:j},I=P=>p.value[P].indexPath,_=(P,M=33.34)=>{let L;return()=>{L&&clearTimeout(L),L=setTimeout(()=>{P()},M)}};let A=!0;const F=()=>{const P=gn(r);if(P&&(d=$(P)||hy),f.value===N())return;const M=()=>{f.value=-1,Oe(()=>{f.value=N()})};A?M():_(M)(),A=!1};re(()=>e.defaultActive,P=>{v.value[P]||(g.value=""),O(P)}),re(()=>e.collapse,P=>{P&&(h.value=[])}),re(v.value,b);let K;ia(()=>{e.mode==="horizontal"&&e.ellipsis?K=Ut(s,F).stop:K?.()});const Y=R(!1);{const P=V=>{p.value[V.index]=V},M=V=>{delete p.value[V.index]};gt(Ph,Nt({props:e,openedMenus:h,items:v,subMenus:p,activeIndex:g,isMenuPopup:m,addMenuItem:V=>{v.value[V.index]=V},removeMenuItem:V=>{delete v.value[V.index]},addSubMenu:P,removeSubMenu:M,openMenu:k,closeMenu:C,handleMenuItemClick:E,handleSubMenuClick:S})),gt(`${Rc}${o.uid}`,{addSubMenu:P,removeSubMenu:M,mouseInChild:Y,level:0})}ct(()=>{e.mode==="horizontal"&&new uK(o.vnode.el,u.namespace.value)}),a({open:M=>{const{indexPath:L}=p.value[M];L.forEach(D=>k(D,L))},close:w,updateActiveIndex:O,handleResize:F});const W=yk(e,0);return()=>{let P=n.default?.()??[];const M=[];if(e.mode==="horizontal"&&s.value){const V=va(P).filter(X=>X?.shapeFlag!==8),G=f.value===-1?V:V.slice(0,f.value),j=f.value===-1?[]:V.slice(f.value);j?.length&&e.ellipsis&&(P=G,M.push(Ye(Rh,{ref:r,index:"sub-menu-more",class:c.e("hide-arrow"),popperOffset:e.popperOffset},{title:()=>Ye(Le,{class:c.e("icon-more")},{default:()=>Ye(e.ellipsisIcon)}),default:()=>j})))}const L=e.closeOnClickOutside?[[Tl,()=>{h.value.length&&(Y.value||(h.value.forEach(V=>t("close",V,I(V))),h.value=[]))}]]:[],D=st(Ye("ul",{key:String(e.collapse),role:"menubar",ref:s,style:W.value,class:{[u.b()]:!0,[u.m(e.mode)]:!0,[u.m("collapse")]:e.collapse}},[...P,...M]),L);return e.collapseTransition&&e.mode==="vertical"?Ye(dK,()=>D):D}}});const hK=Ce({index:{type:q([String,null]),default:null},route:{type:q([String,Object])},disabled:Boolean}),mK={click:e=>_e(e.index)&&ye(e.indexPath)},gK={title:String},xu="ElMenuItem";var bK=le({name:xu,__name:"menu-item",props:hK,emits:mK,setup(e,{expose:t,emit:n}){const a=e,o=n;la(a.index)&&ut(xu,'Missing required prop: "index"');const l=it(),s=Re(Ph),r=fe("menu"),u=fe("menu-item");s||Gt(xu,"can not inject root menu");const{parentMenu:c,indexPath:d}=bk(l,_t(a,"index")),f=Re(`${Rc}${c.value.uid}`);f||Gt(xu,"can not inject sub menu");const h=y(()=>a.index===s.activeIndex),g=Nt({index:a.index,indexPath:d,active:h}),v=()=>{a.disabled||(s.handleMenuItemClick({index:a.index,indexPath:d.value,route:a.route}),o("click",g))};return ct(()=>{f.addSubMenu(g),s.addMenuItem(g)}),Rt(()=>{f.removeSubMenu(g),s.removeMenuItem(g)}),t({parentMenu:c,rootMenu:s,active:h,nsMenu:r,nsMenuItem:u,handleClick:v}),(p,m)=>(x(),B("li",{class:T([i(u).b(),i(u).is("active",h.value),i(u).is("disabled",e.disabled)]),role:"menuitem",tabindex:"-1",onClick:v},[i(c).type.name==="ElMenu"&&i(s).props.collapse&&p.$slots.title?(x(),oe(i($n),{key:0,effect:i(s).props.popperEffect,placement:"right","fallback-placements":["left"],"popper-class":i(s).props.popperClass,"popper-style":i(s).props.popperStyle,persistent:i(s).props.persistent,"focus-on-target":""},{content:Z(()=>[ee(p.$slots,"title")]),default:Z(()=>[H("div",{class:T(i(r).be("tooltip","trigger"))},[ee(p.$slots,"default")],2)]),_:3},8,["effect","popper-class","popper-style","persistent"])):(x(),B(Fe,{key:1},[ee(p.$slots,"default"),ee(p.$slots,"title")],64))],2))}}),wk=bK,yK=le({name:"ElMenuItemGroup",__name:"menu-item-group",props:gK,setup(e){const t=fe("menu-item-group");return(n,a)=>(x(),B("li",{class:T(i(t).b())},[H("div",{class:T(i(t).e("title"))},[n.$slots.title?ee(n.$slots,"title",{key:1}):(x(),B(Fe,{key:0},[mt(ke(e.title),1)],64))],2),H("ul",null,[ee(n.$slots,"default")])],2))}}),Ck=yK;const wK=nt(vK,{MenuItem:wk,MenuItemGroup:Ck,SubMenu:Rh}),CK=Xt(wk),SK=Xt(Ck),kK=Xt(Rh),EK=Ce({icon:{type:Bt,default:()=>XA},title:String,content:{type:String,default:""}}),xK={back:()=>!0},TK=["aria-label"];var $K=le({name:"ElPageHeader",__name:"page-header",props:EK,emits:xK,setup(e,{emit:t}){const n=t,{t:a}=bt(),o=fe("page-header");function l(){n("back")}return(s,r)=>(x(),B("div",{class:T([i(o).b(),i(o).is("contentful",!!s.$slots.default),{[i(o).m("has-breadcrumb")]:!!s.$slots.breadcrumb,[i(o).m("has-extra")]:!!s.$slots.extra}])},[s.$slots.breadcrumb?(x(),B("div",{key:0,class:T(i(o).e("breadcrumb"))},[ee(s.$slots,"breadcrumb")],2)):te("v-if",!0),H("div",{class:T(i(o).e("header"))},[H("div",{class:T(i(o).e("left"))},[H("div",{class:T(i(o).e("back")),role:"button",tabindex:"0",onClick:l},[e.icon||s.$slots.icon?(x(),B("div",{key:0,"aria-label":e.title||i(a)("el.pageHeader.title"),class:T(i(o).e("icon"))},[ee(s.$slots,"icon",{},()=>[e.icon?(x(),oe(i(Le),{key:0},{default:Z(()=>[(x(),oe(ot(e.icon)))]),_:1})):te("v-if",!0)])],10,TK)):te("v-if",!0),H("div",{class:T(i(o).e("title"))},[ee(s.$slots,"title",{},()=>[mt(ke(e.title||i(a)("el.pageHeader.title")),1)])],2)],2),U(i(sk),{direction:"vertical"}),H("div",{class:T(i(o).e("content"))},[ee(s.$slots,"content",{},()=>[mt(ke(e.content),1)])],2)],2),s.$slots.extra?(x(),B("div",{key:0,class:T(i(o).e("extra"))},[ee(s.$slots,"extra")],2)):te("v-if",!0)],2),s.$slots.default?(x(),B("div",{key:1,class:T(i(o).e("main"))},[ee(s.$slots,"default")],2)):te("v-if",!0)],2))}}),OK=$K;const IK=nt(OK),Sk=Symbol("elPaginationKey"),NK=Ce({disabled:Boolean,currentPage:{type:Number,default:1},prevText:{type:String},prevIcon:{type:Bt}}),MK={click:e=>e instanceof MouseEvent},PK=["disabled","aria-label","aria-disabled"],RK={key:0};var AK=le({name:"ElPaginationPrev",__name:"prev",props:NK,emits:MK,setup(e){const t=e,{t:n}=bt(),a=y(()=>t.disabled||t.currentPage<=1);return(o,l)=>(x(),B("button",{type:"button",class:"btn-prev",disabled:a.value,"aria-label":o.prevText||i(n)("el.pagination.prev"),"aria-disabled":a.value,onClick:l[0]||(l[0]=s=>o.$emit("click",s))},[o.prevText?(x(),B("span",RK,ke(o.prevText),1)):(x(),oe(i(Le),{key:1},{default:Z(()=>[(x(),oe(ot(o.prevIcon)))]),_:1}))],8,PK))}}),_K=AK;const LK=Ce({disabled:Boolean,currentPage:{type:Number,default:1},pageCount:{type:Number,default:50},nextText:{type:String},nextIcon:{type:Bt}}),DK=["disabled","aria-label","aria-disabled"],BK={key:0};var VK=le({name:"ElPaginationNext",__name:"next",props:LK,emits:["click"],setup(e){const t=e,{t:n}=bt(),a=y(()=>t.disabled||t.currentPage===t.pageCount||t.pageCount===0);return(o,l)=>(x(),B("button",{type:"button",class:"btn-next",disabled:a.value,"aria-label":o.nextText||i(n)("el.pagination.next"),"aria-disabled":a.value,onClick:l[0]||(l[0]=s=>o.$emit("click",s))},[o.nextText?(x(),B("span",BK,ke(o.nextText),1)):(x(),oe(i(Le),{key:1},{default:Z(()=>[(x(),oe(ot(o.nextIcon)))]),_:1}))],8,DK))}}),FK=VK;const Ah=()=>Re(Sk,{}),zK=Ce({pageSize:{type:Number,required:!0},pageSizes:{type:q(Array),default:()=>Qt([10,20,30,40,50,100])},popperClass:{type:String},popperStyle:{type:q([String,Object])},disabled:Boolean,teleported:Boolean,size:{type:String,values:Ua},appendSizeTo:String});var HK=le({name:"ElPaginationSizes",__name:"sizes",props:zK,emits:["page-size-change"],setup(e,{emit:t}){const n=e,a=t,{t:o}=bt(),l=fe("pagination"),s=Ah(),r=R(n.pageSize);re(()=>n.pageSizes,(d,f)=>{Jt(d,f)||ye(d)&&a("page-size-change",d.includes(n.pageSize)?n.pageSize:n.pageSizes[0])}),re(()=>n.pageSize,d=>{r.value=d});const u=y(()=>n.pageSizes);function c(d){d!==r.value&&(r.value=d,s.handleSizeChange?.(Number(d)))}return(d,f)=>(x(),B("span",{class:T(i(l).e("sizes"))},[U(i($l),{"model-value":r.value,disabled:d.disabled,"popper-class":d.popperClass,"popper-style":d.popperStyle,size:d.size,teleported:d.teleported,"validate-event":!1,"append-to":d.appendSizeTo,onChange:c},{default:Z(()=>[(x(!0),B(Fe,null,ht(u.value,h=>(x(),oe(i(Oc),{key:h,value:h,label:h+i(o)("el.pagination.pagesize")},null,8,["value","label"]))),128))]),_:1},8,["model-value","disabled","popper-class","popper-style","size","teleported","append-to"])],2))}}),KK=HK;const WK=Ce({size:{type:String,values:Ua}}),jK=["disabled"];var YK=le({name:"ElPaginationJumper",__name:"jumper",props:WK,setup(e){const{t}=bt(),n=fe("pagination"),{pageCount:a,disabled:o,currentPage:l,changeEvent:s}=Ah(),r=R(),u=y(()=>r.value??l?.value);function c(f){r.value=f?+f:""}function d(f){f=Math.trunc(+f),s?.(f),r.value=void 0}return(f,h)=>(x(),B("span",{class:T(i(n).e("jump")),disabled:i(o)},[H("span",{class:T([i(n).e("goto")])},ke(i(t)("el.pagination.goto")),3),U(i(Wn),{size:f.size,class:T([i(n).e("editor"),i(n).is("in-pagination")]),min:1,max:i(a),disabled:i(o),"model-value":u.value,"validate-event":!1,"aria-label":i(t)("el.pagination.page"),type:"number","onUpdate:modelValue":c,onChange:d},null,8,["size","class","max","disabled","model-value","aria-label"]),H("span",{class:T([i(n).e("classifier")])},ke(i(t)("el.pagination.pageClassifier")),3)],10,jK))}}),UK=YK;const qK=Ce({total:{type:Number,default:1e3}}),GK=["disabled"];var XK=le({name:"ElPaginationTotal",__name:"total",props:qK,setup(e){const{t}=bt(),n=fe("pagination"),{disabled:a}=Ah();return(o,l)=>(x(),B("span",{class:T(i(n).e("total")),disabled:i(a)},ke(i(t)("el.pagination.total",{total:o.total})),11,GK))}}),ZK=XK;const JK=Ce({currentPage:{type:Number,default:1},pageCount:{type:Number,required:!0},pagerCount:{type:Number,default:7},disabled:Boolean}),QK=["aria-current","aria-label","tabindex"],eW=["tabindex","aria-label"],tW=["aria-current","aria-label","tabindex"],nW=["tabindex","aria-label"],aW=["aria-current","aria-label","tabindex"];var oW=le({name:"ElPaginationPager",__name:"pager",props:JK,emits:[vt],setup(e,{emit:t}){const n=e,a=t,o=fe("pager"),l=fe("icon"),{t:s}=bt(),r=R(!1),u=R(!1),c=R(!1),d=R(!1),f=R(!1),h=R(!1),g=y(()=>{const S=n.pagerCount,E=(S-1)/2,O=Number(n.currentPage),$=Number(n.pageCount);let N=!1,I=!1;$>S&&(O>S-E&&(N=!0),O<$-E&&(I=!0));const _=[];if(N&&!I){const A=$-(S-2);for(let F=A;F<$;F++)_.push(F)}else if(!N&&I)for(let A=2;A["more","btn-quickprev",l.b(),o.is("disabled",n.disabled)]),p=y(()=>["more","btn-quicknext",l.b(),o.is("disabled",n.disabled)]),m=y(()=>n.disabled?-1:0);re(()=>[n.pageCount,n.pagerCount,n.currentPage],([S,E,O])=>{const $=(E-1)/2;let N=!1,I=!1;S>E&&(N=O>E-$,I=O$&&(O=$)),O!==N&&a(vt,O)}return(S,E)=>(x(),B("ul",{class:T(i(o).b()),onClick:C,onKeyup:Zt(w,["enter"])},[S.pageCount>0?(x(),B("li",{key:0,class:T([[i(o).is("active",S.currentPage===1),i(o).is("disabled",S.disabled)],"number"]),"aria-current":S.currentPage===1,"aria-label":i(s)("el.pagination.currentPage",{pager:1}),tabindex:m.value}," 1 ",10,QK)):te("v-if",!0),r.value?(x(),B("li",{key:1,class:T(v.value),tabindex:m.value,"aria-label":i(s)("el.pagination.prevPages",{pager:S.pagerCount-2}),onMouseenter:E[0]||(E[0]=O=>b(!0)),onMouseleave:E[1]||(E[1]=O=>c.value=!1),onFocus:E[2]||(E[2]=O=>k(!0)),onBlur:E[3]||(E[3]=O=>f.value=!1)},[(c.value||f.value)&&!S.disabled?(x(),oe(i(kl),{key:0})):(x(),oe(i(ab),{key:1}))],42,eW)):te("v-if",!0),(x(!0),B(Fe,null,ht(g.value,O=>(x(),B("li",{key:O,class:T([[i(o).is("active",S.currentPage===O),i(o).is("disabled",S.disabled)],"number"]),"aria-current":S.currentPage===O,"aria-label":i(s)("el.pagination.currentPage",{pager:O}),tabindex:m.value},ke(O),11,tW))),128)),u.value?(x(),B("li",{key:2,class:T(p.value),tabindex:m.value,"aria-label":i(s)("el.pagination.nextPages",{pager:S.pagerCount-2}),onMouseenter:E[4]||(E[4]=O=>b()),onMouseleave:E[5]||(E[5]=O=>d.value=!1),onFocus:E[6]||(E[6]=O=>k()),onBlur:E[7]||(E[7]=O=>h.value=!1)},[(d.value||h.value)&&!S.disabled?(x(),oe(i(El),{key:0})):(x(),oe(i(ab),{key:1}))],42,nW)):te("v-if",!0),S.pageCount>1?(x(),B("li",{key:3,class:T([[i(o).is("active",S.currentPage===S.pageCount),i(o).is("disabled",S.disabled)],"number"]),"aria-current":S.currentPage===S.pageCount,"aria-label":i(s)("el.pagination.currentPage",{pager:S.pageCount}),tabindex:m.value},ke(S.pageCount),11,aW)):te("v-if",!0)],34))}}),lW=oW;const Gn=e=>typeof e!="number",sW=Ce({pageSize:Number,defaultPageSize:Number,total:Number,pageCount:Number,pagerCount:{type:Number,validator:e=>ze(e)&&Math.trunc(e)===e&&e>4&&e<22&&e%2===1,default:7},currentPage:Number,defaultCurrentPage:Number,layout:{type:String,default:["prev","pager","next","jumper","->","total"].join(", ")},pageSizes:{type:q(Array),default:()=>Qt([10,20,30,40,50,100])},popperClass:{type:String,default:""},popperStyle:{type:q([String,Object])},prevText:{type:String,default:""},prevIcon:{type:Bt,default:()=>Uo},nextText:{type:String,default:""},nextIcon:{type:Bt,default:()=>Yn},teleported:{type:Boolean,default:!0},small:Boolean,size:bn,background:Boolean,disabled:Boolean,hideOnSinglePage:Boolean,appendSizeTo:String}),rW={"update:current-page":e=>ze(e),"update:page-size":e=>ze(e),"size-change":e=>ze(e),change:(e,t)=>ze(e)&&ze(t),"current-change":e=>ze(e),"prev-click":e=>ze(e),"next-click":e=>ze(e)},my="ElPagination";var iW=le({name:my,props:sW,emits:rW,setup(e,{emit:t,slots:n}){const{t:a}=bt(),o=fe("pagination"),l=it().vnode.props||{},s=fC(),r=y(()=>e.small?"small":e.size??s.value);co({from:"small",replacement:"size",version:"3.0.0",scope:"el-pagination",ref:"https://element-plus.org/zh-CN/component/pagination.html"},y(()=>!!e.small));const u="onUpdate:currentPage"in l||"onUpdate:current-page"in l||"onCurrentChange"in l,c="onUpdate:pageSize"in l||"onUpdate:page-size"in l||"onSizeChange"in l,d=y(()=>{if(Gn(e.total)&&Gn(e.pageCount)||!Gn(e.currentPage)&&!u)return!1;if(e.layout.includes("sizes")){if(Gn(e.pageCount)){if(!Gn(e.total)&&!Gn(e.pageSize)&&!c)return!1}else if(!c)return!1}return!0}),f=R(Gn(e.defaultPageSize)?10:e.defaultPageSize),h=R(Gn(e.defaultCurrentPage)?1:e.defaultCurrentPage),g=y({get(){return Gn(e.pageSize)?f.value:e.pageSize},set(S){Gn(e.pageSize)&&(f.value=S),c&&(t("update:page-size",S),t("size-change",S))}}),v=y(()=>{let S=0;return Gn(e.pageCount)?Gn(e.total)||(S=Math.max(1,Math.ceil(e.total/g.value))):S=e.pageCount,S}),p=y({get(){return Gn(e.currentPage)?h.value:e.currentPage},set(S){let E=S;S<1?E=1:S>v.value&&(E=v.value),Gn(e.currentPage)&&(h.value=E),u&&(t("update:current-page",E),t("current-change",E))}});re(v,S=>{p.value>S&&(p.value=S)}),re([p,g],S=>{t(vt,...S)},{flush:"post"});function m(S){p.value=S}function b(S){g.value=S;const E=v.value;p.value>E&&(p.value=E)}function k(){e.disabled||(p.value-=1,t("prev-click",p.value))}function w(){e.disabled||(p.value+=1,t("next-click",p.value))}function C(S,E){S&&(S.props||(S.props={}),S.props.class=[S.props.class,E].join(" "))}return gt(Sk,{pageCount:v,disabled:y(()=>e.disabled),currentPage:p,changeEvent:m,handleSizeChange:b}),()=>{if(!d.value)return ut(my,a("el.pagination.deprecationWarning")),null;if(!e.layout||e.hideOnSinglePage&&v.value<=1)return null;const S=[],E=[],O=Ye("div",{class:o.e("rightwrapper")},E),$={prev:Ye(_K,{disabled:e.disabled,currentPage:p.value,prevText:e.prevText,prevIcon:e.prevIcon,onClick:k}),jumper:Ye(UK,{size:r.value}),pager:Ye(lW,{currentPage:p.value,pageCount:v.value,pagerCount:e.pagerCount,onChange:m,disabled:e.disabled}),next:Ye(FK,{disabled:e.disabled,currentPage:p.value,pageCount:v.value,nextText:e.nextText,nextIcon:e.nextIcon,onClick:w}),sizes:Ye(KK,{pageSize:g.value,pageSizes:e.pageSizes,popperClass:e.popperClass,popperStyle:e.popperStyle,disabled:e.disabled,teleported:e.teleported,size:r.value,appendSizeTo:e.appendSizeTo}),slot:n?.default?.()??null,total:Ye(ZK,{total:Gn(e.total)?0:e.total})},N=e.layout.split(",").map(_=>_.trim());let I=!1;return N.forEach(_=>{if(_==="->"){I=!0;return}I?E.push($[_]):S.push($[_])}),C(S[0],o.is("first")),C(S[S.length-1],o.is("last")),I&&E.length>0&&(C(E[0],o.is("first")),C(E[E.length-1],o.is("last")),S.push(O)),Ye("div",{class:[o.b(),o.is("background",e.background),o.m(r.value)]},S)}}});const uW=nt(iW),cW=Ce({title:String,confirmButtonText:String,cancelButtonText:String,confirmButtonType:{type:String,values:ip,default:"primary"},cancelButtonType:{type:String,values:ip,default:"text"},icon:{type:Bt,default:()=>M3},iconColor:{type:String,default:"#f90"},hideIcon:Boolean,hideAfter:{type:Number,default:200},effect:{...Lt.effect,default:"light"},teleported:Lt.teleported,persistent:Lt.persistent,width:{type:[String,Number],default:150},virtualTriggering:ho.virtualTriggering,virtualRef:ho.virtualRef}),dW={confirm:e=>e instanceof MouseEvent,cancel:e=>e instanceof MouseEvent};var fW=le({name:"ElPopconfirm",__name:"popconfirm",props:cW,emits:dW,setup(e,{expose:t,emit:n}){const a=e,o=n,{t:l}=bt(),s=fe("popconfirm"),r=R(),u=R(),c=y(()=>i(r)?.popperRef),d=()=>{u.value?.focus?.()},f=()=>{r.value?.onClose?.()},h=y(()=>({width:en(a.width)})),g=b=>{o("confirm",b),f()},v=b=>{o("cancel",b),f()},p=y(()=>a.confirmButtonText||l("el.popconfirm.confirmButtonText")),m=y(()=>a.cancelButtonText||l("el.popconfirm.cancelButtonText"));return t({popperRef:c,hide:f}),(b,k)=>(x(),oe(i($n),rt({ref_key:"tooltipRef",ref:r,trigger:"click",effect:e.effect},b.$attrs,{"virtual-triggering":e.virtualTriggering,"virtual-ref":e.virtualRef,"popper-class":`${i(s).namespace.value}-popover`,"popper-style":h.value,teleported:e.teleported,"fallback-placements":["bottom","top","right","left"],"hide-after":e.hideAfter,persistent:e.persistent,loop:"",onShow:d}),{content:Z(()=>[H("div",{ref_key:"rootRef",ref:u,tabindex:"-1",class:T(i(s).b())},[H("div",{class:T(i(s).e("main"))},[!e.hideIcon&&e.icon?(x(),oe(i(Le),{key:0,class:T(i(s).e("icon")),style:He({color:e.iconColor})},{default:Z(()=>[(x(),oe(ot(e.icon)))]),_:1},8,["class","style"])):te("v-if",!0),mt(" "+ke(e.title),1)],2),H("div",{class:T(i(s).e("action"))},[ee(b.$slots,"actions",{confirm:g,cancel:v},()=>[U(i(Sn),{size:"small",type:e.cancelButtonType==="text"?"":e.cancelButtonType,text:e.cancelButtonType==="text",onClick:v},{default:Z(()=>[mt(ke(m.value),1)]),_:1},8,["type","text"]),U(i(Sn),{size:"small",type:e.confirmButtonType==="text"?"":e.confirmButtonType,text:e.confirmButtonType==="text",onClick:g},{default:Z(()=>[mt(ke(p.value),1)]),_:1},8,["type","text"])])],2)],2)]),default:Z(()=>[b.$slots.reference?ee(b.$slots,"reference",{key:0}):te("v-if",!0)]),_:3},16,["effect","virtual-triggering","virtual-ref","popper-class","popper-style","teleported","hide-after","persistent"]))}}),pW=fW;const vW=nt(pW),hW=Ce({type:{type:String,default:"line",values:["line","circle","dashboard"]},percentage:{type:Number,default:0,validator:e=>e>=0&&e<=100},status:{type:String,default:"",values:["","success","exception","warning"]},indeterminate:Boolean,duration:{type:Number,default:3},strokeWidth:{type:Number,default:6},strokeLinecap:{type:q(String),default:"round"},textInside:Boolean,width:{type:Number,default:126},showText:{type:Boolean,default:!0},color:{type:q([String,Array,Function]),default:""},striped:Boolean,stripedFlow:Boolean,format:{type:q(Function),default:e=>`${e}%`}}),mW=["aria-valuenow"],gW={viewBox:"0 0 100 100"},bW=["d","stroke","stroke-linecap","stroke-width"],yW=["d","stroke","opacity","stroke-linecap","stroke-width"],wW={key:0};var CW=le({name:"ElProgress",__name:"progress",props:hW,setup(e){const t={success:"#13ce66",exception:"#ff4949",warning:"#e6a23c",default:"#20a0ff"},n=e,a=fe("progress"),o=y(()=>{const w={width:`${n.percentage}%`,animationDuration:`${n.duration}s`},C=k(n.percentage);return C.includes("gradient")?w.background=C:w.backgroundColor=C,w}),l=y(()=>(n.strokeWidth/n.width*100).toFixed(1)),s=y(()=>["circle","dashboard"].includes(n.type)?Number.parseInt(`${50-Number.parseFloat(l.value)/2}`,10):0),r=y(()=>{const w=s.value,C=n.type==="dashboard";return` - M 50 50 - m 0 ${C?"":"-"}${w} - a ${w} ${w} 0 1 1 0 ${C?"-":""}${w*2} - a ${w} ${w} 0 1 1 0 ${C?"":"-"}${w*2} - `}),u=y(()=>2*Math.PI*s.value),c=y(()=>n.type==="dashboard"?.75:1),d=y(()=>`${-1*u.value*(1-c.value)/2}px`),f=y(()=>({strokeDasharray:`${u.value*c.value}px, ${u.value}px`,strokeDashoffset:d.value})),h=y(()=>({strokeDasharray:`${u.value*c.value*(n.percentage/100)}px, ${u.value}px`,strokeDashoffset:d.value,transition:"stroke-dasharray 0.6s ease 0s, stroke 0.6s ease, opacity ease 0.6s"})),g=y(()=>{let w;return n.color?w=k(n.percentage):w=t[n.status]||t.default,w}),v=y(()=>n.status==="warning"?kd:n.type==="line"?n.status==="success"?oh:xo:n.status==="success"?Ui:Ia),p=y(()=>n.type==="line"?12+n.strokeWidth*.4:n.width*.111111+2),m=y(()=>n.format(n.percentage));function b(w){const C=100/w.length;return w.map((S,E)=>_e(S)?{color:S,percentage:(E+1)*C}:S).sort((S,E)=>S.percentage-E.percentage)}const k=w=>{const{color:C}=n;if(Be(C))return C(w);if(_e(C))return C;{const S=b(C);for(const E of S)if(E.percentage>w)return E.color;return S[S.length-1]?.color}};return(w,C)=>(x(),B("div",{class:T([i(a).b(),i(a).m(e.type),i(a).is(e.status),{[i(a).m("without-text")]:!e.showText,[i(a).m("text-inside")]:e.textInside}]),role:"progressbar","aria-valuenow":e.percentage,"aria-valuemin":"0","aria-valuemax":"100"},[e.type==="line"?(x(),B("div",{key:0,class:T(i(a).b("bar"))},[H("div",{class:T(i(a).be("bar","outer")),style:He({height:`${e.strokeWidth}px`})},[H("div",{class:T([i(a).be("bar","inner"),{[i(a).bem("bar","inner","indeterminate")]:e.indeterminate},{[i(a).bem("bar","inner","striped")]:e.striped},{[i(a).bem("bar","inner","striped-flow")]:e.stripedFlow}]),style:He(o.value)},[(e.showText||w.$slots.default)&&e.textInside?(x(),B("div",{key:0,class:T(i(a).be("bar","innerText"))},[ee(w.$slots,"default",{percentage:e.percentage},()=>[H("span",null,ke(m.value),1)])],2)):te("v-if",!0)],6)],6)],2)):(x(),B("div",{key:1,class:T(i(a).b("circle")),style:He({height:`${e.width}px`,width:`${e.width}px`})},[(x(),B("svg",gW,[H("path",{class:T(i(a).be("circle","track")),d:r.value,stroke:`var(${i(a).cssVarName("fill-color-light")}, #e5e9f2)`,"stroke-linecap":e.strokeLinecap,"stroke-width":l.value,fill:"none",style:He(f.value)},null,14,bW),H("path",{class:T(i(a).be("circle","path")),d:r.value,stroke:g.value,fill:"none",opacity:e.percentage?1:0,"stroke-linecap":e.strokeLinecap,"stroke-width":l.value,style:He(h.value)},null,14,yW)]))],6)),(e.showText||w.$slots.default)&&!e.textInside?(x(),B("div",{key:2,class:T(i(a).e("text")),style:He({fontSize:`${p.value}px`})},[ee(w.$slots,"default",{percentage:e.percentage},()=>[e.status?(x(),oe(i(Le),{key:1},{default:Z(()=>[(x(),oe(ot(v.value)))]),_:1})):(x(),B("span",wW,ke(m.value),1))])],6)):te("v-if",!0)],10,mW))}}),SW=CW;const kk=nt(SW),kW=Ce({modelValue:{type:Number,default:0},id:{type:String,default:void 0},lowThreshold:{type:Number,default:2},highThreshold:{type:Number,default:4},max:{type:Number,default:5},colors:{type:q([Array,Object]),default:()=>Qt(["","",""])},voidColor:{type:String,default:""},disabledVoidColor:{type:String,default:""},icons:{type:q([Array,Object]),default:()=>[pu,pu,pu]},voidIcon:{type:Bt,default:()=>Y3},disabledVoidIcon:{type:Bt,default:()=>pu},disabled:{type:Boolean,default:void 0},allowHalf:Boolean,showText:Boolean,showScore:Boolean,textColor:{type:String,default:""},texts:{type:q(Array),default:()=>Qt(["Extremely bad","Disappointed","Fair","Satisfied","Surprise"])},scoreTemplate:{type:String,default:"{value}"},size:bn,clearable:Boolean,...Un(["ariaLabel"])}),EW={[vt]:e=>ze(e),[Qe]:e=>ze(e)},xW=["id","aria-label","aria-labelledby","aria-valuenow","aria-valuetext","aria-valuemax","tabindex","aria-disabled"],TW=["onMousemove","onClick"];var $W=le({name:"ElRate",__name:"rate",props:kW,emits:EW,setup(e,{expose:t,emit:n}){function a(M,L){const D=G=>et(G),V=L[Object.keys(L).map(G=>+G).filter(G=>{const j=L[G];return D(j)&&j.excluded?MG-j)[0]];return D(V)&&V.value||V}const o=e,l=n,s=Re(Co,void 0),r=vn(),u=fe("rate"),{inputId:c,isLabeledByFormItem:d}=ya(o,{formItemContext:s}),f=R(zl(o.modelValue,0,o.max)),h=R(-1),g=R(!0),v=R([]),p=y(()=>v.value.map(M=>M.$el.clientWidth)),m=y(()=>[u.b(),u.m(r.value)]),b=tn(),k=y(()=>u.cssVarBlock({"void-color":o.voidColor,"disabled-void-color":o.disabledVoidColor,"fill-color":E.value})),w=y(()=>{let M="";return o.showScore?M=o.scoreTemplate.replace(/\{\s*value\s*\}/,b.value?`${o.modelValue}`:`${f.value}`):o.showText&&(M=o.texts[Math.ceil(f.value)-1]),M}),C=y(()=>o.modelValue*100-Math.floor(o.modelValue)*100),S=y(()=>ye(o.colors)?{[o.lowThreshold]:o.colors[0],[o.highThreshold]:{value:o.colors[1],excluded:!0},[o.max]:o.colors[2]}:o.colors),E=y(()=>{const M=a(f.value,S.value);return et(M)?"":M}),O=y(()=>{let M="";return b.value?M=`${C.value}%`:o.allowHalf&&(M="50%"),{color:E.value,width:M}}),$=y(()=>{let M=ye(o.icons)?[...o.icons]:{...o.icons};return M=uo(M),ye(M)?{[o.lowThreshold]:M[0],[o.highThreshold]:{value:M[1],excluded:!0},[o.max]:M[2]}:M}),N=y(()=>a(o.modelValue,$.value)),I=y(()=>b.value?_e(o.disabledVoidIcon)?o.disabledVoidIcon:uo(o.disabledVoidIcon):_e(o.voidIcon)?o.voidIcon:uo(o.voidIcon)),_=y(()=>a(f.value,$.value));function A(M){const L=b.value&&C.value>0&&M-1o.modelValue,D=o.allowHalf&&g.value&&M-.5<=f.value&&M>f.value;return L||D}function F(M){o.clearable&&M===o.modelValue&&(M=0),l(Qe,M),o.modelValue!==M&&l(vt,M)}function K(M){b.value||(o.allowHalf&&g.value?F(f.value):F(M))}function Y(M){if(b.value)return;const L=Ft(M),D=o.allowHalf?.5:1;let V=f.value;switch(L){case we.up:case we.right:V+=D;break;case we.left:case we.down:V-=D;break}if(V=zl(V,0,o.max),V!==f.value)return M.stopPropagation(),M.preventDefault(),l(Qe,V),l(vt,V),V}function W(M,L){b.value||(o.allowHalf&&L?(g.value=L.offsetX*2<=p.value[M-1],f.value=g.value?M-.5:M):f.value=M,h.value=M)}function P(){b.value||(o.allowHalf&&(g.value=o.modelValue!==Math.floor(o.modelValue)),f.value=zl(o.modelValue,0,o.max),h.value=-1)}return re(()=>o.modelValue,M=>{f.value=zl(M,0,o.max),g.value=o.modelValue!==Math.floor(o.modelValue)}),o.modelValue||l(Qe,0),t({setCurrentValue:W,resetCurrentValue:P}),(M,L)=>(x(),B("div",{id:i(c),class:T([m.value,i(u).is("disabled",i(b))]),role:"slider","aria-label":i(d)?void 0:e.ariaLabel||"rating","aria-labelledby":i(d)?i(s)?.labelId:void 0,"aria-valuenow":f.value,"aria-valuetext":w.value||void 0,"aria-valuemin":"0","aria-valuemax":e.max,style:He(k.value),tabindex:i(b)?void 0:0,"aria-disabled":i(b),onKeydown:Y},[(x(!0),B(Fe,null,ht(e.max,(D,V)=>(x(),B("span",{key:V,class:T(i(u).e("item")),onMousemove:G=>W(D,G),onMouseleave:P,onClick:G=>K(D)},[U(i(Le),{ref_for:!0,ref_key:"iconRefs",ref:v,class:T([i(u).e("icon"),{hover:h.value===D},i(u).is("active",D<=f.value),i(u).is("focus-visible",D===Math.ceil(f.value||1))])},{default:Z(()=>[st((x(),oe(ot(_.value),null,null,512)),[[Ot,!A(D)&&D<=f.value]]),st((x(),oe(ot(I.value),null,null,512)),[[Ot,!A(D)&&D>f.value]]),st((x(),oe(ot(I.value),{class:T([i(u).em("decimal","box")])},null,8,["class"])),[[Ot,A(D)]]),st(U(i(Le),{style:He(O.value),class:T([i(u).e("icon"),i(u).e("decimal")])},{default:Z(()=>[(x(),oe(ot(N.value)))]),_:1},8,["style","class"]),[[Ot,A(D)]])]),_:2},1032,["class"])],42,TW))),128)),e.showText||e.showScore?(x(),B("span",{key:0,class:T(i(u).e("text")),style:He({color:e.textColor})},ke(w.value),7)):te("v-if",!0)],46,xW))}}),OW=$W;const IW=nt(OW),Vl={primary:"icon-primary",success:"icon-success",warning:"icon-warning",error:"icon-error",info:"icon-info"},gy={[Vl.primary]:di,[Vl.success]:o3,[Vl.warning]:kd,[Vl.error]:lh,[Vl.info]:di},NW=Ce({title:{type:String,default:""},subTitle:{type:String,default:""},icon:{type:String,values:["primary","success","warning","info","error"],default:"info"}});var MW=le({name:"ElResult",__name:"result",props:NW,setup(e){const t=e,n=fe("result"),a=y(()=>{const o=t.icon,l=o&&Vl[o]?Vl[o]:"icon-info";return{class:l,component:gy[l]||gy["icon-info"]}});return(o,l)=>(x(),B("div",{class:T(i(n).b())},[H("div",{class:T(i(n).e("icon"))},[ee(o.$slots,"icon",{},()=>[a.value.component?(x(),oe(ot(a.value.component),{key:0,class:T(a.value.class)},null,8,["class"])):te("v-if",!0)])],2),e.title||o.$slots.title?(x(),B("div",{key:0,class:T(i(n).e("title"))},[ee(o.$slots,"title",{},()=>[H("p",null,ke(e.title),1)])],2)):te("v-if",!0),e.subTitle||o.$slots["sub-title"]?(x(),B("div",{key:1,class:T(i(n).e("subtitle"))},[ee(o.$slots,"sub-title",{},()=>[H("p",null,ke(e.subTitle),1)])],2)):te("v-if",!0),o.$slots.extra?(x(),B("div",{key:2,class:T(i(n).e("extra"))},[ee(o.$slots,"extra")],2)):te("v-if",!0)],2))}}),PW=MW;const RW=nt(PW),Op=50,Ac="itemRendered",_c="scroll",Is="forward",Lc="backward",Ea="auto",Md="smart",bi="start",ro="center",yi="end",or="horizontal",Ek="vertical",AW="ltr",Bs="rtl",wi="negative",_h="positive-ascending",Lh="positive-descending",_W={[or]:"left",[Ek]:"top"},LW=20,Ip=Ga({type:q([Number,Function]),required:!0}),Np=Ga({type:Number}),Mp=Ga({type:Number,default:2}),DW=Ga({type:String,values:["ltr","rtl"],default:"ltr"}),Pp=Ga({type:Number,default:0}),Dc=Ga({type:Number,required:!0}),xk=Ga({type:String,values:["horizontal","vertical"],default:Ek}),Tk=Ce({className:{type:String,default:""},containerElement:{type:q([String,Object]),default:"div"},data:{type:q(Array),default:()=>Qt([])},direction:DW,height:{type:[String,Number],required:!0},innerElement:{type:[String,Object],default:"div"},innerProps:{type:q(Object),default:()=>({})},style:{type:q([Object,String,Array])},useIsScrolling:Boolean,width:{type:[Number,String],required:!1},perfMode:{type:Boolean,default:!0},scrollbarAlwaysOn:Boolean}),$k=Ce({cache:Mp,estimatedItemSize:Np,layout:xk,initScrollOffset:Pp,total:Dc,itemSize:Ip,...Tk}),Rp={type:Number,default:6},Ok={type:Number,default:0},Ik={type:Number,default:2},Zl=Ce({columnCache:Mp,columnWidth:Ip,estimatedColumnWidth:Np,estimatedRowHeight:Np,initScrollLeft:Pp,initScrollTop:Pp,itemKey:{type:q(Function),default:({columnIndex:e,rowIndex:t})=>`${t}:${e}`},rowCache:Mp,rowHeight:Ip,totalColumn:Dc,totalRow:Dc,hScrollbarSize:Rp,vScrollbarSize:Rp,scrollbarStartGap:Ok,scrollbarEndGap:Ik,role:String,...Tk}),Nk=Ce({alwaysOn:Boolean,class:String,layout:xk,total:Dc,ratio:{type:Number,required:!0},clientSize:{type:Number,required:!0},scrollFrom:{type:Number,required:!0},scrollbarSize:Rp,startGap:Ok,endGap:Ik,visible:Boolean}),jl=(e,t)=>ee===AW||e===Bs||e===or,by=e=>e===Bs;let ks=null;function Bc(e=!1){if(ks===null||e){const t=document.createElement("div"),n=t.style;n.width="50px",n.height="50px",n.overflow="scroll",n.direction="rtl";const a=document.createElement("div"),o=a.style;return o.width="100px",o.height="100px",t.appendChild(a),document.body.appendChild(t),t.scrollLeft>0?ks=Lh:(t.scrollLeft=1,t.scrollLeft===0?ks=wi:ks=_h),document.body.removeChild(t),ks}return ks}function BW({move:e,size:t,bar:n},a){const o={},l=`translate${n.axis}(${e}px)`;return o[n.size]=t,o.transform=l,a==="horizontal"?o.height="100%":o.width="100%",o}var yy=Number.isNaN||function(t){return typeof t=="number"&&t!==t};function VW(e,t){return!!(e===t||yy(e)&&yy(t))}function FW(e,t){if(e.length!==t.length)return!1;for(var n=0;n{const e=it().proxy.$props;return y(()=>{const t=(n,a,o)=>({});return e.perfMode?id(t):zW(t)})},Pk=({atEndEdge:e,atStartEdge:t,layout:n},a)=>{let o,l=0;const s=u=>u<0&&t.value||u>0&&e.value;return{hasReachedEdge:s,onWheel:u=>{jo(o);let{deltaX:c,deltaY:d}=u;u.shiftKey&&d!==0&&(c=d,d=0);const f=n.value===or?c:d;s(f)||(l+=f,!vd()&&f!==0&&u.preventDefault(),o=Fa(()=>{a(l),l=0}))}}},Ap=le({name:"ElVirtualScrollBar",props:Nk,emits:["scroll","start-move","stop-move"],setup(e,{emit:t}){const n=y(()=>e.startGap+e.endGap),a=fe("virtual-scrollbar"),o=fe("scrollbar"),l=R(),s=R();let r=null,u=null;const c=Nt({isDragging:!1,traveled:0}),d=y(()=>LC[e.layout]),f=y(()=>e.clientSize-i(n)),h=y(()=>({position:"absolute",width:`${or===e.layout?f.value:e.scrollbarSize}px`,height:`${or===e.layout?e.scrollbarSize:f.value}px`,[_W[e.layout]]:"2px",right:"2px",bottom:"2px",borderRadius:"4px"})),g=y(()=>{const E=e.ratio;if(E>=100)return Number.POSITIVE_INFINITY;if(E>=50)return E*f.value/100;const O=f.value/3;return Math.floor(Math.min(Math.max(E*f.value/100,LW),O))}),v=y(()=>{if(!Number.isFinite(g.value))return{display:"none"};const E=`${g.value}px`;return BW({bar:d.value,size:E,move:c.traveled},e.layout)}),p=y(()=>Math.ceil(e.clientSize-g.value-i(n))),m=()=>{window.addEventListener("mousemove",C),window.addEventListener("mouseup",w);const E=i(s);E&&(u=document.onselectstart,document.onselectstart=()=>!1,E.addEventListener("touchmove",C,{passive:!0}),E.addEventListener("touchend",w))},b=()=>{window.removeEventListener("mousemove",C),window.removeEventListener("mouseup",w),document.onselectstart=u,u=null;const E=i(s);E&&(E.removeEventListener("touchmove",C),E.removeEventListener("touchend",w))},k=E=>{E.stopImmediatePropagation(),!(E.ctrlKey||[1,2].includes(E.button))&&(c.isDragging=!0,c[d.value.axis]=E.currentTarget[d.value.offset]-(E[d.value.client]-E.currentTarget.getBoundingClientRect()[d.value.direction]),t("start-move"),m())},w=()=>{c.isDragging=!1,c[d.value.axis]=0,t("stop-move"),b()},C=E=>{const{isDragging:O}=c;if(!O||!s.value||!l.value)return;const $=c[d.value.axis];if(!$)return;jo(r);const N=(l.value.getBoundingClientRect()[d.value.direction]-E[d.value.client])*-1-(s.value[d.value.offset]-$);r=Fa(()=>{c.traveled=Math.max(0,Math.min(N,p.value)),t("scroll",N,p.value)})},S=E=>{const O=Math.abs(E.target.getBoundingClientRect()[d.value.direction]-E[d.value.client])-s.value[d.value.offset]/2;c.traveled=Math.max(0,Math.min(O,p.value)),t("scroll",O,p.value)};return re(()=>e.scrollFrom,E=>{c.isDragging||(c.traveled=Math.ceil(E*p.value))}),Rt(()=>{b()}),()=>Ye("div",{role:"presentation",ref:l,class:[a.b(),e.class,(e.alwaysOn||c.isDragging)&&"always-on"],style:h.value,onMousedown:qe(S,["stop","prevent"]),onTouchstartPrevent:k},Ye("div",{ref:s,class:o.e("thumb"),style:v.value,onMousedown:k},[]))}}),Rk=({name:e,getOffset:t,getItemSize:n,getItemOffset:a,getEstimatedTotalSize:o,getStartIndexForOffset:l,getStopIndexForStartIndex:s,initCache:r,clearCache:u,validateProps:c})=>le({name:e??"ElVirtualList",props:$k,emits:[Ac,_c],setup(d,{emit:f,expose:h}){c(d);const g=it(),v=fe("vl"),p=R(r(d,g)),m=Mk(),b=R(),k=R(),w=R(),C=R({isScrolling:!1,scrollDir:"forward",scrollOffset:ze(d.initScrollOffset)?d.initScrollOffset:0,updateRequested:!1,isScrollbarDragging:!1,scrollbarAlwaysOn:d.scrollbarAlwaysOn}),S=y(()=>{const{total:j,cache:X}=d,{isScrolling:Q,scrollDir:ve,scrollOffset:ue}=i(C);if(j===0)return[0,0,0,0];const ge=l(d,ue,i(p)),ie=s(d,ge,ue,i(p)),ae=!Q||ve===Lc?Math.max(1,X):1,ne=!Q||ve===Is?Math.max(1,X):1;return[Math.max(0,ge-ae),Math.max(0,Math.min(j-1,ie+ne)),ge,ie]}),E=y(()=>o(d,i(p))),O=y(()=>Ci(d.layout)),$=y(()=>[{position:"relative",[`overflow-${O.value?"x":"y"}`]:"scroll",WebkitOverflowScrolling:"touch",willChange:"transform"},{direction:d.direction,height:ze(d.height)?`${d.height}px`:d.height,width:ze(d.width)?`${d.width}px`:d.width},d.style]),N=y(()=>{const j=i(E),X=i(O);return{height:X?"100%":`${j}px`,pointerEvents:i(C).isScrolling?"none":void 0,width:X?`${j}px`:"100%",margin:0,boxSizing:"border-box"}}),I=y(()=>O.value?d.width:d.height),{onWheel:_}=Pk({atStartEdge:y(()=>C.value.scrollOffset<=0),atEndEdge:y(()=>C.value.scrollOffset>=E.value),layout:y(()=>d.layout)},j=>{w.value.onMouseUp?.(),P(Math.min(C.value.scrollOffset+j,E.value-I.value))});At(b,"wheel",_,{passive:!1});const A=()=>{const{total:j}=d;if(j>0){const[ue,ge,ie,ae]=i(S);f(Ac,ue,ge,ie,ae)}const{scrollDir:X,scrollOffset:Q,updateRequested:ve}=i(C);f(_c,X,Q,ve)},F=j=>{const{clientHeight:X,scrollHeight:Q,scrollTop:ve}=j.currentTarget,ue=i(C);if(ue.scrollOffset===ve)return;const ge=Math.max(0,Math.min(ve,Q-X));C.value={...ue,isScrolling:!0,scrollDir:jl(ue.scrollOffset,ge),scrollOffset:ge,updateRequested:!1},Oe(D)},K=j=>{const{clientWidth:X,scrollLeft:Q,scrollWidth:ve}=j.currentTarget,ue=i(C);if(ue.scrollOffset===Q)return;const{direction:ge}=d;let ie=Q;if(ge===Bs)switch(Bc()){case wi:ie=-Q;break;case Lh:ie=ve-X-Q;break}ie=Math.max(0,Math.min(ie,ve-X)),C.value={...ue,isScrolling:!0,scrollDir:jl(ue.scrollOffset,ie),scrollOffset:ie,updateRequested:!1},Oe(D)},Y=j=>{i(O)?K(j):F(j),A()},W=(j,X)=>{const Q=(E.value-I.value)/X*j;P(Math.min(E.value-I.value,Q))},P=j=>{j=Math.max(j,0),j!==i(C).scrollOffset&&(C.value={...i(C),scrollOffset:j,scrollDir:jl(i(C).scrollOffset,j),updateRequested:!0},Oe(D))},M=(j,X=Ea)=>{const{scrollOffset:Q}=i(C);j=Math.max(0,Math.min(j,d.total-1)),P(t(d,j,X,Q,i(p)))},L=j=>{const{direction:X,itemSize:Q,layout:ve}=d,ue=m.value(u&&Q,u&&ve,u&&X);let ge;if(Tt(ue,String(j)))ge=ue[j];else{const ie=a(d,j,i(p)),ae=n(d,j,i(p)),ne=i(O),z=X===Bs,J=ne?ie:0;ue[j]=ge={position:"absolute",left:z?void 0:`${J}px`,right:z?`${J}px`:void 0,top:ne?0:`${ie}px`,height:ne?"100%":`${ae}px`,width:ne?`${ae}px`:"100%"}}return ge},D=()=>{C.value.isScrolling=!1,Oe(()=>{m.value(-1,null,null)})},V=()=>{const j=b.value;j&&(j.scrollTop=0)};ct(()=>{if(!It)return;const{initScrollOffset:j}=d,X=i(b);ze(j)&&X&&(i(O)?X.scrollLeft=j:X.scrollTop=j),A()}),Ya(()=>{const{direction:j,layout:X}=d,{scrollOffset:Q,updateRequested:ve}=i(C),ue=i(b);if(ve&&ue)if(X===or)if(j===Bs)switch(Bc()){case wi:ue.scrollLeft=-Q;break;case _h:ue.scrollLeft=Q;break;default:{const{clientWidth:ge,scrollWidth:ie}=ue;ue.scrollLeft=ie-ge-Q;break}}else ue.scrollLeft=Q;else ue.scrollTop=Q}),$i(()=>{i(b).scrollTop=i(C).scrollOffset});const G={ns:v,clientSize:I,estimatedTotalSize:E,windowStyle:$,windowRef:b,innerRef:k,innerStyle:N,itemsToRender:S,scrollbarRef:w,states:C,getItemStyle:L,onScroll:Y,onScrollbarScroll:W,onWheel:_,scrollTo:P,scrollToItem:M,resetScrollTop:V};return h({windowRef:b,innerRef:k,getItemStyleCache:m,scrollTo:P,scrollToItem:M,resetScrollTop:V,states:C}),G},render(d){const{$slots:f,className:h,clientSize:g,containerElement:v,data:p,getItemStyle:m,innerElement:b,itemsToRender:k,innerStyle:w,layout:C,total:S,onScroll:E,onScrollbarScroll:O,states:$,useIsScrolling:N,windowStyle:I,ns:_}=d,[A,F]=k,K=ot(v),Y=ot(b),W=[];if(S>0)for(let D=A;D<=F;D++)W.push(Ye(Fe,{key:D},f.default?.({data:p,index:D,isScrolling:N?$.isScrolling:void 0,style:m(D)})));const P=[Ye(Y,rt(d.innerProps,{style:w,ref:"innerRef"}),_e(Y)?W:{default:()=>W})],M=Ye(Ap,{ref:"scrollbarRef",clientSize:g,layout:C,onScroll:O,ratio:g*100/this.estimatedTotalSize,scrollFrom:$.scrollOffset/(this.estimatedTotalSize-g),total:S,alwaysOn:$.scrollbarAlwaysOn}),L=Ye(K,{class:[_.e("window"),h],style:I,onScroll:E,ref:"windowRef",key:0},_e(K)?[P]:{default:()=>[P]});return Ye("div",{key:0,class:[_.e("wrapper"),$.scrollbarAlwaysOn?"always-on":""]},[L,M])}}),Ak=Rk({name:"ElFixedSizeList",getItemOffset:({itemSize:e},t)=>t*e,getItemSize:({itemSize:e})=>e,getEstimatedTotalSize:({total:e,itemSize:t})=>t*e,getOffset:({height:e,total:t,itemSize:n,layout:a,width:o},l,s,r)=>{const u=Ci(a)?o:e;_e(u)&&Gt("[ElVirtualList]",` - You should set - width/height - to number when your layout is - horizontal/vertical - `);const c=Math.max(0,t*n-u),d=Math.min(c,l*n),f=Math.max(0,(l+1)*n-u);switch(s===Md&&(r>=f-u&&r<=d+u?s=Ea:s=ro),s){case bi:return d;case yi:return f;case ro:{const h=Math.round(f+(d-f)/2);return hc+Math.floor(u/2)?c:h}case Ea:default:return r>=f&&r<=d?r:rMath.max(0,Math.min(e-1,Math.floor(n/t))),getStopIndexForStartIndex:({height:e,total:t,itemSize:n,layout:a,width:o},l,s)=>{const r=l*n,u=Ci(a)?o:e,c=Math.ceil((u+s-r)/n);return Math.max(0,Math.min(t-1,l+c-1))},initCache(){},clearCache:!0,validateProps(){}}),HW="ElDynamicSizeList",Ns=(e,t,n)=>{const{itemSize:a}=e,{items:o,lastVisitedIndex:l}=n;if(t>l){let s=0;if(l>=0){const r=o[l];s=r.offset+r.size}for(let r=l+1;r<=t;r++){const u=a(r);o[r]={offset:s,size:u},s+=u}n.lastVisitedIndex=t}return o[t]},KW=(e,t,n)=>{const{items:a,lastVisitedIndex:o}=t;return(o>0?a[o].offset:0)>=n?_k(e,t,0,o,n):WW(e,t,Math.max(0,o),n)},_k=(e,t,n,a,o)=>{for(;n<=a;){const l=n+Math.floor((a-n)/2),s=Ns(e,l,t).offset;if(s===o)return l;so&&(a=l-1)}return Math.max(0,n-1)},WW=(e,t,n,a)=>{const{total:o}=e;let l=1;for(;n{let o=0;if(a>=e&&(a=e-1),a>=0){const s=t[a];o=s.offset+s.size}const l=(e-a-1)*n;return o+l},jW=Rk({name:"ElDynamicSizeList",getItemOffset:(e,t,n)=>Ns(e,t,n).offset,getItemSize:(e,t,{items:n})=>n[t].size,getEstimatedTotalSize:wy,getOffset:(e,t,n,a,o)=>{const{height:l,layout:s,width:r}=e,u=Ci(s)?r:l,c=Ns(e,t,o),d=wy(e,o),f=Math.max(0,Math.min(d-u,c.offset)),h=Math.max(0,c.offset-u+c.size);switch(n===Md&&(a>=h-u&&a<=f+u?n=Ea:n=ro),n){case bi:return f;case yi:return h;case ro:return Math.round(h+(f-h)/2);case Ea:default:return a>=h&&a<=f?a:aKW(e,n,t),getStopIndexForStartIndex:(e,t,n,a)=>{const{height:o,total:l,layout:s,width:r}=e,u=Ci(s)?r:o,c=Ns(e,t,a),d=n+u;let f=c.offset+c.size,h=t;for(;h{n.lastVisitedIndex=Math.min(n.lastVisitedIndex,a-1),t.exposed?.getItemStyleCache(-1),o&&t.proxy?.$forceUpdate()},n},clearCache:!1,validateProps:({itemSize:e})=>{typeof e!="function"&&Gt(HW,` - itemSize is required as function, but the given value was ${typeof e} - `)}}),YW=({atXEndEdge:e,atXStartEdge:t,atYEndEdge:n,atYStartEdge:a},o)=>{let l=null,s=0,r=0;const u=(d,f)=>{const h=d<0&&t.value||d>0&&e.value,g=f<0&&a.value||f>0&&n.value;return h||g};return{hasReachedEdge:u,onWheel:d=>{jo(l);let f=d.deltaX,h=d.deltaY;if(Math.abs(f)>Math.abs(h)?h=0:f=0,d.shiftKey&&h!==0&&(f=h,h=0),u(f,h)){d.deltaX!==0&&f===0&&d.preventDefault();return}s+=f,r+=h,d.preventDefault(),l=Fa(()=>{o(s,r),s=0,r=0})}}},UW=(e,t,n,a,o,l,s)=>{const r=R(0),u=R(0);let c,d=0,f=0;const h=v=>{jo(c),r.value=v.touches[0].clientX,u.value=v.touches[0].clientY,d=0,f=0},g=v=>{v.preventDefault(),jo(c),d+=r.value-v.touches[0].clientX,f+=u.value-v.touches[0].clientY,r.value=v.touches[0].clientX,u.value=v.touches[0].clientY,c=Fa(()=>{const p=a.value-i(l),m=o.value-i(s);n({scrollLeft:Math.min(t.value.scrollLeft+d,p),scrollTop:Math.min(t.value.scrollTop+f,m)}),d=0,f=0})};return At(e,"touchstart",h,{passive:!0}),At(e,"touchmove",g,{passive:!1}),{touchStartX:r,touchStartY:u,handleTouchStart:h,handleTouchMove:g}},Lk=({name:e,clearCache:t,getColumnPosition:n,getColumnStartIndexForOffset:a,getColumnStopIndexForStartIndex:o,getEstimatedTotalHeight:l,getEstimatedTotalWidth:s,getColumnOffset:r,getRowOffset:u,getRowPosition:c,getRowStartIndexForOffset:d,getRowStopIndexForStartIndex:f,initCache:h,injectToInstance:g,validateProps:v})=>le({name:e??"ElVirtualList",props:Zl,emits:[Ac,_c],setup(p,{emit:m,expose:b,slots:k}){const w=fe("vl");v(p);const C=it(),S=R(h(p,C));g?.(C,S);const E=R(),O=R(),$=R(),N=R(),I=R({isScrolling:!1,scrollLeft:ze(p.initScrollLeft)?p.initScrollLeft:0,scrollTop:ze(p.initScrollTop)?p.initScrollTop:0,updateRequested:!1,xAxisScrollDir:Is,yAxisScrollDir:Is}),_=Mk(),A=y(()=>Number.parseInt(`${p.height}`,10)),F=y(()=>Number.parseInt(`${p.width}`,10)),K=y(()=>{const{totalColumn:pe,totalRow:Ee,columnCache:me}=p,{isScrolling:Pe,xAxisScrollDir:Ke,scrollLeft:Ge}=i(I);if(pe===0||Ee===0)return[0,0,0,0];const Me=a(p,Ge,i(S)),Ae=o(p,Me,Ge,i(S)),We=!Pe||Ke===Lc?Math.max(1,me):1,xt=!Pe||Ke===Is?Math.max(1,me):1;return[Math.max(0,Me-We),Math.max(0,Math.min(pe-1,Ae+xt)),Me,Ae]}),Y=y(()=>{const{totalColumn:pe,totalRow:Ee,rowCache:me}=p,{isScrolling:Pe,yAxisScrollDir:Ke,scrollTop:Ge}=i(I);if(pe===0||Ee===0)return[0,0,0,0];const Me=d(p,Ge,i(S)),Ae=f(p,Me,Ge,i(S)),We=!Pe||Ke===Lc?Math.max(1,me):1,xt=!Pe||Ke===Is?Math.max(1,me):1;return[Math.max(0,Me-We),Math.max(0,Math.min(Ee-1,Ae+xt)),Me,Ae]}),W=y(()=>l(p,i(S))),P=y(()=>s(p,i(S))),M=y(()=>[{position:"relative",overflow:"hidden",WebkitOverflowScrolling:"touch",willChange:"transform"},{direction:p.direction,height:ze(p.height)?`${p.height}px`:p.height,width:ze(p.width)?`${p.width}px`:p.width},p.style??{}]),L=y(()=>{const pe=`${i(P)}px`;return{height:`${i(W)}px`,pointerEvents:i(I).isScrolling?"none":void 0,width:pe,margin:0,boxSizing:"border-box"}}),D=()=>{const{totalColumn:pe,totalRow:Ee}=p;if(pe>0&&Ee>0){const[Ae,We,xt,je]=i(K),[at,ft,yt,be]=i(Y);m(Ac,{columnCacheStart:Ae,columnCacheEnd:We,rowCacheStart:at,rowCacheEnd:ft,columnVisibleStart:xt,columnVisibleEnd:je,rowVisibleStart:yt,rowVisibleEnd:be})}const{scrollLeft:me,scrollTop:Pe,updateRequested:Ke,xAxisScrollDir:Ge,yAxisScrollDir:Me}=i(I);m(_c,{xAxisScrollDir:Ge,scrollLeft:me,yAxisScrollDir:Me,scrollTop:Pe,updateRequested:Ke})},V=pe=>{const{clientHeight:Ee,clientWidth:me,scrollHeight:Pe,scrollLeft:Ke,scrollTop:Ge,scrollWidth:Me}=pe.currentTarget,Ae=i(I);if(Ae.scrollTop===Ge&&Ae.scrollLeft===Ke)return;let We=Ke;if(by(p.direction))switch(Bc()){case wi:We=-Ke;break;case Lh:We=Me-me-Ke;break}I.value={...Ae,isScrolling:!0,scrollLeft:We,scrollTop:Math.max(0,Math.min(Ge,Pe-Ee)),updateRequested:!0,xAxisScrollDir:jl(Ae.scrollLeft,We),yAxisScrollDir:jl(Ae.scrollTop,Ge)},Oe(()=>z()),J(),D()},G=(pe,Ee)=>{const me=i(A),Pe=(W.value-me)/Ee*pe;Q({scrollTop:Math.min(W.value-me,Pe)})},j=(pe,Ee)=>{const me=i(F),Pe=(P.value-me)/Ee*pe;Q({scrollLeft:Math.min(P.value-me,Pe)})},{onWheel:X}=YW({atXStartEdge:y(()=>I.value.scrollLeft<=0),atXEndEdge:y(()=>I.value.scrollLeft>=P.value-i(F)),atYStartEdge:y(()=>I.value.scrollTop<=0),atYEndEdge:y(()=>I.value.scrollTop>=W.value-i(A))},(pe,Ee)=>{O.value?.onMouseUp?.(),$.value?.onMouseUp?.();const me=i(F),Pe=i(A);Q({scrollLeft:Math.min(I.value.scrollLeft+pe,P.value-me),scrollTop:Math.min(I.value.scrollTop+Ee,W.value-Pe)})});At(E,"wheel",X,{passive:!1});const Q=({scrollLeft:pe=I.value.scrollLeft,scrollTop:Ee=I.value.scrollTop})=>{pe=Math.max(pe,0),Ee=Math.max(Ee,0);const me=i(I);Ee===me.scrollTop&&pe===me.scrollLeft||(I.value={...me,xAxisScrollDir:jl(me.scrollLeft,pe),yAxisScrollDir:jl(me.scrollTop,Ee),scrollLeft:pe,scrollTop:Ee,updateRequested:!0},Oe(()=>z()),J(),D())},{touchStartX:ve,touchStartY:ue,handleTouchStart:ge,handleTouchMove:ie}=UW(E,I,Q,P,W,F,A),ae=(pe=0,Ee=0,me=Ea)=>{const Pe=i(I);Ee=Math.max(0,Math.min(Ee,p.totalColumn-1)),pe=Math.max(0,Math.min(pe,p.totalRow-1));const Ke=A1(w.namespace.value),Ge=i(S),Me=l(p,Ge),Ae=s(p,Ge);Q({scrollLeft:r(p,Ee,me,Pe.scrollLeft,Ge,Ae>p.width?Ke:0),scrollTop:u(p,pe,me,Pe.scrollTop,Ge,Me>p.height?Ke:0)})},ne=(pe,Ee)=>{const{columnWidth:me,direction:Pe,rowHeight:Ke}=p,Ge=_.value(t&&me,t&&Ke,t&&Pe),Me=`${pe},${Ee}`;if(Tt(Ge,Me))return Ge[Me];{const[,Ae]=n(p,Ee,i(S)),We=i(S),xt=by(Pe),[je,at]=c(p,pe,We),[ft]=n(p,Ee,We);return Ge[Me]={position:"absolute",left:xt?void 0:`${Ae}px`,right:xt?`${Ae}px`:void 0,top:`${at}px`,height:`${je}px`,width:`${ft}px`},Ge[Me]}},z=()=>{I.value.isScrolling=!1,Oe(()=>{_.value(-1,null,null)})};ct(()=>{if(!It)return;const{initScrollLeft:pe,initScrollTop:Ee}=p,me=i(E);me&&(ze(pe)&&(me.scrollLeft=pe),ze(Ee)&&(me.scrollTop=Ee)),D()});const J=()=>{const{direction:pe}=p,{scrollLeft:Ee,scrollTop:me,updateRequested:Pe}=i(I),Ke=i(E);if(Pe&&Ke){if(pe===Bs)switch(Bc()){case wi:Ke.scrollLeft=-Ee;break;case _h:Ke.scrollLeft=Ee;break;default:{const{clientWidth:Ge,scrollWidth:Me}=Ke;Ke.scrollLeft=Me-Ge-Ee;break}}else Ke.scrollLeft=Math.max(0,Ee);Ke.scrollTop=Math.max(0,me)}},{resetAfterColumnIndex:se,resetAfterRowIndex:ce,resetAfter:he}=C.proxy;b({windowRef:E,innerRef:N,getItemStyleCache:_,touchStartX:ve,touchStartY:ue,handleTouchStart:ge,handleTouchMove:ie,scrollTo:Q,scrollToItem:ae,states:I,resetAfterColumnIndex:se,resetAfterRowIndex:ce,resetAfter:he});const Se=()=>{const{scrollbarAlwaysOn:pe,scrollbarStartGap:Ee,scrollbarEndGap:me,totalColumn:Pe,totalRow:Ke}=p,Ge=i(F),Me=i(A),Ae=i(P),We=i(W),{scrollLeft:xt,scrollTop:je}=i(I);return{horizontalScrollbar:Ye(Ap,{ref:O,alwaysOn:pe,startGap:Ee,endGap:me,class:w.e("horizontal"),clientSize:Ge,layout:"horizontal",onScroll:j,ratio:Ge*100/Ae,scrollFrom:xt/(Ae-Ge),total:Ke,visible:!0}),verticalScrollbar:Ye(Ap,{ref:$,alwaysOn:pe,startGap:Ee,endGap:me,class:w.e("vertical"),clientSize:Me,layout:"vertical",onScroll:G,ratio:Me*100/We,scrollFrom:je/(We-Me),total:Pe,visible:!0})}},Ie=()=>{const[pe,Ee]=i(K),[me,Pe]=i(Y),{data:Ke,totalColumn:Ge,totalRow:Me,useIsScrolling:Ae,itemKey:We}=p,xt=[];if(Me>0&&Ge>0)for(let je=me;je<=Pe;je++)for(let at=pe;at<=Ee;at++){const ft=We({columnIndex:at,data:Ke,rowIndex:je});xt.push(Ye(Fe,{key:ft},k.default?.({columnIndex:at,data:Ke,isScrolling:Ae?i(I).isScrolling:void 0,style:ne(je,at),rowIndex:je})))}return xt},Ne=()=>{const pe=ot(p.innerElement),Ee=Ie();return[Ye(pe,rt(p.innerProps,{style:i(L),ref:N}),_e(pe)?Ee:{default:()=>Ee})]};return()=>{const pe=ot(p.containerElement),{horizontalScrollbar:Ee,verticalScrollbar:me}=Se(),Pe=Ne();return Ye("div",{key:0,class:w.e("wrapper"),role:p.role},[Ye(pe,{class:p.className,style:i(M),onScroll:V,ref:E},_e(pe)?Pe:{default:()=>Pe}),Ee,me])}}}),Cy="ElFixedSizeGrid",qW=Lk({name:"ElFixedSizeGrid",getColumnPosition:({columnWidth:e},t)=>[e,t*e],getRowPosition:({rowHeight:e},t)=>[e,t*e],getEstimatedTotalHeight:({totalRow:e,rowHeight:t})=>t*e,getEstimatedTotalWidth:({totalColumn:e,columnWidth:t})=>t*e,getColumnOffset:({totalColumn:e,columnWidth:t,width:n},a,o,l,s,r)=>{n=Number(n);const u=Math.max(0,e*t-n),c=Math.min(u,a*t),d=Math.max(0,a*t-n+r+t);switch(o==="smart"&&(l>=d-n&&l<=c+n?o=Ea:o=ro),o){case bi:return c;case yi:return d;case ro:{const f=Math.round(d+(c-d)/2);return fu+Math.floor(n/2)?u:f}case Ea:default:return l>=d&&l<=c?l:d>c||l{t=Number(t);const u=Math.max(0,n*e-t),c=Math.min(u,a*e),d=Math.max(0,a*e-t+r+e);switch(o===Md&&(l>=d-t&&l<=c+t?o=Ea:o=ro),o){case bi:return c;case yi:return d;case ro:{const f=Math.round(d+(c-d)/2);return fu+Math.floor(t/2)?u:f}case Ea:default:return l>=d&&l<=c?l:d>c||lMath.max(0,Math.min(t-1,Math.floor(n/e))),getColumnStopIndexForStartIndex:({columnWidth:e,totalColumn:t,width:n},a,o)=>{const l=a*e,s=Math.ceil((n+o-l)/e);return Math.max(0,Math.min(t-1,a+s-1))},getRowStartIndexForOffset:({rowHeight:e,totalRow:t},n)=>Math.max(0,Math.min(t-1,Math.floor(n/e))),getRowStopIndexForStartIndex:({rowHeight:e,totalRow:t,height:n},a,o)=>{const l=a*e,s=Math.ceil((n+o-l)/e);return Math.max(0,Math.min(t-1,a+s-1))},initCache:()=>{},clearCache:!0,validateProps:({columnWidth:e,rowHeight:t})=>{ze(e)||Gt(Cy,` - "columnWidth" must be passed as number, - instead ${typeof e} was given. - `),ze(t)||Gt(Cy,` - "columnWidth" must be passed as number, - instead ${typeof t} was given. - `)}}),{max:Vc,min:Dk,floor:Bk}=Math,Sy="ElDynamicSizeGrid",GW={column:"columnWidth",row:"rowHeight"},_p={column:"lastVisitedColumnIndex",row:"lastVisitedRowIndex"},No=(e,t,n,a)=>{const[o,l,s]=[n[a],e[GW[a]],n[_p[a]]];if(t>s){let r=0;if(s>=0){const u=o[s];r=u.offset+u.size}for(let u=s+1;u<=t;u++){const c=l(u);o[u]={offset:r,size:c},r+=c}n[_p[a]]=t}return o[t]},Vk=(e,t,n,a,o,l)=>{for(;n<=a;){const s=n+Bk((a-n)/2),r=No(e,s,t,l).offset;if(r===o)return s;r{const l=o==="column"?e.totalColumn:e.totalRow;let s=1;for(;n{const[o,l]=[t[a],t[_p[a]]];return(l>0?o[l].offset:0)>=n?Vk(e,t,0,l,n,a):XW(e,t,Vc(0,l),n,a)},Fk=({totalRow:e},{estimatedRowHeight:t,lastVisitedRowIndex:n,row:a})=>{let o=0;if(n>=e&&(n=e-1),n>=0){const s=a[n];o=s.offset+s.size}const l=(e-n-1)*t;return o+l},zk=({totalColumn:e},{column:t,estimatedColumnWidth:n,lastVisitedColumnIndex:a})=>{let o=0;if(a>e&&(a=e-1),a>=0){const s=t[a];o=s.offset+s.size}const l=(e-a-1)*n;return o+l},ZW={column:zk,row:Fk},Ey=(e,t,n,a,o,l,s)=>{const[r,u]=[l==="row"?e.height:e.width,ZW[l]],c=No(e,t,o,l),d=Vc(0,Dk(u(e,o)-r,c.offset)),f=Vc(0,c.offset-r+s+c.size);switch(n===Md&&(a>=f-r&&a<=d+r?n=Ea:n=ro),n){case bi:return d;case yi:return f;case ro:return Math.round(f+(d-f)/2);case Ea:default:return a>=f&&a<=d?a:f>d||a{const a=No(e,t,n,"column");return[a.size,a.offset]},getRowPosition:(e,t,n)=>{const a=No(e,t,n,"row");return[a.size,a.offset]},getColumnOffset:(e,t,n,a,o,l)=>Ey(e,t,n,a,o,"column",l),getRowOffset:(e,t,n,a,o,l)=>Ey(e,t,n,a,o,"row",l),getColumnStartIndexForOffset:(e,t,n)=>ky(e,n,t,"column"),getColumnStopIndexForStartIndex:(e,t,n,a)=>{const o=No(e,t,a,"column"),l=n+e.width;let s=o.offset+o.size,r=t;for(;rky(e,n,t,"row"),getRowStopIndexForStartIndex:(e,t,n,a)=>{const{totalRow:o,height:l}=e,s=No(e,t,a,"row"),r=n+l;let u=s.size+s.offset,c=t;for(;c{const n=({columnIndex:l,rowIndex:s},r)=>{r=St(r)?!0:r,ze(l)&&(t.value.lastVisitedColumnIndex=Math.min(t.value.lastVisitedColumnIndex,l-1)),ze(s)&&(t.value.lastVisitedRowIndex=Math.min(t.value.lastVisitedRowIndex,s-1)),e.exposed?.getItemStyleCache.value(-1,null,null),r&&e.proxy?.$forceUpdate()},a=(l,s)=>{n({columnIndex:l},s)},o=(l,s)=>{n({rowIndex:l},s)};Object.assign(e.proxy,{resetAfterColumnIndex:a,resetAfterRowIndex:o,resetAfter:n})},initCache:({estimatedColumnWidth:e=Op,estimatedRowHeight:t=Op})=>({column:{},estimatedColumnWidth:e,estimatedRowHeight:t,lastVisitedColumnIndex:-1,lastVisitedRowIndex:-1,row:{}}),clearCache:!1,validateProps:({columnWidth:e,rowHeight:t})=>{Be(e)||Gt(Sy,` - "columnWidth" must be passed as function, - instead ${typeof e} was given. - `),Be(t)||Gt(Sy,` - "rowHeight" must be passed as function, - instead ${typeof t} was given. - `)}}),Dh=Symbol("ElSelectV2Injection"),QW=Ce({allowCreate:Boolean,autocomplete:{type:q(String),default:"none"},automaticDropdown:Boolean,clearable:Boolean,clearIcon:{type:Bt,default:xo},effect:{type:q(String),default:"light"},collapseTags:Boolean,collapseTagsTooltip:Boolean,tagTooltip:{type:q(Object),default:()=>({})},maxCollapseTags:{type:Number,default:1},defaultFirstOption:Boolean,disabled:{type:Boolean,default:void 0},estimatedOptionHeight:{type:Number,default:void 0},filterable:Boolean,filterMethod:{type:q(Function)},height:{type:Number,default:274},itemHeight:{type:Number,default:34},id:String,loading:Boolean,loadingText:String,modelValue:{type:q([Array,String,Number,Boolean,Object]),default:void 0},multiple:Boolean,multipleLimit:{type:Number,default:0},name:String,noDataText:String,noMatchText:String,remoteMethod:{type:q(Function)},reserveKeyword:{type:Boolean,default:!0},options:{type:q(Array),required:!0},placeholder:{type:String},teleported:Lt.teleported,persistent:{type:Boolean,default:!0},popperClass:Lt.popperClass,popperStyle:Lt.popperStyle,popperOptions:{type:q(Object),default:()=>({})},remote:Boolean,debounce:{type:Number,default:300},size:bn,props:{type:q(Object),default:()=>$c},valueKey:{type:String,default:"value"},scrollbarAlwaysOn:Boolean,validateEvent:{type:Boolean,default:!0},offset:{type:Number,default:12},remoteShowSuffix:Boolean,showArrow:{type:Boolean,default:!0},placement:{type:q(String),values:So,default:"bottom-start"},fallbackPlacements:{type:q(Array),default:["bottom-start","top-start","right","left"]},tagType:{...qo.type,default:"info"},tagEffect:{...qo.effect,default:"light"},tabindex:{type:[String,Number],default:0},appendTo:Lt.appendTo,fitInputWidth:{type:[Boolean,Number],default:!0,validator(e){return Dt(e)||ze(e)}},suffixIcon:{type:Bt,default:Eo},...ps,...Un(["ariaLabel"])}),e9=Ce({data:Array,disabled:Boolean,hovering:Boolean,item:{type:q(Object),required:!0},index:Number,style:Object,selected:Boolean,created:Boolean}),t9={[Qe]:e=>!0,[vt]:e=>!0,"remove-tag":e=>!0,"visible-change":e=>!0,focus:e=>e instanceof FocusEvent,blur:e=>e instanceof FocusEvent,clear:()=>!0},n9={hover:e=>ze(e),select:(e,t)=>!0};var a9=le({props:{item:{type:Object,required:!0},style:{type:Object},height:Number},setup(){return{ns:fe("select")}}});function o9(e,t,n,a,o,l){return x(),B("div",{class:T(e.ns.be("group","title")),style:He({...e.style,lineHeight:`${e.height}px`})},ke(e.item.label),7)}var l9=yn(a9,[["render",o9]]);function s9(e,{emit:t}){return{hoverItem:()=>{e.disabled||t("hover",e.index)},selectOptionClick:()=>{e.disabled||t("select",e.item,e.index)}}}var r9=le({props:e9,emits:n9,setup(e,{emit:t}){const n=Re(Dh),a=fe("select"),{hoverItem:o,selectOptionClick:l}=s9(e,{emit:t}),{getLabel:s}=Zi(n.props);return{ns:a,contentId:n.contentId,hoverItem:o,selectOptionClick:l,getLabel:s}}});const i9=["id","aria-selected","aria-disabled"];function u9(e,t,n,a,o,l){return x(),B("li",{id:`${e.contentId}-${e.index}`,role:"option","aria-selected":e.selected,"aria-disabled":e.disabled||void 0,style:He(e.style),class:T([e.ns.be("dropdown","item"),e.ns.is("selected",e.selected),e.ns.is("disabled",e.disabled),e.ns.is("created",e.created),e.ns.is("hovering",e.hovering)]),onMousemove:t[0]||(t[0]=(...s)=>e.hoverItem&&e.hoverItem(...s)),onClick:t[1]||(t[1]=qe((...s)=>e.selectOptionClick&&e.selectOptionClick(...s),["stop"]))},[ee(e.$slots,"default",{item:e.item,index:e.index,disabled:e.disabled},()=>[H("span",null,ke(e.getLabel(e.item)),1)])],46,i9)}var c9=yn(r9,[["render",u9]]);const d9={loading:Boolean,data:{type:Array,required:!0},hoveringIndex:Number,width:Number,id:String,ariaLabel:String};var f9=le({name:"ElSelectDropdown",props:d9,setup(e,{slots:t,expose:n}){const a=Re(Dh),o=fe("select"),{getLabel:l,getValue:s,getDisabled:r}=Zi(a.props),u=R([]),c=R(),d=y(()=>e.data.length);re(()=>d.value,()=>{a.tooltipRef.value?.updatePopper?.()});const f=y(()=>St(a.props.estimatedOptionHeight)),h=y(()=>f.value?{itemSize:a.props.itemHeight}:{estimatedSize:a.props.estimatedOptionHeight,itemSize:I=>u.value[I]}),g=(I=[],_)=>{const{props:{valueKey:A}}=a;return et(_)?I&&I.some(F=>Ht(fn(F,A))===fn(_,A)):I.includes(_)},v=(I,_)=>{if(et(_)){const{valueKey:A}=a.props;return fn(I,A)===fn(_,A)}else return I===_},p=(I,_)=>a.props.multiple?g(I,s(_)):v(I,s(_)),m=(I,_)=>{const{disabled:A,multiple:F,multipleLimit:K}=a.props;return A||!_&&(F?K>0&&I.length>=K:!1)},b=I=>e.hoveringIndex===I;n({listRef:c,isSized:f,isItemDisabled:m,isItemHovering:b,isItemSelected:p,scrollToItem:I=>{const _=c.value;_&&_.scrollToItem(I)},resetScrollTop:()=>{const I=c.value;I&&I.resetScrollTop()}});const C=I=>{const{index:_,data:A,style:F}=I,K=i(f),{itemSize:Y,estimatedSize:W}=i(h),{modelValue:P}=a.props,{onSelect:M,onHover:L}=a,D=A[_];if(D.type==="Group")return U(l9,{item:D,style:F,height:K?Y:W},null);const V=p(P,D),G=m(P,V),j=b(_);return U(c9,rt(I,{selected:V,disabled:r(D)||G,created:!!D.created,hovering:j,item:D,onSelect:M,onHover:L}),{default:X=>t.default?.(X)||U("span",null,[l(D)])})},{onKeyboardNavigate:S,onKeyboardSelect:E}=a,O=()=>{S("forward")},$=()=>{S("backward")},N=I=>{const _=Ft(I),{tab:A,esc:F,down:K,up:Y,enter:W,numpadEnter:P}=we;switch([F,K,Y,W,P].includes(_)&&(I.preventDefault(),I.stopPropagation()),_){case A:case F:break;case K:O();break;case Y:$();break;case W:case P:E();break}};return()=>{const{data:I,width:_}=e,{height:A,multiple:F,scrollbarAlwaysOn:K}=a.props,Y=y(()=>yc?!0:K),W=i(f)?Ak:jW;return U("div",{class:[o.b("dropdown"),o.is("multiple",F)],style:{width:`${_}px`}},[t.header?.(),t.loading?.()||t.empty?.()||U(W,rt({ref:c},i(h),{className:o.be("dropdown","list"),scrollbarAlwaysOn:Y.value,data:I,height:A,width:_,total:I.length,innerElement:"ul",innerProps:{id:e.id,role:"listbox","aria-label":e.ariaLabel,"aria-orientation":"vertical"},onKeydown:N}),{default:P=>U(C,P,null)}),t.footer?.()])}}});function p9(e,t){const{aliasProps:n,getLabel:a,getValue:o}=Zi(e),l=R(0),s=R(),r=y(()=>e.allowCreate&&e.filterable);re(()=>e.options,g=>{const v=new Set(g.map(p=>a(p)));t.createdOptions=t.createdOptions.filter(p=>!v.has(a(p)))});function u(g){const v=p=>a(p)===g;return e.options&&e.options.some(v)||t.createdOptions.some(v)}function c(g){r.value&&(e.multiple&&g.created?l.value++:s.value=g)}function d(g){if(r.value)if(g&&g.length>0){if(u(g)){t.createdOptions=t.createdOptions.filter(p=>a(p)!==t.previousQuery);return}const v={[n.value.value]:g,[n.value.label]:g,created:!0,[n.value.disabled]:!1};t.createdOptions.length>=l.value?t.createdOptions[l.value]=v:t.createdOptions.push(v)}else if(e.multiple)t.createdOptions.length=l.value;else{const v=s.value;t.createdOptions.length=0,v&&v.created&&t.createdOptions.push(v)}}function f(g){if(!r.value||!g||!g.created||g.created&&e.reserveKeyword&&t.inputValue===a(g))return;const v=t.createdOptions.findIndex(p=>o(p)===o(g));~v&&(t.createdOptions.splice(v,1),l.value--)}function h(){r.value&&(t.createdOptions.length=0,l.value=0)}return{createNewOption:d,removeNewOption:f,selectNewOption:c,clearAllNewOption:h}}const v9=(e,t)=>{const{t:n}=bt(),a=sn(),o=fe("select"),l=fe("input"),{form:s,formItem:r}=On(),{inputId:u}=ya(e,{formItemContext:r}),{aliasProps:c,getLabel:d,getValue:f,getDisabled:h,getOptions:g}=Zi(e),{valueOnClear:v,isEmptyValue:p}=Yi(e),m=Nt({inputValue:"",cachedOptions:[],createdOptions:[],hoveringIndex:-1,inputHovering:!1,selectionWidth:0,collapseItemWidth:0,previousQuery:null,previousValue:void 0,selectedLabel:"",menuVisibleOnFocus:!1,isBeforeHide:!1}),b=R(-1),k=R(!1),w=R(),C=R(),S=R(),E=R(),O=R(),$=R(),N=R(),I=R(),_=R(),A=R(),{isComposing:F,handleCompositionStart:K,handleCompositionEnd:Y,handleCompositionUpdate:W}=ji({afterComposition:$e=>Kt($e)}),P=tn(),{wrapperRef:M,isFocused:L,handleBlur:D}=tl(O,{disabled:P,afterFocus(){e.automaticDropdown&&!X.value&&(X.value=!0,m.menuVisibleOnFocus=!0)},beforeBlur($e){return S.value?.isFocusInsideContent($e)||E.value?.isFocusInsideContent($e)},afterBlur(){X.value=!1,m.menuVisibleOnFocus=!1,e.validateEvent&&r?.validate?.("blur").catch($e=>ut($e))}}),V=y(()=>Ie("")),G=y(()=>e.loading?!1:e.options.length>0||m.createdOptions.length>0),j=R([]),X=R(!1),Q=y(()=>s?.statusIcon??!1),ve=y(()=>{const $e=j.value.length*e.itemHeight;return $e>e.height?e.height:$e}),ue=y(()=>e.multiple?ye(e.modelValue)&&e.modelValue.length>0:!p(e.modelValue)),ge=y(()=>e.clearable&&!P.value&&ue.value&&(L.value||m.inputHovering)),ie=y(()=>e.remote&&e.filterable&&!e.remoteShowSuffix?"":e.suffixIcon),ae=y(()=>ie.value&&o.is("reverse",X.value)),ne=y(()=>r?.validateState||""),z=y(()=>{if(ne.value)return Ed[ne.value]}),J=y(()=>e.remote?e.debounce:0),se=y(()=>e.remote&&!m.inputValue&&!G.value),ce=y(()=>e.loading?e.loadingText||n("el.select.loading"):e.filterable&&m.inputValue&&G.value&&j.value.length===0?e.noMatchText||n("el.select.noMatch"):G.value?null:e.noDataText||n("el.select.noData")),he=y(()=>e.filterable&&Be(e.filterMethod)),Se=y(()=>e.filterable&&e.remote&&Be(e.remoteMethod)),Ie=$e=>{const Et=new RegExp(Vv($e),"i"),wt=Ct=>he.value||Se.value?!0:$e?Et.test(d(Ct)||""):!0;return e.loading?[]:[...m.createdOptions,...e.options].reduce((Ct,In)=>{const ua=g(In);if(ye(ua)){const ou=ua.filter(wt);ou.length>0&&Ct.push({label:d(In),type:"Group"},...ou)}else(e.remote||wt(In))&&Ct.push(In);return Ct},[])},Ne=()=>{j.value=Ie(m.inputValue)},Te=y(()=>{const $e=new Map;return V.value.forEach((Et,wt)=>{$e.set(Ze(f(Et)),{option:Et,index:wt})}),$e}),pe=y(()=>{const $e=new Map;return j.value.forEach((Et,wt)=>{$e.set(Ze(f(Et)),{option:Et,index:wt})}),$e}),Ee=y(()=>j.value.every($e=>h($e))),me=vn(),Pe=y(()=>me.value==="small"?"small":"default"),Ke=()=>{if(ze(e.fitInputWidth)){b.value=e.fitInputWidth;return}const $e=w.value?.offsetWidth||200;!e.fitInputWidth&&G.value?Oe(()=>{b.value=Math.max($e,Ge())}):b.value=$e},Ge=()=>{const $e=document.createElement("canvas").getContext("2d"),Et=o.be("dropdown","item"),wt=(I.value?.listRef?.innerRef||document).querySelector(`.${Et}`);if(wt===null||$e===null)return 0;const Ct=getComputedStyle(wt),In=Number.parseFloat(Ct.paddingLeft)+Number.parseFloat(Ct.paddingRight);return $e.font=`bold ${Ct.font.replace(new RegExp(`\\b${Ct.fontWeight}\\b`),"")}`,j.value.reduce((ua,ou)=>{const G2=$e.measureText(d(ou));return Math.max(G2.width,ua)},0)+In},Me=()=>{if(!C.value)return 0;const $e=window.getComputedStyle(C.value);return Number.parseFloat($e.gap||"6px")},Ae=y(()=>{const $e=Me(),Et=e.filterable?$e+ad:0;return{maxWidth:`${A.value&&e.maxCollapseTags===1?m.selectionWidth-m.collapseItemWidth-$e-Et:m.selectionWidth-Et}px`}}),We=y(()=>({maxWidth:`${m.selectionWidth}px`})),xt=y(()=>ye(e.modelValue)?e.modelValue.length===0&&!m.inputValue:e.filterable?!m.inputValue:!0),je=y(()=>{const $e=e.placeholder??n("el.select.placeholder");return e.multiple||!ue.value?$e:m.selectedLabel}),at=y(()=>S.value?.popperRef?.contentRef),ft=y(()=>{if(e.multiple){const $e=e.modelValue.length;if($e>0&&pe.value.has(e.modelValue[$e-1])){const{index:Et}=pe.value.get(e.modelValue[$e-1]);return Et}}else if(!p(e.modelValue)&&pe.value.has(e.modelValue)){const{index:$e}=pe.value.get(e.modelValue);return $e}return-1}),yt=y({get(){return X.value&&(e.loading||!se.value||e.remote&&!!a.empty)&&(!k.value||!Jn(m.previousQuery))},set($e){X.value=$e}}),be=y(()=>e.multiple?e.collapseTags?m.cachedOptions.slice(0,e.maxCollapseTags):m.cachedOptions:[]),Ve=y(()=>e.multiple?e.collapseTags?m.cachedOptions.slice(e.maxCollapseTags):[]:[]),{createNewOption:de,removeNewOption:Ue,selectNewOption:kt,clearAllNewOption:qt}=p9(e,m),xn=$e=>{P.value||e.filterable&&X.value&&$e&&!N.value?.contains($e.target)||(m.menuVisibleOnFocus?m.menuVisibleOnFocus=!1:X.value=!X.value)},De=()=>{m.inputValue.length>0&&!X.value&&(X.value=!0),de(m.inputValue),Oe(()=>{lt(m.inputValue)})},Je=Li(()=>{De(),k.value=!1},J),lt=$e=>{m.previousQuery===$e||F.value||(m.previousQuery=$e,e.filterable&&Be(e.filterMethod)?e.filterMethod($e):e.filterable&&e.remote&&Be(e.remoteMethod)&&e.remoteMethod($e),e.defaultFirstOption&&(e.filterable||e.remote)&&j.value.length?Oe(hn):Oe(Mt))},hn=()=>{const $e=j.value.filter(Ct=>!Ct.disabled&&Ct.type!=="Group"),Et=$e.find(Ct=>Ct.created),wt=$e[0];m.hoveringIndex=Xe(j.value,Et||wt)},Vt=$e=>{Jt(e.modelValue,$e)||t(vt,$e)},dn=$e=>{t(Qe,$e),Vt($e),m.previousValue=e.multiple?String($e):$e,Oe(()=>{if(e.multiple&&ye(e.modelValue)){const Et=m.cachedOptions.slice(),wt=e.modelValue.map(Ct=>im(Ct,Et));Jt(m.cachedOptions,wt)||(m.cachedOptions=wt)}else au(!0)})},Xe=($e=[],Et)=>{if(!et(Et))return $e.indexOf(Et);const wt=e.valueKey;let Ct=-1;return $e.some((In,ua)=>fn(In,wt)===fn(Et,wt)?(Ct=ua,!0):!1),Ct},Ze=$e=>et($e)?fn($e,e.valueKey):$e,pt=()=>{Ke()},qn=()=>{m.selectionWidth=Number.parseFloat(window.getComputedStyle(C.value).width)},Ja=()=>{m.collapseItemWidth=A.value.getBoundingClientRect().width},Na=()=>{S.value?.updatePopper?.()},tu=()=>{E.value?.updatePopper?.()},Il=$e=>{const Et=f($e);if(e.multiple){let wt=e.modelValue.slice();const Ct=Xe(wt,Et);Ct>-1?(wt=[...wt.slice(0,Ct),...wt.slice(Ct+1)],m.cachedOptions.splice(Ct,1),Ue($e)):(e.multipleLimit<=0||wt.length{let wt=e.modelValue.slice();const Ct=Xe(wt,f(Et));Ct>-1&&!P.value&&(wt=[...e.modelValue.slice(0,Ct),...e.modelValue.slice(Ct+1)],m.cachedOptions.splice(Ct,1),dn(wt),t("remove-tag",f(Et)),Ue(Et)),$e.stopPropagation(),To()},To=()=>{O.value?.focus()},Ad=()=>{if(X.value){X.value=!1,Oe(()=>O.value?.blur());return}O.value?.blur()},_d=()=>{m.inputValue.length>0?m.inputValue="":X.value=!1},Ld=$e=>f1($e,Et=>!m.cachedOptions.some(wt=>f(wt)===Et&&h(wt))),Dd=$e=>{const Et=Ft($e);if(e.multiple&&Et!==we.delete&&m.inputValue.length===0){$e.preventDefault();const wt=e.modelValue.slice(),Ct=Ld(wt);if(Ct<0)return;const In=wt[Ct];wt.splice(Ct,1);const ua=m.cachedOptions[Ct];m.cachedOptions.splice(Ct,1),Ue(ua),dn(wt),t("remove-tag",In)}},Bd=()=>{let $e;ye(e.modelValue)?$e=[]:$e=v.value,m.selectedLabel="",X.value=!1,dn($e),t("clear"),qt(),To()},hs=($e,Et=void 0)=>{const wt=j.value;if(!["forward","backward"].includes($e)||P.value||wt.length<=0||Ee.value||F.value)return;if(!X.value)return xn();St(Et)&&(Et=m.hoveringIndex);let Ct=-1;$e==="forward"?(Ct=Et+1,Ct>=wt.length&&(Ct=0)):$e==="backward"&&(Ct=Et-1,(Ct<0||Ct>=wt.length)&&(Ct=wt.length-1));const In=wt[Ct];if(h(In)||In.type==="Group")return hs($e,Ct);m.hoveringIndex=Ct,ms(Ct)},xe=()=>{if(X.value)~m.hoveringIndex&&j.value[m.hoveringIndex]&&Il(j.value[m.hoveringIndex]);else return xn()},dt=$e=>{m.hoveringIndex=$e??-1},Mt=()=>{if(!e.multiple)m.hoveringIndex=j.value.findIndex($e=>Ze(f($e))===Ze(e.modelValue));else{const $e=e.modelValue.length;if($e>0){const Et=e.modelValue[$e-1];m.hoveringIndex=j.value.findIndex(wt=>Ze(Et)===Ze(f(wt)))}else m.hoveringIndex=-1}},Kt=$e=>{if(m.inputValue=$e.target.value,e.remote)k.value=!0,Je();else return De()},mn=$e=>{X.value=!1,L.value&&D(new FocusEvent("blur",$e))},Qa=()=>(m.isBeforeHide=!1,Oe(()=>{~ft.value&&ms(ft.value)})),ms=$e=>{I.value.scrollToItem($e)},im=($e,Et)=>{const wt=Ze($e);if(Te.value.has(wt)){const{option:Ct}=Te.value.get(wt);return Ct}if(Et&&Et.length){const Ct=Et.find(In=>Ze(f(In))===wt);if(Ct)return Ct}return{[c.value.value]:$e,[c.value.label]:$e}},q2=$e=>Te.value.get(f($e))?.index??-1,au=($e=!1)=>{if(e.multiple)if(e.modelValue.length>0){const Et=m.cachedOptions.slice();m.cachedOptions.length=0,m.previousValue=e.modelValue.toString();for(const wt of e.modelValue){const Ct=im(wt,Et);m.cachedOptions.push(Ct)}}else m.cachedOptions=[],m.previousValue=void 0;else if(ue.value){m.previousValue=e.modelValue;const Et=j.value,wt=Et.findIndex(Ct=>Ze(f(Ct))===Ze(e.modelValue));~wt?m.selectedLabel=d(Et[wt]):(!m.selectedLabel||$e)&&(m.selectedLabel=Ze(e.modelValue))}else m.selectedLabel="",m.previousValue=void 0;qt(),Ke()};re(()=>e.fitInputWidth,()=>{Ke()}),re(X,$e=>{$e?(e.persistent||Ke(),lt("")):(m.inputValue="",m.previousQuery=null,m.isBeforeHide=!0,m.menuVisibleOnFocus=!1,de(""))}),re(()=>e.modelValue,($e,Et)=>{(!$e||ye($e)&&$e.length===0||e.multiple&&!Jt($e.toString(),m.previousValue)||!e.multiple&&Ze($e)!==Ze(m.previousValue))&&au(!0),!Jt($e,Et)&&e.validateEvent&&r?.validate?.("change").catch(wt=>ut(wt))},{deep:!0}),re(()=>e.options,()=>{const $e=O.value;(!$e||$e&&document.activeElement!==$e)&&au()},{deep:!0,flush:"post"}),re(()=>j.value,()=>(Ke(),I.value&&Oe(I.value.resetScrollTop))),ia(()=>{m.isBeforeHide||Ne()}),ia(()=>{const{valueKey:$e,options:Et}=e,wt=new Map;for(const Ct of Et){const In=f(Ct);let ua=In;if(et(ua)&&(ua=fn(In,$e)),wt.get(ua)){ut("ElSelectV2","The option values you provided seem to be duplicated, which may cause some problems, please check.");break}else wt.set(ua,!0)}}),ct(()=>{au()}),Ut(w,pt),Ut(C,qn),Ut(M,Na),Ut(_,tu),Ut(A,Ja);let Vd;return re(()=>yt.value,$e=>{$e?Vd=Ut(I,Na).stop:(Vd?.(),Vd=void 0),t("visible-change",$e)}),{inputId:u,collapseTagSize:Pe,currentPlaceholder:je,expanded:X,emptyText:ce,popupHeight:ve,debounce:J,allOptions:V,allOptionsValueMap:Te,filteredOptions:j,iconComponent:ie,iconReverse:ae,tagStyle:Ae,collapseTagStyle:We,popperSize:b,dropdownMenuVisible:yt,hasModelValue:ue,shouldShowPlaceholder:xt,selectDisabled:P,selectSize:me,needStatusIcon:Q,showClearBtn:ge,states:m,isFocused:L,nsSelect:o,nsInput:l,inputRef:O,menuRef:I,tagMenuRef:_,tooltipRef:S,tagTooltipRef:E,selectRef:w,wrapperRef:M,selectionRef:C,prefixRef:$,suffixRef:N,collapseItemRef:A,popperRef:at,validateState:ne,validateIcon:z,showTagList:be,collapseTagList:Ve,debouncedOnInputChange:Je,deleteTag:nu,getLabel:d,getValue:f,getDisabled:h,getValueKey:Ze,getIndex:q2,handleClear:Bd,handleClickOutside:mn,handleDel:Dd,handleEsc:_d,focus:To,blur:Ad,handleMenuEnter:Qa,handleResize:pt,resetSelectionWidth:qn,updateTooltip:Na,updateTagTooltip:tu,updateOptions:Ne,toggleMenu:xn,scrollTo:ms,onInput:Kt,onKeyboardNavigate:hs,onKeyboardSelect:xe,onSelect:Il,onHover:dt,handleCompositionStart:K,handleCompositionEnd:Y,handleCompositionUpdate:W}};var h9=le({name:"ElSelectV2",components:{ElSelectMenu:f9,ElTag:Fo,ElTooltip:$n,ElIcon:Le},directives:{ClickOutside:Tl},props:QW,emits:t9,setup(e,{emit:t}){const n=y(()=>{const{modelValue:u,multiple:c}=e,d=c?[]:void 0;return ye(u)?c?u:d:c?d:u}),a=v9(Nt({...En(e),modelValue:n}),t),{calculatorRef:o,inputStyle:l}=Bv(),s=Pn();gt(Dh,{props:Nt({...En(e),height:a.popupHeight,modelValue:n}),expanded:a.expanded,tooltipRef:a.tooltipRef,contentId:s,onSelect:a.onSelect,onHover:a.onHover,onKeyboardNavigate:a.onKeyboardNavigate,onKeyboardSelect:a.onKeyboardSelect});const r=y(()=>e.multiple?a.states.cachedOptions.map(u=>a.getLabel(u)):a.states.selectedLabel);return{...a,modelValue:n,selectedLabel:r,calculatorRef:o,inputStyle:l,contentId:s,BORDER_HORIZONTAL_WIDTH:Nw}}});const m9=["id","value","autocomplete","tabindex","aria-expanded","aria-label","disabled","aria-controls","aria-activedescendant","readonly","name"],g9=["textContent"],b9={key:1};function y9(e,t,n,a,o,l){const s=$t("el-tag"),r=$t("el-tooltip"),u=$t("el-icon"),c=$t("el-select-menu"),d=pv("click-outside");return st((x(),B("div",{ref:"selectRef",class:T([e.nsSelect.b(),e.nsSelect.m(e.selectSize)]),onMouseenter:t[15]||(t[15]=f=>e.states.inputHovering=!0),onMouseleave:t[16]||(t[16]=f=>e.states.inputHovering=!1)},[U(r,{ref:"tooltipRef",visible:e.dropdownMenuVisible,teleported:e.teleported,"popper-class":[e.nsSelect.e("popper"),e.popperClass],"popper-style":e.popperStyle,"gpu-acceleration":!1,"stop-popper-mouse-event":!1,"popper-options":e.popperOptions,"fallback-placements":e.fallbackPlacements,effect:e.effect,placement:e.placement,pure:"",transition:`${e.nsSelect.namespace.value}-zoom-in-top`,trigger:"click",persistent:e.persistent,"append-to":e.appendTo,"show-arrow":e.showArrow,offset:e.offset,onBeforeShow:e.handleMenuEnter,onHide:t[14]||(t[14]=f=>e.states.isBeforeHide=!1)},{default:Z(()=>[H("div",{ref:"wrapperRef",class:T([e.nsSelect.e("wrapper"),e.nsSelect.is("focused",e.isFocused),e.nsSelect.is("hovering",e.states.inputHovering),e.nsSelect.is("filterable",e.filterable),e.nsSelect.is("disabled",e.selectDisabled)]),onClick:t[11]||(t[11]=qe((...f)=>e.toggleMenu&&e.toggleMenu(...f),["prevent"]))},[e.$slots.prefix?(x(),B("div",{key:0,ref:"prefixRef",class:T(e.nsSelect.e("prefix"))},[ee(e.$slots,"prefix")],2)):te("v-if",!0),H("div",{ref:"selectionRef",class:T([e.nsSelect.e("selection"),e.nsSelect.is("near",e.multiple&&!e.$slots.prefix&&!!e.modelValue.length)])},[e.multiple?ee(e.$slots,"tag",{key:0,data:e.states.cachedOptions,deleteTag:e.deleteTag,selectDisabled:e.selectDisabled},()=>[(x(!0),B(Fe,null,ht(e.showTagList,f=>(x(),B("div",{key:e.getValueKey(e.getValue(f)),class:T(e.nsSelect.e("selected-item"))},[U(s,{closable:!e.selectDisabled&&!e.getDisabled(f),size:e.collapseTagSize,type:e.tagType,effect:e.tagEffect,"disable-transitions":"",style:He(e.tagStyle),onClose:h=>e.deleteTag(h,f)},{default:Z(()=>[H("span",{class:T(e.nsSelect.e("tags-text"))},[ee(e.$slots,"label",{index:e.getIndex(f),label:e.getLabel(f),value:e.getValue(f)},()=>[mt(ke(e.getLabel(f)),1)])],2)]),_:2},1032,["closable","size","type","effect","style","onClose"])],2))),128)),e.collapseTags&&e.states.cachedOptions.length>e.maxCollapseTags?(x(),oe(r,{key:0,ref:"tagTooltipRef",disabled:e.dropdownMenuVisible||!e.collapseTagsTooltip,"fallback-placements":e.tagTooltip?.fallbackPlacements??["bottom","top","right","left"],effect:e.tagTooltip?.effect??e.effect,placement:e.tagTooltip?.placement??"bottom","popper-class":e.tagTooltip?.popperClass??e.popperClass,"popper-style":e.tagTooltip?.popperStyle??e.popperStyle,teleported:e.tagTooltip?.teleported??e.teleported,"append-to":e.tagTooltip?.appendTo??e.appendTo,"popper-options":e.tagTooltip?.popperOptions??e.popperOptions,transition:e.tagTooltip?.transition,"show-after":e.tagTooltip?.showAfter,"hide-after":e.tagTooltip?.hideAfter,"auto-close":e.tagTooltip?.autoClose,offset:e.tagTooltip?.offset},{default:Z(()=>[H("div",{ref:"collapseItemRef",class:T(e.nsSelect.e("selected-item"))},[U(s,{closable:!1,size:e.collapseTagSize,type:e.tagType,effect:e.tagEffect,style:He(e.collapseTagStyle),"disable-transitions":""},{default:Z(()=>[H("span",{class:T(e.nsSelect.e("tags-text"))}," + "+ke(e.states.cachedOptions.length-e.maxCollapseTags),3)]),_:1},8,["size","type","effect","style"])],2)]),content:Z(()=>[H("div",{ref:"tagMenuRef",class:T(e.nsSelect.e("selection"))},[(x(!0),B(Fe,null,ht(e.collapseTagList,f=>(x(),B("div",{key:e.getValueKey(e.getValue(f)),class:T(e.nsSelect.e("selected-item"))},[U(s,{class:"in-tooltip",closable:!e.selectDisabled&&!e.getDisabled(f),size:e.collapseTagSize,type:e.tagType,effect:e.tagEffect,"disable-transitions":"",onClose:h=>e.deleteTag(h,f)},{default:Z(()=>[H("span",{class:T(e.nsSelect.e("tags-text"))},[ee(e.$slots,"label",{index:e.getIndex(f),label:e.getLabel(f),value:e.getValue(f)},()=>[mt(ke(e.getLabel(f)),1)])],2)]),_:2},1032,["closable","size","type","effect","onClose"])],2))),128))],2)]),_:3},8,["disabled","fallback-placements","effect","placement","popper-class","popper-style","teleported","append-to","popper-options","transition","show-after","hide-after","auto-close","offset"])):te("v-if",!0)]):te("v-if",!0),H("div",{class:T([e.nsSelect.e("selected-item"),e.nsSelect.e("input-wrapper"),e.nsSelect.is("hidden",!e.filterable||e.selectDisabled||!e.states.inputValue&&!e.isFocused)])},[H("input",{id:e.inputId,ref:"inputRef",value:e.states.inputValue,style:He(e.inputStyle),autocomplete:e.autocomplete,tabindex:e.tabindex,"aria-autocomplete":"none","aria-haspopup":"listbox",autocapitalize:"off","aria-expanded":e.expanded,"aria-label":e.ariaLabel,class:T([e.nsSelect.e("input"),e.nsSelect.is(e.selectSize)]),disabled:e.selectDisabled,role:"combobox","aria-controls":e.contentId,"aria-activedescendant":e.states.hoveringIndex>=0?`${e.contentId}-${e.states.hoveringIndex}`:"",readonly:!e.filterable,spellcheck:"false",type:"text",name:e.name,onInput:t[0]||(t[0]=(...f)=>e.onInput&&e.onInput(...f)),onChange:t[1]||(t[1]=qe(()=>{},["stop"])),onCompositionstart:t[2]||(t[2]=(...f)=>e.handleCompositionStart&&e.handleCompositionStart(...f)),onCompositionupdate:t[3]||(t[3]=(...f)=>e.handleCompositionUpdate&&e.handleCompositionUpdate(...f)),onCompositionend:t[4]||(t[4]=(...f)=>e.handleCompositionEnd&&e.handleCompositionEnd(...f)),onKeydown:[t[5]||(t[5]=Zt(qe(f=>e.onKeyboardNavigate("backward"),["stop","prevent"]),["up"])),t[6]||(t[6]=Zt(qe(f=>e.onKeyboardNavigate("forward"),["stop","prevent"]),["down"])),t[7]||(t[7]=Zt(qe((...f)=>e.onKeyboardSelect&&e.onKeyboardSelect(...f),["stop","prevent"]),["enter"])),t[8]||(t[8]=Zt(qe((...f)=>e.handleEsc&&e.handleEsc(...f),["stop","prevent"]),["esc"])),t[9]||(t[9]=Zt(qe((...f)=>e.handleDel&&e.handleDel(...f),["stop"]),["delete"]))],onClick:t[10]||(t[10]=qe((...f)=>e.toggleMenu&&e.toggleMenu(...f),["stop"]))},null,46,m9),e.filterable?(x(),B("span",{key:0,ref:"calculatorRef","aria-hidden":"true",class:T(e.nsSelect.e("input-calculator")),textContent:ke(e.states.inputValue)},null,10,g9)):te("v-if",!0)],2),e.shouldShowPlaceholder?(x(),B("div",{key:1,class:T([e.nsSelect.e("selected-item"),e.nsSelect.e("placeholder"),e.nsSelect.is("transparent",!e.hasModelValue||e.expanded&&!e.states.inputValue)])},[e.hasModelValue?ee(e.$slots,"label",{key:0,index:e.allOptionsValueMap.get(e.modelValue)?.index??-1,label:e.currentPlaceholder,value:e.modelValue},()=>[H("span",null,ke(e.currentPlaceholder),1)]):(x(),B("span",b9,ke(e.currentPlaceholder),1))],2)):te("v-if",!0)],2),H("div",{ref:"suffixRef",class:T(e.nsSelect.e("suffix"))},[e.iconComponent?st((x(),oe(u,{key:0,class:T([e.nsSelect.e("caret"),e.nsInput.e("icon"),e.iconReverse])},{default:Z(()=>[(x(),oe(ot(e.iconComponent)))]),_:1},8,["class"])),[[Ot,!e.showClearBtn]]):te("v-if",!0),e.showClearBtn&&e.clearIcon?(x(),oe(u,{key:1,class:T([e.nsSelect.e("caret"),e.nsInput.e("icon"),e.nsSelect.e("clear")]),onClick:qe(e.handleClear,["prevent","stop"])},{default:Z(()=>[(x(),oe(ot(e.clearIcon)))]),_:1},8,["class","onClick"])):te("v-if",!0),e.validateState&&e.validateIcon&&e.needStatusIcon?(x(),oe(u,{key:2,class:T([e.nsInput.e("icon"),e.nsInput.e("validateIcon"),e.nsInput.is("loading",e.validateState==="validating")])},{default:Z(()=>[(x(),oe(ot(e.validateIcon)))]),_:1},8,["class"])):te("v-if",!0)],2)],2)]),content:Z(()=>[U(c,{id:e.contentId,ref:"menuRef",data:e.filteredOptions,width:e.popperSize-e.BORDER_HORIZONTAL_WIDTH,"hovering-index":e.states.hoveringIndex,"scrollbar-always-on":e.scrollbarAlwaysOn,"aria-label":e.ariaLabel},Qn({default:Z(f=>[ee(e.$slots,"default",Lo(Do(f)))]),_:2},[e.$slots.header?{name:"header",fn:Z(()=>[H("div",{class:T(e.nsSelect.be("dropdown","header")),onClick:t[12]||(t[12]=qe(()=>{},["stop"]))},[ee(e.$slots,"header")],2)]),key:"0"}:void 0,e.$slots.loading&&e.loading?{name:"loading",fn:Z(()=>[H("div",{class:T(e.nsSelect.be("dropdown","loading"))},[ee(e.$slots,"loading")],2)]),key:"1"}:e.loading||e.filteredOptions.length===0?{name:"empty",fn:Z(()=>[H("div",{class:T(e.nsSelect.be("dropdown","empty"))},[ee(e.$slots,"empty",{},()=>[H("span",null,ke(e.emptyText),1)])],2)]),key:"2"}:void 0,e.$slots.footer?{name:"footer",fn:Z(()=>[H("div",{class:T(e.nsSelect.be("dropdown","footer")),onClick:t[13]||(t[13]=qe(()=>{},["stop"]))},[ee(e.$slots,"footer")],2)]),key:"3"}:void 0]),1032,["id","data","width","hovering-index","scrollbar-always-on","aria-label"])]),_:3},8,["visible","teleported","popper-class","popper-style","popper-options","fallback-placements","effect","placement","transition","persistent","append-to","show-arrow","offset","onBeforeShow"])],34)),[[d,e.handleClickOutside,e.popperRef]])}var w9=yn(h9,[["render",y9]]);const C9=nt(w9),S9=Ce({animated:Boolean,count:{type:Number,default:1},rows:{type:Number,default:3},loading:{type:Boolean,default:!0},throttle:{type:q([Number,Object])}}),k9=Ce({variant:{type:String,values:["circle","rect","h1","h3","text","caption","p","image","button"],default:"text"}});var E9=le({name:"ElSkeletonItem",__name:"skeleton-item",props:k9,setup(e){const t=fe("skeleton");return(n,a)=>(x(),B("div",{class:T([i(t).e("item"),i(t).e(e.variant)])},[e.variant==="image"?(x(),oe(i(O3),{key:0})):te("v-if",!0)],2))}}),Fc=E9,x9=le({name:"ElSkeleton",__name:"skeleton",props:S9,setup(e,{expose:t}){const n=e,a=fe("skeleton"),o=PR(_t(n,"loading"),n.throttle);return t({uiLoading:o}),(l,s)=>i(o)?(x(),B("div",rt({key:0,class:[i(a).b(),i(a).is("animated",e.animated)]},l.$attrs),[(x(!0),B(Fe,null,ht(e.count,r=>(x(),B(Fe,{key:r},[i(o)?ee(l.$slots,"template",{key:r},()=>[U(Fc,{class:T(i(a).is("first")),variant:"p"},null,8,["class"]),(x(!0),B(Fe,null,ht(e.rows,u=>(x(),oe(Fc,{key:u,class:T([i(a).e("paragraph"),i(a).is("last",u===e.rows&&e.rows>1)]),variant:"p"},null,8,["class"]))),128))]):te("v-if",!0)],64))),128))],16)):ee(l.$slots,"default",Lo(rt({key:1},l.$attrs)))}}),T9=x9;const $9=nt(T9,{SkeletonItem:Fc}),O9=Xt(Fc),Hk=Symbol("sliderContextKey"),I9=Ce({modelValue:{type:q([Number,Array]),default:0},id:{type:String,default:void 0},min:{type:Number,default:0},max:{type:Number,default:100},step:{type:Number,default:1},showInput:Boolean,showInputControls:{type:Boolean,default:!0},size:bn,inputSize:bn,showStops:Boolean,showTooltip:{type:Boolean,default:!0},formatTooltip:{type:q(Function),default:void 0},disabled:{type:Boolean,default:void 0},range:Boolean,vertical:Boolean,height:String,rangeStartLabel:{type:String,default:void 0},rangeEndLabel:{type:String,default:void 0},formatValueText:{type:q(Function),default:void 0},tooltipClass:{type:String,default:void 0},placement:{type:String,values:So,default:"top"},marks:{type:q(Object)},validateEvent:{type:Boolean,default:!0},persistent:{type:Boolean,default:!0},...Un(["ariaLabel"])}),Cf=e=>ze(e)||ye(e)&&e.every(ze),N9={[Qe]:Cf,[pn]:Cf,[vt]:Cf},M9=(e,t,n)=>{const a=R();return ct(async()=>{e.range?(ye(e.modelValue)?(t.firstValue=Math.max(e.min,e.modelValue[0]),t.secondValue=Math.min(e.max,e.modelValue[1])):(t.firstValue=e.min,t.secondValue=e.max),t.oldValue=[t.firstValue,t.secondValue]):(!ze(e.modelValue)||Number.isNaN(e.modelValue)?t.firstValue=e.min:t.firstValue=Math.min(e.max,Math.max(e.min,e.modelValue)),t.oldValue=t.firstValue),At(window,"resize",n),await Oe(),n()}),{sliderWrapper:a}},P9=e=>y(()=>e.marks?Object.keys(e.marks).map(Number.parseFloat).sort((t,n)=>t-n).filter(t=>t<=e.max&&t>=e.min).map(t=>({point:t,position:(t-e.min)*100/(e.max-e.min),mark:e.marks[t]})):[]),R9=(e,t,n)=>{const{formItem:a}=On(),o=jt(),l=R(),s=R(),r={firstButton:l,secondButton:s},u=tn(),c=y(()=>Math.min(t.firstValue,t.secondValue)),d=y(()=>Math.max(t.firstValue,t.secondValue)),f=y(()=>e.range?`${100*(d.value-c.value)/(e.max-e.min)}%`:`${100*(t.firstValue-e.min)/(e.max-e.min)}%`),h=y(()=>e.range?`${100*(c.value-e.min)/(e.max-e.min)}%`:"0%"),g=y(()=>e.vertical?{height:e.height}:{}),v=y(()=>e.vertical?{height:f.value,bottom:h.value}:{width:f.value,left:h.value}),p=()=>{o.value&&(t.sliderSize=o.value.getBoundingClientRect()[e.vertical?"height":"width"])},m=_=>{const A=e.min+_*(e.max-e.min)/100;if(!e.range)return l;let F;return Math.abs(c.value-A)t.secondValue?"firstButton":"secondButton",r[F]},b=_=>{const A=m(_);return A.value.setPosition(_),A},k=_=>{t.firstValue=_??e.min,C(e.range?[c.value,d.value]:_??e.min)},w=_=>{t.secondValue=_,e.range&&C([c.value,d.value])},C=_=>{n(Qe,_),n(pn,_)},S=async()=>{await Oe(),n(vt,e.range?[c.value,d.value]:e.modelValue)},E=_=>{if(u.value||t.dragging)return;p();let A=0;if(e.vertical){const F=_.touches?.item(0)?.clientY??_.clientY;A=(o.value.getBoundingClientRect().bottom-F)/t.sliderSize*100}else A=((_.touches?.item(0)?.clientX??_.clientX)-o.value.getBoundingClientRect().left)/t.sliderSize*100;if(!(A<0||A>100))return b(A)};return{elFormItem:a,slider:o,firstButton:l,secondButton:s,sliderDisabled:u,minValue:c,maxValue:d,runwayStyle:g,barStyle:v,resetSize:p,setPosition:b,emitChange:S,onSliderWrapperPrevent:_=>{(r.firstButton.value?.dragging||r.secondButton.value?.dragging)&&_.preventDefault()},onSliderClick:_=>{E(_)&&S()},onSliderDown:async _=>{const A=E(_);A&&(await Oe(),A.value.onButtonDown(_))},onSliderMarkerDown:_=>{u.value||t.dragging||b(_)&&S()},setFirstValue:k,setSecondValue:w}},A9=(e,t,n,a)=>({stops:y(()=>{if(!e.showStops||e.min>e.max)return[];if(e.step===0)return ut("ElSlider","step should not be 0."),[];const s=Math.ceil((e.max-e.min)/e.step),r=100*e.step/(e.max-e.min),u=Array.from({length:s-1}).map((c,d)=>(d+1)*r);return e.range?u.filter(c=>c<100*(n.value-e.min)/(e.max-e.min)||c>100*(a.value-e.min)/(e.max-e.min)):u.filter(c=>c>100*(t.firstValue-e.min)/(e.max-e.min))}),getStopStyle:s=>e.vertical?{bottom:`${s}%`}:{left:`${s}%`}}),_9=(e,t,n,a,o,l)=>{const s=c=>{o(Qe,c),o(pn,c)},r=()=>e.range?![n.value,a.value].every((c,d)=>c===t.oldValue[d]):e.modelValue!==t.oldValue,u=()=>{e.min>e.max&&Gt("Slider","min should not be greater than max.");const c=e.modelValue;e.range&&ye(c)?c[1]e.max?s([e.max,e.max]):c[0]e.max?s([c[0],e.max]):(t.firstValue=c[0],t.secondValue=c[1],r()&&(e.validateEvent&&l?.validate?.("change").catch(d=>ut(d)),t.oldValue=c.slice())):!e.range&&ze(c)&&!Number.isNaN(c)&&(ce.max?s(e.max):(t.firstValue=c,r()&&(e.validateEvent&&l?.validate?.("change").catch(d=>ut(d)),t.oldValue=c)))};u(),re(()=>t.dragging,c=>{c||u()}),re(()=>e.modelValue,(c,d)=>{t.dragging||ye(c)&&ye(d)&&c.every((f,h)=>f===d[h])&&t.firstValue===c[0]&&t.secondValue===c[1]||u()},{deep:!0}),re(()=>[e.min,e.max],()=>{u()})},L9=(e,t,n)=>{const a=R(),o=R(!1),l=y(()=>t.value instanceof Function);return{tooltip:a,tooltipVisible:o,formatValue:y(()=>l.value&&t.value(e.modelValue)||e.modelValue),displayTooltip:bo(()=>{n.value&&(o.value=!0)},50),hideTooltip:bo(()=>{n.value&&(o.value=!1)},50)}},D9=(e,t,n)=>{const{disabled:a,min:o,max:l,step:s,showTooltip:r,persistent:u,precision:c,sliderSize:d,formatTooltip:f,emitChange:h,resetSize:g,updateDragging:v}=Re(Hk),{tooltip:p,tooltipVisible:m,formatValue:b,displayTooltip:k,hideTooltip:w}=L9(e,f,r),C=R(),S=y(()=>`${(e.modelValue-o.value)/(l.value-o.value)*100}%`),E=y(()=>e.vertical?{bottom:S.value}:{left:S.value}),O=()=>{t.hovering=!0,k()},$=()=>{t.hovering=!1,t.dragging||w()},N=j=>{a.value||(j.preventDefault(),L(j),window.addEventListener("mousemove",D),window.addEventListener("touchmove",D),window.addEventListener("mouseup",V),window.addEventListener("touchend",V),window.addEventListener("contextmenu",V),C.value.focus())},I=j=>{a.value||(t.newPosition=Number.parseFloat(S.value)+j/(l.value-o.value)*100,G(t.newPosition),h())},_=()=>{I(-s.value)},A=()=>{I(s.value)},F=()=>{I(-s.value*4)},K=()=>{I(s.value*4)},Y=()=>{a.value||(G(0),h())},W=()=>{a.value||(G(100),h())},P=j=>{const X=Ft(j);let Q=!0;switch(X){case we.left:case we.down:_();break;case we.right:case we.up:A();break;case we.home:Y();break;case we.end:W();break;case we.pageDown:F();break;case we.pageUp:K();break;default:Q=!1;break}Q&&j.preventDefault()},M=j=>{let X,Q;return j.type.startsWith("touch")?(Q=j.touches[0].clientY,X=j.touches[0].clientX):(Q=j.clientY,X=j.clientX),{clientX:X,clientY:Q}},L=j=>{t.dragging=!0,t.isClick=!0;const{clientX:X,clientY:Q}=M(j);e.vertical?t.startY=Q:t.startX=X,t.startPosition=Number.parseFloat(S.value),t.newPosition=t.startPosition},D=j=>{if(t.dragging){t.isClick=!1,k(),g();let X;const{clientX:Q,clientY:ve}=M(j);e.vertical?(t.currentY=ve,X=(t.startY-t.currentY)/d.value*100):(t.currentX=Q,X=(t.currentX-t.startX)/d.value*100),t.newPosition=t.startPosition+X,G(t.newPosition)}},V=()=>{t.dragging&&(setTimeout(()=>{t.dragging=!1,t.hovering||w(),t.isClick||G(t.newPosition),h()},0),window.removeEventListener("mousemove",D),window.removeEventListener("touchmove",D),window.removeEventListener("mouseup",V),window.removeEventListener("touchend",V),window.removeEventListener("contextmenu",V))},G=async j=>{if(j===null||Number.isNaN(+j))return;j=zl(j,0,100);const X=Math.floor((l.value-o.value)/s.value),Q=X*s.value/(l.value-o.value)*100,ve=Q+(100-Q)/2;let ue;if(jt.dragging,j=>{v(j)}),At(C,"touchstart",N,{passive:!1}),{disabled:a,button:C,tooltip:p,tooltipVisible:m,showTooltip:r,persistent:u,wrapperStyle:E,formatValue:b,handleMouseEnter:O,handleMouseLeave:$,onButtonDown:N,onKeyDown:P,setPosition:G}},B9=Ce({modelValue:{type:Number,default:0},vertical:Boolean,tooltipClass:String,placement:{type:String,values:So,default:"top"}}),V9={[Qe]:e=>ze(e)},F9=["tabindex"];var z9=le({name:"ElSliderButton",__name:"button",props:B9,emits:V9,setup(e,{expose:t,emit:n}){const a=e,o=n,l=fe("slider"),s=Nt({hovering:!1,dragging:!1,isClick:!1,startX:0,currentX:0,startY:0,currentY:0,startPosition:0,newPosition:0,oldValue:a.modelValue}),r=y(()=>f.value?h.value:!1),{disabled:u,button:c,tooltip:d,showTooltip:f,persistent:h,tooltipVisible:g,wrapperStyle:v,formatValue:p,handleMouseEnter:m,handleMouseLeave:b,onButtonDown:k,onKeyDown:w,setPosition:C}=D9(a,s,o),{hovering:S,dragging:E}=En(s);return t({onButtonDown:k,onKeyDown:w,setPosition:C,hovering:S,dragging:E}),(O,$)=>(x(),B("div",{ref_key:"button",ref:c,class:T([i(l).e("button-wrapper"),{hover:i(S),dragging:i(E)}]),style:He(i(v)),tabindex:i(u)?void 0:0,onMouseenter:$[0]||($[0]=(...N)=>i(m)&&i(m)(...N)),onMouseleave:$[1]||($[1]=(...N)=>i(b)&&i(b)(...N)),onMousedown:$[2]||($[2]=(...N)=>i(k)&&i(k)(...N)),onFocus:$[3]||($[3]=(...N)=>i(m)&&i(m)(...N)),onBlur:$[4]||($[4]=(...N)=>i(b)&&i(b)(...N)),onKeydown:$[5]||($[5]=(...N)=>i(w)&&i(w)(...N))},[U(i($n),{ref_key:"tooltip",ref:d,visible:i(g),placement:O.placement,"fallback-placements":["top","bottom","right","left"],"stop-popper-mouse-event":!1,"popper-class":O.tooltipClass,disabled:!i(f),persistent:r.value},{content:Z(()=>[H("span",null,ke(i(p)),1)]),default:Z(()=>[H("div",{class:T([i(l).e("button"),{hover:i(S),dragging:i(E)}])},null,2)]),_:1},8,["visible","placement","popper-class","disabled","persistent"])],46,F9))}}),xy=z9;const H9=Ce({mark:{type:q([String,Object]),default:void 0}});var K9=le({name:"ElSliderMarker",props:H9,setup(e){const t=fe("slider"),n=y(()=>_e(e.mark)?e.mark:e.mark.label),a=y(()=>_e(e.mark)?void 0:e.mark.style);return()=>Ye("div",{class:t.e("marks-text"),style:a.value},n.value)}});const W9=["id","role","aria-label","aria-labelledby"],j9={key:1};var Y9=le({name:"ElSlider",__name:"slider",props:I9,emits:N9,setup(e,{expose:t,emit:n}){const a=e,o=n,l=fe("slider"),{t:s}=bt(),r=Nt({firstValue:0,secondValue:0,oldValue:0,dragging:!1,sliderSize:1}),{elFormItem:u,slider:c,firstButton:d,secondButton:f,sliderDisabled:h,minValue:g,maxValue:v,runwayStyle:p,barStyle:m,resetSize:b,emitChange:k,onSliderWrapperPrevent:w,onSliderClick:C,onSliderDown:S,onSliderMarkerDown:E,setFirstValue:O,setSecondValue:$}=R9(a,r,o),{stops:N,getStopStyle:I}=A9(a,r,g,v),{inputId:_,isLabeledByFormItem:A}=ya(a,{formItemContext:u}),F=vn(),K=y(()=>a.inputSize||F.value),Y=y(()=>a.ariaLabel||s("el.slider.defaultLabel",{min:a.min,max:a.max})),W=y(()=>a.range?a.rangeStartLabel||s("el.slider.defaultRangeStartLabel"):Y.value),P=y(()=>a.formatValueText?a.formatValueText(X.value):`${X.value}`),M=y(()=>a.rangeEndLabel||s("el.slider.defaultRangeEndLabel")),L=y(()=>a.formatValueText?a.formatValueText(Q.value):`${Q.value}`),D=y(()=>[l.b(),l.m(F.value),l.is("vertical",a.vertical),{[l.m("with-input")]:a.showInput}]),V=P9(a);_9(a,r,g,v,o,u);const G=y(()=>{const ge=[a.min,a.max,a.step].map(ie=>{const ae=`${ie}`.split(".")[1];return ae?ae.length:0});return Math.max.apply(null,ge)}),{sliderWrapper:j}=M9(a,r,b),{firstValue:X,secondValue:Q,sliderSize:ve}=En(r),ue=ge=>{r.dragging=ge};return At(j,"touchstart",w,{passive:!1}),At(j,"touchmove",w,{passive:!1}),gt(Hk,{...En(a),sliderSize:ve,disabled:h,precision:G,emitChange:k,resetSize:b,updateDragging:ue}),t({onSliderClick:C}),(ge,ie)=>(x(),B("div",{id:ge.range?i(_):void 0,ref_key:"sliderWrapper",ref:j,class:T(D.value),role:ge.range?"group":void 0,"aria-label":ge.range&&!i(A)?Y.value:void 0,"aria-labelledby":ge.range&&i(A)?i(u)?.labelId:void 0},[H("div",{ref_key:"slider",ref:c,class:T([i(l).e("runway"),{"show-input":ge.showInput&&!ge.range},i(l).is("disabled",i(h))]),style:He(i(p)),onMousedown:ie[0]||(ie[0]=(...ae)=>i(S)&&i(S)(...ae)),onTouchstartPassive:ie[1]||(ie[1]=(...ae)=>i(S)&&i(S)(...ae))},[H("div",{class:T(i(l).e("bar")),style:He(i(m))},null,6),U(xy,{id:ge.range?void 0:i(_),ref_key:"firstButton",ref:d,"model-value":i(X),vertical:ge.vertical,"tooltip-class":ge.tooltipClass,placement:ge.placement,role:"slider","aria-label":ge.range||!i(A)?W.value:void 0,"aria-labelledby":!ge.range&&i(A)?i(u)?.labelId:void 0,"aria-valuemin":ge.min,"aria-valuemax":ge.range?i(Q):ge.max,"aria-valuenow":i(X),"aria-valuetext":P.value,"aria-orientation":ge.vertical?"vertical":"horizontal","aria-disabled":i(h),"onUpdate:modelValue":i(O)},null,8,["id","model-value","vertical","tooltip-class","placement","aria-label","aria-labelledby","aria-valuemin","aria-valuemax","aria-valuenow","aria-valuetext","aria-orientation","aria-disabled","onUpdate:modelValue"]),ge.range?(x(),oe(xy,{key:0,ref_key:"secondButton",ref:f,"model-value":i(Q),vertical:ge.vertical,"tooltip-class":ge.tooltipClass,placement:ge.placement,role:"slider","aria-label":M.value,"aria-valuemin":i(X),"aria-valuemax":ge.max,"aria-valuenow":i(Q),"aria-valuetext":L.value,"aria-orientation":ge.vertical?"vertical":"horizontal","aria-disabled":i(h),"onUpdate:modelValue":i($)},null,8,["model-value","vertical","tooltip-class","placement","aria-label","aria-valuemin","aria-valuemax","aria-valuenow","aria-valuetext","aria-orientation","aria-disabled","onUpdate:modelValue"])):te("v-if",!0),ge.showStops?(x(),B("div",j9,[(x(!0),B(Fe,null,ht(i(N),(ae,ne)=>(x(),B("div",{key:ne,class:T(i(l).e("stop")),style:He(i(I)(ae))},null,6))),128))])):te("v-if",!0),i(V).length>0?(x(),B(Fe,{key:2},[H("div",null,[(x(!0),B(Fe,null,ht(i(V),(ae,ne)=>(x(),B("div",{key:ne,style:He(i(I)(ae.position)),class:T([i(l).e("stop"),i(l).e("marks-stop")])},null,6))),128))]),H("div",{class:T(i(l).e("marks"))},[(x(!0),B(Fe,null,ht(i(V),(ae,ne)=>(x(),oe(i(K9),{key:ne,mark:ae.mark,style:He(i(I)(ae.position)),onMousedown:qe(z=>i(E)(ae.position),["stop"])},null,8,["mark","style","onMousedown"]))),128))],2)],64)):te("v-if",!0)],38),ge.showInput&&!ge.range?(x(),oe(i(gk),{key:0,ref:"input","model-value":i(X),class:T(i(l).e("input")),step:ge.step,disabled:i(h),controls:ge.showInputControls,min:ge.min,max:ge.max,precision:G.value,size:K.value,"onUpdate:modelValue":i(O),onChange:i(k)},null,8,["model-value","class","step","disabled","controls","min","max","precision","size","onUpdate:modelValue","onChange"])):te("v-if",!0)],10,W9))}}),U9=Y9;const q9=nt(U9),G9=Ce({prefixCls:{type:String}}),Ty=le({name:"ElSpaceItem",props:G9,setup(e,{slots:t}){const n=fe("space"),a=y(()=>`${e.prefixCls||n.b()}__item`);return()=>Ye("div",{class:a.value},ee(t,"default"))}}),$y={small:8,default:12,large:16};function X9(e){const t=fe("space"),n=y(()=>[t.b(),t.m(e.direction),e.class]),a=R(0),o=R(0),l=y(()=>[e.wrap||e.fill?{flexWrap:"wrap"}:{},{alignItems:e.alignment},{rowGap:`${o.value}px`,columnGap:`${a.value}px`},e.style]),s=y(()=>e.fill?{flexGrow:1,minWidth:`${e.fillRatio}%`}:{});return ia(()=>{const{size:r="small",wrap:u,direction:c,fill:d}=e;if(ye(r)){const[f=0,h=0]=r;a.value=f,o.value=h}else{let f;ze(r)?f=r:f=$y[r||"small"]||$y.small,(u||d)&&c==="horizontal"?a.value=o.value=f:c==="horizontal"?(a.value=f,o.value=0):(o.value=f,a.value=0)}}),{classes:n,containerStyle:l,itemStyle:s}}const Z9=Ce({direction:{type:String,values:["horizontal","vertical"],default:"horizontal"},class:{type:q([String,Object,Array]),default:""},style:{type:q([String,Array,Object]),default:""},alignment:{type:q(String),default:"center"},prefixCls:{type:String},spacer:{type:q([Object,String,Number,Array]),default:null,validator:e=>zt(e)||ze(e)||_e(e)},wrap:Boolean,fill:Boolean,fillRatio:{type:Number,default:100},size:{type:[String,Array,Number],values:Ua,validator:e=>ze(e)||ye(e)&&e.length===2&&e.every(ze)}}),J9=le({name:"ElSpace",props:Z9,setup(e,{slots:t}){const{classes:n,containerStyle:a,itemStyle:o}=X9(e);function l(s,r="",u=[]){const{prefixCls:c}=e;return s.forEach((d,f)=>{tp(d)?ye(d.children)&&d.children.forEach((h,g)=>{tp(h)&&ye(h.children)?l(h.children,`${r+g}-`,u):zt(h)&&h?.type===un?u.push(h):u.push(U(Ty,{style:o.value,prefixCls:c,key:`nested-${r+g}`},{default:()=>[h]},Ma.PROPS|Ma.STYLE,["style","prefixCls"]))}):MA(d)&&u.push(U(Ty,{style:o.value,prefixCls:c,key:`LoopKey${r+f}`},{default:()=>[d]},Ma.PROPS|Ma.STYLE,["style","prefixCls"]))}),u}return()=>{const{spacer:s,direction:r}=e,u=ee(t,"default",{key:0},()=>[]);if((u.children??[]).length===0)return null;if(ye(u.children)){let c=l(u.children);if(s){const d=c.length-1;c=c.reduce((f,h,g)=>{const v=[...f,h];return g!==d&&v.push(U("span",{style:[o.value,r==="vertical"?"width: 100%":null],key:g},[zt(s)?s:mt(s,Ma.TEXT)],Ma.STYLE)),v},[])}return U("div",{class:n.value,style:a.value},c,Ma.STYLE|Ma.CLASS)}return u.children}}}),Q9=nt(J9),ej=Ce({space:{type:[Number,String],default:""},active:{type:Number,default:0},direction:{type:String,default:"horizontal",values:["horizontal","vertical"]},alignCenter:{type:Boolean},simple:{type:Boolean},finishStatus:{type:String,values:["wait","process","finish","error","success"],default:"finish"},processStatus:{type:String,values:["wait","process","finish","error","success"],default:"process"}}),tj={[vt]:(e,t)=>[e,t].every(ze)},Kk="ElSteps",nj=Ce({title:{type:String,default:""},icon:{type:Bt},description:{type:String,default:""},status:{type:String,values:["","wait","process","finish","error","success"],default:""}});var aj=le({name:"ElSteps",__name:"steps",props:ej,emits:tj,setup(e,{emit:t}){const n=e,a=t,o=fe("steps"),{children:l,addChild:s,removeChild:r,ChildrenSorter:u}=Cd(it(),"ElStep");return re(l,()=>{l.value.forEach((c,d)=>{c.setIndex(d)})}),gt(Kk,{props:n,steps:l,addStep:s,removeStep:r}),re(()=>n.active,(c,d)=>{a(vt,c,d)}),(c,d)=>(x(),B("div",{class:T([i(o).b(),i(o).m(e.simple?"simple":e.direction)])},[ee(c.$slots,"default"),U(i(u))],2))}}),oj=aj,lj=le({name:"ElStep",__name:"item",props:nj,setup(e){const t=e,n=fe("step"),a=R(-1),o=R({}),l=R(""),s=Re(Kk),r=it();let u=0,c=0;ct(()=>{re([()=>s.props.active,()=>s.props.processStatus,()=>s.props.finishStatus],([$],[N])=>{c=N||0,u=$-c,E($)},{immediate:!0})});const d=y(()=>t.status||l.value),f=y(()=>{const $=s.steps.value[a.value-1];return $?$.internalStatus.value:"wait"}),h=y(()=>s.props.alignCenter),g=y(()=>s.props.direction==="vertical"),v=y(()=>s.props.simple),p=y(()=>s.steps.value.length),m=y(()=>s.steps.value[p.value-1]?.uid===r.uid),b=y(()=>v.value?"":s.props.space),k=y(()=>[n.b(),n.is(v.value?"simple":s.props.direction),n.is("flex",m.value&&!b.value&&!h.value),n.is("center",h.value&&!g.value&&!v.value)]),w=y(()=>{const $={flexBasis:ze(b.value)?`${b.value}px`:b.value?b.value:`${100/(p.value-(h.value?0:1))}%`};return g.value||m.value&&($.maxWidth=`${100/p.value}%`),$}),C=$=>{a.value=$},S=$=>{const N=$==="wait",I={transitionDelay:`${Math.abs(u)===1?0:u>0?(a.value+1-c)*150:-(a.value+1-s.props.active)*150}ms`},_=$===s.props.processStatus||N?0:100;I.borderWidth=_&&!v.value?"1px":0,I[s.props.direction==="vertical"?"height":"width"]=`${_}%`,o.value=I},E=$=>{$>a.value?l.value=s.props.finishStatus:$===a.value&&f.value!=="error"?l.value=s.props.processStatus:l.value="wait";const N=s.steps.value[a.value-1];N&&N.calcProgress(l.value)},O={uid:r.uid,getVnode:()=>r.vnode,currentStatus:d,internalStatus:l,setIndex:C,calcProgress:S};return s.addStep(O),Rt(()=>{s.removeStep(O)}),($,N)=>(x(),B("div",{style:He(w.value),class:T(k.value)},[te(" icon & line "),H("div",{class:T([i(n).e("head"),i(n).is(d.value)])},[v.value?te("v-if",!0):(x(),B("div",{key:0,class:T(i(n).e("line"))},[H("i",{class:T(i(n).e("line-inner")),style:He(o.value)},null,6)],2)),H("div",{class:T([i(n).e("icon"),i(n).is(e.icon||$.$slots.icon?"icon":"text")])},[ee($.$slots,"icon",{},()=>[e.icon?(x(),oe(i(Le),{key:0,class:T(i(n).e("icon-inner"))},{default:Z(()=>[(x(),oe(ot(e.icon)))]),_:1},8,["class"])):d.value==="success"?(x(),oe(i(Le),{key:1,class:T([i(n).e("icon-inner"),i(n).is("status")])},{default:Z(()=>[U(i(Ui))]),_:1},8,["class"])):d.value==="error"?(x(),oe(i(Le),{key:2,class:T([i(n).e("icon-inner"),i(n).is("status")])},{default:Z(()=>[U(i(Ia))]),_:1},8,["class"])):v.value?te("v-if",!0):(x(),B("div",{key:3,class:T(i(n).e("icon-inner"))},ke(a.value+1),3))])],2)],2),te(" title & description "),H("div",{class:T(i(n).e("main"))},[H("div",{class:T([i(n).e("title"),i(n).is(d.value)])},[ee($.$slots,"title",{},()=>[mt(ke(e.title),1)])],2),v.value?(x(),B("div",{key:0,class:T(i(n).e("arrow"))},null,2)):(x(),B("div",{key:1,class:T([i(n).e("description"),i(n).is(d.value)])},[ee($.$slots,"description",{},()=>[mt(ke(e.description),1)])],2))],2)],6))}}),Wk=lj;const sj=nt(oj,{Step:Wk}),rj=Xt(Wk),jk=e=>["",...Ua].includes(e),ij=Ce({modelValue:{type:[Boolean,String,Number],default:!1},disabled:{type:Boolean,default:void 0},loading:Boolean,size:{type:String,validator:jk},width:{type:[String,Number],default:""},inlinePrompt:Boolean,inactiveActionIcon:{type:Bt},activeActionIcon:{type:Bt},activeIcon:{type:Bt},inactiveIcon:{type:Bt},activeText:{type:String,default:""},inactiveText:{type:String,default:""},activeValue:{type:[Boolean,String,Number],default:!0},inactiveValue:{type:[Boolean,String,Number],default:!1},name:{type:String,default:""},validateEvent:{type:Boolean,default:!0},beforeChange:{type:q(Function)},id:String,tabindex:{type:[String,Number]},...Un(["ariaLabel"])}),uj={[Qe]:e=>Dt(e)||_e(e)||ze(e),[vt]:e=>Dt(e)||_e(e)||ze(e),[pn]:e=>Dt(e)||_e(e)||ze(e)},cj=["id","aria-checked","aria-disabled","aria-label","name","true-value","false-value","disabled","tabindex"],dj=["aria-hidden"],fj={key:1},pj={key:1},vj=["aria-hidden"],Sf="ElSwitch";var hj=le({name:Sf,__name:"switch",props:ij,emits:uj,setup(e,{expose:t,emit:n}){const a=e,o=n,{formItem:l}=On(),s=vn(),r=fe("switch"),{inputId:u}=ya(a,{formItemContext:l}),c=tn(y(()=>{if(a.loading)return!0})),d=R(a.modelValue!==!1),f=jt(),h=y(()=>[r.b(),r.m(s.value),r.is("disabled",c.value),r.is("checked",b.value)]),g=y(()=>[r.e("label"),r.em("label","left"),r.is("active",!b.value)]),v=y(()=>[r.e("label"),r.em("label","right"),r.is("active",b.value)]),p=y(()=>({width:en(a.width)}));re(()=>a.modelValue,()=>{d.value=!0});const m=y(()=>d.value?a.modelValue:!1),b=y(()=>m.value===a.activeValue);[a.activeValue,a.inactiveValue].includes(m.value)||(o(Qe,a.inactiveValue),o(vt,a.inactiveValue),o(pn,a.inactiveValue)),re(b,S=>{f.value.checked=S,a.validateEvent&&l?.validate?.("change").catch(E=>ut(E))});const k=()=>{const S=b.value?a.inactiveValue:a.activeValue;o(Qe,S),o(vt,S),o(pn,S),Oe(()=>{f.value.checked=b.value})},w=()=>{if(c.value)return;const{beforeChange:S}=a;if(!S){k();return}const E=S();[Jl(E),Dt(E)].includes(!0)||Gt(Sf,"beforeChange must return type `Promise` or `boolean`"),Jl(E)?E.then(O=>{O&&k()}).catch(O=>{ut(Sf,`some error occurred: ${O}`)}):E&&k()},C=()=>{f.value?.focus?.()};return ct(()=>{f.value.checked=b.value}),t({focus:C,checked:b}),(S,E)=>(x(),B("div",{class:T(h.value),onClick:qe(w,["prevent"])},[H("input",{id:i(u),ref_key:"input",ref:f,class:T(i(r).e("input")),type:"checkbox",role:"switch","aria-checked":b.value,"aria-disabled":i(c),"aria-label":e.ariaLabel,name:e.name,"true-value":e.activeValue,"false-value":e.inactiveValue,disabled:i(c),tabindex:e.tabindex,onChange:k,onKeydown:Zt(w,["enter"])},null,42,cj),!e.inlinePrompt&&(e.inactiveIcon||e.inactiveText||S.$slots.inactive)?(x(),B("span",{key:0,class:T(g.value)},[ee(S.$slots,"inactive",{},()=>[e.inactiveIcon?(x(),oe(i(Le),{key:0},{default:Z(()=>[(x(),oe(ot(e.inactiveIcon)))]),_:1})):te("v-if",!0),!e.inactiveIcon&&e.inactiveText?(x(),B("span",{key:1,"aria-hidden":b.value},ke(e.inactiveText),9,dj)):te("v-if",!0)])],2)):te("v-if",!0),H("span",{class:T(i(r).e("core")),style:He(p.value)},[e.inlinePrompt?(x(),B("div",{key:0,class:T(i(r).e("inner"))},[b.value?(x(),B("div",{key:1,class:T(i(r).e("inner-wrapper"))},[ee(S.$slots,"active",{},()=>[e.activeIcon?(x(),oe(i(Le),{key:0},{default:Z(()=>[(x(),oe(ot(e.activeIcon)))]),_:1})):te("v-if",!0),!e.activeIcon&&e.activeText?(x(),B("span",pj,ke(e.activeText),1)):te("v-if",!0)])],2)):(x(),B("div",{key:0,class:T(i(r).e("inner-wrapper"))},[ee(S.$slots,"inactive",{},()=>[e.inactiveIcon?(x(),oe(i(Le),{key:0},{default:Z(()=>[(x(),oe(ot(e.inactiveIcon)))]),_:1})):te("v-if",!0),!e.inactiveIcon&&e.inactiveText?(x(),B("span",fj,ke(e.inactiveText),1)):te("v-if",!0)])],2))],2)):te("v-if",!0),H("div",{class:T(i(r).e("action"))},[e.loading?(x(),oe(i(Le),{key:0,class:T(i(r).is("loading"))},{default:Z(()=>[U(i(wo))]),_:1},8,["class"])):b.value?ee(S.$slots,"active-action",{key:1},()=>[e.activeActionIcon?(x(),oe(i(Le),{key:0},{default:Z(()=>[(x(),oe(ot(e.activeActionIcon)))]),_:1})):te("v-if",!0)]):b.value?te("v-if",!0):ee(S.$slots,"inactive-action",{key:2},()=>[e.inactiveActionIcon?(x(),oe(i(Le),{key:0},{default:Z(()=>[(x(),oe(ot(e.inactiveActionIcon)))]),_:1})):te("v-if",!0)])],2)],6),!e.inlinePrompt&&(e.activeIcon||e.activeText||S.$slots.active)?(x(),B("span",{key:1,class:T(v.value)},[ee(S.$slots,"active",{},()=>[e.activeIcon?(x(),oe(i(Le),{key:0},{default:Z(()=>[(x(),oe(ot(e.activeIcon)))]),_:1})):te("v-if",!0),!e.activeIcon&&e.activeText?(x(),B("span",{key:1,"aria-hidden":!b.value},ke(e.activeText),9,vj)):te("v-if",!0)])],2)):te("v-if",!0)],2))}}),mj=hj;const gj=nt(mj),kf=function(e){return e.target?.closest("td")},bj=function(e,t,n,a,o){if(!t&&!a&&(!o||ye(o)&&!o.length))return e;_e(n)?n=n==="descending"?-1:1:n=n&&n<0?-1:1;const l=a?null:function(r,u){return o?p1(Cn(o),c=>_e(c)?fn(r,c):c(r,u,e)):(t!=="$key"&&et(r)&&"$value"in r&&(r=r.$value),[et(r)?t?fn(r,t):null:r])},s=function(r,u){if(a)return a(r.value,u.value);for(let c=0,d=r.key?.length??0;cu.key?.[c])return 1}return 0};return e.map((r,u)=>({value:r,index:u,key:l?l(r,u):null})).sort((r,u)=>{let c=s(r,u);return c||(c=r.index-u.index),c*+n}).map(r=>r.value)},Yk=function(e,t){let n=null;return e.columns.forEach(a=>{a.id===t&&(n=a)}),n},yj=function(e,t){let n=null;for(let a=0;a{if(!e)throw new Error("Row is required when get row identity");if(_e(t)){if(!t.includes("."))return`${e[t]}`;const n=t.split(".");let a=e;for(const o of n)a=a[o];return`${a}`}else if(Be(t))return t.call(null,e);return""},Vs=function(e,t,n=!1,a="children"){const o=e||[],l={};return o.forEach((s,r)=>{if(l[Rn(s,t)]={row:s,index:r},n){const u=s[a];ye(u)&&Object.assign(l,Vs(u,t,!0,a))}}),l};function wj(e,t){const n={};let a;for(a in e)n[a]=e[a];for(a in t)if(Tt(t,a)){const o=t[a];St(o)||(n[a]=o)}return n}function Bh(e){return e===""||St(e)||(e=Number.parseInt(e,10),Number.isNaN(e)&&(e="")),e}function Uk(e){return e===""||St(e)||(e=Bh(e),Number.isNaN(e)&&(e=80)),e}function Cj(e){return ze(e)?e:_e(e)?/^\d+(?:px)?$/.test(e)?Number.parseInt(e,10):e:null}function Sj(...e){return e.length===0?t=>t:e.length===1?e[0]:e.reduce((t,n)=>(...a)=>t(n(...a)))}function zc(e,t,n,a,o,l,s){let r=l??0,u=!1;const d=(()=>{if(!s)return e.indexOf(t);const p=Rn(t,s);return e.findIndex(m=>Rn(m,s)===p)})(),f=d!==-1,h=o?.call(null,t,r),g=p=>{p==="add"?e.push(t):e.splice(d,1),u=!0},v=p=>{let m=0;const b=a?.children&&p[a.children];return b&&ye(b)&&(m+=b.length,b.forEach(k=>{m+=v(k)})),m};return(!o||h)&&(Dt(n)?n&&!f?g("add"):!n&&f&&g("remove"):g(f?"remove":"add")),!a?.checkStrictly&&a?.children&&ye(t[a.children])&&t[a.children].forEach(p=>{const m=zc(e,p,n??!f,a,o,r+1,s);r+=v(p)+1,m&&(u=m)}),u}function kj(e,t,n="children",a="hasChildren",o=!1){const l=r=>!(ye(r)&&r.length);function s(r,u,c){t(r,u,c),u.forEach(d=>{if(d[a]&&o){t(d,null,c+1);return}const f=d[n];l(f)||s(d,f,c+1)})}e.forEach(r=>{if(r[a]&&o){t(r,null,0);return}const u=r[n];l(u)||s(r,u,0)})}const Ej=(e,t,n,a)=>{const o={strategy:"fixed",...e.popperOptions},l=Be(a?.tooltipFormatter)?a.tooltipFormatter({row:n,column:a,cellValue:bl(n,a.property).value}):void 0;return zt(l)?{slotContent:l,content:null,...e,popperOptions:o}:{slotContent:null,content:l??t,...e,popperOptions:o}};let aa=null;function xj(e,t,n,a,o,l){const s=Ej(e,t,n,a),r={...s,slotContent:void 0};if(aa?.trigger===o){const g=aa.vm?.component;v1(g?.props,r),g&&s.slotContent&&(g.slots.content=()=>[s.slotContent]);return}aa?.();const u=l?.refs.tableWrapper,c=u?.dataset.prefix,d=U($n,{virtualTriggering:!0,virtualRef:o,appendTo:u,placement:"top",transition:"none",offset:0,hideAfter:0,...r},s.slotContent?{content:()=>s.slotContent}:void 0);d.appContext={...l.appContext,...l};const f=document.createElement("div");Cl(d,f),d.component.exposed.onOpen();const h=u?.querySelector(`.${c}-scrollbar__wrap`);aa=()=>{d.component?.exposed?.onClose&&d.component.exposed.onClose(),Cl(null,f);const g=aa;h?.removeEventListener("scroll",g),g.trigger=void 0,g.vm=void 0,aa=null},aa.trigger=o??void 0,aa.vm=d,h?.addEventListener("scroll",aa)}function qk(e){return e.children?p1(e.children,qk):[e]}function Iy(e,t){return e+t.colSpan}const Gk=(e,t,n,a)=>{let o=0,l=e;const s=n.states.columns.value;if(a){const u=qk(a[e]);o=s.slice(0,s.indexOf(u[0])).reduce(Iy,0),l=o+u.reduce(Iy,0)-1}else o=e;let r;switch(t){case"left":l=s.length-n.states.rightFixedLeafColumnsLength.value&&(r="right");break;default:l=s.length-n.states.rightFixedLeafColumnsLength.value&&(r="right")}return r?{direction:r,start:o,after:l}:{}},Vh=(e,t,n,a,o,l=0)=>{const s=[],{direction:r,start:u,after:c}=Gk(t,n,a,o);if(r){const d=r==="left";s.push(`${e}-fixed-column--${r}`),d&&c+l===a.states.fixedLeafColumnsLength.value-1?s.push("is-last-column"):!d&&u-l===a.states.columns.value.length-a.states.rightFixedLeafColumnsLength.value&&s.push("is-first-column")}return s};function Ny(e,t){return e+(dd(t.realWidth)||Number.isNaN(t.realWidth)?Number(t.width):t.realWidth)}const Fh=(e,t,n,a)=>{const{direction:o,start:l=0,after:s=0}=Gk(e,t,n,a);if(!o)return;const r={},u=o==="left",c=n.states.columns.value;return u?r.left=c.slice(0,l).reduce(Ny,0):r.right=c.slice(s+1).reverse().reduce(Ny,0),r},lr=(e,t)=>{e&&(Number.isNaN(e[t])||(e[t]=`${e[t]}px`))};function Xk(e){return e.some(t=>zt(t)?!(t.type===un||t.type===Fe&&!Xk(t.children)):!0)?e:null}function Tj(e){const t=it(),n=R(!1),a=R([]),o=(c,d)=>{const f=t.store.states.rowExpandable.value;return f?.(c,d)??!0};return{updateExpandRows:()=>{const c=e.data.value||[],d=e.rowKey.value;if(n.value)a.value=t.store.states.rowExpandable.value?c.filter(o):c.slice();else if(d){const f=Vs(a.value,d);a.value=c.filter((h,g)=>!!f[Rn(h,d)]&&o(h,g))}else a.value=[]},toggleRowExpansion:(c,d)=>{const f=(e.data.value||[]).indexOf(c);f>-1&&!o(c,f)||zc(a.value,c,d,void 0,void 0,void 0,e.rowKey.value)&&t.emit("expand-change",c,a.value.slice())},setExpandRowKeys:c=>{t.store.assertRowKey();const d=e.data.value||[],f=e.rowKey.value,h=Vs(d,f);a.value=c.reduce((g,v)=>{const p=h[v];return p&&o(p.row,p.index)&&g.push(p.row),g},[])},isRowExpanded:c=>{const d=e.rowKey.value;return d?!!Vs(a.value,d)[Rn(c,d)]:a.value.includes(c)},states:{expandRows:a,defaultExpandAll:n}}}function $j(e){const t=it(),n=R(null),a=R(null),o=c=>{t.store.assertRowKey(),n.value=c,s(c)},l=()=>{n.value=null},s=c=>{const{data:d,rowKey:f}=e,h=a.value;let g=null;f.value&&(g=(i(d)||[]).find(v=>Rn(v,f.value)===c)??null),a.value=g??null,t.emit("current-change",a.value,h)};return{setCurrentRowKey:o,restoreCurrentRowKey:l,setCurrentRowByKey:s,updateCurrentRow:c=>{const d=a.value;if(c&&c!==d){a.value=c,t.emit("current-change",a.value,d);return}!c&&d&&(a.value=null,t.emit("current-change",null,d))},updateCurrentRowData:()=>{const c=e.rowKey.value,d=e.data.value||[],f=a.value;f&&!d.includes(f)?c?s(Rn(f,c)):(a.value=null,t.emit("current-change",null,f)):n.value&&(s(n.value),l())},states:{_currentRowKey:n,currentRow:a}}}function Oj(e){const t=R([]),n=R({}),a=R(16),o=R(!1),l=R({}),s=R("hasChildren"),r=R("children"),u=R(!1),c=it(),d=y(()=>e.rowKey.value?h(e.data.value||[]):{}),f=y(()=>{const C=e.rowKey.value,S=Object.keys(l.value),E={};return S.length&&S.forEach(O=>{if(l.value[O].length){const $={children:[]};l.value[O].forEach(N=>{const I=Rn(N,C);$.children.push(I),N[s.value]&&!E[I]&&(E[I]={children:[]})}),E[O]=$}}),E}),h=C=>{const S=e.rowKey.value,E={};return kj(C,(O,$,N)=>{const I=Rn(O,S);ye($)?E[I]={children:$.map(_=>Rn(_,S)),level:N}:o.value&&(E[I]={children:[],lazy:!0,level:N})},r.value,s.value,o.value),E},g=(C=!1,S)=>{S||=c.store?.states.defaultExpandAll.value;const E=d.value,O=f.value,$=Object.keys(E),N={};if($.length){const I=i(n),_=[],A=(K,Y)=>{if(C)return t.value?S||t.value.includes(Y):!!(S||K?.expanded);{const W=S||t.value&&t.value.includes(Y);return!!(K?.expanded||W)}};$.forEach(K=>{const Y=I[K],W={...E[K]};if(W.expanded=A(Y,K),W.lazy){const{loaded:P=!1,loading:M=!1}=Y||{};W.loaded=!!P,W.loading=!!M,_.push(K)}N[K]=W});const F=Object.keys(O);o.value&&F.length&&_.length&&F.forEach(K=>{const Y=I[K],W=O[K].children;if(_.includes(K)){if(N[K].children?.length!==0)throw new Error("[ElTable]children must be an empty array.");N[K].children=W}else{const{loaded:P=!1,loading:M=!1}=Y||{};N[K]={lazy:!0,loaded:!!P,loading:!!M,expanded:A(Y,K),children:W,level:void 0}}})}n.value=N,c.store?.updateTableScrollY()};re(()=>t.value,()=>{g(!0)}),re(()=>d.value,()=>{g()}),re(()=>f.value,()=>{g()});const v=C=>{t.value=C,g()},p=C=>o.value&&C&&"loaded"in C&&!C.loaded,m=(C,S)=>{c.store.assertRowKey();const E=e.rowKey.value,O=Rn(C,E),$=O&&n.value[O];if(O&&$&&"expanded"in $){const N=$.expanded;S=St(S)?!$.expanded:S,n.value[O].expanded=S,N!==S&&c.emit("expand-change",C,S),S&&p($)&&k(C,O,$),c.store.updateTableScrollY()}},b=C=>{c.store.assertRowKey();const S=e.rowKey.value,E=Rn(C,S),O=n.value[E];p(O)?k(C,E,O):m(C,void 0)},k=(C,S,E)=>{const{load:O}=c.props;O&&!n.value[S].loaded&&(n.value[S].loading=!0,O(C,E,$=>{if(!ye($))throw new TypeError("[ElTable] data must be an array");n.value[S].loading=!1,n.value[S].loaded=!0,n.value[S].expanded=!0,$.length&&(l.value[S]=$),c.emit("expand-change",C,!0)}))};return{loadData:k,loadOrToggle:b,toggleTreeExpansion:m,updateTreeExpandKeys:v,updateTreeData:g,updateKeyChildren:(C,S)=>{const{lazy:E,rowKey:O}=c.props;if(E){if(!O)throw new Error("[Table] rowKey is required in updateKeyChild");l.value[C]&&(l.value[C]=S)}},normalize:h,states:{expandRowKeys:t,treeData:n,indent:a,lazy:o,lazyTreeNodeMap:l,lazyColumnIdentifier:s,childrenColumnName:r,checkStrictly:u}}}const Ij=(e,t)=>{const n=t.sortingColumn;return!n||_e(n.sortable)?e:bj(e,t.sortProp,t.sortOrder,n.sortMethod,n.sortBy)},ec=e=>{const t=[];return e.forEach(n=>{n.children&&n.children.length>0?t.push.apply(t,ec(n.children)):t.push(n)}),t};function Nj(){const e=it(),{size:t}=En(e.proxy?.$props),n=R(null),a=R([]),o=R([]),l=R(!1),s=R([]),r=R([]),u=R([]),c=R([]),d=R([]),f=R([]),h=R([]),g=R([]),v=[],p=R(0),m=R(0),b=R(0),k=R(!1),w=R([]),C=R(!1),S=R(!1),E=R(null),O=R(null),$=R({}),N=R(null),I=R(null),_=R(null),A=R(null),F=R(null),K=y(()=>n.value?Vs(w.value,n.value):void 0);re(a,()=>{e.state&&(M(!1),e.props.tableLayout==="auto"&&e.refs.tableHeaderRef?.updateFixedColumnStyle())},{deep:!0});const Y=()=>{if(!n.value)throw new Error("[ElTable] prop row-key is required")},W=je=>{je.children?.forEach(at=>{at.fixed=je.fixed,W(at)})},P=()=>{s.value.forEach(de=>{W(de)}),c.value=s.value.filter(de=>[!0,"left"].includes(de.fixed));const je=s.value.find(de=>de.type==="selection");let at;je&&je.fixed!=="right"&&!c.value.includes(je)&&s.value.indexOf(je)===0&&c.value.length&&(c.value.unshift(je),at=!0),d.value=s.value.filter(de=>de.fixed==="right");const ft=s.value.filter(de=>(at?de.type!=="selection":!0)&&!de.fixed);r.value=Array.from(c.value).concat(ft).concat(d.value);const yt=ec(ft),be=ec(c.value),Ve=ec(d.value);p.value=yt.length,m.value=be.length,b.value=Ve.length,u.value=Array.from(be).concat(yt).concat(Ve),l.value=c.value.length>0||d.value.length>0},M=(je,at=!1)=>{je&&P(),at?e.state.doLayout():e.state.debouncedUpdateLayout()},L=je=>K.value?!!K.value[Rn(je,n.value)]:w.value.includes(je),D=()=>{k.value=!1;const je=w.value;w.value=[],je.length&&e.emit("selection-change",[])},V=()=>{let je;if(n.value){je=[];const at=e?.store?.states?.childrenColumnName.value,ft=Vs(a.value,n.value,!0,at);for(const yt in K.value)Tt(K.value,yt)&&!ft[yt]&&je.push(K.value[yt].row)}else je=w.value.filter(at=>!a.value.includes(at));if(je.length){const at=w.value.filter(ft=>!je.includes(ft));w.value=at,e.emit("selection-change",at.slice())}},G=()=>(w.value||[]).slice(),j=(je,at,ft=!0,yt=!1)=>{const be={children:e?.store?.states?.childrenColumnName.value,checkStrictly:e?.store?.states?.checkStrictly.value};if(zc(w.value,je,at,be,yt?void 0:E.value,a.value.indexOf(je),n.value)){const Ve=(w.value||[]).slice();ft&&e.emit("select",Ve,je),e.emit("selection-change",Ve)}},X=()=>{const je=S.value?!k.value:!(k.value||w.value.length);k.value=je;let at=!1,ft=0;const yt=e?.store?.states?.rowKey.value,{childrenColumnName:be}=e.store.states,Ve={children:be.value,checkStrictly:!1};a.value.forEach((de,Ue)=>{const kt=Ue+ft;zc(w.value,de,je,Ve,E.value,kt,yt)&&(at=!0),ft+=ve(Rn(de,yt))}),at&&e.emit("selection-change",w.value?w.value.slice():[]),e.emit("select-all",(w.value||[]).slice())},Q=()=>{if(a.value?.length===0){k.value=!1;return}const{childrenColumnName:je}=e.store.states;let at=0,ft=0;const yt=Ve=>{for(const de of Ve){const Ue=E.value&&E.value.call(null,de,at);if(L(de))ft++;else if(!E.value||Ue)return!1;if(at++,de[je.value]?.length&&!yt(de[je.value]))return!1}return!0},be=yt(a.value||[]);k.value=ft===0?!1:be},ve=je=>{if(!e||!e.store)return 0;const{treeData:at}=e.store.states;let ft=0;const yt=at.value[je]?.children;return yt&&(ft+=yt.length,yt.forEach(be=>{ft+=ve(be)})),ft},ue=(je,at)=>{const ft={};return Cn(je).forEach(yt=>{$.value[yt.id]=at,ft[yt.columnKey||yt.id]=at}),ft},ge=(je,at,ft)=>{I.value&&I.value!==je&&(I.value.order=null),I.value=je,_.value=at,A.value=ft},ie=()=>{let je=i(o);Object.keys($.value).forEach(at=>{const ft=$.value[at];if(!ft||ft.length===0)return;const yt=Yk({columns:u.value},at);yt&&yt.filterMethod&&(je=je.filter(be=>ft.some(Ve=>yt.filterMethod.call(null,Ve,be,yt))))}),N.value=je},ae=()=>{a.value=Ij(N.value??[],{sortingColumn:I.value,sortProp:_.value,sortOrder:A.value})},ne=(je=void 0)=>{je?.filter||ie(),ae()},z=je=>{const{tableHeaderRef:at}=e.refs;if(!at)return;const ft=Object.assign({},at.filterPanels),yt=Object.keys(ft);if(yt.length)if(_e(je)&&(je=[je]),ye(je)){const be=je.map(Ve=>yj({columns:u.value},Ve));yt.forEach(Ve=>{const de=be.find(Ue=>Ue.id===Ve);de&&(de.filteredValue=[])}),e.store.commit("filterChange",{column:be,values:[],silent:!0,multi:!0})}else yt.forEach(be=>{const Ve=u.value.find(de=>de.id===be);Ve&&(Ve.filteredValue=[])}),$.value={},e.store.commit("filterChange",{column:{},values:[],silent:!0})},J=()=>{I.value&&(ge(null,null,null),e.store.commit("changeSortCondition",{silent:!0}))},{setExpandRowKeys:se,toggleRowExpansion:ce,updateExpandRows:he,states:Se,isRowExpanded:Ie}=Tj({data:a,rowKey:n}),{updateTreeExpandKeys:Ne,toggleTreeExpansion:Te,updateTreeData:pe,updateKeyChildren:Ee,loadOrToggle:me,states:Pe}=Oj({data:a,rowKey:n}),{updateCurrentRowData:Ke,updateCurrentRow:Ge,setCurrentRowKey:Me,states:Ae}=$j({data:a,rowKey:n});return{assertRowKey:Y,updateColumns:P,scheduleLayout:M,isSelected:L,clearSelection:D,cleanSelection:V,getSelectionRows:G,toggleRowSelection:j,_toggleAllSelection:X,toggleAllSelection:null,updateAllSelected:Q,updateFilters:ue,updateCurrentRow:Ge,updateSort:ge,execFilter:ie,execSort:ae,execQuery:ne,clearFilter:z,clearSort:J,toggleRowExpansion:ce,setExpandRowKeysAdapter:je=>{se(je),Ne(je)},setCurrentRowKey:Me,toggleRowExpansionAdapter:(je,at)=>{u.value.some(({type:ft})=>ft==="expand")?ce(je,at):Te(je,at)},isRowExpanded:Ie,updateExpandRows:he,updateCurrentRowData:Ke,loadOrToggle:me,updateTreeData:pe,updateKeyChildren:Ee,states:{tableSize:t,rowKey:n,data:a,_data:o,isComplex:l,_columns:s,originColumns:r,columns:u,fixedColumns:c,rightFixedColumns:d,leafColumns:f,fixedLeafColumns:h,rightFixedLeafColumns:g,updateOrderFns:v,leafColumnsLength:p,fixedLeafColumnsLength:m,rightFixedLeafColumnsLength:b,isAllSelected:k,selection:w,reserveSelection:C,selectOnIndeterminate:S,selectable:E,rowExpandable:O,filters:$,filteredData:N,sortingColumn:I,sortProp:_,sortOrder:A,hoverRow:F,...Se,...Pe,...Ae}}}function Lp(e,t){return e.map(n=>n.id===t.id?t:(n.children?.length&&(n.children=Lp(n.children,t)),n))}function Dp(e){e.forEach(t=>{t.no=t.getColumnIndex?.(),t.children?.length&&Dp(t.children)}),e.sort((t,n)=>t.no-n.no)}function Mj(){const e=it(),t=Nj(),n=fe("table"),{t:a}=bt();return{ns:n,t:a,...t,mutations:{setData(r,u){const c=i(r._data)!==u;r.data.value=u,r._data.value=u,e.store.execQuery(),e.store.updateCurrentRowData(),e.store.updateExpandRows(),e.store.updateTreeData(e.store.states.defaultExpandAll.value),i(r.reserveSelection)?e.store.assertRowKey():c?e.store.clearSelection():e.store.cleanSelection(),e.store.updateAllSelected(),e.$ready&&e.store.scheduleLayout()},insertColumn(r,u,c,d){const f=i(r._columns);let h=[];c?(c&&!c.children&&(c.children=[]),c.children?.push(u),h=Lp(f,c)):(f.push(u),h=f),Dp(h),r._columns.value=h,r.updateOrderFns.push(d),u.type==="selection"&&(r.selectable.value=u.selectable,r.reserveSelection.value=u.reserveSelection),e.$ready&&(e.store.updateColumns(),e.store.scheduleLayout())},updateColumnOrder(r,u){u.getColumnIndex?.()!==u.no&&(Dp(r._columns.value),e.$ready&&e.store.updateColumns())},removeColumn(r,u,c,d){const f=i(r._columns)||[];if(c)c.children?.splice(c.children.findIndex(g=>g.id===u.id),1),Oe(()=>{c.children?.length===0&&delete c.children}),r._columns.value=Lp(f,c);else{const g=f.indexOf(u);g>-1&&(f.splice(g,1),r._columns.value=f)}const h=r.updateOrderFns.indexOf(d);h>-1&&r.updateOrderFns.splice(h,1),e.$ready&&(e.store.updateColumns(),e.store.scheduleLayout())},sort(r,u){const{prop:c,order:d,init:f}=u;if(c){const h=i(r.columns).find(g=>g.property===c);h&&(h.order=d,e.store.updateSort(h,c,d),e.store.commit("changeSortCondition",{init:f}))}},changeSortCondition(r,u){const{sortingColumn:c,sortProp:d,sortOrder:f}=r,h=i(c),g=i(d),v=i(f);dd(v)&&(r.sortingColumn.value=null,r.sortProp.value=null),e.store.execQuery({filter:!0}),(!u||!(u.silent||u.init))&&e.emit("sort-change",{column:h,prop:g,order:v}),e.store.updateTableScrollY()},filterChange(r,u){const{column:c,values:d,silent:f}=u,h=e.store.updateFilters(c,d);e.store.execQuery(),f||e.emit("filter-change",h),e.store.updateTableScrollY()},toggleAllSelection(){e.store.toggleAllSelection?.()},rowSelectedChanged(r,u){e.store.toggleRowSelection(u),e.store.updateAllSelected()},setHoverRow(r,u){r.hoverRow.value=u},setCurrentRow(r,u){e.store.updateCurrentRow(u)}},commit:function(r,...u){const c=e.store.mutations;if(c[r])c[r].apply(e,[e.store.states,...u]);else throw new Error(`Action not found: ${r}`)},updateTableScrollY:function(){Oe(()=>e.layout.updateScrollY.apply(e.layout))}}}const zh={rowKey:"rowKey",defaultExpandAll:"defaultExpandAll",rowExpandable:"rowExpandable",selectOnIndeterminate:"selectOnIndeterminate",indent:"indent",lazy:"lazy","treeProps.hasChildren":{key:"lazyColumnIdentifier",default:"hasChildren"},"treeProps.children":{key:"childrenColumnName",default:"children"},"treeProps.checkStrictly":{key:"checkStrictly",default:!1}};function Pj(e,t){if(!e)throw new Error("Table is required.");const n=Mj();return n.toggleAllSelection=bo(n._toggleAllSelection,10),Object.keys(zh).forEach(a=>{Zk(Jk(t,a),a,n)}),Rj(n,t),n}function Rj(e,t){Object.keys(zh).forEach(n=>{re(()=>Jk(t,n),a=>{Zk(a,n,e)})})}function Zk(e,t,n){let a=e,o=zh[t];et(o)&&(a=a||o.default,o=o.key),n.states[o].value=a}function Jk(e,t){if(t.includes(".")){const n=t.split(".");let a=e;return n.forEach(o=>{a=a[o]}),a}else return e[t]}var Aj=class{constructor(e){this.observers=[],this.table=null,this.store=null,this.columns=[],this.fit=!0,this.showHeader=!0,this.height=R(null),this.scrollX=R(!1),this.scrollY=R(!1),this.bodyWidth=R(null),this.fixedWidth=R(null),this.rightFixedWidth=R(null),this.gutterWidth=0;for(const t in e)Tt(e,t)&&(Yt(this[t])?this[t].value=e[t]:this[t]=e[t]);if(!this.table)throw new Error("Table is required for Table Layout");if(!this.store)throw new Error("Store is required for Table Layout")}updateScrollY(){const e=this.height.value;if(dd(e))return!1;const t=this.table.refs.scrollBarRef;if(this.table.vnode.el&&t?.wrapRef){let n=!0;const a=this.scrollY.value;return n=t.wrapRef.scrollHeight>t.wrapRef.clientHeight,this.scrollY.value=n,a!==n}return!1}setHeight(e,t="height"){if(!It)return;const n=this.table.vnode.el;if(e=Cj(e),this.height.value=Number(e),!n&&(e||e===0)){Oe(()=>this.setHeight(e,t));return}n&&ze(e)?(n.style[t]=`${e}px`,this.updateElsHeight()):n&&_e(e)&&(n.style[t]=e,this.updateElsHeight())}setMaxHeight(e){this.setHeight(e,"max-height")}getFlattenColumns(){const e=[];return this.table.store.states.columns.value.forEach(t=>{t.isColumnGroup?e.push.apply(e,t.columns):e.push(t)}),e}updateElsHeight(){this.updateScrollY(),this.notifyObservers("scrollable")}headerDisplayNone(e){if(!e)return!0;let t=e;for(;t.tagName!=="DIV";){if(getComputedStyle(t).display==="none")return!0;t=t.parentElement}return!1}updateColumnsWidth(){if(!It)return;const e=this.fit,t=this.table.vnode.el?.clientWidth;let n=0;const a=this.getFlattenColumns(),o=a.filter(r=>!ze(r.width));if(a.forEach(r=>{ze(r.width)&&r.realWidth&&(r.realWidth=null)}),o.length>0&&e){if(a.forEach(r=>{n+=Number(r.width||r.minWidth||80)}),n<=t){this.scrollX.value=!1;const r=t-n;if(o.length===1)o[0].realWidth=Number(o[0].minWidth||80)+r;else{const u=r/o.reduce((d,f)=>d+Number(f.minWidth||80),0);let c=0;o.forEach((d,f)=>{if(f===0)return;const h=Math.floor(Number(d.minWidth||80)*u);c+=h,d.realWidth=Number(d.minWidth||80)+h}),o[0].realWidth=Number(o[0].minWidth||80)+r-c}}else this.scrollX.value=!0,o.forEach(r=>{r.realWidth=Number(r.minWidth)});this.bodyWidth.value=Math.max(n,t),this.table.state.resizeState.value.width=this.bodyWidth.value}else a.forEach(r=>{!r.width&&!r.minWidth?r.realWidth=80:r.realWidth=Number(r.width||r.minWidth),n+=r.realWidth}),this.scrollX.value=n>t,this.bodyWidth.value=n;const l=this.store.states.fixedColumns.value;if(l.length>0){let r=0;l.forEach(u=>{r+=Number(u.realWidth||u.width)}),this.fixedWidth.value=r}const s=this.store.states.rightFixedColumns.value;if(s.length>0){let r=0;s.forEach(u=>{r+=Number(u.realWidth||u.width)}),this.rightFixedWidth.value=r}this.notifyObservers("columns")}addObserver(e){this.observers.push(e)}removeObserver(e){const t=this.observers.indexOf(e);t!==-1&&this.observers.splice(t,1)}notifyObservers(e){this.observers.forEach(t=>{switch(e){case"columns":t.state?.onColumnsChange(this);break;case"scrollable":t.state?.onScrollableChange(this);break;default:throw new Error(`Table Layout don't have event ${e}.`)}})}};const Za=Symbol("ElTable"),Qk=e=>{const t=[];return e.forEach(n=>{n.children?(t.push(n),t.push.apply(t,Qk(n.children))):t.push(n)}),t},e2=e=>{let t=1;const n=(o,l)=>{if(l&&(o.level=l.level+1,t{n(r,o),s+=r.colSpan}),o.colSpan=s}else o.colSpan=1};e.forEach(o=>{o.level=1,n(o,void 0)});const a=[];for(let o=0;o{o.children?(o.rowSpan=1,o.children.forEach(l=>l.isSubColumn=!0)):o.rowSpan=t-o.level+1,a[o.level-1].push(o)}),a};function _j(e){const t=Re(Za),n=y(()=>e2(e.store.states.originColumns.value));return{isGroup:y(()=>{const l=n.value.length>1;return l&&t&&(t.state.isGroup.value=!0),l}),toggleAllSelection:l=>{l.stopPropagation(),t?.store.commit("toggleAllSelection")},columnRows:n}}var Lj=le({name:"ElTableFilterPanel",components:{ElCheckbox:ja,ElCheckboxGroup:wh,ElScrollbar:Ka,ElTooltip:$n,ElIcon:Le,ArrowDown:Eo,ArrowUp:Sd},props:{placement:{type:String,default:"bottom-start"},store:{type:Object},column:{type:Object},upDataColumn:{type:Function},appendTo:Lt.appendTo},setup(e){const t=it(),{t:n}=bt(),a=fe("table-filter"),o=t?.parent;e.column&&!o.filterPanels.value[e.column.id]&&(o.filterPanels.value[e.column.id]=t);const l=R(null),s=R(null),r=R(0),u=y(()=>e.column&&e.column.filters),c=y(()=>e.column&&e.column.filterClassName?`${a.b()} ${e.column.filterClassName}`:a.b()),d=y({get:()=>(e.column?.filteredValue||[])[0],set:O=>{f.value&&(la(O)?f.value.splice(0,1):f.value.splice(0,1,O))}}),f=y({get(){return e.column?e.column.filteredValue||[]:[]},set(O){e.column&&e.upDataColumn?.("filteredValue",O)}}),h=y(()=>e.column?e.column.filterMultiple:!0),g=O=>O.value===d.value,v=()=>{l.value?.onClose()},p=()=>{k(f.value),v()},m=()=>{f.value=[],k(f.value),v()},b=(O,$)=>{d.value=O,r.value=$,la(O)?k([]):k(f.value),v()},k=O=>{e.store?.commit("filterChange",{column:e.column,values:O}),e.store?.updateAllSelected()},w=()=>{s.value?.focus(),!h.value&&S(),e.column&&e.upDataColumn?.("filterOpened",!0)},C=()=>{e.column&&e.upDataColumn?.("filterOpened",!1)},S=()=>{if(la(d)){r.value=0;return}const O=(u.value||[]).findIndex($=>$.value===d.value);r.value=O>=0?O+1:0};return{multiple:h,filterClassName:c,filteredValue:f,filterValue:d,filters:u,handleConfirm:p,handleReset:m,handleSelect:b,isPropAbsent:la,isActive:g,t:n,ns:a,tooltipRef:l,rootRef:s,checkedIndex:r,handleShowTooltip:w,handleHideTooltip:C,handleKeydown:O=>{const $=Ft(O),N=(u.value?u.value.length:0)+1;let I=r.value,_=!0;switch($){case we.down:case we.right:I=(I+1)%N;break;case we.up:case we.left:I=(I-1+N)%N;break;case we.tab:v(),_=!1;break;case we.enter:case we.space:if(I===0)b(null,0);else{const A=(u.value||[])[I-1];A.value&&b(A.value,I)}break;default:_=!1;break}_&&O.preventDefault(),r.value=I,s.value?.querySelector(`.${a.e("list-item")}:nth-child(${I+1})`)?.focus()}}}});const Dj=["disabled"],Bj=["tabindex","aria-checked"],Vj=["tabindex","aria-checked","onClick"],Fj=["aria-label"];function zj(e,t,n,a,o,l){const s=$t("el-checkbox"),r=$t("el-checkbox-group"),u=$t("el-scrollbar"),c=$t("arrow-up"),d=$t("arrow-down"),f=$t("el-icon"),h=$t("el-tooltip");return x(),oe(h,{ref:"tooltipRef",offset:0,placement:e.placement,"show-arrow":!1,trigger:"click",role:"dialog",teleported:"",effect:"light",pure:"",loop:"","popper-class":e.filterClassName,persistent:"","append-to":e.appendTo,onShow:e.handleShowTooltip,onHide:e.handleHideTooltip},{content:Z(()=>[e.multiple?(x(),B("div",{key:0,ref:"rootRef",tabindex:"-1",class:T(e.ns.e("multiple"))},[H("div",{class:T(e.ns.e("content"))},[U(u,{"wrap-class":e.ns.e("wrap")},{default:Z(()=>[U(r,{modelValue:e.filteredValue,"onUpdate:modelValue":t[0]||(t[0]=g=>e.filteredValue=g),class:T(e.ns.e("checkbox-group"))},{default:Z(()=>[(x(!0),B(Fe,null,ht(e.filters,g=>(x(),oe(s,{key:g.value,value:g.value},{default:Z(()=>[mt(ke(g.text),1)]),_:2},1032,["value"]))),128))]),_:1},8,["modelValue","class"])]),_:1},8,["wrap-class"])],2),H("div",{class:T(e.ns.e("bottom"))},[H("button",{class:T(e.ns.is("disabled",e.filteredValue.length===0)),disabled:e.filteredValue.length===0,type:"button",onClick:t[1]||(t[1]=(...g)=>e.handleConfirm&&e.handleConfirm(...g))},ke(e.t("el.table.confirmFilter")),11,Dj),H("button",{type:"button",onClick:t[2]||(t[2]=(...g)=>e.handleReset&&e.handleReset(...g))},ke(e.t("el.table.resetFilter")),1)],2)],2)):(x(),B("ul",{key:1,ref:"rootRef",tabindex:"-1",role:"radiogroup",class:T(e.ns.e("list")),onKeydown:t[4]||(t[4]=(...g)=>e.handleKeydown&&e.handleKeydown(...g))},[H("li",{role:"radio",class:T([e.ns.e("list-item"),e.ns.is("active",e.isPropAbsent(e.filterValue))]),tabindex:e.checkedIndex===0?0:-1,"aria-checked":e.isPropAbsent(e.filterValue),onClick:t[3]||(t[3]=g=>e.handleSelect(null,0))},ke(e.t("el.table.clearFilter")),11,Bj),(x(!0),B(Fe,null,ht(e.filters,(g,v)=>(x(),B("li",{key:g.value,role:"radio",class:T([e.ns.e("list-item"),e.ns.is("active",e.isActive(g))]),tabindex:e.checkedIndex===v+1?0:-1,"aria-checked":e.isActive(g),onClick:p=>e.handleSelect(g.value,v+1)},ke(g.text),11,Vj))),128))],34))]),default:Z(()=>[H("button",{type:"button",class:T(`${e.ns.namespace.value}-table__column-filter-trigger`),"aria-label":e.t("el.table.filterLabel",{column:e.column?.label||""})},[U(f,null,{default:Z(()=>[ee(e.$slots,"filter-icon",{},()=>[e.column?.filterOpened?(x(),oe(c,{key:0})):(x(),oe(d,{key:1}))])]),_:3})],10,Fj)]),_:3},8,["placement","popper-class","append-to","onShow","onHide"])}var Hj=yn(Lj,[["render",zj]]);function Hh(e){const t=it();ed(()=>{n.value.addObserver(t)}),ct(()=>{a(n.value),o(n.value)}),Ya(()=>{a(n.value),o(n.value)}),rr(()=>{n.value.removeObserver(t)});const n=y(()=>{const l=e.layout;if(!l)throw new Error("Can not find table layout.");return l}),a=l=>{const s=e.vnode.el?.querySelectorAll("colgroup > col")||[];if(!s.length)return;const r=l.getFlattenColumns(),u={};r.forEach(c=>{u[c.id]=c});for(let c=0,d=s.length;c{const s=e.vnode.el?.querySelectorAll("colgroup > col[name=gutter]")||[];for(let u=0,c=s.length;u{p.stopPropagation()},l=(p,m)=>{!m.filters&&m.sortable?v(p,m,!1):m.filterable&&!m.sortable&&o(p),a?.emit("header-click",m,p)},s=(p,m)=>{a?.emit("header-contextmenu",m,p)},r=R(null),u=R(!1),c=R(),d=(p,m)=>{if(It&&!(m.children&&m.children.length>0)&&r.value&&e.border&&r.value.id===m.id){u.value=!0;const b=a;t("set-drag-visible",!0);const k=b?.vnode.el?.getBoundingClientRect().left,w=n?.vnode?.el?.querySelector(`th.${m.id}`),C=w.getBoundingClientRect(),S=C.left-k+30;ka(w,"noclick"),c.value={startMouseLeft:p.clientX,startLeft:C.right-k,startColumnLeft:C.left-k,tableLeft:k};const E=b?.refs.resizeProxy;E.style.left=`${c.value.startLeft}px`,document.onselectstart=function(){return!1},document.ondragstart=function(){return!1};const O=N=>{const I=N.clientX-c.value.startMouseLeft,_=c.value.startLeft+I;E.style.left=`${Math.max(S,_)}px`},$=()=>{if(u.value){const{startColumnLeft:N,startLeft:I}=c.value;m.width=m.realWidth=Number.parseInt(E.style.left,10)-N,b?.emit("header-dragend",m.width,I-N,m,p),requestAnimationFrame(()=>{e.store.scheduleLayout(!1,!0)}),document.body.style.cursor="",u.value=!1,r.value=null,c.value=void 0,t("set-drag-visible",!1)}document.removeEventListener("mousemove",O),document.removeEventListener("mouseup",$),document.onselectstart=null,document.ondragstart=null,setTimeout(()=>{jn(w,"noclick")},0)};document.addEventListener("mousemove",O),document.addEventListener("mouseup",$)}},f=(p,m)=>{if(!e.border||m.children&&m.children.length>0)return;const b=p.target,k=oa(b)?b.closest("th"):null;if(!k)return;const w=fo(k,"is-sortable");if(w){const N=u.value?"col-resize":"";k.style.cursor=N;const I=k.querySelector(".caret-wrapper");I&&(I.style.cursor=N)}if(!m.resizable||u.value){r.value=null;return}const C=k.getBoundingClientRect(),S=k.parentNode?.lastElementChild===k,E=e.allowDragLastColumn||!S,O=C.width>12&&C.right-p.clientX<8&&E,$=O?"col-resize":"";document.body.style.cursor=$,r.value=O?m:null,w&&(k.style.cursor=$)},h=()=>{!It||u.value||(document.body.style.cursor="")},g=({order:p,sortOrders:m})=>{if(p==="")return m[0];const b=m.indexOf(p||null);return m[b>m.length-2?0:b+1]},v=(p,m,b)=>{p.stopPropagation();const k=m.order===b?null:b||g(m),w=p.target?.closest("th");if(w&&fo(w,"noclick")){jn(w,"noclick");return}if(!m.sortable)return;const C=p.currentTarget;if(["ascending","descending"].some(N=>fo(C,N)&&!m.sortOrders.includes(N)))return;const S=e.store.states;let E=S.sortProp.value,O;const $=S.sortingColumn.value;($!==m||$===m&&dd($.order))&&($&&($.order=null),S.sortingColumn.value=m,E=m.property),k?O=m.order=k:O=m.order=null,S.sortProp.value=E,S.sortOrder.value=O,a?.store.commit("changeSortCondition")};return{handleHeaderClick:l,handleHeaderContextMenu:s,handleMouseDown:d,handleMouseMove:f,handleMouseOut:h,handleSortClick:v,handleFilterClick:o}}function Wj(e){const t=Re(Za),n=fe("table");return{getHeaderRowStyle:r=>{const u=t?.props.headerRowStyle;return Be(u)?u.call(null,{rowIndex:r}):u},getHeaderRowClass:r=>{const u=[],c=t?.props.headerRowClassName;return _e(c)?u.push(c):Be(c)&&u.push(c.call(null,{rowIndex:r})),u.join(" ")},getHeaderCellStyle:(r,u,c,d)=>{let f=t?.props.headerCellStyle??{};Be(f)&&(f=f.call(null,{rowIndex:r,columnIndex:u,row:c,column:d}));const h=Fh(u,d.fixed,e.store,c);return lr(h,"left"),lr(h,"right"),Object.assign({},f,h)},getHeaderCellClass:(r,u,c,d)=>{const f=Vh(n.b(),u,d.fixed,e.store,c),h=[d.id,d.order,d.headerAlign,d.className,d.labelClassName,...f];d.children||h.push("is-leaf"),d.sortable&&h.push("is-sortable");const g=t?.props.headerCellClassName;return _e(g)?h.push(g):Be(g)&&h.push(g.call(null,{rowIndex:r,columnIndex:u,row:c,column:d})),h.push(n.e("cell")),h.filter(v=>!!v).join(" ")}}}var jj=le({name:"ElTableHeader",components:{ElCheckbox:ja},props:{fixed:{type:String,default:""},store:{required:!0,type:Object},border:Boolean,defaultSort:{type:Object,default:()=>({prop:"",order:""})},appendFilterPanelTo:{type:String},allowDragLastColumn:{type:Boolean}},setup(e,{emit:t}){const n=it(),a=Re(Za),o=fe("table"),l=R({}),{onColumnsChange:s,onScrollableChange:r}=Hh(a),u=a?.props.tableLayout==="auto",c=Nt(new Map),d=R();let f;const h=()=>{f=setTimeout(()=>{c.size>0&&(c.forEach((A,F)=>{const K=d.value.querySelector(`.${F.replace(/\s/g,".")}`);K&&(A.width=K.getBoundingClientRect().width||A.width)}),c.clear())})};re(c,h),Rt(()=>{f&&(clearTimeout(f),f=void 0)}),ct(async()=>{await Oe(),await Oe();const{prop:A,order:F}=e.defaultSort;a?.store.commit("sort",{prop:A,order:F,init:!0}),h()});const{handleHeaderClick:g,handleHeaderContextMenu:v,handleMouseDown:p,handleMouseMove:m,handleMouseOut:b,handleSortClick:k,handleFilterClick:w}=Kj(e,t),{getHeaderRowStyle:C,getHeaderRowClass:S,getHeaderCellStyle:E,getHeaderCellClass:O}=Wj(e),{isGroup:$,toggleAllSelection:N,columnRows:I}=_j(e),{t:_}=bt();return n.state={onColumnsChange:s,onScrollableChange:r},n.filterPanels=l,{ns:o,t:_,filterPanels:l,onColumnsChange:s,onScrollableChange:r,columnRows:I,getHeaderRowClass:S,getHeaderRowStyle:C,getHeaderCellClass:O,getHeaderCellStyle:E,handleHeaderClick:g,handleHeaderContextMenu:v,handleMouseDown:p,handleMouseMove:m,handleMouseOut:b,handleSortClick:k,handleFilterClick:w,isGroup:$,toggleAllSelection:N,saveIndexSelection:c,isTableLayoutAuto:u,theadRef:d,updateFixedColumnStyle:h}},render(){const{ns:e,t,isGroup:n,columnRows:a,getHeaderCellStyle:o,getHeaderCellClass:l,getHeaderRowClass:s,getHeaderRowStyle:r,handleHeaderClick:u,handleHeaderContextMenu:c,handleMouseDown:d,handleMouseMove:f,handleSortClick:h,handleMouseOut:g,store:v,$parent:p,saveIndexSelection:m,isTableLayoutAuto:b}=this;let k=1;return Ye("thead",{ref:"theadRef",class:e.is("group",n)},a.map((w,C)=>Ye("tr",{class:s(C),key:C,style:r(C)},w.map((S,E)=>{S.rowSpan>k&&(k=S.rowSpan);const O=l(C,E,w,S);return b&&S.fixed&&m.set(O,S),Ye("th",{class:O,colspan:S.colSpan,key:`${S.id}-thead`,rowspan:S.rowSpan,scope:S.colSpan>1?"colgroup":"col",ariaSort:S.sortable?S.order:void 0,style:o(C,E,w,S),onClick:$=>{$.currentTarget?.classList.contains("noclick")||u($,S)},onContextmenu:$=>c($,S),onMousedown:$=>d($,S),onMousemove:$=>f($,S),onMouseout:g},[Ye("div",{class:["cell",S.filteredValue&&S.filteredValue.length>0?"highlight":""]},[S.renderHeader?S.renderHeader({column:S,$index:E,store:v,_self:p}):S.label,S.sortable&&Ye("button",{type:"button",class:"caret-wrapper","aria-label":t("el.table.sortLabel",{column:S.label||""}),onClick:$=>h($,S)},[Ye("i",{onClick:$=>h($,S,"ascending"),class:"sort-caret ascending"}),Ye("i",{onClick:$=>h($,S,"descending"),class:"sort-caret descending"})]),S.filterable&&Ye(Hj,{store:v,placement:S.filterPlacement||"bottom-start",appendTo:p?.appendFilterPanelTo,column:S,upDataColumn:($,N)=>{S[$]=N}},{"filter-icon":()=>S.renderFilterIcon?S.renderFilterIcon({filterOpened:S.filterOpened}):null})])])}))))}});function Ef(e,t,n=.03){return e-t>n}function Yj(e){const t=Re(Za),n=R(""),a=R(Ye("div")),o=(v,p,m)=>{const b=t,k=kf(v);let w=null;const C=b?.vnode.el?.dataset.prefix;k&&(w=Oy({columns:e.store?.states.columns.value??[]},k,C),w&&b?.emit(`cell-${m}`,p,w,k,v)),b?.emit(`row-${m}`,p,w,v)},l=(v,p)=>{o(v,p,"dblclick")},s=(v,p)=>{e.store?.commit("setCurrentRow",p),o(v,p,"click")},r=(v,p)=>{o(v,p,"contextmenu")},u=bo(v=>{e.store?.commit("setHoverRow",v)},30),c=bo(()=>{e.store?.commit("setHoverRow",null)},30),d=v=>{const p=window.getComputedStyle(v,null);return{left:Number.parseInt(p.paddingLeft,10)||0,right:Number.parseInt(p.paddingRight,10)||0,top:Number.parseInt(p.paddingTop,10)||0,bottom:Number.parseInt(p.paddingBottom,10)||0}},f=(v,p,m)=>{let b=p?.target?.parentNode;for(;v>1&&(b=b?.nextSibling,!(!b||b.nodeName!=="TR"));)m(b,"hover-row hover-fixed-row"),v--};return{handleDoubleClick:l,handleClick:s,handleContextMenu:r,handleMouseEnter:u,handleMouseLeave:c,handleCellMouseEnter:(v,p,m)=>{if(!t)return;const b=t,k=kf(v),w=b?.vnode.el?.dataset.prefix;let C=null;if(k){if(C=Oy({columns:e.store?.states.columns.value??[]},k,w),!C)return;k.rowSpan>1&&f(k.rowSpan,v,ka);const P=b.hoverState={cell:k,column:C,row:p};b?.emit("cell-mouse-enter",P.row,P.column,P.cell,v)}if(!m){aa?.trigger===k&&aa?.();return}const S=v.target.querySelector(".cell");if(!(fo(S,`${w}-tooltip`)&&S.childNodes.length&&S.textContent?.trim()))return;const E=document.createRange();E.setStart(S,0),E.setEnd(S,S.childNodes.length);const{width:O,height:$}=E.getBoundingClientRect(),{width:N,height:I}=S.getBoundingClientRect(),{top:_,left:A,right:F,bottom:K}=d(S),Y=A+F,W=_+K;Ef(O+Y,N)||Ef($+W,I)||Ef(S.scrollWidth,N)?xj(m,(k?.innerText||k?.textContent)??"",p,C,k,b):aa?.trigger===k&&aa?.()},handleCellMouseLeave:v=>{const p=kf(v);if(!p)return;p.rowSpan>1&&f(p.rowSpan,v,jn);const m=t?.hoverState;t?.emit("cell-mouse-leave",m?.row,m?.column,m?.cell,v)},tooltipContent:n,tooltipTrigger:a}}function Uj(e){const t=Re(Za),n=fe("table");return{getRowStyle:(c,d)=>{const f=t?.props.rowStyle;return Be(f)?f.call(null,{row:c,rowIndex:d}):f||null},getRowClass:(c,d,f)=>{const h=[n.e("row")];t?.props.highlightCurrentRow&&c===e.store?.states.currentRow.value&&h.push("current-row"),e.stripe&&f%2===1&&h.push(n.em("row","striped"));const g=t?.props.rowClassName;return _e(g)?h.push(g):Be(g)&&h.push(g.call(null,{row:c,rowIndex:d})),h},getCellStyle:(c,d,f,h)=>{const g=t?.props.cellStyle;let v=g??{};Be(g)&&(v=g.call(null,{rowIndex:c,columnIndex:d,row:f,column:h}));const p=Fh(d,e?.fixed,e.store);return lr(p,"left"),lr(p,"right"),Object.assign({},v,p)},getCellClass:(c,d,f,h,g)=>{const v=Vh(n.b(),d,e?.fixed,e.store,void 0,g),p=[h.id,h.align,h.className,...v],m=t?.props.cellClassName;return _e(m)?p.push(m):Be(m)&&p.push(m.call(null,{rowIndex:c,columnIndex:d,row:f,column:h})),p.push(n.e("cell")),p.filter(b=>!!b).join(" ")},getSpan:(c,d,f,h)=>{let g=1,v=1;const p=t?.props.spanMethod;if(Be(p)){const m=p({row:c,column:d,rowIndex:f,columnIndex:h});ye(m)?(g=m[0],v=m[1]):et(m)&&(g=m.rowspan,v=m.colspan)}return{rowspan:g,colspan:v}},getColspanRealWidth:(c,d,f)=>{if(d<1)return c[f].realWidth;const h=c.map(({realWidth:g,width:v})=>g||v).slice(f,f+d);return Number(h.reduce((g,v)=>Number(g)+Number(v),-1))}}}const qj=["colspan","rowspan"];var Gj=le({name:"TableTdWrapper",__name:"td-wrapper",props:{colspan:{type:Number,default:1},rowspan:{type:Number,default:1}},setup(e){return(t,n)=>(x(),B("td",{colspan:e.colspan,rowspan:e.rowspan},[ee(t.$slots,"default")],8,qj))}}),Xj=Gj;function Zj(e){const t=Re(Za),n=fe("table"),{handleDoubleClick:a,handleClick:o,handleContextMenu:l,handleMouseEnter:s,handleMouseLeave:r,handleCellMouseEnter:u,handleCellMouseLeave:c,tooltipContent:d,tooltipTrigger:f}=Yj(e),{getRowStyle:h,getRowClass:g,getCellStyle:v,getCellClass:p,getSpan:m,getColspanRealWidth:b}=Uj(e);let k=-1;const w=y(()=>e.store?.states.columns.value.findIndex(({type:$})=>$==="default")),C=($,N)=>{const I=t?.props?.rowKey;return I?Rn($,I):N},S=($,N,I,_=!1)=>{const{tooltipEffect:A,tooltipOptions:F,store:K}=e,{indent:Y,columns:W}=K.states,P=[];let M=!0;return I&&(P.push(n.em("row",`level-${I.level}`)),M=!!I.display),N===0&&(k=-1),e.stripe&&M&&k++,P.push(...g($,N,k)),Ye("tr",{style:[M?null:{display:"none"},h($,N)],class:P,key:C($,N),onDblclick:L=>a(L,$),onClick:L=>o(L,$),onContextmenu:L=>l(L,$),onMouseenter:()=>s(N),onMouseleave:r},W.value.map((L,D)=>{const{rowspan:V,colspan:G}=m($,L,N,D);if(!V||!G)return null;const j=Object.assign({},L);j.realWidth=b(W.value,G,D);const X={store:K,_self:e.context||t,column:j,row:$,$index:N,cellIndex:D,expanded:_};D===w.value&&I&&(X.treeNode={indent:I.level&&I.level*Y.value,level:I.level},Dt(I.expanded)&&(X.treeNode.expanded=I.expanded,"loading"in I&&(X.treeNode.loading=I.loading),"noLazyChildren"in I&&(X.treeNode.noLazyChildren=I.noLazyChildren)));const Q=`${C($,N)},${D}`,ve=j.columnKey||j.rawColumnKey||"",ue=L.showOverflowTooltip&&v1({effect:A},F,L.showOverflowTooltip);return Ye(Xj,{style:v(N,D,$,L),class:p(N,D,$,L,G-1),key:`${ve}${Q}`,rowspan:V,colspan:G,onMouseenter:ge=>u(ge,$,ue),onMouseleave:c},{default:()=>E(D,L,X)})}))},E=($,N,I)=>N.renderCell(I);return{wrappedRowRender:($,N)=>{const I=e.store,{isRowExpanded:_,assertRowKey:A}=I,{treeData:F,lazyTreeNodeMap:K,childrenColumnName:Y,rowKey:W}=I.states,P=I.states.columns.value;if(P.some(({type:M})=>M==="expand")){const M=_($),L=S($,N,void 0,M),D=t?.renderExpanded;if(!D)return console.error("[Element Error]renderExpanded is required."),L;const V=[[L]];return(t.props.preserveExpandedContent||M)&&V[0].push(Ye("tr",{key:`expanded-row__${L.key}`,style:{display:M?"":"none"}},[Ye("td",{colspan:P.length,class:`${n.e("cell")} ${n.e("expanded-cell")}`},[D({row:$,$index:N,store:I,expanded:M})])])),V}else if(Object.keys(F.value).length){A();const M=Rn($,W.value);let L=F.value[M],D=null;L&&(D={expanded:L.expanded,level:L.level,display:!0,noLazyChildren:void 0,loading:void 0},Dt(L.lazy)&&(D&&Dt(L.loaded)&&L.loaded&&(D.noLazyChildren=!(L.children&&L.children.length)),D.loading=L.loading));const V=[S($,N,D??void 0)];if(L){let G=0;const j=(X,Q)=>{X&&X.length&&Q&&X.forEach(ve=>{const ue={display:Q.display&&Q.expanded,level:Q.level+1,expanded:!1,noLazyChildren:!1,loading:!1},ge=Rn(ve,W.value);if(la(ge))throw new Error("For nested data item, row-key is required.");L={...F.value[ge]},L&&(ue.expanded=L.expanded,L.level=L.level||ue.level,L.display=!!(L.expanded&&ue.display),Dt(L.lazy)&&(Dt(L.loaded)&&L.loaded&&(ue.noLazyChildren=!(L.children&&L.children.length)),ue.loading=L.loading)),G++,V.push(S(ve,N+G,ue)),L&&j(K.value[ge]||ve[Y.value],L)})};L.display=!0,j(K.value[M]||$[Y.value],L)}return V}else return S($,N,void 0)},tooltipContent:d,tooltipTrigger:f}}const Jj={store:{required:!0,type:Object},stripe:Boolean,tooltipEffect:String,tooltipOptions:{type:Object},context:{default:()=>({}),type:Object},rowClassName:[String,Function],rowStyle:[Object,Function],fixed:{type:String,default:""},highlight:Boolean};var Qj=le({name:"ElTableBody",props:Jj,setup(e){const t=it(),n=Re(Za),a=fe("table"),{wrappedRowRender:o,tooltipContent:l,tooltipTrigger:s}=Zj(e),{onColumnsChange:r,onScrollableChange:u}=Hh(n),c=[];return re(e.store?.states.hoverRow,(d,f)=>{const h=t?.vnode.el,g=Array.from(h?.children||[]).filter(m=>m?.classList.contains(`${a.e("row")}`));let v=d;const p=g[v]?.childNodes;if(p?.length){let m=0;Array.from(p).reduce((b,k,w)=>(p[w]?.colSpan>1&&(m=p[w]?.colSpan),k.nodeName!=="TD"&&m===0&&b.push(w),m>0&&m--,b),[]).forEach(b=>{for(v=d;v>0;){const k=g[v-1]?.childNodes;if(k[b]&&k[b].nodeName==="TD"&&k[b].rowSpan>1){ka(k[b],"hover-cell"),c.push(k[b]);break}v--}})}else c.forEach(m=>jn(m,"hover-cell")),c.length=0;!e.store?.states.isComplex.value||!It||Fa(()=>{const m=g[f],b=g[d];m&&!m.classList.contains("hover-fixed-row")&&jn(m,"hover-row"),b&&ka(b,"hover-row")})}),rr(()=>{aa?.()}),{ns:a,onColumnsChange:r,onScrollableChange:u,wrappedRowRender:o,tooltipContent:l,tooltipTrigger:s}},render(){const{wrappedRowRender:e,store:t}=this;return Ye("tbody",{tabIndex:-1},[(t?.states.data.value||[]).reduce((n,a)=>n.concat(e(a,n.length)),[])])}});function e7(){const e=Re(Za)?.store;return{leftFixedLeafCount:y(()=>e?.states.fixedLeafColumnsLength.value??0),rightFixedLeafCount:y(()=>e?.states.rightFixedColumns.value.length??0),columnsCount:y(()=>e?.states.columns.value.length??0),leftFixedCount:y(()=>e?.states.fixedColumns.value.length??0),rightFixedCount:y(()=>e?.states.rightFixedColumns.value.length??0),columns:y(()=>e?.states.columns.value??[])}}function t7(e){const{columns:t}=e7(),n=fe("table");return{getCellClasses:(l,s)=>{const r=l[s],u=[n.e("cell"),r.id,r.align,r.labelClassName,...Vh(n.b(),s,r.fixed,e.store)];return r.className&&u.push(r.className),r.children||u.push(n.is("leaf")),u},getCellStyles:(l,s)=>{const r=Fh(s,l.fixed,e.store);return lr(r,"left"),lr(r,"right"),r},columns:t}}var n7=le({name:"ElTableFooter",props:{fixed:{type:String,default:""},store:{required:!0,type:Object},summaryMethod:Function,sumText:String,border:Boolean,defaultSort:{type:Object,default:()=>({prop:"",order:""})}},setup(e){const t=Re(Za),n=fe("table"),{getCellClasses:a,getCellStyles:o,columns:l}=t7(e),{onScrollableChange:s,onColumnsChange:r}=Hh(t);return{ns:n,onScrollableChange:s,onColumnsChange:r,getCellClasses:a,getCellStyles:o,columns:l}},render(){const{columns:e,getCellStyles:t,getCellClasses:n,summaryMethod:a,sumText:o}=this,l=this.store.states.data.value;let s=[];return a?s=a({columns:e,data:l}):e.forEach((r,u)=>{if(u===0){s[u]=o;return}const c=l.map(g=>Number(g[r.property])),d=[];let f=!0;c.forEach(g=>{if(!Number.isNaN(+g)){f=!1;const v=`${g}`.split(".")[1];d.push(v?v.length:0)}});const h=Math.max.apply(null,d);f?s[u]="":s[u]=c.reduce((g,v)=>{const p=Number(v);return Number.isNaN(+p)?g:Number.parseFloat((g+v).toFixed(Math.min(h,20)))},0)}),Ye(Ye("tfoot",[Ye("tr",{},[...e.map((r,u)=>Ye("td",{key:u,colspan:r.colSpan,rowspan:r.rowSpan,class:n(e,u),style:t(r,u)},[Ye("div",{class:["cell",r.labelClassName]},[s[u]])]))])]))}});function a7(e){return{setCurrentRow:f=>{e.commit("setCurrentRow",f)},getSelectionRows:()=>e.getSelectionRows(),toggleRowSelection:(f,h,g=!0)=>{e.toggleRowSelection(f,h,!1,g),e.updateAllSelected()},clearSelection:()=>{e.clearSelection()},clearFilter:f=>{e.clearFilter(f)},toggleAllSelection:()=>{e.commit("toggleAllSelection")},toggleRowExpansion:(f,h)=>{e.toggleRowExpansionAdapter(f,h)},clearSort:()=>{e.clearSort()},sort:(f,h)=>{e.commit("sort",{prop:f,order:h})},updateKeyChildren:(f,h)=>{e.updateKeyChildren(f,h)}}}function o7(e,t,n,a){const o=R(!1),l=R(null),s=R(!1),r=Y=>{s.value=Y},u=R({width:null,height:null,headerHeight:null}),c=R(!1),d={display:"inline-block",verticalAlign:"middle"},f=R(),h=R(0),g=R(0),v=R(0),p=R(0),m=R(0);re(()=>e.height,Y=>{t.setHeight(Y??null)},{immediate:!0}),re(()=>e.maxHeight,Y=>{t.setMaxHeight(Y??null)},{immediate:!0}),re(()=>[e.currentRowKey,n.states.rowKey],([Y,W])=>{!i(W)||!i(Y)||n.setCurrentRowKey(`${Y}`)},{immediate:!0}),re(()=>e.data,Y=>{a.store.commit("setData",Y)},{immediate:!0,deep:!0}),ia(()=>{e.expandRowKeys&&n.setExpandRowKeysAdapter(e.expandRowKeys)});const b=()=>{a.store.commit("setHoverRow",null),a.hoverState&&(a.hoverState=null)},k=(Y,W)=>{const{pixelX:P,pixelY:M}=W;Math.abs(P)>=Math.abs(M)&&(a.refs.bodyWrapper.scrollLeft+=W.pixelX/5)},w=y(()=>e.height||e.maxHeight||n.states.fixedColumns.value.length>0||n.states.rightFixedColumns.value.length>0),C=y(()=>({width:t.bodyWidth.value?`${t.bodyWidth.value}px`:""})),S=()=>{w.value&&t.updateElsHeight(),t.updateColumnsWidth(),!(typeof window>"u")&&requestAnimationFrame(N)};ct(async()=>{await Oe(),n.updateColumns(),I(),requestAnimationFrame(S);const Y=a.vnode.el,W=a.refs.headerWrapper;e.flexible&&Y&&Y.parentElement&&(Y.parentElement.style.minWidth="0"),u.value={width:f.value=Y.offsetWidth,height:Y.offsetHeight,headerHeight:e.showHeader&&W?W.offsetHeight:null},n.states.columns.value.forEach(P=>{P.filteredValue&&P.filteredValue.length&&a.store.commit("filterChange",{column:P,values:P.filteredValue,silent:!0})}),a.$ready=!0});const E=(Y,W)=>{if(!Y)return;const P=Array.from(Y.classList).filter(M=>!M.startsWith("is-scrolling-"));P.push(t.scrollX.value?W:"is-scrolling-none"),Y.className=P.join(" ")},O=Y=>{const{tableWrapper:W}=a.refs;E(W,Y)},$=Y=>{const{tableWrapper:W}=a.refs;return!!(W&&W.classList.contains(Y))},N=function(){if(!a.refs.scrollBarRef)return;if(!t.scrollX.value){const V="is-scrolling-none";$(V)||O(V);return}const Y=a.refs.scrollBarRef.wrapRef;if(!Y)return;const{scrollLeft:W,offsetWidth:P,scrollWidth:M}=Y,{headerWrapper:L,footerWrapper:D}=a.refs;L&&(L.scrollLeft=W),D&&(D.scrollLeft=W),W>=M-P-1?O("is-scrolling-right"):O(W===0?"is-scrolling-left":"is-scrolling-middle")},I=()=>{a.refs.scrollBarRef&&(a.refs.scrollBarRef.wrapRef&&At(a.refs.scrollBarRef.wrapRef,"scroll",N,{passive:!0}),e.fit?Ut(a.vnode.el,_):At(window,"resize",_),Ut(a.refs.tableInnerWrapper,()=>{_(),a.refs?.scrollBarRef?.update()}))},_=()=>{const Y=a.vnode.el;if(!a.$ready||!Y)return;let W=!1;const{width:P,height:M,headerHeight:L}=u.value,D=f.value=Y.offsetWidth;P!==D&&(W=!0);const V=Y.offsetHeight;(e.height||w.value)&&M!==V&&(W=!0);const G=e.tableLayout==="fixed"?a.refs.headerWrapper:a.refs.tableHeaderRef?.$el;e.showHeader&&G?.offsetHeight!==L&&(W=!0),h.value=a.refs.tableWrapper?.scrollHeight||0,v.value=G?.scrollHeight||0,p.value=a.refs.footerWrapper?.offsetHeight||0,m.value=a.refs.appendWrapper?.offsetHeight||0,g.value=h.value-v.value-p.value-m.value,W&&(u.value={width:D,height:V,headerHeight:e.showHeader&&G?.offsetHeight||0},S())},A=vn(),F=y(()=>{const{bodyWidth:Y,scrollY:W,gutterWidth:P}=t;return Y.value?`${Y.value-(W.value?P:0)}px`:""}),K=y(()=>e.maxHeight?"fixed":e.tableLayout);return{isHidden:o,renderExpanded:l,setDragVisible:r,isGroup:c,handleMouseLeave:b,handleHeaderFooterMousewheel:k,tableSize:A,emptyBlockStyle:y(()=>{if(e.data&&e.data.length)return;let Y="100%";e.height&&g.value&&(Y=`${g.value}px`);const W=f.value;return{width:W?`${W}px`:"",height:Y}}),resizeProxyVisible:s,bodyWidth:F,resizeState:u,doLayout:S,tableBodyStyles:C,tableLayout:K,scrollbarViewStyle:d,scrollbarStyle:y(()=>e.height?{height:"100%"}:e.maxHeight?Number.isNaN(Number(e.maxHeight))?{maxHeight:`calc(${e.maxHeight} - ${v.value+p.value}px)`}:{maxHeight:`${+e.maxHeight-v.value-p.value}px`}:{})}}function l7(e){let t;const n=()=>{const a=e.vnode.el.querySelector(".hidden-columns"),o={childList:!0,subtree:!0},l=e.store.states.updateOrderFns;t=new MutationObserver(()=>{l.forEach(s=>s())}),t.observe(a,o)};ct(()=>{n()}),rr(()=>{t?.disconnect()})}var s7={data:{type:Array,default:()=>[]},size:bn,width:[String,Number],height:[String,Number],maxHeight:[String,Number],fit:{type:Boolean,default:!0},stripe:Boolean,border:Boolean,rowKey:[String,Function],showHeader:{type:Boolean,default:!0},showSummary:Boolean,sumText:String,summaryMethod:Function,rowClassName:[String,Function],rowStyle:[Object,Function],cellClassName:[String,Function],cellStyle:[Object,Function],headerRowClassName:[String,Function],headerRowStyle:[Object,Function],headerCellClassName:[String,Function],headerCellStyle:[Object,Function],highlightCurrentRow:Boolean,currentRowKey:[String,Number],emptyText:String,expandRowKeys:Array,defaultExpandAll:Boolean,rowExpandable:{type:Function},defaultSort:Object,tooltipEffect:String,tooltipOptions:Object,spanMethod:Function,selectOnIndeterminate:{type:Boolean,default:!0},indent:{type:Number,default:16},treeProps:{type:Object,default:()=>({hasChildren:"hasChildren",children:"children",checkStrictly:!1})},lazy:Boolean,load:Function,style:{type:[String,Object,Array],default:()=>({})},className:{type:String,default:""},tableLayout:{type:String,default:"fixed"},scrollbarAlwaysOn:Boolean,flexible:Boolean,showOverflowTooltip:{type:[Boolean,Object],default:void 0},tooltipFormatter:Function,appendFilterPanelTo:String,scrollbarTabindex:{type:[Number,String],default:void 0},allowDragLastColumn:{type:Boolean,default:!0},preserveExpandedContent:Boolean,nativeScrollbar:Boolean};function t2(e){const t=e.tableLayout==="auto";let n=e.columns||[];t&&n.every(({width:o})=>St(o))&&(n=[]);const a=o=>{const l={key:`${e.tableLayout}_${o.id}`,style:{},name:void 0};return t?l.style={width:`${o.width}px`}:l.name=o.id,l};return Ye("colgroup",{},n.map(o=>Ye("col",a(o))))}t2.props=["columns","tableLayout"];const r7=()=>{const e=R(),t=(l,s)=>{const r=e.value;r&&r.scrollTo(l,s)},n=(l,s)=>{const r=e.value;r&&ze(s)&&["Top","Left"].includes(l)&&r[`setScroll${l}`](s)};return{scrollBarRef:e,scrollTo:t,setScrollTop:l=>n("Top",l),setScrollLeft:l=>n("Left",l)}};let i7=1;var u7=le({name:"ElTable",directives:{Mousewheel:_D},components:{TableHeader:jj,TableBody:Qj,TableFooter:n7,ElScrollbar:Ka,hColgroup:t2},props:s7,emits:["select","select-all","selection-change","cell-mouse-enter","cell-mouse-leave","cell-contextmenu","cell-click","cell-dblclick","row-click","row-contextmenu","row-dblclick","header-click","header-contextmenu","sort-change","filter-change","current-change","header-dragend","expand-change","scroll"],setup(e){const{t}=bt(),n=fe("table"),a=nl("table"),o=it();gt(Za,o);const l=Pj(o,e);o.store=l;const s=new Aj({store:o.store,table:o,fit:e.fit,showHeader:e.showHeader});o.layout=s;const r=y(()=>(l.states.data.value||[]).length===0),{setCurrentRow:u,getSelectionRows:c,toggleRowSelection:d,clearSelection:f,clearFilter:h,toggleAllSelection:g,toggleRowExpansion:v,clearSort:p,sort:m,updateKeyChildren:b}=a7(l),{isHidden:k,renderExpanded:w,setDragVisible:C,isGroup:S,handleMouseLeave:E,handleHeaderFooterMousewheel:O,tableSize:$,emptyBlockStyle:N,resizeProxyVisible:I,bodyWidth:_,resizeState:A,doLayout:F,tableBodyStyles:K,tableLayout:Y,scrollbarViewStyle:W,scrollbarStyle:P}=o7(e,s,l,o),{scrollBarRef:M,scrollTo:L,setScrollLeft:D,setScrollTop:V}=r7(),G=bo(F,50),j=`${n.namespace.value}-table_${i7++}`;o.tableId=j,o.state={isGroup:S,resizeState:A,doLayout:F,debouncedUpdateLayout:G};const X=y(()=>e.sumText??t("el.table.sumText")),Q=y(()=>e.emptyText??t("el.table.emptyText")),ve=y(()=>e.tooltipEffect??a.value?.tooltipEffect),ue=y(()=>e.tooltipOptions??a.value?.tooltipOptions),ge=y(()=>e2(l.states.originColumns.value)[0]);return l7(o),Rt(()=>{G.cancel()}),{ns:n,layout:s,store:l,columns:ge,handleHeaderFooterMousewheel:O,handleMouseLeave:E,tableId:j,tableSize:$,isHidden:k,isEmpty:r,renderExpanded:w,resizeProxyVisible:I,resizeState:A,isGroup:S,bodyWidth:_,tableBodyStyles:K,emptyBlockStyle:N,debouncedUpdateLayout:G,setCurrentRow:u,getSelectionRows:c,toggleRowSelection:d,clearSelection:f,clearFilter:h,toggleAllSelection:g,toggleRowExpansion:v,clearSort:p,doLayout:F,sort:m,updateKeyChildren:b,t,setDragVisible:C,context:o,computedSumText:X,computedEmptyText:Q,computedTooltipEffect:ve,computedTooltipOptions:ue,tableLayout:Y,scrollbarViewStyle:W,scrollbarStyle:P,scrollBarRef:M,scrollTo:L,setScrollLeft:D,setScrollTop:V,allowDragLastColumn:e.allowDragLastColumn}}});const c7=["data-prefix"],d7={ref:"hiddenColumns",class:"hidden-columns"};function f7(e,t,n,a,o,l){const s=$t("hColgroup"),r=$t("table-header"),u=$t("table-body"),c=$t("table-footer"),d=$t("el-scrollbar"),f=pv("mousewheel");return x(),B("div",{ref:"tableWrapper",class:T([{[e.ns.m("fit")]:e.fit,[e.ns.m("striped")]:e.stripe,[e.ns.m("border")]:e.border||e.isGroup,[e.ns.m("hidden")]:e.isHidden,[e.ns.m("group")]:e.isGroup,[e.ns.m("fluid-height")]:e.maxHeight,[e.ns.m("scrollable-x")]:e.layout.scrollX.value,[e.ns.m("scrollable-y")]:e.layout.scrollY.value,[e.ns.m("enable-row-hover")]:!e.store.states.isComplex.value,[e.ns.m("enable-row-transition")]:(e.store.states.data.value||[]).length!==0&&(e.store.states.data.value||[]).length<100,"has-footer":e.showSummary},e.ns.m(e.tableSize),e.className,e.ns.b(),e.ns.m(`layout-${e.tableLayout}`)]),style:He(e.style),"data-prefix":e.ns.namespace.value,onMouseleave:t[1]||(t[1]=(...h)=>e.handleMouseLeave&&e.handleMouseLeave(...h))},[H("div",{ref:"tableInnerWrapper",class:T(e.ns.e("inner-wrapper"))},[H("div",d7,[ee(e.$slots,"default")],512),e.showHeader&&e.tableLayout==="fixed"?st((x(),B("div",{key:0,ref:"headerWrapper",class:T(e.ns.e("header-wrapper"))},[H("table",{ref:"tableHeader",class:T(e.ns.e("header")),style:He(e.tableBodyStyles),border:"0",cellpadding:"0",cellspacing:"0"},[U(s,{columns:e.store.states.columns.value,"table-layout":e.tableLayout},null,8,["columns","table-layout"]),U(r,{ref:"tableHeaderRef",border:e.border,"default-sort":e.defaultSort,store:e.store,"append-filter-panel-to":e.appendFilterPanelTo,"allow-drag-last-column":e.allowDragLastColumn,onSetDragVisible:e.setDragVisible},null,8,["border","default-sort","store","append-filter-panel-to","allow-drag-last-column","onSetDragVisible"])],6)],2)),[[f,e.handleHeaderFooterMousewheel]]):te("v-if",!0),H("div",{ref:"bodyWrapper",class:T(e.ns.e("body-wrapper"))},[U(d,{ref:"scrollBarRef","view-style":e.scrollbarViewStyle,"wrap-style":e.scrollbarStyle,always:e.scrollbarAlwaysOn,tabindex:e.scrollbarTabindex,native:e.nativeScrollbar,onScroll:t[0]||(t[0]=h=>e.$emit("scroll",h))},{default:Z(()=>[H("table",{ref:"tableBody",class:T(e.ns.e("body")),cellspacing:"0",cellpadding:"0",border:"0",style:He({width:e.bodyWidth,tableLayout:e.tableLayout})},[U(s,{columns:e.store.states.columns.value,"table-layout":e.tableLayout},null,8,["columns","table-layout"]),e.showHeader&&e.tableLayout==="auto"?(x(),oe(r,{key:0,ref:"tableHeaderRef",class:T(e.ns.e("body-header")),border:e.border,"default-sort":e.defaultSort,store:e.store,"append-filter-panel-to":e.appendFilterPanelTo,onSetDragVisible:e.setDragVisible},null,8,["class","border","default-sort","store","append-filter-panel-to","onSetDragVisible"])):te("v-if",!0),U(u,{context:e.context,highlight:e.highlightCurrentRow,"row-class-name":e.rowClassName,"tooltip-effect":e.computedTooltipEffect,"tooltip-options":e.computedTooltipOptions,"row-style":e.rowStyle,store:e.store,stripe:e.stripe},null,8,["context","highlight","row-class-name","tooltip-effect","tooltip-options","row-style","store","stripe"]),e.showSummary&&e.tableLayout==="auto"?(x(),oe(c,{key:1,class:T(e.ns.e("body-footer")),border:e.border,"default-sort":e.defaultSort,store:e.store,"sum-text":e.computedSumText,"summary-method":e.summaryMethod},null,8,["class","border","default-sort","store","sum-text","summary-method"])):te("v-if",!0)],6),e.isEmpty?(x(),B("div",{key:0,ref:"emptyBlock",style:He(e.emptyBlockStyle),class:T(e.ns.e("empty-block"))},[H("span",{class:T(e.ns.e("empty-text"))},[ee(e.$slots,"empty",{},()=>[mt(ke(e.computedEmptyText),1)])],2)],6)):te("v-if",!0),e.$slots.append?(x(),B("div",{key:1,ref:"appendWrapper",class:T(e.ns.e("append-wrapper"))},[ee(e.$slots,"append")],2)):te("v-if",!0)]),_:3},8,["view-style","wrap-style","always","tabindex","native"])],2),e.showSummary&&e.tableLayout==="fixed"?st((x(),B("div",{key:1,ref:"footerWrapper",class:T(e.ns.e("footer-wrapper"))},[H("table",{class:T(e.ns.e("footer")),cellspacing:"0",cellpadding:"0",border:"0",style:He(e.tableBodyStyles)},[U(s,{columns:e.store.states.columns.value,"table-layout":e.tableLayout},null,8,["columns","table-layout"]),U(c,{border:e.border,"default-sort":e.defaultSort,store:e.store,"sum-text":e.computedSumText,"summary-method":e.summaryMethod},null,8,["border","default-sort","store","sum-text","summary-method"])],6)],2)),[[Ot,!e.isEmpty],[f,e.handleHeaderFooterMousewheel]]):te("v-if",!0),e.border||e.isGroup?(x(),B("div",{key:2,class:T(e.ns.e("border-left-patch"))},null,2)):te("v-if",!0)],2),st(H("div",{ref:"resizeProxy",class:T(e.ns.e("column-resize-proxy"))},null,2),[[Ot,e.resizeProxyVisible]])],46,c7)}var p7=yn(u7,[["render",f7]]);const v7={selection:"table-column--selection",expand:"table__expand-column"},h7={default:{order:""},selection:{width:48,minWidth:48,realWidth:48,order:""},expand:{width:48,minWidth:48,realWidth:48,order:""},index:{width:48,minWidth:48,realWidth:48,order:""}},m7=e=>v7[e]||"",g7={selection:{renderHeader({store:e}){function t(){return e.states.data.value&&e.states.data.value.length===0}return Ye(ja,{disabled:t(),size:e.states.tableSize.value,indeterminate:e.states.selection.value.length>0&&!e.states.isAllSelected.value,"onUpdate:modelValue":e.toggleAllSelection??void 0,modelValue:e.states.isAllSelected.value,ariaLabel:e.t("el.table.selectAllLabel")})},renderCell({row:e,column:t,store:n,$index:a}){return Ye(ja,{disabled:t.selectable?!t.selectable.call(null,e,a):!1,size:n.states.tableSize.value,onChange:()=>{n.commit("rowSelectedChanged",e)},onClick:o=>o.stopPropagation(),modelValue:n.isSelected(e),ariaLabel:n.t("el.table.selectRowLabel")})},sortable:!1,resizable:!1},index:{renderHeader({column:e}){return e.label||"#"},renderCell({column:e,$index:t}){let n=t+1;const a=e.index;return ze(a)?n=t+a:Be(a)&&(n=a(t)),Ye("div",{},[n])},sortable:!1},expand:{renderHeader({column:e}){return e.label||""},renderCell({column:e,row:t,store:n,expanded:a,$index:o}){const{ns:l}=n,s=[l.e("expand-icon")];!e.renderExpand&&a&&s.push(l.em("expand-icon","expanded"));const r=function(c){c.stopPropagation(),n.toggleRowExpansion(t)},u=n.states.rowExpandable.value?.(t,o)??!0;return u||s.push(l.is("disabled")),Ye("button",{type:"button",disabled:!u,"aria-label":n.t(a?"el.table.collapseRowLabel":"el.table.expandRowLabel"),"aria-expanded":a,class:s,onClick:r},{default:()=>e.renderExpand?[e.renderExpand({expanded:a,expandable:u})]:[Ye(Le,null,{default:()=>[Ye(Yn)]})]})},sortable:!1,resizable:!1}};function b7({row:e,column:t,$index:n}){const a=t.property,o=a&&bl(e,a).value;return t&&t.formatter?t.formatter(e,t,o,n):o?.toString?.()||""}function y7({row:e,treeNode:t,store:n},a=!1){const{ns:o}=n;if(!t)return a?[Ye("span",{class:o.e("placeholder")})]:null;const l=[],s=function(r){r.stopPropagation(),!t.loading&&n.loadOrToggle(e)};if(t.indent&&l.push(Ye("span",{class:o.e("indent"),style:{"padding-left":`${t.indent}px`}})),Dt(t.expanded)&&!t.noLazyChildren){const r=[o.e("expand-icon"),t.expanded?o.em("expand-icon","expanded"):""];let u=Yn;t.loading&&(u=wo),l.push(Ye("button",{type:"button","aria-label":n.t(t.expanded?"el.table.collapseRowLabel":"el.table.expandRowLabel"),"aria-expanded":t.expanded,class:r,onClick:s},{default:()=>[Ye(Le,{class:o.is("loading",t.loading)},{default:()=>[Ye(u)]})]}))}else l.push(Ye("span",{class:o.e("placeholder")}));return l}function My(e,t){return e.reduce((n,a)=>(n[a]=a,n),t)}function w7(e,t){const n=it();return{registerComplexWatchers:()=>{const l=["fixed"],s={realWidth:"width",realMinWidth:"minWidth"},r=My(l,s);Object.keys(r).forEach(u=>{const c=s[u];Tt(t,c)&&re(()=>t[c],d=>{let f=d;c==="width"&&u==="realWidth"&&(f=Bh(d)),c==="minWidth"&&u==="realMinWidth"&&(f=Uk(d)),n.columnConfig.value[c]=f,n.columnConfig.value[u]=f;const h=c==="fixed";e.value.store.scheduleLayout(h)})})},registerNormalWatchers:()=>{const l=["label","filters","filterMultiple","filteredValue","sortable","index","formatter","className","labelClassName","filterClassName","showOverflowTooltip","tooltipFormatter","resizable"],s=["showOverflowTooltip"],r={property:"prop",align:"realAlign",headerAlign:"realHeaderAlign"},u=My(l,r);Object.keys(u).forEach(d=>{const f=r[d];Tt(t,f)&&re(()=>t[f],h=>{n.columnConfig.value[d]=h,(d==="filters"||d==="filterMethod")&&(n.columnConfig.value.filterable=!!(n.columnConfig.value.filters||n.columnConfig.value.filterMethod))})}),s.forEach(d=>{Tt(e.value.props,d)&&re(()=>e.value.props[d],f=>{n.columnConfig.value.type!=="selection"&&St(t[d])&&(n.columnConfig.value[d]=f)})});const c=nl("table");c.value&&Tt(c.value,"showOverflowTooltip")&&re(()=>c.value?.showOverflowTooltip,d=>{n.columnConfig.value.type!=="selection"&&(!St(t.showOverflowTooltip)||!St(e.value.props.showOverflowTooltip)||(n.columnConfig.value.showOverflowTooltip=d))})}}}function C7(e,t,n){const a=it(),o=R(""),l=R(!1),s=R(),r=R(),u=fe("table");ia(()=>{s.value=e.align?`is-${e.align}`:null,s.value}),ia(()=>{r.value=e.headerAlign?`is-${e.headerAlign}`:s.value,r.value});const c=y(()=>{let C=a.vnode.vParent||a.parent;for(;C&&!C.tableId&&!C.columnId;)C=C.vnode.vParent||C.parent;return C}),d=y(()=>{const{store:C}=a.parent;if(!C)return!1;const{treeData:S}=C.states,E=S.value;return E&&Object.keys(E).length>0}),f=R(Bh(e.width)),h=R(Uk(e.minWidth)),g=C=>(f.value&&(C.width=f.value),h.value&&(C.minWidth=h.value),!f.value&&h.value&&(C.width=void 0),C.minWidth||(C.minWidth=80),C.realWidth=Number(St(C.width)?C.minWidth:C.width),C),v=C=>{const S=C.type,E=g7[S]||{};Object.keys(E).forEach($=>{const N=E[$];$!=="className"&&!St(N)&&(C[$]=N)});const O=m7(S);if(O){const $=`${i(u.namespace)}-${O}`;C.className=C.className?`${C.className} ${$}`:$}return C},p=C=>{ye(C)?C.forEach(E=>S(E)):S(C);function S(E){E?.type?.name==="ElTableColumn"&&(E.vParent=a)}};return{columnId:o,realAlign:s,isSubColumn:l,realHeaderAlign:r,columnOrTableParent:c,setColumnWidth:g,setColumnForcedProps:v,setColumnRenders:C=>{e.renderHeader?ut("TableColumn","Comparing to render-header, scoped-slot header is easier to use. We recommend users to use scoped-slot header."):C.type!=="selection"&&(C.renderHeader=E=>{if(a.columnConfig.value.label,t.header){const O=t.header(E);if(Xk(O))return Ye(Fe,O)}return mt(C.label)}),t["filter-icon"]&&(C.renderFilterIcon=E=>ee(t,"filter-icon",E)),t.expand&&(C.renderExpand=E=>ee(t,"expand",E));let S=C.renderCell;return C.type==="expand"?(C.renderCell=E=>Ye("div",{class:"cell"},[S(E)]),n.value.renderExpanded=E=>t.default?t.default(E):t.default):(S=S||b7,C.renderCell=E=>{let O=null;if(t.default){const A=t.default(E);O=A.some(F=>F.type!==un)?A:S(E)}else O=S(E);const{columns:$}=n.value.store.states,N=$.value.findIndex(A=>A.type==="default"),I=y7(E,d.value&&E.cellIndex===N),_={class:"cell",style:{}};return C.showOverflowTooltip&&(_.class=`${_.class} ${i(u.namespace)}-tooltip`,_.style={width:`${(E.column.realWidth||Number(E.column.width))-1}px`}),p(O),Ye("div",_,[I,O])}),C},getPropsData:(...C)=>C.reduce((S,E)=>(ye(E)&&E.forEach(O=>{S[O]=e[O]}),S),{}),getColumnElIndex:(C,S)=>Array.prototype.indexOf.call(C,S),updateColumnOrder:()=>{n.value.store.commit("updateColumnOrder",a.columnConfig.value)}}}var S7={type:{type:String,default:"default"},label:String,className:String,labelClassName:String,property:String,prop:String,width:{type:[String,Number],default:""},minWidth:{type:[String,Number],default:""},renderHeader:Function,sortable:{type:[Boolean,String],default:!1},sortMethod:Function,sortBy:[String,Function,Array],resizable:{type:Boolean,default:!0},columnKey:String,align:String,headerAlign:String,showOverflowTooltip:{type:[Boolean,Object],default:void 0},tooltipFormatter:Function,fixed:[Boolean,String],formatter:Function,selectable:Function,reserveSelection:Boolean,filterMethod:Function,filteredValue:Array,filters:Array,filterPlacement:String,filterMultiple:{type:Boolean,default:!0},filterClassName:String,index:[Number,Function],sortOrders:{type:Array,default:()=>["ascending","descending",null],validator:e=>e.every(t=>["ascending","descending",null].includes(t))}};let k7=1;var E7=le({name:"ElTableColumn",components:{ElCheckbox:ja},props:S7,setup(e,{slots:t}){const n=it(),a=nl("table"),o=R({}),l=y(()=>{let C=n.parent;for(;C&&!C.tableId;)C=C.parent;return C}),{registerNormalWatchers:s,registerComplexWatchers:r}=w7(l,e),{columnId:u,isSubColumn:c,realHeaderAlign:d,columnOrTableParent:f,setColumnWidth:h,setColumnForcedProps:g,setColumnRenders:v,getPropsData:p,getColumnElIndex:m,realAlign:b,updateColumnOrder:k}=C7(e,t,l),w=f.value;u.value=`${"tableId"in w&&w.tableId||"columnId"in w&&w.columnId}_column_${k7++}`,ed(()=>{c.value=l.value!==w;const C=e.type||"default",S=e.sortable===""?!0:e.sortable,E=C==="selection"?!1:St(e.showOverflowTooltip)?w.props.showOverflowTooltip??a.value?.showOverflowTooltip:e.showOverflowTooltip,O=St(e.tooltipFormatter)?w.props.tooltipFormatter??a.value?.tooltipFormatter:e.tooltipFormatter,$={...h7[C],id:u.value,type:C,property:e.prop||e.property,align:b,headerAlign:d,showOverflowTooltip:E,tooltipFormatter:O,filterable:e.filters||e.filterMethod,filteredValue:[],filterPlacement:"",filterClassName:"",isColumnGroup:!1,isSubColumn:!1,filterOpened:!1,sortable:S,index:e.index,rawColumnKey:n.vnode.key};let N=p(["columnKey","label","className","labelClassName","type","renderHeader","formatter","fixed","resizable"],["sortMethod","sortBy","sortOrders"],["selectable","reserveSelection"],["filterMethod","filters","filterMultiple","filterOpened","filteredValue","filterPlacement","filterClassName"]);N=wj($,N),N=Sj(v,h,g)(N),o.value=N,s(),r()}),ct(()=>{const C=f.value,S=c.value?C.vnode.el?.children:C.refs.hiddenColumns?.children,E=()=>m(S||[],n.vnode.el);o.value.getColumnIndex=E,E()>-1&&l.value.store.commit("insertColumn",o.value,c.value?"columnConfig"in C&&C.columnConfig.value:null,k)}),Rt(()=>{const C=o.value.getColumnIndex;(C?C():-1)>-1&&l.value.store.commit("removeColumn",o.value,c.value?"columnConfig"in w&&w.columnConfig.value:null,k)}),n.columnId=u.value,n.columnConfig=o},render(){try{const e=this.$slots.default?.({row:{},column:{},$index:-1}),t=[];if(ye(e))for(const n of e)n.type?.name==="ElTableColumn"||n.shapeFlag&2?t.push(n):n.type===Fe&&ye(n.children)&&n.children.forEach(a=>{a?.patchFlag!==1024&&!_e(a?.children)&&t.push(a)});return Ye("div",t)}catch{return Ye("div",[])}}}),n2=E7;const x7=nt(p7,{TableColumn:n2}),T7=Xt(n2);let io=(function(e){return e.ASC="asc",e.DESC="desc",e})({}),Hc=(function(e){return e.LEFT="left",e.CENTER="center",e.RIGHT="right",e})({}),$7=(function(e){return e.LEFT="left",e.RIGHT="right",e})({});const Bp={[io.ASC]:io.DESC,[io.DESC]:io.ASC},Si=Symbol("placeholder"),a2=String,Qi={type:q(Array),required:!0},Kh={type:q(Array)},o2={...Kh,required:!0},O7=String,Py={type:q(Array),default:()=>Qt([])},Fl={type:Number,required:!0},l2={type:q([String,Number,Symbol]),default:"id"},Ry={type:q(Object)},Yl=Ce({class:String,columns:Qi,columnsStyles:{type:q(Object),required:!0},depth:Number,expandColumnKey:O7,estimatedRowHeight:{...Zl.estimatedRowHeight,default:void 0},isScrolling:Boolean,onRowExpand:{type:q(Function)},onRowHover:{type:q(Function)},onRowHeightChange:{type:q(Function)},rowData:{type:q(Object),required:!0},rowEventHandlers:{type:q(Object)},rowIndex:{type:Number,required:!0},rowKey:l2,style:{type:q(Object)}}),xf={type:Number,required:!0},Wh=Ce({class:String,columns:Qi,fixedHeaderData:{type:q(Array)},headerData:{type:q(Array),required:!0},headerHeight:{type:q([Number,Array]),default:50},rowWidth:xf,rowHeight:{type:Number,default:50},height:xf,width:xf}),tc=Ce({columns:Qi,data:o2,fixedData:Kh,estimatedRowHeight:Yl.estimatedRowHeight,width:Fl,height:Fl,headerWidth:Fl,headerHeight:Wh.headerHeight,bodyWidth:Fl,rowHeight:Fl,cache:$k.cache,useIsScrolling:Boolean,scrollbarAlwaysOn:Zl.scrollbarAlwaysOn,scrollbarStartGap:Zl.scrollbarStartGap,scrollbarEndGap:Zl.scrollbarEndGap,class:a2,style:Ry,containerStyle:Ry,getRowHeight:{type:q(Function),required:!0},rowKey:Yl.rowKey,onRowsRendered:{type:q(Function)},onScroll:{type:q(Function)}}),I7=Ce({cache:tc.cache,estimatedRowHeight:Yl.estimatedRowHeight,rowKey:l2,headerClass:{type:q([String,Function])},headerProps:{type:q([Object,Function])},headerCellProps:{type:q([Object,Function])},headerHeight:Wh.headerHeight,footerHeight:{type:Number,default:0},rowClass:{type:q([String,Function])},rowProps:{type:q([Object,Function])},rowHeight:{type:Number,default:50},cellProps:{type:q([Object,Function])},columns:Qi,data:o2,dataGetter:{type:q(Function)},fixedData:Kh,expandColumnKey:Yl.expandColumnKey,expandedRowKeys:Py,defaultExpandedRowKeys:Py,class:a2,fixed:Boolean,style:{type:q(Object)},width:Fl,height:Fl,maxHeight:Number,useIsScrolling:Boolean,indentSize:{type:Number,default:12},iconSize:{type:Number,default:12},hScrollbarSize:Zl.hScrollbarSize,vScrollbarSize:Zl.vScrollbarSize,scrollbarAlwaysOn:Nk.alwaysOn,sortBy:{type:q(Object),default:()=>({})},sortState:{type:q(Object),default:void 0},onColumnSort:{type:q(Function)},onExpandedRowsChange:{type:q(Function)},onEndReached:{type:q(Function)},onRowExpand:Yl.onRowExpand,onScroll:tc.onScroll,onRowsRendered:tc.onRowsRendered,rowEventHandlers:Yl.rowEventHandlers}),N7=(e,t,n)=>{const a={flexGrow:0,flexShrink:0,...n?{}:{flexGrow:e.flexGrow??0,flexShrink:e.flexShrink??1}},o={...e.style??{},...a,flexBasis:"auto",width:e.width};return t||(e.maxWidth&&(o.maxWidth=e.maxWidth),e.minWidth&&(o.minWidth=e.minWidth)),o};function M7(e,t,n){const a=y(()=>i(t).map((m,b)=>({...m,key:m.key??m.dataKey??b}))),o=y(()=>i(a).filter(m=>!m.hidden)),l=y(()=>i(o).filter(m=>m.fixed==="left"||m.fixed===!0)),s=y(()=>i(o).filter(m=>m.fixed==="right")),r=y(()=>i(o).filter(m=>!m.fixed)),u=y(()=>{const m=[];return i(l).forEach(b=>{m.push({...b,placeholderSign:Si})}),i(r).forEach(b=>{m.push(b)}),i(s).forEach(b=>{m.push({...b,placeholderSign:Si})}),m}),c=y(()=>i(l).length||i(s).length),d=y(()=>i(a).reduce((m,b)=>(m[b.key]=N7(b,i(n),e.fixed),m),{})),f=y(()=>i(o).reduce((m,b)=>m+b.width,0)),h=m=>i(a).find(b=>b.key===m),g=m=>i(d)[m],v=(m,b)=>{m.width=b};function p(m){const{key:b}=m.currentTarget.dataset;if(!b)return;const{sortState:k,sortBy:w}=e;let C=io.ASC;et(k)?C=Bp[k[b]]:C=Bp[w.order],e.onColumnSort?.({column:h(b),key:b,order:C})}return{columns:a,columnsStyles:d,columnsTotalWidth:f,fixedColumnsOnLeft:l,fixedColumnsOnRight:s,hasFixedColumns:c,mainColumns:u,normalColumns:r,visibleColumns:o,getColumn:h,getColumnStyle:g,updateColumnWidth:v,onColumnSorted:p}}const P7=(e,{mainTableRef:t,leftTableRef:n,rightTableRef:a,onMaybeEndReached:o})=>{const l=R({scrollLeft:0,scrollTop:0});function s(g){const{scrollTop:v}=g;t.value?.scrollTo(g),n.value?.scrollToTop(v),a.value?.scrollToTop(v)}function r(g){l.value=g,s(g)}function u(g){l.value.scrollTop=g,s(i(l))}function c(g){l.value.scrollLeft=g,t.value?.scrollTo?.(i(l))}function d(g){r(g),e.onScroll?.(g)}function f({scrollTop:g}){const{scrollTop:v}=i(l);g!==v&&u(g)}function h(g,v="auto"){t.value?.scrollToRow(g,v)}return re(()=>i(l).scrollTop,(g,v)=>{g>v&&o()}),{scrollPos:l,scrollTo:r,scrollToLeft:c,scrollToTop:u,scrollToRow:h,onScroll:d,onVerticalScroll:f}},R7=(e,{mainTableRef:t,leftTableRef:n,rightTableRef:a,tableInstance:o,ns:l,isScrolling:s})=>{const r=it(),{emit:u}=r,c=jt(!1),d=R(e.defaultExpandedRowKeys||[]),f=R(-1),h=jt(null),g=R({}),v=R({}),p=jt({}),m=jt({}),b=jt({}),k=y(()=>ze(e.estimatedRowHeight));function w(I){e.onRowsRendered?.(I),I.rowCacheEnd>i(f)&&(f.value=I.rowCacheEnd)}function C({hovered:I,rowKey:_}){s.value||o.vnode.el.querySelectorAll(`[rowkey="${String(_)}"]`).forEach(A=>{I?A.classList.add(l.is("hovered")):A.classList.remove(l.is("hovered"))})}function S({expanded:I,rowData:_,rowIndex:A,rowKey:F}){const K=[...i(d)],Y=K.indexOf(F);I?Y===-1&&K.push(F):Y>-1&&K.splice(Y,1),d.value=K,u("update:expandedRowKeys",K),e.onRowExpand?.({expanded:I,rowData:_,rowIndex:A,rowKey:F}),e.onExpandedRowsChange?.(K),o.vnode.el.querySelector(`.${l.is("hovered")}[rowkey="${String(F)}"]`)&&Oe(()=>C({hovered:!0,rowKey:F}))}const E=bo(()=>{c.value=!0,g.value={...i(g),...i(v)},O(i(h),!1),v.value={},h.value=null,t.value?.forceUpdate(),n.value?.forceUpdate(),a.value?.forceUpdate(),r.proxy?.$forceUpdate(),c.value=!1},0);function O(I,_=!1){i(k)&&[t,n,a].forEach(A=>{const F=i(A);F&&F.resetAfterRowIndex(I,_)})}function $(I,_,A){const F=i(h);(F===null||F>A)&&(h.value=A),v.value[I]=_}function N({rowKey:I,height:_,rowIndex:A},F){F?F===$7.RIGHT?b.value[I]=_:p.value[I]=_:m.value[I]=_;const K=Math.max(...[p,b,m].map(Y=>Y.value[I]||0));i(g)[I]!==K&&($(I,K,A),E())}return{expandedRowKeys:d,lastRenderedRowIndex:f,isDynamic:k,isResetting:c,rowHeights:g,resetAfterIndex:O,onRowExpanded:S,onRowHovered:C,onRowsRendered:w,onRowHeightChange:N}},A7=(e,{expandedRowKeys:t,lastRenderedRowIndex:n,resetAfterIndex:a})=>{const o=R({}),l=y(()=>{const r={},{data:u,rowKey:c}=e,d=i(t);if(!d||!d.length)return u;const f=[],h=new Set;d.forEach(v=>h.add(v));let g=u.slice();for(g.forEach(v=>r[v[c]]=0);g.length>0;){const v=g.shift();f.push(v),h.has(v[c])&&ye(v.children)&&v.children.length>0&&(g=[...v.children,...g],v.children.forEach(p=>r[p[c]]=r[v[c]]+1))}return o.value=r,f}),s=y(()=>{const{data:r,expandColumnKey:u}=e;return u?i(l):r});return re(s,(r,u)=>{r!==u&&(n.value=-1,a(0,!0))}),{data:s,depthMap:o}},_7=(e,t)=>e+t,nc=e=>ye(e)?e.reduce(_7,0):e,ss=(e,t,n={})=>Be(e)?e(t):e??n,gl=e=>(["width","maxWidth","minWidth","height"].forEach(t=>{e[t]=en(e[t])}),e),s2=e=>zt(e)?t=>Ye(e,t):e,L7=(e,{columnsTotalWidth:t,rowsHeight:n,fixedColumnsOnLeft:a,fixedColumnsOnRight:o})=>{const l=y(()=>{const{fixed:p,width:m,vScrollbarSize:b}=e,k=m-b;return p?Math.max(Math.round(i(t)),k):k}),s=y(()=>{const{height:p=0,maxHeight:m=0,footerHeight:b,hScrollbarSize:k}=e;if(m>0){const w=i(h),C=i(n),S=i(f)+w+C+k;return Math.min(S,m-b)}return p-b}),r=y(()=>{const{maxHeight:p}=e,m=i(s);if(ze(p)&&p>0)return m;const b=i(n)+i(f)+i(h);return Math.min(m,b)}),u=p=>p.width,c=y(()=>nc(i(a).map(u))),d=y(()=>nc(i(o).map(u))),f=y(()=>nc(e.headerHeight)),h=y(()=>(e.fixedData?.length||0)*e.rowHeight),g=y(()=>i(s)-i(f)-i(h)),v=y(()=>{const{style:p={},height:m,width:b}=e;return gl({...p,height:m,width:b})});return{bodyWidth:l,fixedTableHeight:r,mainTableHeight:s,leftTableWidth:c,rightTableWidth:d,windowHeight:g,footerHeight:y(()=>gl({height:e.footerHeight})),emptyStyle:y(()=>({top:en(i(f)),bottom:en(e.footerHeight),width:en(e.width)})),rootStyle:v,headerHeight:f}};function D7(e){const t=R(),n=R(),a=R(),{columns:o,columnsStyles:l,columnsTotalWidth:s,fixedColumnsOnLeft:r,fixedColumnsOnRight:u,hasFixedColumns:c,mainColumns:d,onColumnSorted:f}=M7(e,_t(e,"columns"),_t(e,"fixed")),{scrollTo:h,scrollToLeft:g,scrollToTop:v,scrollToRow:p,onScroll:m,onVerticalScroll:b,scrollPos:k}=P7(e,{mainTableRef:t,leftTableRef:n,rightTableRef:a,onMaybeEndReached:J}),w=fe("table-v2"),C=it(),S=jt(!1),{expandedRowKeys:E,lastRenderedRowIndex:O,isDynamic:$,isResetting:N,rowHeights:I,resetAfterIndex:_,onRowExpanded:A,onRowHeightChange:F,onRowHovered:K,onRowsRendered:Y}=R7(e,{mainTableRef:t,leftTableRef:n,rightTableRef:a,tableInstance:C,ns:w,isScrolling:S}),{data:W,depthMap:P}=A7(e,{expandedRowKeys:E,lastRenderedRowIndex:O,resetAfterIndex:_}),M=y(()=>{const{estimatedRowHeight:se,rowHeight:ce}=e,he=i(W);return ze(se)?Object.values(i(I)).reduce((Se,Ie)=>Se+Ie,0):he.length*ce}),{bodyWidth:L,fixedTableHeight:D,mainTableHeight:V,leftTableWidth:G,rightTableWidth:j,windowHeight:X,footerHeight:Q,emptyStyle:ve,rootStyle:ue,headerHeight:ge}=L7(e,{columnsTotalWidth:s,fixedColumnsOnLeft:r,fixedColumnsOnRight:u,rowsHeight:M}),ie=R(),ae=y(()=>{const se=i(W).length===0;return ye(e.fixedData)?e.fixedData.length===0&&se:se});function ne(se){const{estimatedRowHeight:ce,rowHeight:he,rowKey:Se}=e;return ce?i(I)[i(W)[se][Se]]||ce:he}const z=R(!1);function J(){const{onEndReached:se}=e;if(!se)return;const{scrollTop:ce}=i(k),he=i(M),Se=he-(ce+i(X))+e.hScrollbarSize;!z.value&&i(O)>=0&&he<=ce+i(V)-i(ge)?(z.value=!0,se(Se)):z.value=!1}return re(()=>i(M),()=>z.value=!1),re(()=>e.expandedRowKeys,se=>E.value=se,{deep:!0}),{columns:o,containerRef:ie,mainTableRef:t,leftTableRef:n,rightTableRef:a,isDynamic:$,isResetting:N,isScrolling:S,hasFixedColumns:c,columnsStyles:l,columnsTotalWidth:s,data:W,expandedRowKeys:E,depthMap:P,fixedColumnsOnLeft:r,fixedColumnsOnRight:u,mainColumns:d,bodyWidth:L,emptyStyle:ve,rootStyle:ue,footerHeight:Q,mainTableHeight:V,fixedTableHeight:D,leftTableWidth:G,rightTableWidth:j,showEmpty:ae,getRowHeight:ne,onColumnSorted:f,onRowHovered:K,onRowExpanded:A,onRowsRendered:Y,onRowHeightChange:F,scrollTo:h,scrollToLeft:g,scrollToTop:v,scrollToRow:p,onScroll:m,onVerticalScroll:b}}const jh=Symbol("tableV2"),r2="tableV2GridScrollLeft",B7=le({name:"ElTableV2Header",props:Wh,setup(e,{slots:t,expose:n}){const a=fe("table-v2"),o=Re(r2),l=R(),s=y(()=>gl({width:e.width,height:e.height})),r=y(()=>gl({width:e.rowWidth,height:e.height})),u=y(()=>Cn(i(e.headerHeight))),c=h=>{const g=i(l);Oe(()=>{g?.scroll&&g.scroll({left:h})})},d=()=>{const h=a.e("fixed-header-row"),{columns:g,fixedHeaderData:v,rowHeight:p}=e;return v?.map((m,b)=>{const k=gl({height:p,width:"100%"});return t.fixed?.({class:h,columns:g,rowData:m,rowIndex:-(b+1),style:k})})},f=()=>{const h=a.e("dynamic-header-row"),{columns:g}=e;return i(u).map((v,p)=>{const m=gl({width:"100%",height:v});return t.dynamic?.({class:h,columns:g,headerIndex:p,style:m})})};return Ya(()=>{o?.value&&c(o.value)}),n({scrollToLeft:c}),()=>{if(!(e.height<=0))return U("div",{ref:l,class:e.class,style:i(s),role:"rowgroup"},[U("div",{style:i(r),class:a.e("header")},[f(),d()])])}}}),V7="ElTableV2Grid",F7=e=>{const t=R(),n=R(),a=R(0),o=y(()=>{const{data:m,rowHeight:b,estimatedRowHeight:k}=e;if(!k)return m.length*b}),l=y(()=>{const{fixedData:m,rowHeight:b}=e;return(m?.length||0)*b}),s=y(()=>nc(e.headerHeight)),r=y(()=>{const{height:m}=e;return Math.max(0,m-i(s)-i(l))}),u=y(()=>i(s)+i(l)>0),c=({data:m,rowIndex:b})=>m[b][e.rowKey];function d({rowCacheStart:m,rowCacheEnd:b,rowVisibleStart:k,rowVisibleEnd:w}){e.onRowsRendered?.({rowCacheStart:m,rowCacheEnd:b,rowVisibleStart:k,rowVisibleEnd:w})}function f(m,b){n.value?.resetAfterRowIndex(m,b)}function h(m,b){const k=i(t),w=i(n);et(m)?(k?.scrollToLeft(m.scrollLeft),a.value=m.scrollLeft,w?.scrollTo(m)):(k?.scrollToLeft(m),a.value=m,w?.scrollTo({scrollLeft:m,scrollTop:b}))}function g(m){i(n)?.scrollTo({scrollTop:m})}function v(m,b){const k=i(n);if(!k)return;const w=a.value;k.scrollToItem(m,0,b),w&&h({scrollLeft:w})}function p(){i(n)?.$forceUpdate(),i(t)?.$forceUpdate()}return re(()=>e.bodyWidth,()=>{ze(e.estimatedRowHeight)&&n.value?.resetAfter({columnIndex:0},!1)}),{bodyRef:n,forceUpdate:p,fixedRowHeight:l,gridHeight:r,hasHeader:u,headerHeight:s,headerRef:t,totalHeight:o,itemKey:c,onItemRendered:d,resetAfterRowIndex:f,scrollTo:h,scrollToTop:g,scrollToRow:v,scrollLeft:a}},Yh=le({name:V7,props:tc,setup(e,{slots:t,expose:n}){const{ns:a}=Re(jh),{bodyRef:o,fixedRowHeight:l,gridHeight:s,hasHeader:r,headerRef:u,headerHeight:c,totalHeight:d,forceUpdate:f,itemKey:h,onItemRendered:g,resetAfterRowIndex:v,scrollTo:p,scrollToTop:m,scrollToRow:b,scrollLeft:k}=F7(e);gt(r2,k),$i(async()=>{await Oe();const C=o.value?.states.scrollTop;C&&m(Math.round(C)+1)}),n({forceUpdate:f,totalHeight:d,scrollTo:p,scrollToTop:m,scrollToRow:b,resetAfterRowIndex:v});const w=()=>e.bodyWidth;return()=>{const{cache:C,columns:S,data:E,fixedData:O,useIsScrolling:$,scrollbarAlwaysOn:N,scrollbarEndGap:I,scrollbarStartGap:_,style:A,rowHeight:F,bodyWidth:K,estimatedRowHeight:Y,headerWidth:W,height:P,width:M,getRowHeight:L,onScroll:D}=e,V=ze(Y),G=V?JW:qW,j=i(c);return U("div",{role:"table",class:[a.e("table"),e.class],style:A},[U(G,{ref:o,data:E,useIsScrolling:$,itemKey:h,columnCache:0,columnWidth:V?w:K,totalColumn:1,totalRow:E.length,rowCache:C,rowHeight:V?L:F,width:M,height:i(s),class:a.e("body"),role:"rowgroup",scrollbarStartGap:_,scrollbarEndGap:I,scrollbarAlwaysOn:N,onScroll:D,onItemRendered:g,perfMode:!1},{default:X=>{const Q=E[X.rowIndex];return t.row?.({...X,columns:S,rowData:Q})}}),i(r)&&U(B7,{ref:u,class:a.e("header-wrapper"),columns:S,headerData:E,headerHeight:e.headerHeight,fixedHeaderData:O,rowWidth:W,rowHeight:F,width:M,height:Math.min(j+i(l),P)},{dynamic:t.header,fixed:t.row})])}}});function z7(e){return typeof e=="function"||Object.prototype.toString.call(e)==="[object Object]"&&!zt(e)}const H7=(e,{slots:t})=>{const{mainTableRef:n,...a}=e;return U(Yh,rt({ref:n},a),z7(t)?t:{default:()=>[t]})};function K7(e){return typeof e=="function"||Object.prototype.toString.call(e)==="[object Object]"&&!zt(e)}const W7=(e,{slots:t})=>{if(!e.columns.length)return;const{leftTableRef:n,...a}=e;return U(Yh,rt({ref:n},a),K7(t)?t:{default:()=>[t]})};function j7(e){return typeof e=="function"||Object.prototype.toString.call(e)==="[object Object]"&&!zt(e)}const Y7=(e,{slots:t})=>{if(!e.columns.length)return;const{rightTableRef:n,...a}=e;return U(Yh,rt({ref:n},a),j7(t)?t:{default:()=>[t]})},U7=e=>{const{isScrolling:t}=Re(jh),n=R(!1),a=R(),o=y(()=>ze(e.estimatedRowHeight)&&e.rowIndex>=0),l=(u=!1)=>{const c=i(a);if(!c)return;const{columns:d,onRowHeightChange:f,rowKey:h,rowIndex:g,style:v}=e,{height:p}=c.getBoundingClientRect();n.value=!0,Oe(()=>{if(u||p!==Number.parseInt(v.height)){const m=d[0],b=m?.placeholderSign===Si;f?.({rowKey:h,height:p,rowIndex:g},m&&!b&&m.fixed)}})},s=y(()=>{const{rowData:u,rowIndex:c,rowKey:d,onRowHover:f}=e,h=e.rowEventHandlers||{},g={};return Object.entries(h).forEach(([v,p])=>{Be(p)&&(g[v]=m=>{p({event:m,rowData:u,rowIndex:c,rowKey:d})})}),f&&[{name:"onMouseleave",hovered:!1},{name:"onMouseenter",hovered:!0}].forEach(({name:v,hovered:p})=>{const m=g[v];g[v]=b=>{f({event:b,hovered:p,rowData:u,rowIndex:c,rowKey:d}),m?.(b)}}),g}),r=u=>{const{onRowExpand:c,rowData:d,rowIndex:f,rowKey:h}=e;c?.({expanded:u,rowData:d,rowIndex:f,rowKey:h})};return ct(()=>{i(o)&&l(!0)}),{isScrolling:t,measurable:o,measured:n,rowRef:a,eventHandlers:s,onExpand:r}},q7=le({name:"ElTableV2TableRow",props:Yl,setup(e,{expose:t,slots:n,attrs:a}){const{eventHandlers:o,isScrolling:l,measurable:s,measured:r,rowRef:u,onExpand:c}=U7(e);return t({onExpand:c}),()=>{const{columns:d,columnsStyles:f,expandColumnKey:h,depth:g,rowData:v,rowIndex:p,style:m}=e;let b=d.map((k,w)=>{const C=ye(v.children)&&v.children.length>0&&k.key===h;return n.cell({column:k,columns:d,columnIndex:w,depth:g,style:f[k.key],rowData:v,rowIndex:p,isScrolling:i(l),expandIconProps:C?{rowData:v,rowIndex:p,onExpand:c}:void 0})});if(n.row&&(b=n.row({cells:b.map(k=>ye(k)&&k.length===1?k[0]:k),style:m,columns:d,depth:g,rowData:v,rowIndex:p,isScrolling:i(l)})),i(s)){const{height:k,...w}=m||{},C=i(r);return U("div",rt({ref:u,class:e.class,style:C?m:w,role:"row"},a,i(o)),[b])}return U("div",rt(a,{ref:u,class:e.class,style:m,role:"row"},i(o)),[b])}}});function G7(e){return typeof e=="function"||Object.prototype.toString.call(e)==="[object Object]"&&!zt(e)}const X7=(e,{slots:t})=>{const{columns:n,columnsStyles:a,depthMap:o,expandColumnKey:l,expandedRowKeys:s,estimatedRowHeight:r,hasFixedColumns:u,rowData:c,rowIndex:d,style:f,isScrolling:h,rowProps:g,rowClass:v,rowKey:p,rowEventHandlers:m,ns:b,onRowHovered:k,onRowExpanded:w}=e,C=ss(v,{columns:n,rowData:c,rowIndex:d},""),S=ss(g,{columns:n,rowData:c,rowIndex:d}),E=c[p],O=o[E]||0,$=!!l,N=d<0,I=[b.e("row"),C,b.is("expanded",$&&s.includes(E)),b.is("fixed",!O&&N),b.is("customized",!!t.row),{[b.e(`row-depth-${O}`)]:$&&d>=0}],_=u?k:void 0,A={...S,columns:n,columnsStyles:a,class:I,depth:O,expandColumnKey:l,estimatedRowHeight:N?void 0:r,isScrolling:h,rowIndex:d,rowData:c,rowKey:E,rowEventHandlers:m,style:f};return U(q7,rt(A,{onRowExpand:w,onMouseenter:Y=>{_?.({hovered:!0,rowKey:E,event:Y,rowData:c,rowIndex:d})},onMouseleave:Y=>{_?.({hovered:!1,rowKey:E,event:Y,rowData:c,rowIndex:d})},rowkey:E}),G7(t)?t:{default:()=>[t]})},Uh=(e,{slots:t})=>{const{cellData:n,style:a}=e,o=n?.toString?.()||"",l=ee(t,"default",e,()=>[o]);return U("div",{class:e.class,title:o,style:a},[l])};Uh.displayName="ElTableV2Cell";Uh.inheritAttrs=!1;const i2=e=>{const{expanded:t,expandable:n,onExpand:a,style:o,size:l,ariaLabel:s}=e;return U("button",rt({onClick:n?()=>a(!t):void 0,ariaLabel:s,ariaExpanded:t,class:e.class},{type:"button"}),[U(Le,{size:l,style:o},{default:()=>[U(Yn,null,null)]})])};i2.inheritAttrs=!1;const Vp=({columns:e,column:t,columnIndex:n,depth:a,expandIconProps:o,isScrolling:l,rowData:s,rowIndex:r,style:u,expandedRowKeys:c,ns:d,t:f,cellProps:h,expandColumnKey:g,indentSize:v,iconSize:p,rowKey:m},{slots:b})=>{const k=gl(u);if(t.placeholderSign===Si)return U("div",{class:d.em("row-cell","placeholder"),style:k},null);const{cellRenderer:w,dataKey:C,dataGetter:S}=t,E=Be(S)?S({columns:e,column:t,columnIndex:n,rowData:s,rowIndex:r}):fn(s,C??""),O=ss(h,{cellData:E,columns:e,column:t,columnIndex:n,rowIndex:r,rowData:s}),$={class:d.e("cell-text"),columns:e,column:t,columnIndex:n,cellData:E,isScrolling:l,rowData:s,rowIndex:r},N=s2(w),I=N?N($):ee(b,"default",$,()=>[U(Uh,$,null)]),_=[d.e("row-cell"),t.class,t.align===Hc.CENTER&&d.is("align-center"),t.align===Hc.RIGHT&&d.is("align-right")],A=r>=0&&g&&t.key===g,F=r>=0&&c.includes(s[m]);let K;const Y=`margin-inline-start: ${a*v}px;`;return A&&(et(o)?K=U(i2,rt(o,{class:[d.e("expand-icon"),d.is("expanded",F)],size:p,expanded:F,ariaLabel:f(F?"el.table.collapseRowLabel":"el.table.expandRowLabel"),style:Y,expandable:!0}),null):K=U("div",{style:[Y,`width: ${p}px; height: ${p}px;`].join(" ")},null)),U("div",rt({class:_,style:k},O,{role:"cell"}),[K,I])};Vp.inheritAttrs=!1;const Z7=Ce({class:String,columns:Qi,columnsStyles:{type:q(Object),required:!0},headerIndex:Number,style:{type:q(Object)}}),J7=le({name:"ElTableV2HeaderRow",props:Z7,setup(e,{slots:t}){return()=>{const{columns:n,columnsStyles:a,headerIndex:o,style:l}=e;let s=n.map((r,u)=>t.cell({columns:n,column:r,columnIndex:u,headerIndex:o,style:a[r.key]}));return t.header&&(s=t.header({cells:s.map(r=>ye(r)&&r.length===1?r[0]:r),columns:n,headerIndex:o})),U("div",{class:e.class,style:l,role:"row"},[s])}}});function Q7(e){return typeof e=="function"||Object.prototype.toString.call(e)==="[object Object]"&&!zt(e)}const eY=({columns:e,columnsStyles:t,headerIndex:n,style:a,headerClass:o,headerProps:l,ns:s},{slots:r})=>{const u={columns:e,headerIndex:n},c=[s.e("header-row"),ss(o,u,""),s.is("customized",!!r.header)];return U(J7,{...ss(l,u),columnsStyles:t,class:c,columns:e,headerIndex:n,style:a},Q7(r)?r:{default:()=>[r]})},qh=(e,{slots:t})=>ee(t,"default",e,()=>[U("div",{class:e.class,title:e.column?.title},[e.column?.title])]);qh.displayName="ElTableV2HeaderCell";qh.inheritAttrs=!1;const tY=e=>{const{sortOrder:t}=e;return U("button",{type:"button","aria-label":e.ariaLabel,class:e.class},[U(Le,{size:14},{default:()=>[t===io.ASC?U(K3,null,null):U(z3,null,null)]})])},Ay=(e,{slots:t})=>{const{column:n,ns:a,t:o,style:l,onColumnSorted:s}=e,r=gl(l);if(n.placeholderSign===Si)return U("div",{class:a.em("header-row-cell","placeholder"),style:r},null);const{headerCellRenderer:u,headerClass:c,sortable:d}=n,f={...e,class:a.e("header-cell-text")},h=s2(u),g=h?h(f):ee(t,"default",f,()=>[U(qh,f,null)]),{sortBy:v,sortState:p,headerCellProps:m}=e;let b,k,w;if(p){const S=p[n.key];b=!!Bp[S],k=b?S:io.ASC}else b=n.key===v.key,k=b?v.order:io.ASC;k===io.ASC?w="ascending":k===io.DESC?w="descending":w=void 0;const C=[a.e("header-cell"),ss(c,e,""),n.align===Hc.CENTER&&a.is("align-center"),n.align===Hc.RIGHT&&a.is("align-right"),d&&a.is("sortable")];return U("div",rt({...ss(m,e),onClick:n.sortable?s:void 0,ariaSort:d?w:void 0,class:C,style:r,"data-key":n.key},{role:"columnheader"}),[g,d&&U(tY,{class:[a.e("sort-icon"),b&&a.is("sorting")],sortOrder:k,ariaLabel:o("el.table.sortLabel",{column:n.title||""})},null)])},u2=(e,{slots:t})=>U("div",{class:e.class,style:e.style},[t.default?.()]);u2.displayName="ElTableV2Footer";const c2=(e,{slots:t})=>{const n=ee(t,"default",{},()=>[U(hk,null,null)]);return U("div",{class:e.class,style:e.style},[n])};c2.displayName="ElTableV2Empty";const d2=(e,{slots:t})=>U("div",{class:e.class,style:e.style},[t.default?.()]);d2.displayName="ElTableV2Overlay";function $r(e){return typeof e=="function"||Object.prototype.toString.call(e)==="[object Object]"&&!zt(e)}const nY=le({name:"ElTableV2",props:I7,setup(e,{slots:t,expose:n}){const a=fe("table-v2"),{t:o}=bt(),{columnsStyles:l,fixedColumnsOnLeft:s,fixedColumnsOnRight:r,mainColumns:u,mainTableHeight:c,fixedTableHeight:d,leftTableWidth:f,rightTableWidth:h,data:g,depthMap:v,expandedRowKeys:p,hasFixedColumns:m,mainTableRef:b,leftTableRef:k,rightTableRef:w,isDynamic:C,isResetting:S,isScrolling:E,bodyWidth:O,emptyStyle:$,rootStyle:N,footerHeight:I,showEmpty:_,scrollTo:A,scrollToLeft:F,scrollToTop:K,scrollToRow:Y,getRowHeight:W,onColumnSorted:P,onRowHeightChange:M,onRowHovered:L,onRowExpanded:D,onRowsRendered:V,onScroll:G,onVerticalScroll:j}=D7(e);return n({scrollTo:A,scrollToLeft:F,scrollToTop:K,scrollToRow:Y}),gt(jh,{ns:a,isResetting:S,isScrolling:E}),()=>{const{cache:X,cellProps:Q,estimatedRowHeight:ve,expandColumnKey:ue,fixedData:ge,headerHeight:ie,headerClass:ae,headerProps:ne,headerCellProps:z,sortBy:J,sortState:se,rowHeight:ce,rowClass:he,rowEventHandlers:Se,rowKey:Ie,rowProps:Ne,scrollbarAlwaysOn:Te,indentSize:pe,iconSize:Ee,useIsScrolling:me,vScrollbarSize:Pe,width:Ke}=e,Ge=i(g),Me={cache:X,class:a.e("main"),columns:i(u),data:Ge,fixedData:ge,estimatedRowHeight:ve,bodyWidth:i(O),headerHeight:ie,headerWidth:i(O),height:i(c),mainTableRef:b,rowKey:Ie,rowHeight:ce,scrollbarAlwaysOn:Te,scrollbarStartGap:2,scrollbarEndGap:Pe,useIsScrolling:me,width:Ke,getRowHeight:W,onRowsRendered:V,onScroll:G},Ae=i(f),We=i(d),xt={cache:X,class:a.e("left"),columns:i(s),data:Ge,fixedData:ge,estimatedRowHeight:ve,leftTableRef:k,rowHeight:ce,bodyWidth:Ae,headerWidth:Ae,headerHeight:ie,height:We,rowKey:Ie,scrollbarAlwaysOn:Te,scrollbarStartGap:2,scrollbarEndGap:Pe,useIsScrolling:me,width:Ae,getRowHeight:W,onScroll:j},je=i(h),at={cache:X,class:a.e("right"),columns:i(r),data:Ge,fixedData:ge,estimatedRowHeight:ve,rightTableRef:w,rowHeight:ce,bodyWidth:je,headerWidth:je,headerHeight:ie,height:We,rowKey:Ie,scrollbarAlwaysOn:Te,scrollbarStartGap:2,scrollbarEndGap:Pe,width:je,style:`${a.cssVarName("table-scrollbar-size")}: ${Pe}px`,useIsScrolling:me,getRowHeight:W,onScroll:j},ft=i(l),yt={ns:a,depthMap:i(v),columnsStyles:ft,expandColumnKey:ue,expandedRowKeys:i(p),estimatedRowHeight:ve,hasFixedColumns:i(m),rowProps:Ne,rowClass:he,rowKey:Ie,rowEventHandlers:Se,onRowHovered:L,onRowExpanded:D,onRowHeightChange:M},be={cellProps:Q,expandColumnKey:ue,indentSize:pe,iconSize:Ee,rowKey:Ie,expandedRowKeys:i(p),ns:a,t:o},Ve={ns:a,headerClass:ae,headerProps:ne,columnsStyles:ft},de={ns:a,t:o,sortBy:J,sortState:se,headerCellProps:z,onColumnSorted:P},Ue={row:xn=>U(X7,rt(xn,yt),{row:t.row,cell:De=>{let Je;return t.cell?U(Vp,rt(De,be,{style:ft[De.column.key]}),$r(Je=t.cell(De))?Je:{default:()=>[Je]}):U(Vp,rt(De,be,{style:ft[De.column.key]}),null)}}),header:xn=>U(eY,rt(xn,Ve),{header:t.header,cell:De=>{let Je;return t["header-cell"]?U(Ay,rt(De,de,{style:ft[De.column.key]}),$r(Je=t["header-cell"](De))?Je:{default:()=>[Je]}):U(Ay,rt(De,de,{style:ft[De.column.key]}),null)}})},kt=[e.class,a.b(),a.e("root"),a.is("dynamic",i(C))],qt={class:a.e("footer"),style:i(I)};return U("div",{class:kt,style:i(N)},[U(H7,Me,$r(Ue)?Ue:{default:()=>[Ue]}),U(W7,xt,$r(Ue)?Ue:{default:()=>[Ue]}),U(Y7,at,$r(Ue)?Ue:{default:()=>[Ue]}),t.footer&&U(u2,qt,{default:t.footer}),i(_)&&U(c2,{class:a.e("empty"),style:i($)},{default:t.empty}),t.overlay&&U(d2,{class:a.e("overlay")},{default:t.overlay})])}}}),aY=Ce({disableWidth:Boolean,disableHeight:Boolean,onResize:{type:q(Function)}}),oY=e=>{const t=R(),n=R(0),a=R(0);let o;return ct(()=>{o=Ut(t,([l])=>{const{width:s,height:r}=l.contentRect,{paddingLeft:u,paddingRight:c,paddingTop:d,paddingBottom:f}=getComputedStyle(l.target),h=Number.parseInt(u)||0,g=Number.parseInt(c)||0,v=Number.parseInt(d)||0,p=Number.parseInt(f)||0;n.value=s-h-g,a.value=r-v-p}).stop}),Rt(()=>{o?.()}),re([n,a],([l,s])=>{e.onResize?.({width:l,height:s})}),{sizer:t,width:n,height:a}},lY=le({name:"ElAutoResizer",props:aY,setup(e,{slots:t}){const n=fe("auto-resizer"),{height:a,width:o,sizer:l}=oY(e),s={width:"100%",height:"100%"};return()=>U("div",{ref:l,class:n.b(),style:s},[t.default?.({height:a.value,width:o.value})])}}),sY=nt(nY),rY=nt(lY),Pd=Symbol("tabsRootContextKey"),iY=Ce({tabs:{type:q(Array),default:()=>Qt([])},tabRefs:{type:q(Object),default:()=>Qt({})}}),_y="ElTabBar";var uY=le({name:_y,__name:"tab-bar",props:iY,setup(e,{expose:t}){const n=e,a=Re(Pd);a||Gt(_y,"");const o=fe("tabs"),l=R(),s=R(),r=y(()=>St(a.props.defaultValue)||!!s.value?.transform),u=()=>{let g=0,v=0;const p=["top","bottom"].includes(a.props.tabPosition)?"width":"height",m=p==="width"?"x":"y",b=m==="x"?"left":"top";return n.tabs.every(k=>{if(St(k.paneName))return!1;const w=n.tabRefs[k.paneName];if(!w)return!1;if(!k.active)return!0;g=w[`offset${fl(b)}`],v=w[`client${fl(p)}`];const C=window.getComputedStyle(w);return p==="width"&&(v-=Number.parseFloat(C.paddingLeft)+Number.parseFloat(C.paddingRight),g+=Number.parseFloat(C.paddingLeft)),!1}),{[p]:`${v}px`,transform:`translate${fl(m)}(${g}px)`}},c=()=>s.value=u(),d=[],f=()=>{d.forEach(g=>g.stop()),d.length=0,Object.values(n.tabRefs).forEach(g=>{d.push(Ut(g,c))})};re(()=>n.tabs,async()=>{await Oe(),c(),f()},{immediate:!0});const h=Ut(l,()=>c());return Rt(()=>{d.forEach(g=>g.stop()),d.length=0,h.stop()}),t({ref:l,update:c}),(g,v)=>r.value?(x(),B("div",{key:0,ref_key:"barRef",ref:l,class:T([i(o).e("active-bar"),i(o).is(i(a).props.tabPosition)]),style:He(s.value)},null,6)):te("v-if",!0)}}),cY=uY;const dY=Ce({panes:{type:q(Array),default:()=>Qt([])},currentName:{type:[String,Number],default:""},editable:Boolean,type:{type:String,values:["card","border-card",""],default:""},stretch:Boolean,tabindex:{type:[String,Number],default:void 0}}),fY={tabClick:(e,t,n)=>n instanceof Event,tabRemove:(e,t)=>t instanceof Event},Ly="ElTabNav",pY=le({name:Ly,props:dY,emits:fY,setup(e,{expose:t,emit:n}){const a=Re(Pd);a||Gt(Ly,"");const o=fe("tabs"),l=dP(),s=pP(),r=R(),u=R(),c=R(),d=R({}),f=R(),h=R(!1),g=R(0),v=R(!1),p=R(!0),m=jt(),b=y(()=>["top","bottom"].includes(a.props.tabPosition)),k=y(()=>b.value?"width":"height"),w=y(()=>({transform:`translate${k.value==="width"?"X":"Y"}(-${g.value}px)`})),{width:C,height:S}=qf(r),{width:E,height:O}=qf(u,{width:0,height:0},{box:"border-box"}),$=y(()=>b.value?C.value:S.value),N=y(()=>b.value?E.value:O.value),{onWheel:I}=Pk({atStartEdge:y(()=>g.value<=0),atEndEdge:y(()=>N.value-g.value<=$.value),layout:y(()=>b.value?"horizontal":"vertical")},D=>{g.value=zl(g.value+D,0,N.value-$.value)}),_=()=>{if(!r.value)return;const D=r.value[`offset${fl(k.value)}`],V=g.value;V&&(g.value=V>D?V-D:0)},A=()=>{if(!r.value||!u.value)return;const D=u.value[`offset${fl(k.value)}`],V=r.value[`offset${fl(k.value)}`],G=g.value;D-G<=V||(g.value=D-G>V*2?G+V:D-V)},F=async()=>{const D=u.value;if(!h.value||!c.value||!r.value||!D)return;await Oe();const V=d.value[e.currentName];if(!V)return;const G=r.value,j=V.getBoundingClientRect(),X=G.getBoundingClientRect(),Q=b.value?D.offsetWidth-X.width:D.offsetHeight-X.height,ve=g.value;let ue=ve;b.value?(j.leftX.right&&(ue=ve+j.right-X.right)):(j.topX.bottom&&(ue=ve+(j.bottom-X.bottom))),ue=Math.max(ue,0),g.value=Math.min(ue,Q)},K=()=>{if(!u.value||!r.value)return;e.stretch&&f.value?.update();const D=u.value[`offset${fl(k.value)}`],V=r.value[`offset${fl(k.value)}`],G=g.value;V0&&(g.value=0))},Y=D=>{const V=Ft(D);let G=0;switch(V){case we.left:case we.up:G=-1;break;case we.right:case we.down:G=1;break;default:return}const j=Array.from(D.currentTarget.querySelectorAll("[role=tab]:not(.is-disabled)"));let X=j.indexOf(D.target)+G;X<0?X=j.length-1:X>=j.length&&(X=0),j[X].focus({preventScroll:!0}),j[X].click(),W()},W=()=>{p.value&&(v.value=!0)},P=()=>v.value=!1,M=(D,V)=>{d.value[V]=D},L=async()=>{await Oe(),d.value[e.currentName]?.focus({preventScroll:!0})};return re(l,D=>{D==="hidden"?p.value=!1:D==="visible"&&setTimeout(()=>p.value=!0,50)}),re(s,D=>{D?setTimeout(()=>p.value=!0,50):p.value=!1}),Ut(c,()=>{Fa(K)}),ct(()=>setTimeout(()=>F(),0)),Ya(()=>K()),t({scrollToActiveTab:F,removeFocus:P,focusActiveTab:L,tabListRef:u,tabBarRef:f,scheduleRender:()=>Nu(m)}),()=>{const D=h.value?[U("span",{class:[o.e("nav-prev"),o.is("disabled",!h.value.prev)],onClick:_},[U(Le,null,{default:()=>[U(Uo,null,null)]})]),U("span",{class:[o.e("nav-next"),o.is("disabled",!h.value.next)],onClick:A},[U(Le,null,{default:()=>[U(Yn,null,null)]})])]:null,V=e.panes.map((G,j)=>{const X=G.uid,Q=G.props.disabled,ve=G.props.name??G.index??`${j}`,ue=!Q&&(G.isClosable||G.props.closable!==!1&&e.editable);G.index=`${j}`;const ge=ue?U(Le,{class:"is-icon-close",onClick:ne=>n("tabRemove",G,ne)},{default:()=>[U(Ia,null,null)]}):null,ie=G.slots.label?.()||G.props.label,ae=!Q&&G.active?e.tabindex??a.props.tabindex:-1;return U("div",{ref:ne=>M(ne,ve),class:[o.e("item"),o.is(a.props.tabPosition),o.is("active",G.active),o.is("disabled",Q),o.is("closable",ue),o.is("focus",v.value)],id:`tab-${ve}`,key:`tab-${X}`,"aria-controls":`pane-${ve}`,role:"tab","aria-selected":G.active,tabindex:ae,onFocus:()=>W(),onBlur:()=>P(),onClick:ne=>{P(),n("tabClick",G,ve,ne)},onKeydown:ne=>{const z=Ft(ne);ue&&(z===we.delete||z===we.backspace)&&n("tabRemove",G,ne)}},[ie,ge])});return m.value,U("div",{ref:c,class:[o.e("nav-wrap"),o.is("scrollable",!!h.value),o.is(a.props.tabPosition)]},[D,U("div",{class:o.e("nav-scroll"),ref:r},[e.panes.length>0?U("div",{class:[o.e("nav"),o.is(a.props.tabPosition),o.is("stretch",e.stretch&&["top","bottom"].includes(a.props.tabPosition))],ref:u,style:w.value,role:"tablist",onKeydown:Y,onWheel:I},[e.type?null:U(cY,{ref:f,tabs:[...e.panes],tabRefs:d.value},null),V]):null])])}}}),vY=Ce({type:{type:String,values:["card","border-card",""],default:""},closable:Boolean,addable:Boolean,modelValue:{type:[String,Number]},defaultValue:{type:[String,Number]},editable:Boolean,tabPosition:{type:String,values:["top","right","bottom","left"],default:"top"},beforeLeave:{type:q(Function),default:()=>!0},stretch:Boolean,tabindex:{type:[String,Number],default:0}}),Tf=e=>_e(e)||ze(e),hY={[Qe]:e=>Tf(e),tabClick:(e,t)=>t instanceof Event,tabChange:e=>Tf(e),edit:(e,t)=>["remove","add"].includes(t),tabRemove:e=>Tf(e),tabAdd:()=>!0},mY=le({name:"ElTabs",props:vY,emits:hY,setup(e,{emit:t,slots:n,expose:a}){const o=fe("tabs"),l=y(()=>["left","right"].includes(e.tabPosition)),{children:s,addChild:r,removeChild:u,ChildrenSorter:c}=Cd(it(),"ElTabPane"),d=R(),f=R((St(e.modelValue)?e.defaultValue:e.modelValue)??"0"),h=async(k,w=!1)=>{if(!(f.value===k||St(k)))try{let C;if(e.beforeLeave){const S=e.beforeLeave(k,f.value);C=S instanceof Promise?await S:S}else C=!0;if(C!==!1){const S=s.value.find(E=>E.paneName===f.value)?.isFocusInsidePane();f.value=k,w&&(t(Qe,k),t("tabChange",k)),d.value?.removeFocus?.(),S&&d.value?.focusActiveTab()}}catch{}},g=(k,w,C)=>{k.props.disabled||(t("tabClick",k,C),h(w,!0))},v=(k,w)=>{k.props.disabled||St(k.props.name)||(w.stopPropagation(),t("edit",k.props.name,"remove"),t("tabRemove",k.props.name))},p=()=>{t("edit",void 0,"add"),t("tabAdd")},m=k=>{const w=Ft(k);[we.enter,we.numpadEnter].includes(w)&&p()},b=k=>{const w=k.el.firstChild,C=["bottom","right"].includes(e.tabPosition)?k.children[0].el:k.children[1].el;w!==C&&w.before(C)};return re(()=>e.modelValue,k=>h(k)),re(f,async()=>{await Oe(),d.value?.scrollToActiveTab()}),gt(Pd,{props:e,currentName:f,registerPane:r,unregisterPane:u,nav$:d}),a({currentName:f,get tabNavRef(){return Ri(d.value,["scheduleRender"])}}),()=>{const k=n["add-icon"],w=e.editable||e.addable?U("div",{class:[o.e("new-tab"),l.value&&o.e("new-tab-vertical")],tabindex:e.tabindex,onClick:p,onKeydown:m},[k?ee(n,"add-icon"):U(Le,{class:o.is("icon-plus")},{default:()=>[U(bC,null,null)]})]):null,C=()=>U(pY,{ref:d,currentName:f.value,editable:e.editable,type:e.type,panes:s.value,stretch:e.stretch,onTabClick:g,onTabRemove:v},null),S=U("div",{class:[o.e("header"),l.value&&o.e("header-vertical"),o.is(e.tabPosition)]},[U(c,null,{default:C,$stable:!0}),w]),E=U("div",{class:o.e("content")},[ee(n,"default")]);return U("div",{class:[o.b(),o.m(e.tabPosition),{[o.m("card")]:e.type==="card",[o.m("border-card")]:e.type==="border-card"}],onVnodeMounted:b,onVnodeUpdated:b},[E,S])}}}),gY=Ce({label:{type:String,default:""},name:{type:[String,Number]},closable:{type:Boolean,default:void 0},disabled:Boolean,lazy:Boolean}),bY=["id","aria-hidden","aria-labelledby"],Dy="ElTabPane";var yY=le({name:Dy,__name:"tab-pane",props:gY,setup(e){const t=e,n=it(),a=sn(),o=Re(Pd);o||Gt(Dy,"usage: ");const l=fe("tab-pane"),s=R(),r=R(),u=y(()=>t.closable??o.props.closable),c=y(()=>o.currentName.value===(t.name??r.value)),d=R(c.value),f=y(()=>t.name??r.value),h=y(()=>!t.lazy||d.value||c.value),g=()=>s.value?.contains(document.activeElement);re(c,p=>{p&&(d.value=!0)});const v=Nt({uid:n.uid,getVnode:()=>n.vnode,slots:a,props:t,paneName:f,active:c,index:r,isClosable:u,isFocusInsidePane:g});return o.registerPane(v),Rt(()=>{o.unregisterPane(v)}),dv(()=>{a.label&&o.nav$.value?.scheduleRender()}),(p,m)=>h.value?st((x(),B("div",{key:0,id:`pane-${f.value}`,ref_key:"paneRef",ref:s,class:T(i(l).b()),role:"tabpanel","aria-hidden":!c.value,"aria-labelledby":`tab-${f.value}`},[ee(p.$slots,"default")],10,bY)),[[Ot,c.value]]):te("v-if",!0)}}),f2=yY;const wY=nt(mY,{TabPane:f2}),CY=Xt(f2),SY=Ce({type:{type:String,values:["primary","success","info","warning","danger",""],default:""},size:{type:String,values:Ua,default:""},truncated:Boolean,lineClamp:{type:[String,Number]},tag:{type:String,default:"span"}});var kY=le({name:"ElText",__name:"text",props:SY,setup(e){const t=e,n=R(),a=vn(),o=fe("text"),l=y(()=>[o.b(),o.m(t.type),o.m(a.value),o.is("truncated",t.truncated),o.is("line-clamp",!St(t.lineClamp))]),s=()=>{if(Zo().title)return;let r=!1;const u=n.value?.textContent||"";if(t.truncated){const c=n.value?.offsetWidth,d=n.value?.scrollWidth;c&&d&&d>c&&(r=!0)}else if(!St(t.lineClamp)){const c=n.value?.offsetHeight,d=n.value?.scrollHeight;c&&d&&d>c&&(r=!0)}r?n.value?.setAttribute("title",u):n.value?.removeAttribute("title")};return ct(s),Ya(s),(r,u)=>(x(),oe(ot(e.tag),{ref_key:"textRef",ref:n,class:T(l.value),style:He({"-webkit-line-clamp":e.lineClamp})},{default:Z(()=>[ee(r.$slots,"default")]),_:3},8,["class","style"]))}}),EY=kY;const Gh=nt(EY),Fp="00:30",xY=Ce({format:{type:String,default:"HH:mm"},modelValue:{type:q(String)},disabled:{type:Boolean,default:void 0},editable:{type:Boolean,default:!0},effect:{type:q(String),default:"light"},clearable:{type:Boolean,default:!0},size:bn,placeholder:String,start:{type:String,default:"09:00"},end:{type:String,default:"18:00"},step:{type:String,default:Fp},minTime:{type:q(String)},maxTime:{type:q(String)},includeEndTime:Boolean,name:String,prefixIcon:{type:q([String,Object]),default:()=>gC},clearIcon:{type:q([String,Object]),default:()=>xo},popperClass:{type:String,default:""},popperStyle:{type:q([String,Object])},...ps}),Ao=e=>{const t=(e||"").split(":");if(t.length>=2){let n=Number.parseInt(t[0],10);const a=Number.parseInt(t[1],10),o=e.toUpperCase();return o.includes("AM")&&n===12?n=0:o.includes("PM")&&n!==12&&(n+=12),{hours:n,minutes:a}}return null},$f=(e,t)=>{const n=Ao(e);if(!n)return-1;const a=Ao(t);if(!a)return-1;const o=n.minutes+n.hours*60,l=a.minutes+a.hours*60;return o===l?0:o>l?1:-1},By=e=>`${e}`.padStart(2,"0"),$s=e=>`${By(e.hours)}:${By(e.minutes)}`,TY=(e,t)=>{const n=Ao(e);if(!n)return"";const a=Ao(t);if(!a)return"";const o={hours:n.hours,minutes:n.minutes};return o.minutes+=a.minutes,o.hours+=a.hours,o.hours+=Math.floor(o.minutes/60),o.minutes=o.minutes%60,$s(o)};var $Y=le({name:"ElTimeSelect",__name:"time-select",props:xY,emits:[vt,"blur","focus","clear",Qe],setup(e,{expose:t}){tt.extend(mh);const{Option:n}=$l,a=e,o=fe("input"),l=R(),s=tn(),{lang:r}=bt(),u=y(()=>a.modelValue),c=y(()=>{const b=Ao(a.start);return b?$s(b):null}),d=y(()=>{const b=Ao(a.end);return b?$s(b):null}),f=y(()=>{const b=Ao(a.minTime||"");return b?$s(b):null}),h=y(()=>{const b=Ao(a.maxTime||"");return b?$s(b):null}),g=y(()=>{const b=Ao(a.step),k=!b||b.hours<0||b.minutes<0||Number.isNaN(b.hours)||Number.isNaN(b.minutes)||b.hours===0&&b.minutes===0;return k&&ut("ElTimeSelect",`invalid step, fallback to default step (${Fp}).`),k?Fp:$s(b)}),v=y(()=>{const b=[],k=(w,C)=>{b.push({value:w,rawValue:C,disabled:$f(C,f.value||"-1:-1")<=0||$f(C,h.value||"100:100")>=0})};if(a.start&&a.end&&a.step){let w=c.value,C;for(;w&&d.value&&$f(w,d.value)<=0;)C=tt(w,"HH:mm").locale(r.value).format(a.format),k(C,w),w=TY(w,g.value);a.includeEndTime&&d.value&&b[b.length-1]?.rawValue!==d.value&&k(tt(d.value,"HH:mm").locale(r.value).format(a.format),d.value)}return b});return t({blur:()=>{l.value?.blur?.()},focus:()=>{l.value?.focus?.()}}),(b,k)=>(x(),oe(i($l),{ref_key:"select",ref:l,name:e.name,"model-value":u.value,disabled:i(s),clearable:e.clearable,"clear-icon":e.clearIcon,size:e.size,effect:e.effect,placeholder:e.placeholder,"default-first-option":"",filterable:e.editable,"empty-values":e.emptyValues,"value-on-clear":e.valueOnClear,"popper-class":e.popperClass,"popper-style":e.popperStyle,"onUpdate:modelValue":k[0]||(k[0]=w=>b.$emit(i(Qe),w)),onChange:k[1]||(k[1]=w=>b.$emit(i(vt),w)),onBlur:k[2]||(k[2]=w=>b.$emit("blur",w)),onFocus:k[3]||(k[3]=w=>b.$emit("focus",w)),onClear:k[4]||(k[4]=()=>b.$emit("clear"))},{prefix:Z(()=>[e.prefixIcon?(x(),oe(i(Le),{key:0,class:T(i(o).e("prefix-icon"))},{default:Z(()=>[(x(),oe(ot(e.prefixIcon)))]),_:1},8,["class"])):te("v-if",!0)]),default:Z(()=>[(x(!0),B(Fe,null,ht(v.value,w=>(x(),oe(i(n),{key:w.value,label:w.value,value:w.value,disabled:w.disabled},null,8,["label","value","disabled"]))),128))]),_:1},8,["name","model-value","disabled","clearable","clear-icon","size","effect","placeholder","filterable","empty-values","value-on-clear","popper-class","popper-style"]))}}),OY=$Y;const IY=nt(OY),p2="timeline",NY=Ce({mode:{type:String,values:["start","alternate","alternate-reverse","end"],default:"start"},reverse:Boolean}),MY=le({name:"ElTimeline",props:NY,setup(e,{slots:t}){const n=fe("timeline");gt(p2,{props:e,slots:t});const a=y(()=>[n.b(),n.is(e.mode)]);return()=>{const o=va(t.default?.()??[]);return Ye("ul",{class:a.value},e.reverse?o.reverse():o)}}}),PY=Ce({timestamp:{type:String,default:""},hideTimestamp:Boolean,center:Boolean,placement:{type:String,values:["top","bottom"],default:"bottom"},type:{type:String,values:["primary","success","warning","danger","info"],default:""},color:{type:String,default:""},size:{type:String,values:["normal","large"],default:"normal"},icon:{type:Bt},hollow:Boolean});var RY=le({name:"ElTimelineItem",__name:"timeline-item",props:PY,setup(e){const t=e,{props:n}=Re(p2),a=fe("timeline-item"),o=y(()=>[a.e("node"),a.em("node",t.size||""),a.em("node",t.type||""),a.is("hollow",t.hollow)]),l=y(()=>[a.b(),{[a.e("center")]:t.center},a.is(n.mode)]);return(s,r)=>(x(),B("li",{class:T(l.value)},[H("div",{class:T(i(a).e("tail"))},null,2),s.$slots.dot?te("v-if",!0):(x(),B("div",{key:0,class:T(o.value),style:He({backgroundColor:e.color})},[e.icon?(x(),oe(i(Le),{key:0,class:T(i(a).e("icon"))},{default:Z(()=>[(x(),oe(ot(e.icon)))]),_:1},8,["class"])):te("v-if",!0)],6)),s.$slots.dot?(x(),B("div",{key:1,class:T(i(a).e("dot"))},[ee(s.$slots,"dot")],2)):te("v-if",!0),H("div",{class:T(i(a).e("wrapper"))},[!e.hideTimestamp&&e.placement==="top"?(x(),B("div",{key:0,class:T([i(a).e("timestamp"),i(a).is("top")])},ke(e.timestamp),3)):te("v-if",!0),H("div",{class:T(i(a).e("content"))},[ee(s.$slots,"default")],2),!e.hideTimestamp&&e.placement==="bottom"?(x(),B("div",{key:1,class:T([i(a).e("timestamp"),i(a).is("bottom")])},ke(e.timestamp),3)):te("v-if",!0)],2)],2))}}),v2=RY;const AY=nt(MY,{TimelineItem:v2}),_Y=Xt(v2),h2="left-check-change",m2="right-check-change",Os=Ce({data:{type:q(Array),default:()=>[]},titles:{type:q(Array),default:()=>[]},buttonTexts:{type:q(Array),default:()=>[]},filterPlaceholder:String,filterMethod:{type:q(Function)},leftDefaultChecked:{type:q(Array),default:()=>[]},rightDefaultChecked:{type:q(Array),default:()=>[]},renderContent:{type:q(Function)},modelValue:{type:q(Array),default:()=>[]},format:{type:q(Object),default:()=>({})},filterable:Boolean,props:{type:q(Object),default:()=>Qt({label:"label",key:"key",disabled:"disabled"})},targetOrder:{type:String,values:["original","push","unshift"],default:"original"},validateEvent:{type:Boolean,default:!0}}),zp=(e,t)=>[e,t].every(ye)||ye(e)&&cn(t),LY={[vt]:(e,t,n)=>[e,n].every(ye)&&["left","right"].includes(t),[Qe]:e=>ye(e),[h2]:zp,[m2]:zp},eu=e=>{const t={label:"label",key:"key",disabled:"disabled"};return y(()=>({...t,...e.props}))},DY=(e,t)=>({onSourceCheckedChange:(o,l)=>{e.leftChecked=o,l&&t(h2,o,l)},onTargetCheckedChange:(o,l)=>{e.rightChecked=o,l&&t(m2,o,l)}}),BY=e=>{const t=eu(e),n=y(()=>e.data.reduce((a,o)=>(a[o[t.value.key]]=o)&&a,{}));return{sourceData:y(()=>e.data.filter(a=>!e.modelValue.includes(a[t.value.key]))),targetData:y(()=>e.targetOrder==="original"?e.data.filter(a=>e.modelValue.includes(a[t.value.key])):e.modelValue.reduce((a,o)=>{const l=n.value[o];return l&&a.push(l),a},[]))}},VY=(e,t,n)=>{const a=eu(e),o=(r,u,c)=>{n(Qe,r),n(vt,r,u,c)};return{addToLeft:()=>{const r=e.modelValue.slice();t.rightChecked.forEach(u=>{const c=r.indexOf(u);c>-1&&r.splice(c,1)}),o(r,"left",t.rightChecked)},addToRight:()=>{let r=e.modelValue.slice();const u=e.data.filter(c=>{const d=c[a.value.key];return t.leftChecked.includes(d)&&!e.modelValue.includes(d)}).map(c=>c[a.value.key]);r=e.targetOrder==="unshift"?u.concat(r):r.concat(u),e.targetOrder==="original"&&(r=e.data.filter(c=>r.includes(c[a.value.key])).map(c=>c[a.value.key])),o(r,"right",t.leftChecked)}}},Hp="checked-change",FY=Ce({data:Os.data,optionRender:{type:q(Function)},placeholder:String,title:String,filterable:Boolean,format:Os.format,filterMethod:Os.filterMethod,defaultChecked:Os.leftDefaultChecked,props:Os.props}),zY={[Hp]:zp},HY=(e,t,n)=>{const a=eu(e),o=y(()=>e.data.filter(d=>Be(e.filterMethod)?e.filterMethod(t.query,d):String(d[a.value.label]||d[a.value.key]).toLowerCase().includes(t.query.toLowerCase()))),l=y(()=>o.value.filter(d=>!d[a.value.disabled])),s=y(()=>{const d=t.checked.length,f=e.data.length,{noChecked:h,hasChecked:g}=e.format;return h&&g?d>0?g.replace(/\${checked}/g,d.toString()).replace(/\${total}/g,f.toString()):h.replace(/\${total}/g,f.toString()):`${d}/${f}`}),r=y(()=>{const d=t.checked.length;return d>0&&d{const d=l.value.map(f=>f[a.value.key]);t.allChecked=d.length>0&&d.every(f=>t.checked.includes(f))},c=d=>{t.checked=d?l.value.map(f=>f[a.value.key]):[]};return re(()=>t.checked,(d,f)=>{u(),t.checkChangeByUser?n(Hp,d,d.concat(f).filter(h=>!d.includes(h)||!f.includes(h))):(n(Hp,d),t.checkChangeByUser=!0)}),re(l,()=>{u()}),re(()=>e.data,()=>{const d=[],f=o.value.map(h=>h[a.value.key]);t.checked.forEach(h=>{f.includes(h)&&d.push(h)}),t.checkChangeByUser=!1,t.checked=d}),re(()=>e.defaultChecked,(d,f)=>{if(f&&d.length===f.length&&d.every(v=>f.includes(v)))return;const h=[],g=l.value.map(v=>v[a.value.key]);d.forEach(v=>{g.includes(v)&&h.push(v)}),t.checkChangeByUser=!1,t.checked=h},{immediate:!0}),{filteredData:o,checkableData:l,checkedSummary:s,isIndeterminate:r,updateAllChecked:u,handleAllCheckedChange:c}};var KY=le({name:"ElTransferPanel",__name:"transfer-panel",props:FY,emits:zY,setup(e,{expose:t,emit:n}){const a=e,o=n,l=sn(),s=({option:C})=>C,{t:r}=bt(),u=fe("transfer"),c=Nt({checked:[],allChecked:!1,query:"",checkChangeByUser:!0}),d=eu(a),{filteredData:f,checkedSummary:h,isIndeterminate:g,handleAllCheckedChange:v}=HY(a,c,o),p=y(()=>!Jn(c.query)&&Jn(f.value)),m=y(()=>!Jn(l.default()[0].children)),{checked:b,allChecked:k,query:w}=En(c);return t({query:w}),(C,S)=>(x(),B("div",{class:T(i(u).b("panel"))},[H("p",{class:T(i(u).be("panel","header"))},[U(i(ja),{modelValue:i(k),"onUpdate:modelValue":S[0]||(S[0]=E=>Yt(k)?k.value=E:null),indeterminate:i(g),"validate-event":!1,onChange:i(v)},{default:Z(()=>[H("span",{class:T(i(u).be("panel","header-title"))},ke(e.title),3),H("span",{class:T(i(u).be("panel","header-count"))},ke(i(h)),3)]),_:1},8,["modelValue","indeterminate","onChange"])],2),H("div",{class:T([i(u).be("panel","body"),i(u).is("with-footer",m.value)])},[e.filterable?(x(),oe(i(Wn),{key:0,modelValue:i(w),"onUpdate:modelValue":S[1]||(S[1]=E=>Yt(w)?w.value=E:null),class:T(i(u).be("panel","filter")),size:"default",placeholder:e.placeholder,"prefix-icon":i(V3),clearable:"","validate-event":!1},null,8,["modelValue","class","placeholder","prefix-icon"])):te("v-if",!0),st(U(i(wh),{modelValue:i(b),"onUpdate:modelValue":S[2]||(S[2]=E=>Yt(b)?b.value=E:null),"validate-event":!1,class:T([i(u).is("filterable",e.filterable),i(u).be("panel","list")])},{default:Z(()=>[(x(!0),B(Fe,null,ht(i(f),E=>(x(),oe(i(ja),{key:E[i(d).key],class:T(i(u).be("panel","item")),value:E[i(d).key],disabled:E[i(d).disabled],"validate-event":!1},{default:Z(()=>[U(s,{option:e.optionRender?.(E)},null,8,["option"])]),_:2},1032,["class","value","disabled"]))),128))]),_:1},8,["modelValue","class"]),[[Ot,!p.value&&!i(Jn)(e.data)]]),st(H("div",{class:T(i(u).be("panel","empty"))},[ee(C.$slots,"empty",{},()=>[mt(ke(p.value?i(r)("el.transfer.noMatch"):i(r)("el.transfer.noData")),1)])],2),[[Ot,p.value||i(Jn)(e.data)]])],2),m.value?(x(),B("p",{key:0,class:T(i(u).be("panel","footer"))},[ee(C.$slots,"default")],2)):te("v-if",!0)],2))}}),Vy=KY;const WY={key:0},jY={key:0};var YY=le({name:"ElTransfer",__name:"transfer",props:Os,emits:LY,setup(e,{expose:t,emit:n}){const a=e,o=n,l=sn(),{t:s}=bt(),r=fe("transfer"),{formItem:u}=On(),c=Nt({leftChecked:[],rightChecked:[]}),d=eu(a),{sourceData:f,targetData:h}=BY(a),{onSourceCheckedChange:g,onTargetCheckedChange:v}=DY(c,o),{addToLeft:p,addToRight:m}=VY(a,c,o),b=R(),k=R(),w=N=>{switch(N){case"left":b.value.query="";break;case"right":k.value.query="";break}},C=y(()=>a.buttonTexts.length===2),S=y(()=>a.titles[0]||s("el.transfer.titles.0")),E=y(()=>a.titles[1]||s("el.transfer.titles.1")),O=y(()=>a.filterPlaceholder||s("el.transfer.filterPlaceholder"));re(()=>a.modelValue,()=>{a.validateEvent&&u?.validate?.("change").catch(N=>ut(N))});const $=y(()=>N=>{if(a.renderContent)return a.renderContent(Ye,N);const I=(l.default?.({option:N})||[]).filter(_=>_.type!==un);return I.length?I:Ye("span",N[d.value.label]||N[d.value.key])});return t({clearQuery:w,leftPanel:b,rightPanel:k}),(N,I)=>(x(),B("div",{class:T(i(r).b())},[U(Vy,{ref_key:"leftPanel",ref:b,data:i(f),"option-render":$.value,placeholder:O.value,title:S.value,filterable:e.filterable,format:e.format,"filter-method":e.filterMethod,"default-checked":e.leftDefaultChecked,props:a.props,onCheckedChange:i(g)},{empty:Z(()=>[ee(N.$slots,"left-empty")]),default:Z(()=>[ee(N.$slots,"left-footer")]),_:3},8,["data","option-render","placeholder","title","filterable","format","filter-method","default-checked","props","onCheckedChange"]),H("div",{class:T(i(r).e("buttons"))},[U(i(Sn),{type:"primary",class:T([i(r).e("button"),i(r).is("with-texts",C.value)]),disabled:i(Jn)(c.rightChecked),onClick:i(p)},{default:Z(()=>[U(i(Le),null,{default:Z(()=>[U(i(Uo))]),_:1}),i(St)(e.buttonTexts[0])?te("v-if",!0):(x(),B("span",WY,ke(e.buttonTexts[0]),1))]),_:1},8,["class","disabled","onClick"]),U(i(Sn),{type:"primary",class:T([i(r).e("button"),i(r).is("with-texts",C.value)]),disabled:i(Jn)(c.leftChecked),onClick:i(m)},{default:Z(()=>[i(St)(e.buttonTexts[1])?te("v-if",!0):(x(),B("span",jY,ke(e.buttonTexts[1]),1)),U(i(Le),null,{default:Z(()=>[U(i(Yn))]),_:1})]),_:1},8,["class","disabled","onClick"])],2),U(Vy,{ref_key:"rightPanel",ref:k,data:i(h),"option-render":$.value,placeholder:O.value,filterable:e.filterable,format:e.format,"filter-method":e.filterMethod,title:E.value,"default-checked":e.rightDefaultChecked,props:a.props,onCheckedChange:i(v)},{empty:Z(()=>[ee(N.$slots,"right-empty")]),default:Z(()=>[ee(N.$slots,"right-footer")]),_:3},8,["data","option-render","placeholder","filterable","format","filter-method","title","default-checked","props","onCheckedChange"])],2))}}),UY=YY;const qY=nt(UY),Xh="RootTree",g2="NodeInstance",Fy="TreeNodeMap",b2=Ce({data:{type:q(Array),default:()=>[]},emptyText:{type:String},renderAfterExpand:{type:Boolean,default:!0},nodeKey:String,checkStrictly:Boolean,defaultExpandAll:Boolean,expandOnClickNode:{type:Boolean,default:!0},checkOnClickNode:Boolean,checkOnClickLeaf:{type:Boolean,default:!0},checkDescendants:Boolean,autoExpandParent:{type:Boolean,default:!0},defaultCheckedKeys:{type:Array},defaultExpandedKeys:{type:Array},currentNodeKey:{type:[String,Number]},renderContent:{type:q(Function)},showCheckbox:Boolean,draggable:Boolean,allowDrag:{type:q(Function)},allowDrop:{type:q(Function)},props:{type:Object,default:()=>({children:"children",label:"label",disabled:"disabled"})},lazy:Boolean,highlightCurrent:Boolean,load:{type:Function},filterNodeMethod:{type:Function},accordion:Boolean,indent:{type:Number,default:18},icon:{type:Bt}}),GY={"check-change":(e,t,n)=>e&&Dt(t)&&Dt(n),"current-change":(e,t)=>!0,"node-click":(e,t,n,a)=>e&&t&&a instanceof Event,"node-contextmenu":(e,t,n,a)=>e instanceof Event&&t&&n,"node-collapse":(e,t,n)=>e&&t,"node-expand":(e,t,n)=>e&&t,check:(e,t)=>e&&t,"node-drag-start":(e,t)=>e&&t,"node-drag-end":(e,t,n,a)=>e&&a,"node-drop":(e,t,n,a)=>e&&t&&a,"node-drag-leave":(e,t,n)=>e&&t&&n,"node-drag-enter":(e,t,n)=>e&&t&&n,"node-drag-over":(e,t,n)=>e&&t&&n},Fs="$treeNodeId",zy=function(e,t){!t||t[Fs]||Object.defineProperty(t,Fs,{value:e.id,enumerable:!1,configurable:!1,writable:!1})},Zh=(e,t)=>t?.[e||Fs],Kp=(e,t,n)=>{const a=e.value.currentNode;n();const o=e.value.currentNode;a!==o&&t("current-change",o?o.data:null,o)},y2=e=>{let t=!0,n=!0,a=!0,o=!0;for(let l=0,s=e.length;l{n.canFocus=t,Wp(n.childNodes,t)})};let XY=0;var jp=class ac{constructor(t){this.isLeafByUser=void 0,this.isLeaf=void 0,this.isEffectivelyChecked=!1,this.id=XY++,this.text=null,this.checked=!1,this.indeterminate=!1,this.data=null,this.expanded=!1,this.parent=null,this.visible=!0,this.isCurrent=!1,this.canFocus=!1;for(const n in t)Tt(t,n)&&(this[n]=t[n]);this.level=0,this.loaded=!1,this.childNodes=[],this.loading=!1,this.parent&&(this.level=this.parent.level+1)}initialize(){const t=this.store;if(!t)throw new Error("[Node]store is required!");t.registerNode(this);const n=t.props;if(n&&typeof n.isLeaf<"u"){const l=Tu(this,"isLeaf");Dt(l)&&(this.isLeafByUser=l)}if(t.lazy!==!0&&this.data?(this.setData(this.data),t.defaultExpandAll&&(this.expanded=!0,this.canFocus=!0)):this.level>0&&t.lazy&&t.defaultExpandAll&&!this.isLeafByUser&&this.expand(),ye(this.data)||zy(this,this.data),!this.data)return;const a=t.defaultExpandedKeys,o=t.key;o&&!cn(this.key)&&a&&a.includes(this.key)&&this.expand(null,t.autoExpandParent),o&&t.currentNodeKey!==void 0&&this.key===t.currentNodeKey&&(t.currentNode&&(t.currentNode.isCurrent=!1),t.currentNode=this,t.currentNode.isCurrent=!0),t.lazy&&t._initDefaultCheckedNode(this),this.updateLeafState(),(this.level===1||this.parent?.expanded===!0)&&(this.canFocus=!0)}setData(t){ye(t)||zy(this,t),this.data=t,this.childNodes=[];let n;this.level===0&&ye(this.data)?n=this.data:n=Tu(this,"children")||[];for(let a=0,o=n.length;a-1)return t.childNodes[n+1]}return null}get previousSibling(){const t=this.parent;if(t){const n=t.childNodes.indexOf(this);if(n>-1)return n>0?t.childNodes[n-1]:null}return null}contains(t,n=!0){return(this.childNodes||[]).some(a=>a===t||n&&a.contains(t))}remove(){const t=this.parent;t&&t.removeChild(this)}insertChild(t,n,a){if(!t)throw new Error("InsertChild error: child is required.");if(!(t instanceof ac)){if(!a){const o=this.getChildren(!0);o?.includes(t.data)||(St(n)||n<0?o?.push(t.data):o?.splice(n,0,t.data))}Object.assign(t,{parent:this,store:this.store}),t=Nt(new ac(t)),t instanceof ac&&t.initialize()}t.level=this.level+1,St(n)||n<0?this.childNodes.push(t):this.childNodes.splice(n,0,t),this.updateLeafState()}insertBefore(t,n){let a;n&&(a=this.childNodes.indexOf(n)),this.insertChild(t,a)}insertAfter(t,n){let a;n&&(a=this.childNodes.indexOf(n),a!==-1&&(a+=1)),this.insertChild(t,a)}removeChild(t){const n=this.getChildren()||[],a=n.indexOf(t.data);a>-1&&n.splice(a,1);const o=this.childNodes.indexOf(t);o>-1&&(this.store&&this.store.deregisterNode(t),t.parent=null,this.childNodes.splice(o,1)),this.updateLeafState()}removeChildByData(t){const n=this.childNodes.find(a=>a.data===t);n&&this.removeChild(n)}expand(t,n){const a=()=>{if(n){let o=this.parent;for(;o&&o.level>0;)o.expanded=!0,o=o.parent}this.expanded=!0,t&&t(),Wp(this.childNodes,!0)};this.shouldLoadData()?this.loadData(o=>{ye(o)&&(this.checked?this.setChecked(!0,!0):this.store.checkStrictly||Nr(this),a())}):a()}doCreateChildren(t,n={}){t.forEach(a=>{this.insertChild(Object.assign({data:a},n),void 0,!0)})}collapse(){this.expanded=!1,Wp(this.childNodes,!1)}shouldLoadData(){return!!(this.store.lazy===!0&&this.store.load&&!this.loaded)}updateLeafState(){if(this.store.lazy===!0&&this.loaded!==!0&&typeof this.isLeafByUser<"u"){this.isLeaf=this.isLeafByUser,this.isEffectivelyChecked=this.isLeaf&&this.disabled;return}const t=this.childNodes;if(!this.store.lazy||this.store.lazy===!0&&this.loaded===!0){this.isLeaf=!t||t.length===0,this.isEffectivelyChecked=this.isLeaf&&this.disabled;return}this.isLeaf=!1}setChecked(t,n,a,o){if(this.indeterminate=t==="half",this.checked=t===!0,this.isEffectivelyChecked=!this.childNodes.length&&(this.disabled||this.checked),this.store.checkStrictly)return;if(!(this.shouldLoadData()&&!this.store.checkDescendants)){const s=()=>{if(n){const r=this.childNodes;for(let f=0,h=r.length;f{s(),Nr(this)},{checked:t!==!1});return}else s()}const l=this.parent;!l||l.level===0||a||Nr(l)}getChildren(t=!1){if(this.level===0)return this.data;const n=this.data;if(!n)return null;const a=this.store.props;let o="children";return a&&(o=a.children||"children"),St(n[o])&&(n[o]=null),t&&!n[o]&&(n[o]=[]),n[o]}updateChildren(){const t=this.getChildren()||[],n=this.childNodes.map(l=>l.data),a={},o=[];t.forEach((l,s)=>{const r=l[Fs];r&&n.some(u=>u?.[Fs]===r)?a[r]={index:s,data:l}:o.push({index:s,data:l})}),this.store.lazy||n.forEach(l=>{a[l?.[Fs]]||this.removeChildByData(l)}),o.forEach(({index:l,data:s})=>{this.insertChild({data:s},l)}),this.updateLeafState()}loadData(t,n={}){if(this.store.lazy===!0&&this.store.load&&!this.loaded&&(!this.loading||Object.keys(n).length)){this.loading=!0;const a=l=>{this.childNodes=[],this.doCreateChildren(l,n),this.loaded=!0,this.loading=!1,this.updateLeafState(),t&&t.call(this,l)},o=()=>{this.loading=!1};this.store.load(this,a,o)}else t&&t.call(this)}eachNode(t){const n=[this];for(;n.length;){const a=n.shift();n.unshift(...a.childNodes),t(a)}}reInitChecked(){this.store.checkStrictly||Nr(this)}},ZY=class{constructor(e){this.lazy=!1,this.checkStrictly=!1,this.autoExpandParent=!1,this.defaultExpandAll=!1,this.checkDescendants=!1,this.currentNode=null,this.currentNodeKey=null;for(const t in e)Tt(e,t)&&(this[t]=e[t]);this.nodesMap={}}initialize(){if(this.root=new jp({data:this.data,store:this}),this.root.initialize(),this.lazy&&this.load){const e=this.load;e(this.root,t=>{this.root.doCreateChildren(t),this._initDefaultCheckedNodes()},Pt)}else this._initDefaultCheckedNodes()}filter(e){const t=this.filterNodeMethod,n=this.lazy,a=async function(o){const l=o.root?o.root.childNodes:o.childNodes;for(const[s,r]of l.entries())r.visible=!!t?.call(r,e,r.data,r),s%80===0&&s>0&&await Oe(),await a(r);if(!o.visible&&l.length){let s=!0;s=!l.some(r=>r.visible),o.root?o.root.visible=s===!1:o.visible=s===!1}e&&o.visible&&!o.isLeaf&&(!n||o.loaded)&&o.expand()};a(this)}setData(e){e!==this.root.data?(this.nodesMap={},this.root.setData(e),this._initDefaultCheckedNodes(),this.setCurrentNodeKey(this.currentNodeKey)):this.root.updateChildren()}getNode(e){if(e instanceof jp)return e;const t=et(e)?Zh(this.key,e):e;return this.nodesMap[t]||null}insertBefore(e,t){const n=this.getNode(t);n.parent?.insertBefore({data:e},n)}insertAfter(e,t){const n=this.getNode(t);n.parent?.insertAfter({data:e},n)}remove(e){const t=this.getNode(e);t&&t.parent&&(t===this.currentNode&&(this.currentNode=null),t.parent.removeChild(t))}append(e,t){const n=la(t)?this.root:this.getNode(t);n&&n.insertChild({data:e})}_initDefaultCheckedNodes(){const e=this.defaultCheckedKeys||[],t=this.nodesMap;e.forEach(n=>{const a=t[n];a&&a.setChecked(!0,!this.checkStrictly)})}_initDefaultCheckedNode(e){const t=this.defaultCheckedKeys||[];!cn(e.key)&&t.includes(e.key)&&e.setChecked(!0,!this.checkStrictly)}setDefaultCheckedKey(e){e!==this.defaultCheckedKeys&&(this.defaultCheckedKeys=e,this._initDefaultCheckedNodes())}registerNode(e){const t=this.key;if(!(!e||!e.data))if(!t)this.nodesMap[e.id]=e;else{const n=e.key;cn(n)||(this.nodesMap[n]=e)}}deregisterNode(e){!this.key||!e||!e.data||(e.childNodes.forEach(t=>{this.deregisterNode(t)}),delete this.nodesMap[e.key])}getCheckedNodes(e=!1,t=!1){const n=[],a=function(o){(o.root?o.root.childNodes:o.childNodes).forEach(l=>{(l.checked||t&&l.indeterminate)&&(!e||e&&l.isLeaf)&&n.push(l.data),a(l)})};return a(this),n}getCheckedKeys(e=!1){return this.getCheckedNodes(e).map(t=>(t||{})[this.key])}getHalfCheckedNodes(){const e=[],t=function(n){(n.root?n.root.childNodes:n.childNodes).forEach(a=>{a.indeterminate&&e.push(a.data),t(a)})};return t(this),e}getHalfCheckedKeys(){return this.getHalfCheckedNodes().map(e=>(e||{})[this.key])}_getAllNodes(){const e=[],t=this.nodesMap;for(const n in t)Tt(t,n)&&e.push(t[n]);return e}updateChildren(e,t){const n=this.nodesMap[e];if(!n)return;const a=n.childNodes;for(let o=a.length-1;o>=0;o--){const l=a[o];this.remove(l.data)}for(let o=0,l=t.length;or.level-u.level),o=Object.create(null),l=Object.keys(n);a.forEach(r=>r.setChecked(!1,!1));const s=r=>{r.childNodes.forEach(u=>{o[u.data[e]]=!0,u.childNodes?.length&&s(u)})};for(let r=0,u=a.length;r{g.isLeaf||g.setChecked(!1,!1,!0),f(g)}),h.reInitChecked()};f(c)}}}setCheckedNodes(e,t=!1){const n=this.key,a={};e.forEach(o=>{a[(o||{})[n]]=!0}),this._setCheckedKeys(n,t,a)}setCheckedKeys(e,t=!1){this.defaultCheckedKeys=e;const n=this.key,a={};e.forEach(o=>{a[o]=!0}),this._setCheckedKeys(n,t,a)}setDefaultExpandedKeys(e){e=e||[],this.defaultExpandedKeys=e,e.forEach(t=>{const n=this.getNode(t);n&&n.expand(null,this.autoExpandParent)})}setChecked(e,t,n){const a=this.getNode(e);a&&a.setChecked(!!t,n)}getCurrentNode(){return this.currentNode}setCurrentNode(e){const t=this.currentNode;t&&(t.isCurrent=!1),this.currentNode=e,this.currentNode.isCurrent=!0}setUserCurrentNode(e,t=!0){const n=e[this.key],a=this.nodesMap[n];this.setCurrentNode(a),t&&this.currentNode&&this.currentNode.level>1&&this.currentNode.parent?.expand(null,!0)}setCurrentNodeKey(e,t=!0){if(this.currentNodeKey=e,la(e)){this.currentNode&&(this.currentNode.isCurrent=!1),this.currentNode=null;return}const n=this.getNode(e);n&&(this.setCurrentNode(n),t&&this.currentNode&&this.currentNode.level>1&&this.currentNode.parent?.expand(null,!0))}};function w2(e){const t=Re(Fy,null);let n={treeNodeExpand:a=>{e.node!==a&&e.node?.collapse()},children:new Set};return t&&t.children.add(n),Rt(()=>{t&&t.children.delete(n),n=null}),gt(Fy,n),{broadcastExpanded:a=>{if(e.accordion)for(const o of n.children)o.treeNodeExpand(a)}}}const C2=Symbol("dragEvents");function JY({props:e,ctx:t,el$:n,dropIndicator$:a,store:o}){const l=fe("tree"),s=R({showDropIndicator:!1,draggingNode:null,dropNode:null,allowDrop:!0,dropType:null});return gt(C2,{treeNodeDragStart:({event:d,treeNode:f})=>{if(d.dataTransfer){if(Be(e.allowDrag)&&!e.allowDrag(f.node))return d.preventDefault(),!1;d.dataTransfer.effectAllowed="move";try{d.dataTransfer.setData("text/plain","")}catch{}s.value.draggingNode=f,t.emit("node-drag-start",f.node,d)}},treeNodeDragOver:({event:d,treeNode:f})=>{if(!d.dataTransfer)return;const h=f,g=s.value.dropNode;g&&g.node.id!==h.node.id&&jn(g.$el,l.is("drop-inner"));const v=s.value.draggingNode;if(!v||!h)return;let p=!0,m=!0,b=!0,k=!0;Be(e.allowDrop)&&(p=e.allowDrop(v.node,h.node,"prev"),k=m=e.allowDrop(v.node,h.node,"inner"),b=e.allowDrop(v.node,h.node,"next")),d.dataTransfer.dropEffect=m||p||b?"move":"none",(p||m||b)&&g?.node.id!==h.node.id&&(g&&t.emit("node-drag-leave",v.node,g.node,d),t.emit("node-drag-enter",v.node,h.node,d)),p||m||b?s.value.dropNode=h:s.value.dropNode=null,h.node.nextSibling===v.node&&(b=!1),h.node.previousSibling===v.node&&(p=!1),h.node.contains(v.node,!1)&&(m=!1),(v.node===h.node||v.node.contains(h.node))&&(p=!1,m=!1,b=!1);const w=h.$el,C=w.querySelector(`.${l.be("node","content")}`).getBoundingClientRect(),S=n.value.getBoundingClientRect(),E=n.value.scrollTop;let O;const $=p?m?.25:b?.45:1:Number.NEGATIVE_INFINITY,N=b?m?.75:p?.55:0:Number.POSITIVE_INFINITY;let I=-9999;const _=d.clientY-C.top;_C.height*N?O="after":m?O="inner":O="none";const A=w.querySelector(`.${l.be("node","expand-icon")}`).getBoundingClientRect(),F=a.value;O==="before"?I=A.top-S.top+E:O==="after"&&(I=A.bottom-S.top+E),F.style.top=`${I}px`,F.style.left=`${A.right-S.left}px`,O==="inner"?ka(w,l.is("drop-inner")):jn(w,l.is("drop-inner")),s.value.showDropIndicator=O==="before"||O==="after",s.value.allowDrop=s.value.showDropIndicator||k,s.value.dropType=O,t.emit("node-drag-over",v.node,h.node,d)},treeNodeDragEnd:d=>{const{draggingNode:f,dropType:h,dropNode:g}=s.value;if(d.preventDefault(),d.dataTransfer&&(d.dataTransfer.dropEffect="move"),f?.node.data&&g){const v={data:f.node.data};h!=="none"&&f.node.remove(),h==="before"?g.node.parent?.insertBefore(v,g.node):h==="after"?g.node.parent?.insertAfter(v,g.node):h==="inner"&&g.node.insertChild(v),h!=="none"&&(o.value.registerNode(v),o.value.key&&f.node.eachNode(p=>{o.value.nodesMap[p.data[o.value.key]]?.setChecked(p.checked,!o.value.checkStrictly)})),jn(g.$el,l.is("drop-inner")),t.emit("node-drag-end",f.node,g.node,h,d),h!=="none"&&t.emit("node-drop",f.node,g.node,h,d)}f&&!g&&t.emit("node-drag-end",f.node,null,h,d),s.value.showDropIndicator=!1,s.value.draggingNode=null,s.value.dropNode=null,s.value.allowDrop=!0}}),{dragState:s}}var QY=le({name:"ElTreeNodeContent",props:{node:{type:Object,required:!0},renderContent:Function},setup(e){const t=fe("tree"),n=Re(g2),a=Re(Xh);return()=>{const o=e.node,{data:l,store:s}=o;return e.renderContent?e.renderContent(Ye,{_self:n,node:o,data:l,store:s}):ee(a.ctx.slots,"default",{node:o,data:l},()=>[Ye(Gh,{tag:"span",truncated:!0,class:t.be("node","label")},()=>[o.label])])}}}),eU=QY,tU=le({name:"ElTreeNode",components:{ElCollapseTransition:Od,ElCheckbox:ja,NodeContent:eU,ElIcon:Le,Loading:wo},props:{node:{type:jp,default:()=>({})},props:{type:Object,default:()=>({})},accordion:Boolean,renderContent:Function,renderAfterExpand:Boolean,showCheckbox:Boolean},emits:["node-expand"],setup(e,t){const n=fe("tree"),{broadcastExpanded:a}=w2(e),o=Re(Xh),l=R(!1),s=R(!1),r=R(),u=R(),c=R(),d=Re(C2),f=it();gt(g2,f),o||ut("Tree","Can not find node's tree."),e.node.expanded&&(l.value=!0,s.value=!0);const h=o.props.props.children||"children";re(()=>{const N=e.node.data?.[h];return N&&[...N]},()=>{e.node.updateChildren()}),re(()=>e.node.indeterminate,N=>{p(e.node.checked,N)}),re(()=>e.node.checked,N=>{p(N,e.node.indeterminate)}),re(()=>e.node.childNodes.length,()=>e.node.reInitChecked()),re(()=>e.node.expanded,N=>{Oe(()=>l.value=N),N&&(s.value=!0)});const g=N=>o.props.nodeKey?Zh(o.props.nodeKey,N.data):N.id,v=N=>{const I=e.props.class;if(!I)return{};let _;if(Be(I)){const{data:A}=N;_=I(A,N)}else _=I;return _e(_)?{[_]:!0}:_},p=(N,I)=>{(r.value!==N||u.value!==I)&&o.ctx.emit("check-change",e.node.data,N,I),r.value=N,u.value=I},m=N=>{Kp(o.store,o.ctx.emit,()=>{if(o?.props?.nodeKey){const I=g(e.node);o.store.value.setCurrentNodeKey(I)}else o.store.value.setCurrentNode(e.node)}),o.currentNode.value=e.node,o.props.expandOnClickNode&&k(),(o.props.checkOnClickNode||e.node.isLeaf&&o.props.checkOnClickLeaf&&e.showCheckbox)&&!e.node.disabled&&w(!e.node.checked),o.ctx.emit("node-click",e.node.data,e.node,f,N)},b=N=>{o.instance.vnode.props?.onNodeContextmenu&&(N.stopPropagation(),N.preventDefault()),o.ctx.emit("node-contextmenu",N,e.node.data,e.node,f)},k=()=>{e.node.isLeaf||(l.value?(o.ctx.emit("node-collapse",e.node.data,e.node,f),e.node.collapse()):e.node.expand(()=>{t.emit("node-expand",e.node.data,e.node,f)}))},w=N=>{const I=o?.props.checkStrictly,_=e.node.childNodes;!I&&_.length&&(N=_.some(A=>!A.isEffectivelyChecked)),e.node.setChecked(N,!I),Oe(()=>{const A=o.store.value;o.ctx.emit("check",e.node.data,{checkedNodes:A.getCheckedNodes(),checkedKeys:A.getCheckedKeys(),halfCheckedNodes:A.getHalfCheckedNodes(),halfCheckedKeys:A.getHalfCheckedKeys()})})};return{ns:n,node$:c,tree:o,expanded:l,childNodeRendered:s,oldChecked:r,oldIndeterminate:u,getNodeKey:g,getNodeClass:v,handleSelectChange:p,handleClick:m,handleContextMenu:b,handleExpandIconClick:k,handleCheckChange:w,handleChildNodeExpand:(N,I,_)=>{a(I),o.ctx.emit("node-expand",N,I,_)},handleDragStart:N=>{o.props.draggable&&d.treeNodeDragStart({event:N,treeNode:e})},handleDragOver:N=>{N.preventDefault(),o.props.draggable&&d.treeNodeDragOver({event:N,treeNode:{$el:c.value,node:e.node}})},handleDrop:N=>{N.preventDefault()},handleDragEnd:N=>{o.props.draggable&&d.treeNodeDragEnd(N)},CaretRight:mC}}});const nU=["aria-expanded","aria-disabled","aria-checked","draggable","data-key"],aU=["aria-expanded"];function oU(e,t,n,a,o,l){const s=$t("el-icon"),r=$t("el-checkbox"),u=$t("loading"),c=$t("node-content"),d=$t("el-tree-node"),f=$t("el-collapse-transition");return st((x(),B("div",{ref:"node$",class:T([e.ns.b("node"),e.ns.is("expanded",e.expanded),e.ns.is("current",e.node.isCurrent),e.ns.is("hidden",!e.node.visible),e.ns.is("focusable",!e.node.disabled),e.ns.is("checked",!e.node.disabled&&e.node.checked),e.getNodeClass(e.node)]),role:"treeitem",tabindex:"-1","aria-expanded":e.expanded,"aria-disabled":e.node.disabled,"aria-checked":e.node.checked,draggable:e.tree.props.draggable,"data-key":e.getNodeKey(e.node),onClick:t[2]||(t[2]=qe((...h)=>e.handleClick&&e.handleClick(...h),["stop"])),onContextmenu:t[3]||(t[3]=(...h)=>e.handleContextMenu&&e.handleContextMenu(...h)),onDragstart:t[4]||(t[4]=qe((...h)=>e.handleDragStart&&e.handleDragStart(...h),["stop"])),onDragover:t[5]||(t[5]=qe((...h)=>e.handleDragOver&&e.handleDragOver(...h),["stop"])),onDragend:t[6]||(t[6]=qe((...h)=>e.handleDragEnd&&e.handleDragEnd(...h),["stop"])),onDrop:t[7]||(t[7]=qe((...h)=>e.handleDrop&&e.handleDrop(...h),["stop"]))},[H("div",{class:T(e.ns.be("node","content")),style:He({paddingLeft:(e.node.level-1)*e.tree.props.indent+"px"})},[e.tree.props.icon||e.CaretRight?(x(),oe(s,{key:0,class:T([e.ns.be("node","expand-icon"),e.ns.is("leaf",e.node.isLeaf),{expanded:!e.node.isLeaf&&e.expanded}]),onClick:qe(e.handleExpandIconClick,["stop"])},{default:Z(()=>[(x(),oe(ot(e.tree.props.icon||e.CaretRight)))]),_:1},8,["class","onClick"])):te("v-if",!0),e.showCheckbox?(x(),oe(r,{key:1,"model-value":e.node.checked,indeterminate:e.node.indeterminate,disabled:!!e.node.disabled,onClick:t[0]||(t[0]=qe(()=>{},["stop"])),onChange:e.handleCheckChange},null,8,["model-value","indeterminate","disabled","onChange"])):te("v-if",!0),e.node.loading?(x(),oe(s,{key:2,class:T([e.ns.be("node","loading-icon"),e.ns.is("loading")])},{default:Z(()=>[U(u)]),_:1},8,["class"])):te("v-if",!0),U(c,{node:e.node,"render-content":e.renderContent},null,8,["node","render-content"])],6),U(f,null,{default:Z(()=>[!e.renderAfterExpand||e.childNodeRendered?st((x(),B("div",{key:0,class:T(e.ns.be("node","children")),role:"group","aria-expanded":e.expanded,onClick:t[1]||(t[1]=qe(()=>{},["stop"]))},[(x(!0),B(Fe,null,ht(e.node.childNodes,h=>(x(),oe(d,{key:e.getNodeKey(h),"render-content":e.renderContent,"render-after-expand":e.renderAfterExpand,"show-checkbox":e.showCheckbox,node:h,accordion:e.accordion,props:e.props,onNodeExpand:e.handleChildNodeExpand},null,8,["render-content","render-after-expand","show-checkbox","node","accordion","props","onNodeExpand"]))),128))],10,aU)),[[Ot,e.expanded]]):te("v-if",!0)]),_:1})],42,nU)),[[Ot,e.node.visible]])}var lU=yn(tU,[["render",oU]]);function sU({el$:e},t){const n=fe("tree");ct(()=>{l()}),Ya(()=>{e.value?.querySelectorAll("input[type=checkbox]").forEach(s=>{s.setAttribute("tabindex","-1")})});function a(s,r){const u=t.value.getNode(s[r].dataset.key);return u.canFocus&&u.visible&&(u.parent?.expanded||u.parent?.level===0)}At(e,"keydown",s=>{const r=s.target;if(!r.className.includes(n.b("node")))return;const u=Ft(s),c=Array.from(e.value.querySelectorAll(`.${n.is("focusable")}[role=treeitem]`)),d=c.indexOf(r);let f;if([we.up,we.down].includes(u)){if(s.preventDefault(),u===we.up){f=d===-1?0:d!==0?d-1:c.length-1;const g=f;for(;!a(c,f);){if(f--,f===g){f=-1;break}f<0&&(f=c.length-1)}}else{f=d===-1?0:d=c.length&&(f=0)}}f!==-1&&c[f].focus()}[we.left,we.right].includes(u)&&(s.preventDefault(),r.click());const h=r.querySelector('[type="checkbox"]');[we.enter,we.numpadEnter,we.space].includes(u)&&h&&(s.preventDefault(),h.click())});const l=()=>{if(!e.value)return;const s=Array.from(e.value.querySelectorAll(`.${n.is("focusable")}[role=treeitem]`));Array.from(e.value.querySelectorAll("input[type=checkbox]")).forEach(u=>{u.setAttribute("tabindex","-1")});const r=e.value.querySelectorAll(`.${n.is("checked")}[role=treeitem]`);if(r.length){r[0].setAttribute("tabindex","0");return}s[0]?.setAttribute("tabindex","0")}}var rU=le({name:"ElTree",components:{ElTreeNode:lU},props:b2,emits:GY,setup(e,t){const{t:n}=bt(),a=fe("tree"),o=R(new ZY({key:e.nodeKey,data:e.data,lazy:e.lazy,props:e.props,load:e.load,currentNodeKey:e.currentNodeKey,checkStrictly:e.checkStrictly,checkDescendants:e.checkDescendants,defaultCheckedKeys:e.defaultCheckedKeys,defaultExpandedKeys:e.defaultExpandedKeys,autoExpandParent:e.autoExpandParent,defaultExpandAll:e.defaultExpandAll,filterNodeMethod:e.filterNodeMethod}));o.value.initialize();const l=R(o.value.root),s=R(null),r=R(null),u=R(null),{broadcastExpanded:c}=w2(e),{dragState:d}=JY({props:e,ctx:t,el$:r,dropIndicator$:u,store:o});sU({el$:r},o);const f=it(),h=y(()=>{let D=f?.parent;for(;D;){if(D.type.name==="ElTreeSelect")return!0;D=D.parent}return!1}),g=y(()=>{const{childNodes:D}=l.value;return(!D||D.length===0||D.every(({visible:V})=>!V))&&!h.value});re(()=>e.currentNodeKey,D=>{o.value.setCurrentNodeKey(D??null)}),re(()=>e.defaultCheckedKeys,(D,V)=>{Jt(D,V)||o.value.setDefaultCheckedKey(D??[])}),re(()=>e.defaultExpandedKeys,D=>{o.value.setDefaultExpandedKeys(D??[])}),re(()=>e.data,D=>{o.value.setData(D)},{deep:!0}),re(()=>e.checkStrictly,D=>{o.value.checkStrictly=D});const v=D=>{if(!e.filterNodeMethod)throw new Error("[Tree] filterNodeMethod is required when filter");o.value.filter(D)},p=D=>e.nodeKey?Zh(e.nodeKey,D.data):D.id,m=D=>{if(!e.nodeKey)throw new Error(`[Tree] nodeKey is required in ${D}`)},b=D=>{m("getNodePath");const V=o.value.getNode(D);if(!V)return[];const G=[V.data];let j=V.parent;for(;j&&j!==l.value;)G.push(j.data),j=j.parent;return G.reverse()},k=(D,V)=>o.value.getCheckedNodes(D,V),w=D=>o.value.getCheckedKeys(D),C=()=>{const D=o.value.getCurrentNode();return D?D.data:null},S=()=>{m("getCurrentKey");const D=C();return D?D[e.nodeKey]:null},E=(D,V)=>{m("setCheckedNodes"),o.value.setCheckedNodes(D,V)},O=(D,V)=>{m("setCheckedKeys"),o.value.setCheckedKeys(D,V)},$=(D,V,G)=>{o.value.setChecked(D,V,G)},N=()=>o.value.getHalfCheckedNodes(),I=()=>o.value.getHalfCheckedKeys(),_=(D,V=!0)=>{m("setCurrentNode"),Kp(o,t.emit,()=>{c(D),o.value.setUserCurrentNode(D,V)})},A=(D=null,V=!0)=>{m("setCurrentKey"),Kp(o,t.emit,()=>{c(),o.value.setCurrentNodeKey(D,V)})},F=D=>o.value.getNode(D),K=D=>{o.value.remove(D)},Y=(D,V)=>{o.value.append(D,V)},W=(D,V)=>{o.value.insertBefore(D,V)},P=(D,V)=>{o.value.insertAfter(D,V)},M=(D,V,G)=>{c(V),t.emit("node-expand",D,V,G)},L=(D,V)=>{m("updateKeyChildren"),o.value.updateChildren(D,V)};return gt(Xh,{ctx:t,props:e,store:o,root:l,currentNode:s,instance:f}),gt(Co,void 0),{ns:a,store:o,root:l,currentNode:s,dragState:d,el$:r,dropIndicator$:u,isEmpty:g,filter:v,getNodeKey:p,getNodePath:b,getCheckedNodes:k,getCheckedKeys:w,getCurrentNode:C,getCurrentKey:S,setCheckedNodes:E,setCheckedKeys:O,setChecked:$,getHalfCheckedNodes:N,getHalfCheckedKeys:I,setCurrentNode:_,setCurrentKey:A,t:n,getNode:F,remove:K,append:Y,insertBefore:W,insertAfter:P,handleNodeExpand:M,updateKeyChildren:L}}});function iU(e,t,n,a,o,l){const s=$t("el-tree-node");return x(),B("div",{ref:"el$",class:T([e.ns.b(),e.ns.is("dragging",!!e.dragState.draggingNode),e.ns.is("drop-not-allow",!e.dragState.allowDrop),e.ns.is("drop-inner",e.dragState.dropType==="inner"),{[e.ns.m("highlight-current")]:e.highlightCurrent}]),role:"tree"},[(x(!0),B(Fe,null,ht(e.root.childNodes,r=>(x(),oe(s,{key:e.getNodeKey(r),node:r,props:e.props,accordion:e.accordion,"render-after-expand":e.renderAfterExpand,"show-checkbox":e.showCheckbox,"render-content":e.renderContent,onNodeExpand:e.handleNodeExpand},null,8,["node","props","accordion","render-after-expand","show-checkbox","render-content","onNodeExpand"]))),128)),e.isEmpty?(x(),B("div",{key:0,class:T(e.ns.e("empty-block"))},[ee(e.$slots,"empty",{},()=>[H("span",{class:T(e.ns.e("empty-text"))},ke(e.emptyText??e.t("el.tree.emptyText")),3)])],2)):te("v-if",!0),st(H("div",{ref:"dropIndicator$",class:T(e.ns.e("drop-indicator"))},null,2),[[Ot,e.dragState.showDropIndicator]])],2)}var uU=yn(rU,[["render",iU]]);const Jh=nt(uU),cU=(e,{attrs:t,emit:n},{select:a,tree:o,key:l})=>{const s=fe("tree-select");re(()=>e.data,()=>{e.filterable&&Oe(()=>{o.value?.filter(a.value?.states.inputValue)})},{flush:"post"});const r=u=>{const c=u.at(-1);if(c.expanded&&c.childNodes.at(-1))r([c.childNodes.at(-1)]);else{o.value.el$?.querySelector(`[data-key="${u.at(-1).key}"]`)?.focus({preventScroll:!0});return}};return ct(()=>{At(()=>a.value?.$el,"keydown",async u=>{const c=Ft(u),{dropdownMenuVisible:d}=a.value;[we.down,we.up].includes(c)&&d&&(await Oe(),setTimeout(()=>{if(we.up===c){const f=o.value.store.root.childNodes;r(f);return}a.value.optionsArray[a.value.states.hoveringIndex].$el?.parentNode?.parentNode?.focus({preventScroll:!0})}))},{capture:!0})}),{...Wo(En(e),Object.keys($l.props)),...t,class:y(()=>t.class),style:y(()=>t.style),"onUpdate:modelValue":u=>n(Qe,u),valueKey:l,popperClass:y(()=>{const u=[s.e("popper")];return e.popperClass&&u.push(e.popperClass),u.join(" ")}),filterMethod:(u="")=>{e.filterMethod?e.filterMethod(u):e.remoteMethod?e.remoteMethod(u):o.value?.filter(u)}}},dU=le({extends:Oc,setup(e,t){const n=Oc.setup(e,t);delete n.selectOptionClick;const a=it().proxy;return Oe(()=>{n.select.states.cachedOptions.get(a.value)||n.select.onOptionCreate(a)}),re(()=>t.attrs.visible,o=>{Oe(()=>{n.states.visible=o})},{immediate:!0}),n},methods:{selectOptionClick(){this.$el.parentElement.click()}}});function Yp(e){return e||e===0}function Qh(e){return ye(e)&&e.length}function Es(e){return ye(e)?e:Yp(e)?[e]:[]}function oc(e,t,n,a,o){for(let l=0;l{re([()=>e.modelValue,l],()=>{e.showCheckbox&&Oe(()=>{const v=l.value;v&&!Jt(v.getCheckedKeys(),Es(e.modelValue))&&v.setCheckedKeys(Es(e.modelValue))})},{immediate:!0,deep:!0});const r=y(()=>({value:s.value,label:"label",children:"children",disabled:"disabled",isLeaf:"isLeaf",...e.props})),u=(v,p)=>{const m=r.value[v];return Be(m)?m(p,l.value?.getNode(u("value",p))):p[m]},c=Es(e.modelValue).map(v=>oc(e.data||[],p=>u("value",p)===v,p=>u("children",p),(p,m,b,k)=>k&&u("value",k))).filter(v=>Yp(v)),d=y(()=>{if(!e.renderAfterExpand&&!e.lazy)return[];const v=[];return lc(e.data.concat(e.cacheData),p=>{const m=u("value",p);v.push({value:m,currentLabel:u("label",p),isDisabled:u("disabled",p)})},p=>u("children",p)),v}),f=()=>l.value?.getCheckedKeys().filter(v=>{const p=l.value?.getNode(v);return!cn(p)&&Jn(p.childNodes)}),h=v=>{Jt(e.modelValue,v)||a(vt,v)};function g(v){a(Qe,v),h(v)}return{...Wo(En(e),Object.keys(Jh.props)),...t,nodeKey:s,expandOnClickNode:y(()=>!e.checkStrictly&&e.expandOnClickNode),defaultExpandedKeys:y(()=>e.defaultExpandedKeys?e.defaultExpandedKeys.concat(c):c),renderContent:(v,{node:p,data:m,store:b})=>v(dU,{value:u("value",m),label:u("label",m),disabled:u("disabled",m),visible:p.visible},e.renderContent?()=>e.renderContent(v,{node:p,data:m,store:b}):n.default?()=>n.default({node:p,data:m,store:b}):void 0),filterNodeMethod:(v,p,m)=>e.filterNodeMethod?e.filterNodeMethod(v,p,m):v?new RegExp(Vv(v),"i").test(u("label",p)||""):!0,onNodeClick:(v,p,m)=>{if(t.onNodeClick?.(v,p,m),!(e.showCheckbox&&e.checkOnClickNode))if(!e.showCheckbox&&(e.checkStrictly||p.isLeaf)){if(!u("disabled",v)){const b=o.value?.states.options.get(u("value",v));o.value?.handleOptionSelect(b)}}else e.expandOnClickNode&&m.proxy.handleExpandIconClick()},onCheck:(v,p)=>{if(!e.showCheckbox)return;const m=u("value",v),b={};lc([l.value.store.root],S=>b[S.key]=S,S=>S.childNodes);const k=p.checkedKeys,w=e.multiple?Es(e.modelValue).filter(S=>!(S in b)&&!k.includes(S)):[],C=w.concat(k);if(e.checkStrictly)g(e.multiple?C:C.includes(m)?m:void 0);else if(e.multiple){const S=f();g(w.concat(S))}else{const S=oc([v],$=>!Qh(u("children",$))&&!u("disabled",$),$=>u("children",$)),E=S?u("value",S):void 0,O=Yp(e.modelValue)&&!!oc([v],$=>u("value",$)===e.modelValue,$=>u("children",$));g(E===e.modelValue||O?void 0:E)}Oe(()=>{const S=Es(e.modelValue);l.value.setCheckedKeys(S),t.onCheck?.(v,{checkedKeys:l.value.getCheckedKeys(),checkedNodes:l.value.getCheckedNodes(),halfCheckedKeys:l.value.getHalfCheckedKeys(),halfCheckedNodes:l.value.getHalfCheckedNodes()})}),o.value?.focus()},onNodeExpand:(v,p,m)=>{t.onNodeExpand?.(v,p,m),Oe(()=>{if(!e.checkStrictly&&e.lazy&&e.multiple&&p.checked){const b={},k=l.value.getCheckedKeys();lc([l.value.store.root],S=>b[S.key]=S,S=>S.childNodes);const w=Es(e.modelValue).filter(S=>!(S in b)&&!k.includes(S)),C=f();g(w.concat(C))}})},cacheOptions:d}};var pU=le({props:{data:{type:Array,default:()=>[]}},setup(e){const t=Re(Xi);return re(()=>e.data,()=>{e.data.forEach(a=>{t.states.cachedOptions.has(a.value)||t.states.cachedOptions.set(a.value,a)});const n=t.selectRef?.querySelectorAll("input")||[];It&&!Array.from(n).includes(document.activeElement)&&t.setSelected()},{flush:"post",immediate:!0}),()=>{}}}),vU=le({name:"ElTreeSelect",inheritAttrs:!1,props:{...vS,...b2,cacheData:{type:Array,default:()=>[]}},setup(e,t){const{slots:n,expose:a,emit:o,attrs:l}=t,s={...l,onChange:void 0},r=R(),u=R(),c=y(()=>e.nodeKey||e.valueKey||"value"),d=cU(e,{attrs:l,emit:o},{select:r,tree:u,key:c}),{cacheOptions:f,...h}=fU(e,{attrs:s,slots:n,emit:o},{select:r,tree:u,key:c}),g=Nt({});return a(g),ct(()=>{Object.assign(g,{...Wo(u.value,["filter","updateKeyChildren","getCheckedNodes","setCheckedNodes","getCheckedKeys","setCheckedKeys","setChecked","getHalfCheckedNodes","getHalfCheckedKeys","getCurrentKey","getCurrentNode","setCurrentKey","setCurrentNode","getNode","remove","append","insertBefore","insertAfter"]),...Wo(r.value,["focus","blur","selectedLabel"]),treeRef:u.value,selectRef:r.value})}),()=>Ye($l,Nt({...d,ref:v=>r.value=v}),{...n,default:()=>[Ye(pU,{data:f.value}),Ye(Jh,Nt({...h,ref:v=>u.value=v}))]})}}),hU=vU;const mU=nt(hU),em=Symbol(),gU={key:-1,level:-1,data:{}};let _o=(function(e){return e.KEY="id",e.LABEL="label",e.CHILDREN="children",e.DISABLED="disabled",e.CLASS="",e})({}),Hy=(function(e){return e.ADD="add",e.DELETE="delete",e})({});const S2={type:Number,default:26},bU=Ce({data:{type:q(Array),default:()=>Qt([])},emptyText:{type:String},height:{type:Number,default:200},props:{type:q(Object),default:()=>Qt({children:_o.CHILDREN,label:_o.LABEL,disabled:_o.DISABLED,value:_o.KEY,class:_o.CLASS})},highlightCurrent:Boolean,showCheckbox:Boolean,defaultCheckedKeys:{type:q(Array),default:()=>Qt([])},checkStrictly:Boolean,defaultExpandedKeys:{type:q(Array),default:()=>Qt([])},indent:{type:Number,default:16},itemSize:S2,icon:{type:Bt},expandOnClickNode:{type:Boolean,default:!0},checkOnClickNode:Boolean,checkOnClickLeaf:{type:Boolean,default:!0},currentNodeKey:{type:q([String,Number])},accordion:Boolean,filterMethod:{type:q(Function)},perfMode:{type:Boolean,default:!0},scrollbarAlwaysOn:Boolean}),yU=Ce({node:{type:q(Object),default:()=>Qt(gU)},expanded:Boolean,checked:Boolean,indeterminate:Boolean,showCheckbox:Boolean,disabled:Boolean,current:Boolean,hiddenExpandIcon:Boolean,itemSize:S2}),wU=Ce({node:{type:q(Object),required:!0}}),k2="node-click",E2="node-drop",x2="node-expand",T2="node-collapse",$2="current-change",O2="check",I2="check-change",N2="node-contextmenu",CU={[k2]:(e,t,n)=>e&&t&&n,[E2]:(e,t,n)=>e&&t&&n,[x2]:(e,t)=>e&&t,[T2]:(e,t)=>e&&t,[$2]:(e,t)=>e&&t,[O2]:(e,t)=>e&&t,[I2]:(e,t)=>e&&Dt(t),[N2]:(e,t,n)=>e&&t&&n},SU={click:(e,t)=>!!(e&&t),drop:(e,t)=>!!(e&&t),toggle:e=>!!e,check:(e,t)=>e&&Dt(t)};function kU(e,t){const n=R(new Set),a=R(new Set),{emit:o}=it();re([()=>t.value,()=>e.defaultCheckedKeys],()=>Oe(()=>{k(e.defaultCheckedKeys)}),{immediate:!0});const l=()=>{if(!t.value||!e.showCheckbox||e.checkStrictly)return;const{levelTreeNodeMap:w,maxLevel:C}=t.value,S=n.value,E=new Set;for(let O=C;O>=1;--O){const $=w.get(O);$&&$.forEach(N=>{const I=N.children;let _=!N.isLeaf||N.disabled||S.has(N.key);if(I){let A=!0,F=!1;for(const K of I){const Y=K.key;if(K.isEffectivelyChecked||(_=!1),S.has(Y))F=!0;else if(E.has(Y)){A=!1,F=!0;break}else A=!1}A?S.add(N.key):F?(E.add(N.key),S.delete(N.key)):(S.delete(N.key),E.delete(N.key))}N.isEffectivelyChecked=_})}a.value=E},s=w=>n.value.has(w.key),r=w=>a.value.has(w.key),u=(w,C,S=!0,E=!0)=>{const O=n.value,$=w.children;!e.checkStrictly&&S&&$?.length&&(C=$.some(I=>!I.isEffectivelyChecked));const N=(I,_)=>{O[_?Hy.ADD:Hy.DELETE](I.key);const A=I.children;!e.checkStrictly&&A&&A.forEach(F=>{(!F.disabled||F.children)&&N(F,_)})};N(w,C),E&&l(),S&&c(w,C)},c=(w,C)=>{const{checkedNodes:S,checkedKeys:E}=v(),{halfCheckedNodes:O,halfCheckedKeys:$}=p();o(O2,w.data,{checkedKeys:E,checkedNodes:S,halfCheckedKeys:$,halfCheckedNodes:O}),o(I2,w.data,C)};function d(w=!1){return v(w).checkedKeys}function f(w=!1){return v(w).checkedNodes}function h(){return p().halfCheckedKeys}function g(){return p().halfCheckedNodes}function v(w=!1){const C=[],S=[];if(t?.value&&e.showCheckbox){const{treeNodeMap:E}=t.value;n.value.forEach(O=>{const $=E.get(O);$&&(!w||w&&$.isLeaf)&&(S.push(O),C.push($.data))})}return{checkedKeys:S,checkedNodes:C}}function p(){const w=[],C=[];if(t?.value&&e.showCheckbox){const{treeNodeMap:S}=t.value;a.value.forEach(E=>{const O=S.get(E);O&&(C.push(E),w.push(O.data))})}return{halfCheckedNodes:w,halfCheckedKeys:C}}function m(w){n.value.clear(),a.value.clear(),Oe(()=>{k(w)})}function b(w,C){if(t?.value&&e.showCheckbox){const S=t.value.treeNodeMap.get(w);S&&u(S,C,!1)}}function k(w){if(t?.value){const{treeNodeMap:C}=t.value;if(e.showCheckbox&&C&&w?.length>0){for(const S of w){const E=C.get(S);E&&!s(E)&&u(E,!0,!1,!1)}l()}}}return{updateCheckedKeys:l,toggleCheckbox:u,isChecked:s,isIndeterminate:r,getCheckedKeys:d,getCheckedNodes:f,getHalfCheckedKeys:h,getHalfCheckedNodes:g,setChecked:b,setCheckedKeys:m}}function EU(e,t){const n=R(new Set([])),a=R(new Set([])),o=y(()=>Be(e.filterMethod));function l(r){if(!o.value)return;const u=new Set,c=a.value,d=n.value,f=[],h=t.value?.treeNodes||[],g=e.filterMethod;d.clear();function v(p){p.forEach(m=>{f.push(m),g?.(r,m.data,m)?f.forEach(k=>{u.add(k.key),k.expanded=!0}):(m.expanded=!1,m.isLeaf&&d.add(m.key));const b=m.children;if(b&&v(b),!m.isLeaf){if(!u.has(m.key))d.add(m.key);else if(b){let k=!0;for(const w of b)if(!d.has(w.key)){k=!1;break}k?c.add(m.key):c.delete(m.key)}}f.pop()})}return v(h),u}function s(r){return a.value.has(r.key)}return{hiddenExpandIconKeySet:a,hiddenNodeKeySet:n,doFilter:l,isForceHiddenExpandIcon:s}}function xU(e,t){const n=R(new Set),a=R(),o=jt(),l=R(),{isIndeterminate:s,isChecked:r,toggleCheckbox:u,getCheckedKeys:c,getCheckedNodes:d,getHalfCheckedKeys:f,getHalfCheckedNodes:h,setChecked:g,setCheckedKeys:v}=kU(e,o),{doFilter:p,hiddenNodeKeySet:m,isForceHiddenExpandIcon:b}=EU(e,o),k=y(()=>e.props?.value||_o.KEY),w=y(()=>e.props?.children||_o.CHILDREN),C=y(()=>e.props?.disabled||_o.DISABLED),S=y(()=>e.props?.label||_o.LABEL),E=y(()=>{const ne=n.value,z=m.value,J=[],se=o.value?.treeNodes||[],ce=[];for(let he=se.length-1;he>=0;--he)ce.push(se[he]);for(;ce.length;){const he=ce.pop();if(!z.has(he.key)&&(J.push(he),he.children&&ne.has(he.key)))for(let Se=he.children.length-1;Se>=0;--Se)ce.push(he.children[Se])}return J}),O=y(()=>E.value.length>0);function $(ne){const z=new Map,J=new Map;let se=1;function ce(Se,Ie=1,Ne=void 0){const Te=[];for(const pe of Se){const Ee=_(pe),me={level:Ie,key:Ee,data:pe};me.label=F(pe),me.parent=Ne;const Pe=I(pe);me.disabled=A(pe),me.isLeaf=!Pe||Pe.length===0,me.expanded=n.value.has(Ee),Pe&&Pe.length&&(me.children=ce(Pe,Ie+1,me)),Te.push(me),z.set(Ee,me),J.has(Ie)||J.set(Ie,[]),J.get(Ie)?.push(me)}return Ie>se&&(se=Ie),Te}const he=ce(ne);return{treeNodeMap:z,levelTreeNodeMap:J,maxLevel:se,treeNodes:he}}function N(ne){const z=p(ne);z&&(n.value=z)}function I(ne){return ne[w.value]}function _(ne){return ne?ne[k.value]:""}function A(ne){return ne[C.value]}function F(ne){return ne[S.value]}function K(ne){n.value.has(ne.key)?V(ne):D(ne)}function Y(ne){const z=new Set,J=o.value.treeNodeMap;n.value.forEach(se=>{const ce=J.get(se);n.value.delete(ce.key),ce.expanded=!1}),ne.forEach(se=>{let ce=J.get(se);for(;ce&&!z.has(ce.key);)z.add(ce.key),ce.expanded=!0,ce=ce.parent}),n.value=z}function W(ne,z){t(k2,ne.data,ne,z),M(ne),e.expandOnClickNode&&K(ne),e.showCheckbox&&(e.checkOnClickNode||ne.isLeaf&&e.checkOnClickLeaf)&&!ne.disabled&&u(ne,!r(ne),!0)}function P(ne,z){t(E2,ne.data,ne,z)}function M(ne){j(ne)||(a.value=ne.key,t($2,ne.data,ne))}function L(ne,z){u(ne,z)}function D(ne){const z=n.value;if(o.value&&e.accordion){const{treeNodeMap:se}=o.value;z.forEach(ce=>{const he=se.get(ce);ne&&ne.level===he?.level&&(z.delete(ce),he.expanded=!1)})}z.add(ne.key);const J=ge(ne.key);J&&(J.expanded=!0,t(x2,J.data,J))}function V(ne){n.value.delete(ne.key);const z=ge(ne.key);z&&(z.expanded=!1,t(T2,z.data,z))}function G(ne){return!!ne.disabled}function j(ne){const z=a.value;return z!==void 0&&z===ne.key}function X(){if(a.value)return o.value?.treeNodeMap.get(a.value)?.data}function Q(){return a.value}function ve(ne){a.value=ne}function ue(ne){o.value=$(ne)}function ge(ne){const z=et(ne)?_(ne):ne;return o.value?.treeNodeMap.get(z)}function ie(ne,z="auto"){const J=ge(ne);J&&l.value&&l.value.scrollToItem(E.value.indexOf(J),z)}function ae(ne){l.value?.scrollTo(ne)}return re(()=>e.currentNodeKey,ne=>{a.value=ne},{immediate:!0}),re(()=>e.defaultExpandedKeys,ne=>{n.value=new Set(ne)},{immediate:!0}),re(()=>e.data,ne=>{ue(ne)},{immediate:!0}),{tree:o,flattenTree:E,isNotEmpty:O,listRef:l,getKey:_,getChildren:I,toggleExpand:K,toggleCheckbox:u,isChecked:r,isIndeterminate:s,isDisabled:G,isCurrent:j,isForceHiddenExpandIcon:b,handleNodeClick:W,handleNodeDrop:P,handleNodeCheck:L,getCurrentNode:X,getCurrentKey:Q,setCurrentKey:ve,getCheckedKeys:c,getCheckedNodes:d,getHalfCheckedKeys:f,getHalfCheckedNodes:h,setChecked:g,setCheckedKeys:v,filter:N,setData:ue,getNode:ge,expandNode:D,collapseNode:V,setExpandedKeys:Y,scrollToNode:ie,scrollTo:ae}}var TU=le({name:"ElTreeNodeContent",props:wU,setup(e){const t=Re(em),n=fe("tree");return()=>{const a=e.node,{data:o}=a;return t?.ctx.slots.default?t.ctx.slots.default({node:a,data:o}):Ye(Gh,{tag:"span",truncated:!0,class:n.be("node","label")},()=>[a?.label])}}});const $U=["aria-expanded","aria-disabled","aria-checked","data-key"];var OU=le({name:"ElTreeNode",__name:"tree-node",props:yU,emits:SU,setup(e,{emit:t}){const n=e,a=t,o=Re(em),l=fe("tree"),s=y(()=>o?.props.indent??16),r=y(()=>o?.props.icon??mC),u=v=>{const p=o?.props.props?.class;if(!p)return{};let m;if(Be(p)){const{data:b}=v;m=p(b,v)}else m=p;return _e(m)?{[m]:!0}:m},c=v=>{a("click",n.node,v)},d=v=>{a("drop",n.node,v)},f=()=>{a("toggle",n.node)},h=v=>{a("check",n.node,v)},g=v=>{o?.instance?.vnode?.props?.onNodeContextmenu&&(v.stopPropagation(),v.preventDefault()),o?.ctx.emit(N2,v,n.node?.data,n.node)};return(v,p)=>(x(),B("div",{ref:"node$",class:T([i(l).b("node"),i(l).is("expanded",e.expanded),i(l).is("current",e.current),i(l).is("focusable",!e.disabled),i(l).is("checked",!e.disabled&&e.checked),u(e.node)]),role:"treeitem",tabindex:"-1","aria-expanded":e.expanded,"aria-disabled":e.disabled,"aria-checked":e.checked,"data-key":e.node?.key,onClick:qe(c,["stop"]),onContextmenu:g,onDragover:p[1]||(p[1]=qe(()=>{},["prevent"])),onDragenter:p[2]||(p[2]=qe(()=>{},["prevent"])),onDrop:qe(d,["stop"])},[H("div",{class:T(i(l).be("node","content")),style:He({paddingLeft:`${(e.node.level-1)*s.value}px`,height:e.itemSize+"px"})},[r.value?(x(),oe(i(Le),{key:0,class:T([i(l).is("leaf",!!e.node?.isLeaf),i(l).is("hidden",e.hiddenExpandIcon),{expanded:!e.node?.isLeaf&&e.expanded},i(l).be("node","expand-icon")]),onClick:qe(f,["stop"])},{default:Z(()=>[(x(),oe(ot(r.value)))]),_:1},8,["class"])):te("v-if",!0),e.showCheckbox?(x(),oe(i(ja),{key:1,"model-value":e.checked,indeterminate:e.indeterminate,disabled:e.disabled,onChange:h,onClick:p[0]||(p[0]=qe(()=>{},["stop"]))},null,8,["model-value","indeterminate","disabled"])):te("v-if",!0),U(i(TU),{node:{...e.node,expanded:e.expanded}},null,8,["node"])],6)],42,$U))}}),IU=OU,NU=le({name:"ElTreeV2",__name:"tree",props:bU,emits:CU,setup(e,{expose:t,emit:n}){const a=e,o=n,l=sn(),s=y(()=>a.itemSize);gt(em,{ctx:{emit:o,slots:l},props:a,instance:it()}),gt(Co,void 0);const{t:r}=bt(),u=fe("tree"),{flattenTree:c,isNotEmpty:d,listRef:f,toggleExpand:h,isIndeterminate:g,isChecked:v,isDisabled:p,isCurrent:m,isForceHiddenExpandIcon:b,handleNodeClick:k,handleNodeDrop:w,handleNodeCheck:C,toggleCheckbox:S,getCurrentNode:E,getCurrentKey:O,setCurrentKey:$,getCheckedKeys:N,getCheckedNodes:I,getHalfCheckedKeys:_,getHalfCheckedNodes:A,setChecked:F,setCheckedKeys:K,filter:Y,setData:W,getNode:P,expandNode:M,collapseNode:L,setExpandedKeys:D,scrollToNode:V,scrollTo:G}=xU(a,o);return t({toggleCheckbox:S,getCurrentNode:E,getCurrentKey:O,setCurrentKey:$,getCheckedKeys:N,getCheckedNodes:I,getHalfCheckedKeys:_,getHalfCheckedNodes:A,setChecked:F,setCheckedKeys:K,filter:Y,setData:W,getNode:P,expandNode:M,collapseNode:L,setExpandedKeys:D,scrollToNode:V,scrollTo:G}),(j,X)=>(x(),B("div",{class:T([i(u).b(),{[i(u).m("highlight-current")]:e.highlightCurrent}]),role:"tree"},[i(d)?(x(),oe(i(Ak),{key:0,ref_key:"listRef",ref:f,"class-name":i(u).b("virtual-list"),data:i(c),total:i(c).length,height:e.height,"item-size":s.value,"perf-mode":e.perfMode,"scrollbar-always-on":e.scrollbarAlwaysOn},{default:Z(({data:Q,index:ve,style:ue})=>[(x(),oe(IU,{key:Q[ve].key,style:He(ue),node:Q[ve],expanded:Q[ve].expanded,"show-checkbox":e.showCheckbox,checked:i(v)(Q[ve]),indeterminate:i(g)(Q[ve]),"item-size":s.value,disabled:i(p)(Q[ve]),current:i(m)(Q[ve]),"hidden-expand-icon":i(b)(Q[ve]),onClick:i(k),onToggle:i(h),onCheck:i(C),onDrop:i(w)},null,8,["style","node","expanded","show-checkbox","checked","indeterminate","item-size","disabled","current","hidden-expand-icon","onClick","onToggle","onCheck","onDrop"]))]),_:1},8,["class-name","data","total","height","item-size","perf-mode","scrollbar-always-on"])):(x(),B("div",{key:1,class:T(i(u).e("empty-block"))},[ee(j.$slots,"empty",{},()=>[H("span",{class:T(i(u).e("empty-text"))},ke(e.emptyText??i(r)("el.tree.emptyText")),3)])],2))],2))}}),MU=NU;const PU=nt(MU),RU="ElUpload";var AU=class extends Error{constructor(e,t,n,a){super(e),this.name="UploadAjaxError",this.status=t,this.method=n,this.url=a}};function Ky(e,t,n){let a;return n.response?a=`${n.response.error||n.response}`:n.responseText?a=`${n.responseText}`:a=`fail to ${t.method} ${e} ${n.status}`,new AU(a,n.status,t.method,e)}function _U(e){const t=e.responseText||e.response;if(!t)return t;try{return JSON.parse(t)}catch{return t}}const LU=e=>{typeof XMLHttpRequest>"u"&&Gt(RU,"XMLHttpRequest is undefined");const t=new XMLHttpRequest,n=e.action;t.upload&&t.upload.addEventListener("progress",l=>{const s=l;s.percent=l.total>0?l.loaded/l.total*100:0,e.onProgress(s)});const a=new FormData;if(e.data)for(const[l,s]of Object.entries(e.data))ye(s)?s.length===2&&s[0]instanceof Blob&&_e(s[1])?a.append(l,s[0],s[1]):s.forEach(r=>{a.append(l,r)}):a.append(l,s);a.append(e.filename,e.file,e.file.name),t.addEventListener("error",()=>{e.onError(Ky(n,e,t))}),t.addEventListener("load",()=>{if(t.status<200||t.status>=300)return e.onError(Ky(n,e,t));e.onSuccess(_U(t))}),t.open(e.method,n,!0),e.withCredentials&&"withCredentials"in t&&(t.withCredentials=!0);const o=e.headers||{};if(o instanceof Headers)o.forEach((l,s)=>t.setRequestHeader(s,l));else for(const[l,s]of Object.entries(o))cn(s)||t.setRequestHeader(l,String(s));return t.send(a),t},M2=["text","picture","picture-card"];let DU=1;const Up=()=>Date.now()+DU++,P2=Ce({action:{type:String,default:"#"},headers:{type:q(Object)},method:{type:String,default:"post"},data:{type:q([Object,Function,Promise]),default:()=>Qt({})},multiple:Boolean,name:{type:String,default:"file"},drag:Boolean,withCredentials:Boolean,showFileList:{type:Boolean,default:!0},accept:{type:String,default:""},fileList:{type:q(Array),default:()=>Qt([])},autoUpload:{type:Boolean,default:!0},listType:{type:String,values:M2,default:"text"},httpRequest:{type:q(Function),default:LU},disabled:{type:Boolean,default:void 0},limit:Number,directory:Boolean}),BU=Ce({...P2,beforeUpload:{type:q(Function),default:Pt},beforeRemove:{type:q(Function)},onRemove:{type:q(Function),default:Pt},onChange:{type:q(Function),default:Pt},onPreview:{type:q(Function),default:Pt},onSuccess:{type:q(Function),default:Pt},onProgress:{type:q(Function),default:Pt},onError:{type:q(Function),default:Pt},onExceed:{type:q(Function),default:Pt},crossorigin:{type:q(String)}}),R2=Symbol("uploadContextKey"),VU=Ce({files:{type:q(Array),default:()=>Qt([])},disabled:{type:Boolean,default:void 0},handlePreview:{type:q(Function),default:Pt},listType:{type:String,values:M2,default:"text"},crossorigin:{type:q(String)}}),FU={remove:e=>!!e},zU=Ce({...P2,beforeUpload:{type:q(Function),default:Pt},onRemove:{type:q(Function),default:Pt},onStart:{type:q(Function),default:Pt},onSuccess:{type:q(Function),default:Pt},onProgress:{type:q(Function),default:Pt},onError:{type:q(Function),default:Pt},onExceed:{type:q(Function),default:Pt}}),HU=Ce({disabled:{type:Boolean,default:void 0},directory:Boolean}),KU={file:e=>ye(e)},WU=["tabindex","aria-disabled","onKeydown"],jU=["src","crossorigin"],YU=["onClick"],UU=["title"],qU=["onClick"],GU=["onClick"];var XU=le({name:"ElUploadList",__name:"upload-list",props:VU,emits:FU,setup(e,{emit:t}){const n=e,a=t,{t:o}=bt(),l=fe("upload"),s=fe("icon"),r=fe("list"),u=tn(),c=R(!1),d=y(()=>[l.b("list"),l.bm("list",n.listType),l.is("disabled",u.value)]),f=h=>{a("remove",h)};return(h,g)=>(x(),oe(Sw,{tag:"ul",class:T(d.value),name:i(r).b()},{default:Z(()=>[(x(!0),B(Fe,null,ht(e.files,(v,p)=>(x(),B("li",{key:v.uid||v.name,class:T([i(l).be("list","item"),i(l).is(v.status),{focusing:c.value}]),tabindex:i(u)?void 0:0,"aria-disabled":i(u),role:"button",onKeydown:Zt(m=>!i(u)&&f(v),["delete"]),onFocus:g[0]||(g[0]=m=>c.value=!0),onBlur:g[1]||(g[1]=m=>c.value=!1),onClick:g[2]||(g[2]=m=>c.value=!1)},[ee(h.$slots,"default",{file:v,index:p},()=>[e.listType==="picture"||v.status!=="uploading"&&e.listType==="picture-card"?(x(),B("img",{key:0,class:T(i(l).be("list","item-thumbnail")),src:v.url,crossorigin:e.crossorigin,alt:""},null,10,jU)):te("v-if",!0),v.status==="uploading"||e.listType!=="picture-card"?(x(),B("div",{key:1,class:T(i(l).be("list","item-info"))},[H("a",{class:T(i(l).be("list","item-name")),onClick:qe(m=>e.handlePreview(v),["prevent"])},[U(i(Le),{class:T(i(s).m("document"))},{default:Z(()=>[U(i(h3))]),_:1},8,["class"]),H("span",{class:T(i(l).be("list","item-file-name")),title:v.name},ke(v.name),11,UU)],10,YU),v.status==="uploading"?(x(),oe(i(kk),{key:0,type:e.listType==="picture-card"?"circle":"line","stroke-width":e.listType==="picture-card"?6:2,percentage:Number(v.percentage),style:He(e.listType==="picture-card"?"":"margin-top: 0.5rem")},null,8,["type","stroke-width","percentage","style"])):te("v-if",!0)],2)):te("v-if",!0),H("label",{class:T(i(l).be("list","item-status-label"))},[e.listType==="text"?(x(),oe(i(Le),{key:0,class:T([i(s).m("upload-success"),i(s).m("circle-check")])},{default:Z(()=>[U(i(oh))]),_:1},8,["class"])):["picture-card","picture"].includes(e.listType)?(x(),oe(i(Le),{key:1,class:T([i(s).m("upload-success"),i(s).m("check")])},{default:Z(()=>[U(i(Ui))]),_:1},8,["class"])):te("v-if",!0)],2),i(u)?te("v-if",!0):(x(),oe(i(Le),{key:2,class:T(i(s).m("close")),"aria-label":i(o)("el.upload.delete"),role:"button",tabindex:"0",onClick:m=>f(v),onKeydown:Zt(qe(m=>f(v),["prevent"]),["enter","space"])},{default:Z(()=>[U(i(Ia))]),_:1},8,["class","aria-label","onClick","onKeydown"])),i(u)?te("v-if",!0):(x(),B("i",{key:3,class:T(i(s).m("close-tip"))},ke(i(o)("el.upload.deleteTip")),3)),e.listType==="picture-card"?(x(),B("span",{key:4,class:T(i(l).be("list","item-actions"))},[H("span",{class:T(i(l).be("list","item-preview")),onClick:m=>e.handlePreview(v)},[U(i(Le),{class:T(i(s).m("zoom-in"))},{default:Z(()=>[U(i(wC))]),_:1},8,["class"])],10,qU),i(u)?te("v-if",!0):(x(),B("span",{key:0,class:T(i(l).be("list","item-delete")),onClick:m=>f(v)},[U(i(Le),{class:T(i(s).m("delete"))},{default:Z(()=>[U(i(p3))]),_:1},8,["class"])],10,GU))],2)):te("v-if",!0)])],42,WU))),128)),ee(h.$slots,"append")]),_:3},8,["class","name"]))}}),Wy=XU;const jy="ElUploadDrag";var ZU=le({name:jy,__name:"upload-dragger",props:HU,emits:KU,setup(e,{emit:t}){const n=e,a=t;Re(R2)||Gt(jy,"usage: ");const o=fe("upload"),l=R(!1),s=tn(),r=h=>new Promise((g,v)=>h.file(g,v)),u=async h=>{try{if(h.isFile){const g=await r(h);return g.isDirectory=!1,[g]}if(h.isDirectory){const g=h.createReader(),v=()=>new Promise((k,w)=>g.readEntries(k,w)),p=[];let m=await v();for(;m.length>0;)p.push(...m),m=await v();const b=p.map(k=>u(k).catch(()=>[]));return gc(await Promise.all(b))}}catch{return[]}return[]},c=async h=>{if(s.value)return;l.value=!1,h.stopPropagation();const g=Array.from(h.dataTransfer.files),v=h.dataTransfer.items||[];if(n.directory){const p=Array.from(v).map(m=>m?.webkitGetAsEntry?.()).filter(m=>m);a("file",gc(await Promise.all(p.map(u))));return}g.forEach((p,m)=>{const b=v[m]?.webkitGetAsEntry?.();b&&(p.isDirectory=b.isDirectory)}),a("file",g)},d=()=>{s.value||(l.value=!0)},f=h=>{h.currentTarget.contains(h.relatedTarget)||(l.value=!1)};return(h,g)=>(x(),B("div",{class:T([i(o).b("dragger"),i(o).is("dragover",l.value)]),onDrop:qe(c,["prevent"]),onDragover:qe(d,["prevent"]),onDragleave:qe(f,["prevent"])},[ee(h.$slots,"default")],34))}}),JU=ZU;const QU=["tabindex","aria-disabled","onKeydown"],eq=["name","disabled","multiple","accept","webkitdirectory"];var tq=le({name:"ElUploadContent",inheritAttrs:!1,__name:"upload-content",props:zU,setup(e,{expose:t}){const n=e,a=fe("upload"),o=tn(),l=jt({}),s=jt(),r=p=>{if(p.length===0)return;const{autoUpload:m,limit:b,fileList:k,multiple:w,onStart:C,onExceed:S}=n;if(b&&k.length+p.length>b){S(p,k);return}w||(p=p.slice(0,1));for(const E of p){const O=E;O.uid=Up(),C(O),m&&u(O)}},u=async p=>{if(s.value.value="",!n.beforeUpload)return d(p);let m,b={};try{const w=n.data,C=n.beforeUpload(p);b=qr(n.data)?Vo(n.data):n.data,m=await C,qr(n.data)&&Jt(w,b)&&(b=Vo(n.data))}catch{m=!1}if(m===!1){n.onRemove(p);return}let k=p;m instanceof Blob&&(m instanceof File?k=m:k=new File([m],p.name,{type:p.type})),d(Object.assign(k,{uid:p.uid}),b)},c=async(p,m)=>Be(p)?p(m):p,d=async(p,m)=>{const{headers:b,data:k,method:w,withCredentials:C,name:S,action:E,onProgress:O,onSuccess:$,onError:N,httpRequest:I}=n;try{m=await c(m??k,p)}catch{n.onRemove(p);return}const{uid:_}=p,A={headers:b||{},withCredentials:C,file:p,data:m,method:w,filename:S,action:E,onProgress:K=>{O(K,p)},onSuccess:K=>{$(K,p),delete l.value[_]},onError:K=>{N(K,p),delete l.value[_]}},F=I(A);l.value[_]=F,F instanceof Promise&&F.then(A.onSuccess,A.onError)},f=p=>{const m=p.target.files;m&&r(Array.from(m))},h=()=>{o.value||(s.value.value="",s.value.click())},g=()=>{h()};return t({abort:p=>{m1(l.value).filter(p?([m])=>String(p.uid)===m:()=>!0).forEach(([m,b])=>{b instanceof XMLHttpRequest&&b.abort(),delete l.value[m]})},upload:u}),(p,m)=>(x(),B("div",{class:T([i(a).b(),i(a).m(e.listType),i(a).is("drag",e.drag),i(a).is("disabled",i(o))]),tabindex:i(o)?void 0:0,"aria-disabled":i(o),role:"button",onClick:h,onKeydown:Zt(qe(g,["self"]),["enter","space"])},[e.drag?(x(),oe(JU,{key:0,disabled:i(o),directory:e.directory,onFile:r},{default:Z(()=>[ee(p.$slots,"default")]),_:3},8,["disabled","directory"])):ee(p.$slots,"default",{key:1}),H("input",{ref_key:"inputRef",ref:s,class:T(i(a).e("input")),name:e.name,disabled:i(o),multiple:e.multiple,accept:e.accept,webkitdirectory:e.directory||void 0,type:"file",onChange:f,onClick:m[0]||(m[0]=qe(()=>{},["stop"]))},null,42,eq)],42,QU))}}),Yy=tq;const Uy="ElUpload",qy=e=>{e.url?.startsWith("blob:")&&URL.revokeObjectURL(e.url)},nq=(e,t)=>{const n=E1(e,"fileList",void 0,{passive:!0}),a=v=>n.value.find(p=>p.uid===v.uid);function o(v){t.value?.abort(v)}function l(v=["ready","uploading","success","fail"]){n.value=n.value.filter(p=>!v.includes(p.status))}function s(v){n.value=n.value.filter(p=>p.uid!==v.uid)}const r=v=>{Oe(()=>e.onChange(v,n.value))},u=(v,p)=>{const m=a(p);m&&(console.error(v),m.status="fail",s(m),e.onError(v,m,n.value),r(m))},c=(v,p)=>{const m=a(p);m&&(e.onProgress(v,m,n.value),m.status="uploading",m.percentage=Math.round(v.percent))},d=(v,p)=>{const m=a(p);m&&(m.status="success",m.response=v,e.onSuccess(v,m,n.value),r(m))},f=v=>{cn(v.uid)&&(v.uid=Up());const p={name:v.name,percentage:0,status:"ready",size:v.size,raw:v,uid:v.uid};if(e.listType==="picture-card"||e.listType==="picture")try{p.url=URL.createObjectURL(v)}catch(m){ut(Uy,m.message),e.onError(m,p,n.value)}n.value=[...n.value,p],r(p)},h=async v=>{const p=v instanceof File?a(v):v;p||Gt(Uy,"file to be removed not found");const m=b=>{o(b),s(b),e.onRemove(b,n.value),qy(b)};e.beforeRemove?await e.beforeRemove(p,n.value)!==!1&&m(p):m(p)};function g(){n.value.filter(({status:v})=>v==="ready").forEach(({raw:v})=>v&&t.value?.upload(v))}return re(()=>e.listType,v=>{v!=="picture-card"&&v!=="picture"||(n.value=n.value.map(p=>{const{raw:m,url:b}=p;if(!b&&m)try{p.url=URL.createObjectURL(m)}catch(k){e.onError(k,p,n.value)}return p}))}),re(n,v=>{for(const p of v)p.uid||=Up(),p.status||="success"},{immediate:!0,deep:!0}),{uploadFiles:n,abort:o,clearFiles:l,handleError:u,handleProgress:c,handleStart:f,handleSuccess:d,handleRemove:h,submit:g,revokeFileObjectURL:qy}};var aq=le({name:"ElUpload",__name:"upload",props:BU,setup(e,{expose:t}){const n=e,a=tn(),o=jt(),{abort:l,submit:s,clearFiles:r,uploadFiles:u,handleStart:c,handleError:d,handleRemove:f,handleSuccess:h,handleProgress:g,revokeFileObjectURL:v}=nq(n,o),p=y(()=>n.listType==="picture-card"),m=y(()=>({...n,fileList:u.value,onStart:c,onProgress:g,onSuccess:h,onError:d,onRemove:f}));return Rt(()=>{u.value.forEach(v)}),gt(R2,{accept:_t(n,"accept")}),t({abort:l,submit:s,clearFiles:r,handleStart:c,handleRemove:f}),(b,k)=>(x(),B("div",null,[p.value&&e.showFileList?(x(),oe(Wy,{key:0,disabled:i(a),"list-type":e.listType,files:i(u),crossorigin:e.crossorigin,"handle-preview":e.onPreview,onRemove:i(f)},Qn({append:Z(()=>[U(Yy,rt({ref_key:"uploadRef",ref:o},m.value),{default:Z(()=>[b.$slots.trigger?ee(b.$slots,"trigger",{key:0}):te("v-if",!0),!b.$slots.trigger&&b.$slots.default?ee(b.$slots,"default",{key:1}):te("v-if",!0)]),_:3},16)]),_:2},[b.$slots.file?{name:"default",fn:Z(({file:w,index:C})=>[ee(b.$slots,"file",{file:w,index:C})]),key:"0"}:void 0]),1032,["disabled","list-type","files","crossorigin","handle-preview","onRemove"])):te("v-if",!0),!p.value||p.value&&!e.showFileList?(x(),oe(Yy,rt({key:1,ref_key:"uploadRef",ref:o},m.value),{default:Z(()=>[b.$slots.trigger?ee(b.$slots,"trigger",{key:0}):te("v-if",!0),!b.$slots.trigger&&b.$slots.default?ee(b.$slots,"default",{key:1}):te("v-if",!0)]),_:3},16)):te("v-if",!0),b.$slots.trigger?ee(b.$slots,"default",{key:2}):te("v-if",!0),ee(b.$slots,"tip"),!p.value&&e.showFileList?(x(),oe(Wy,{key:3,disabled:i(a),"list-type":e.listType,files:i(u),crossorigin:e.crossorigin,"handle-preview":e.onPreview,onRemove:i(f)},Qn({_:2},[b.$slots.file?{name:"default",fn:Z(({file:w,index:C})=>[ee(b.$slots,"file",{file:w,index:C})]),key:"0"}:void 0]),1032,["disabled","list-type","files","crossorigin","handle-preview","onRemove"])):te("v-if",!0)]))}}),oq=aq;const lq=nt(oq),sq=Ce({zIndex:{type:Number,default:9},rotate:{type:Number,default:-22},width:Number,height:Number,image:String,content:{type:q([String,Array]),default:"Element Plus"},font:{type:q(Object)},gap:{type:q(Array),default:()=>[100,100]},offset:{type:q(Array)}});function rq(e){return e.replace(/([A-Z])/g,"-$1").toLowerCase()}function iq(e){return Object.keys(e).map(t=>`${rq(t)}: ${e[t]};`).join(" ")}function uq(){return window.devicePixelRatio||1}const cq=(e,t)=>{let n=!1;return e.removedNodes.length&&t&&(n=Array.from(e.removedNodes).includes(t)),e.type==="attributes"&&e.target===t&&(n=!0),n},dq={left:[0,.5],start:[0,.5],center:[.5,0],right:[1,-.5],end:[1,-.5]};function Of(e,t,n=1){const a=document.createElement("canvas"),o=a.getContext("2d"),l=e*n,s=t*n;return a.setAttribute("width",`${l}px`),a.setAttribute("height",`${s}px`),o.save(),[o,a,l,s]}function fq(){function e(t,n,a,o,l,s,r,u,c){const[d,f,h,g]=Of(o,l,a);let v=0;if(t instanceof HTMLImageElement)d.drawImage(t,0,0,h,g);else{const{color:G,fontSize:j,fontStyle:X,fontWeight:Q,fontFamily:ve,textAlign:ue,textBaseline:ge}=s,ie=Number(j)*a;d.font=`${X} normal ${Q} ${ie}px/${l}px ${ve}`,d.fillStyle=G,d.textAlign=ue,d.textBaseline=ge;const ae=ye(t)?t:[t];if(ge!=="top"&&ae[0]){const ne=d.measureText(ae[0]);d.textBaseline="top";const z=d.measureText(ae[0]);v=ne.actualBoundingBoxAscent-z.actualBoundingBoxAscent}ae?.forEach((ne,z)=>{const[J,se]=dq[ue];d.fillText(ne??"",h*J+c*se,z*(ie+s.fontGap*a))})}const p=Math.PI/180*Number(n),m=Math.max(o,l),[b,k,w]=Of(m,m,a);b.translate(w/2,w/2),b.rotate(p),h>0&&g>0&&b.drawImage(f,-h/2,-g/2);function C(G,j){return[G*Math.cos(p)-j*Math.sin(p),G*Math.sin(p)+j*Math.cos(p)]}let S=0,E=0,O=0,$=0;const N=h/2,I=g/2;[[0-N,0-I],[0+N,0-I],[0+N,0+I],[0-N,0+I]].forEach(([G,j])=>{const[X,Q]=C(G,j);S=Math.min(S,X),E=Math.max(E,X),O=Math.min(O,Q),$=Math.max($,Q)});const _=S+w/2,A=O+w/2,F=E-S,K=$-O,Y=r*a,W=u*a,P=(F+Y)*2,M=K+W,[L,D]=Of(P,M);function V(G=0,j=0){L.drawImage(k,_,A,F,K,G,j+v,F,K)}return V(),V(F+Y,-K/2-W/2),V(F+Y,+K/2+W/2),[D.toDataURL(),P/a,M/a]}return e}var pq=le({name:"ElWatermark",__name:"watermark",props:sq,setup(e){const t={position:"relative"},n=e,a=y(()=>n.font?.fontGap??3),o=y(()=>n.font?.color??"rgba(0,0,0,.15)"),l=y(()=>n.font?.fontSize??16),s=y(()=>n.font?.fontWeight??"normal"),r=y(()=>n.font?.fontStyle??"normal"),u=y(()=>n.font?.fontFamily??"sans-serif"),c=y(()=>n.font?.textAlign??"center"),d=y(()=>n.font?.textBaseline??"hanging"),f=y(()=>n.gap[0]),h=y(()=>n.gap[1]),g=y(()=>f.value/2),v=y(()=>h.value/2),p=y(()=>n.offset?.[0]??g.value),m=y(()=>n.offset?.[1]??v.value),b=()=>{const _={zIndex:n.zIndex,position:"absolute",left:0,top:0,width:"100%",height:"100%",pointerEvents:"none",backgroundRepeat:"repeat"};let A=p.value-g.value,F=m.value-v.value;return A>0&&(_.left=`${A}px`,_.width=`calc(100% - ${A}px)`,A=0),F>0&&(_.top=`${F}px`,_.height=`calc(100% - ${F}px)`,F=0),_.backgroundPosition=`${A}px ${F}px`,_},k=jt(null),w=jt(),C=R(!1),S=()=>{w.value&&(w.value.remove(),w.value=void 0)},E=(_,A)=>{k.value&&w.value&&(C.value=!0,w.value.setAttribute("style",iq({...b(),backgroundImage:`url('${_}')`,backgroundSize:`${Math.floor(A)}px`})),k.value?.append(w.value),setTimeout(()=>{C.value=!1}))},O=_=>{let A=120,F=64,K=0;const{image:Y,content:W,width:P,height:M,rotate:L}=n;if(!Y&&_.measureText){_.font=`${Number(l.value)}px ${u.value}`;const D=ye(W)?W:[W];let V=0,G=0;D.forEach(X=>{const{width:Q,fontBoundingBoxAscent:ve,fontBoundingBoxDescent:ue,actualBoundingBoxAscent:ge,actualBoundingBoxDescent:ie}=_.measureText(X),ae=St(ve)?ge+ie:ve+ue;Q>V&&(V=Math.ceil(Q)),ae>G&&(G=Math.ceil(ae))}),A=V,F=G*D.length+(D.length-1)*a.value;const j=Math.PI/180*Number(L);K=Math.ceil(Math.abs(Math.sin(j)*F)/2),A+=K}return[P??A,M??F,K]},$=fq(),N=()=>{const _=document.createElement("canvas").getContext("2d"),A=n.image,F=n.content,K=n.rotate;if(_){w.value||(w.value=document.createElement("div"));const Y=uq(),[W,P,M]=O(_),L=D=>{const[V,G]=$(D||"",K,Y,W,P,{color:o.value,fontSize:l.value,fontStyle:r.value,fontWeight:s.value,fontFamily:u.value,fontGap:a.value,textAlign:c.value,textBaseline:d.value},f.value,h.value,M);E(V,G)};if(A){const D=new Image;D.onload=()=>{L(D)},D.onerror=()=>{L(F)},D.crossOrigin="anonymous",D.referrerPolicy="no-referrer",D.src=A}else L(F)}};return ct(()=>{N()}),re(()=>n,()=>{N()},{deep:!0,flush:"post"}),Rt(()=>{S()}),Di(k,_=>{C.value||_.forEach(A=>{cq(A,w.value)&&(S(),N())})},{attributes:!0,subtree:!0,childList:!0}),(_,A)=>(x(),B("div",{ref_key:"containerRef",ref:k,style:He([t])},[ee(_.$slots,"default")],4))}}),vq=pq;const hq=nt(vq),mq=["absolute","fixed"],gq=["top-start","top-end","top","bottom-start","bottom-end","bottom","left-start","left-end","left","right-start","right-end","right"],tm=Ce({placement:{type:q(String),values:gq,default:"bottom"},reference:{type:q(Object),default:null},strategy:{type:q(String),values:mq,default:"absolute"},offset:{type:Number,default:10},showArrow:Boolean,zIndex:{type:Number,default:2001}}),bq={close:()=>!0},yq=Ce({modelValue:Boolean,current:{type:Number,default:0},showArrow:{type:Boolean,default:!0},showClose:{type:Boolean,default:!0},closeIcon:{type:Bt},placement:tm.placement,contentStyle:{type:q([Object])},mask:{type:q([Boolean,Object]),default:!0},gap:{type:q(Object),default:()=>({offset:6,radius:2})},zIndex:{type:Number},scrollIntoViewOptions:{type:q([Boolean,Object]),default:()=>({block:"center"})},type:{type:q(String)},appendTo:{type:_i.to.type,default:"body"},closeOnPressEscape:{type:Boolean,default:!0},targetAreaClickable:{type:Boolean,default:!0}}),wq={[Qe]:e=>Dt(e),"update:current":e=>ze(e),close:e=>ze(e),finish:()=>!0,change:e=>ze(e)},Cq=Ce({target:{type:q([String,Object,Function])},title:String,description:String,showClose:{type:Boolean,default:void 0},closeIcon:{type:Bt},showArrow:{type:Boolean,default:void 0},placement:tm.placement,mask:{type:q([Boolean,Object]),default:void 0},contentStyle:{type:q([Object])},prevButtonProps:{type:q(Object)},nextButtonProps:{type:q(Object)},scrollIntoViewOptions:{type:q([Boolean,Object]),default:void 0},type:{type:q(String)}}),Sq={close:()=>!0},kq=(e,t,n,a,o)=>{const l=R(null),s=()=>{let d;return _e(e.value)?d=document.querySelector(e.value):Be(e.value)?d=e.value():d=e.value,d},r=()=>{const d=s();if(!d||!t.value){l.value=null;return}Eq(d)||d.scrollIntoView(o.value);const{left:f,top:h,width:g,height:v}=d.getBoundingClientRect();l.value={left:f,top:h,width:g,height:v,radius:0}};ct(()=>{re([t,e],()=>{r()},{immediate:!0}),window.addEventListener("resize",r)}),Rt(()=>{window.removeEventListener("resize",r)});const u=d=>(ye(n.value.offset)?n.value.offset[d]:n.value.offset)??6,c=y(()=>{if(!l.value)return l.value;const d=u(0),f=u(1),h=n.value?.radius||2;return{left:l.value.left-d,top:l.value.top-f,width:l.value.width+d*2,height:l.value.height+f*2,radius:h}});return{mergedPosInfo:c,triggerTarget:y(()=>{const d=s();return!a.value||!d||!window.DOMRect?d||void 0:{getBoundingClientRect(){return window.DOMRect.fromRect({width:c.value?.width||0,height:c.value?.height||0,x:c.value?.left||0,y:c.value?.top||0})}}})}},Rd=Symbol("ElTour");function Eq(e){const t=window.innerWidth||document.documentElement.clientWidth,n=window.innerHeight||document.documentElement.clientHeight,{top:a,right:o,bottom:l,left:s}=e.getBoundingClientRect();return a>=0&&s>=0&&o<=t&&l<=n}const xq=(e,t,n,a,o,l,s,r)=>{const u=R(),c=R(),d=R({}),f={x:u,y:c,placement:a,strategy:o,middlewareData:d},h=y(()=>{const b=[EA(i(l)),TA(),xA(),Tq()];return i(r)&&i(n)&&b.push($A({element:i(n)})),b}),g=async()=>{if(!It)return;const b=i(e),k=i(t);if(!b||!k)return;const w=await OA(b,k,{placement:i(a),strategy:i(o),middleware:i(h)});si(f).forEach(C=>{f[C].value=w[C]})},v=y(()=>{if(!i(e))return{position:"fixed",top:"50%",left:"50%",transform:"translate3d(-50%, -50%, 0)",maxWidth:"100vw",zIndex:i(s)};const{overflow:b}=i(d);return{position:i(o),zIndex:i(s),top:i(c)!=null?`${i(c)}px`:"",left:i(u)!=null?`${i(u)}px`:"",maxWidth:b?.maxWidth?`${b?.maxWidth}px`:""}}),p=y(()=>{if(!i(r))return{};const{arrow:b}=i(d);return{left:b?.x!=null?`${b?.x}px`:"",top:b?.y!=null?`${b?.y}px`:""}});let m;return ct(()=>{const b=i(e),k=i(t);b&&k&&(m=SA(b,k,g)),ia(()=>{g()})}),Rt(()=>{m&&m()}),{update:g,contentStyle:v,arrowStyle:p}},Tq=()=>({name:"overflow",async fn(e){const t=await kA(e);let n=0;return t.left>0&&(n=t.left),t.right>0&&(n=t.right),{data:{maxWidth:e.rects.floating.width-n}}}}),$q=Ce({zIndex:{type:Number,default:1001},visible:Boolean,fill:{type:String,default:"rgba(0,0,0,0.5)"},pos:{type:q(Object)},targetAreaClickable:{type:Boolean,default:!0}}),Oq={style:{width:"100%",height:"100%"}},Iq=["d"];var Nq=le({name:"ElTourMask",inheritAttrs:!1,__name:"mask",props:$q,setup(e){const t=e,{ns:n}=Re(Rd),a=y(()=>t.pos?.radius??2),o=y(()=>{const d=a.value,f=`a${d},${d} 0 0 1`;return{topRight:`${f} ${d},${d}`,bottomRight:`${f} ${-d},${d}`,bottomLeft:`${f} ${-d},${-d}`,topLeft:`${f} ${d},${-d}`}}),{width:l,height:s}=Dv(),r=y(()=>{const d=l.value,f=s.value,h=o.value,g=`M${d},0 L0,0 L0,${f} L${d},${f} L${d},0 Z`,v=a.value;return t.pos?`${g} M${t.pos.left+v},${t.pos.top} h${t.pos.width-v*2} ${h.topRight} v${t.pos.height-v*2} ${h.bottomRight} h${-t.pos.width+v*2} ${h.bottomLeft} v${-t.pos.height+v*2} ${h.topLeft} z`:g}),u=y(()=>({position:"fixed",left:0,right:0,top:0,bottom:0,zIndex:t.zIndex,pointerEvents:t.pos&&t.targetAreaClickable?"none":"auto"})),c=y(()=>({fill:t.fill,pointerEvents:"auto",cursor:"auto"}));return hd(_t(t,"visible"),{ns:n}),(d,f)=>e.visible?(x(),B("div",rt({key:0,class:i(n).e("mask"),style:u.value},d.$attrs),[(x(),B("svg",Oq,[H("path",{class:T(i(n).e("hollow")),style:He(c.value),d:r.value},null,14,Iq)]))],16)):te("v-if",!0)}}),Mq=Nq;const Pq=["data-side"];var Rq=le({name:"ElTourContent",__name:"content",props:tm,emits:bq,setup(e,{emit:t}){const n=e,a=t,o=R(n.placement),l=R(n.strategy),s=R(null),r=R(null);re(()=>n.placement,()=>{o.value=n.placement});const{contentStyle:u,arrowStyle:c}=xq(_t(n,"reference"),s,r,o,l,_t(n,"offset"),_t(n,"zIndex"),_t(n,"showArrow")),d=y(()=>o.value.split("-")[0]),{ns:f}=Re(Rd),h=()=>{a("close")},g=v=>{v.detail.focusReason==="pointer"&&v.preventDefault()};return(v,p)=>(x(),B("div",{ref_key:"contentRef",ref:s,style:He(i(u)),class:T(i(f).e("content")),"data-side":d.value,tabindex:"-1"},[U(i(hr),{loop:"",trapped:"","focus-start-el":"container","focus-trap-el":s.value||void 0,onReleaseRequested:h,onFocusoutPrevented:g},{default:Z(()=>[ee(v.$slots,"default")]),_:3},8,["focus-trap-el"]),e.showArrow?(x(),B("span",{key:0,ref_key:"arrowRef",ref:r,style:He(i(c)),class:T(i(f).e("arrow"))},null,6)):te("v-if",!0)],14,Pq))}}),Aq=Rq,_q=le({name:"ElTourSteps",props:{current:{type:Number,default:0}},emits:["update-total"],setup(e,{slots:t,emit:n}){let a=0;return()=>{const o=t.default?.(),l=[];let s=0;function r(u){ye(u)&&u.forEach(c=>{(c?.type||{})?.name==="ElTourStep"&&(l.push(c),s+=1)})}return o.length&&r(va(o[0]?.children)),a!==s&&(a=s,n("update-total",s)),l.length?l[e.current]:null}}}),Lq=le({name:"ElTour",inheritAttrs:!1,__name:"tour",props:yq,emits:wq,setup(e,{emit:t}){const n=e,a=t,o=fe("tour"),l=R(0),s=R(),r=E1(n,"current",a,{passive:!0}),u=y(()=>s.value?.target),c=y(()=>[o.b(),b.value==="primary"?o.m("primary"):""]),d=y(()=>s.value?.placement||n.placement),f=y(()=>s.value?.contentStyle??n.contentStyle),h=y(()=>s.value?.mask??n.mask),g=y(()=>!!h.value&&n.modelValue),v=y(()=>Dt(h.value)?void 0:h.value),p=y(()=>!!u.value&&(s.value?.showArrow??n.showArrow)),m=y(()=>s.value?.scrollIntoViewOptions??n.scrollIntoViewOptions),b=y(()=>s.value?.type??n.type),{nextZIndex:k}=zi(),w=k(),C=y(()=>n.zIndex??w),{mergedPosInfo:S,triggerTarget:E}=kq(u,_t(n,"modelValue"),_t(n,"gap"),h,m);re(()=>n.modelValue,I=>{I||(r.value=0)});const O=()=>{n.closeOnPressEscape&&(a(Qe,!1),a("close",r.value))},$=I=>{l.value=I},N=sn();return gt(Rd,{currentStep:s,current:r,total:l,showClose:_t(n,"showClose"),closeIcon:_t(n,"closeIcon"),mergedType:b,ns:o,slots:N,updateModelValue(I){a(Qe,I)},onClose(){a("close",r.value)},onFinish(){a("finish")},onChange(){a(vt,r.value)}}),(I,_)=>(x(),B(Fe,null,[U(i(vr),{to:e.appendTo},{default:Z(()=>[H("div",rt({class:c.value},I.$attrs),[U(Mq,{visible:g.value,fill:v.value?.color,style:He(v.value?.style),pos:i(S),"z-index":C.value,"target-area-clickable":e.targetAreaClickable},null,8,["visible","fill","style","pos","z-index","target-area-clickable"]),e.modelValue?(x(),oe(Aq,{key:i(r),reference:i(E),placement:d.value,"show-arrow":p.value,"z-index":C.value,style:He(f.value),onClose:O},{default:Z(()=>[U(i(_q),{current:i(r),onUpdateTotal:$},{default:Z(()=>[ee(I.$slots,"default")]),_:3},8,["current"])]),_:3},8,["reference","placement","show-arrow","z-index","style"])):te("v-if",!0)],16)]),_:3},8,["to"]),te(" just for IDE "),te("v-if",!0)],64))}}),Dq=Lq;const Bq=["aria-label"];var Vq=le({name:"ElTourStep",__name:"step",props:Cq,emits:Sq,setup(e,{emit:t}){const n=e,a=t,{Close:o}=CC,{t:l}=bt(),{currentStep:s,current:r,total:u,showClose:c,closeIcon:d,mergedType:f,ns:h,slots:g,updateModelValue:v,onClose:p,onFinish:m,onChange:b}=Re(Rd);re(n,I=>{s.value=I},{immediate:!0});const k=y(()=>n.showClose??c.value),w=y(()=>n.closeIcon??d.value??o),C=I=>{if(I)return Ri(I,["children","onClick"])},S=()=>{r.value-=1,n.prevButtonProps?.onClick&&n.prevButtonProps?.onClick(),b()},E=()=>{r.value>=u.value-1?O():r.value+=1,n.nextButtonProps?.onClick&&n.nextButtonProps.onClick(),b()},O=()=>{$(),m()},$=()=>{v(!1),p(),a("close")},N=I=>{if(!I.target?.isContentEditable)switch(Ft(I)){case we.left:I.preventDefault(),r.value>0&&S();break;case we.right:I.preventDefault(),E();break}};return ct(()=>{window.addEventListener("keydown",N)}),Rt(()=>{window.removeEventListener("keydown",N)}),(I,_)=>(x(),B(Fe,null,[k.value?(x(),B("button",{key:0,"aria-label":i(l)("el.tour.close"),class:T(i(h).e("closebtn")),type:"button",onClick:$},[U(i(Le),{class:T(i(h).e("close"))},{default:Z(()=>[(x(),oe(ot(w.value)))]),_:1},8,["class"])],10,Bq)):te("v-if",!0),H("header",{class:T([i(h).e("header"),{"show-close":i(c)}])},[ee(I.$slots,"header",{},()=>[H("span",{role:"heading",class:T(i(h).e("title"))},ke(e.title),3)])],2),H("div",{class:T(i(h).e("body"))},[ee(I.$slots,"default",{},()=>[H("span",null,ke(e.description),1)])],2),H("footer",{class:T(i(h).e("footer"))},[H("div",{class:T(i(h).b("indicators"))},[i(g).indicators?(x(),oe(ot(i(g).indicators),{key:0,current:i(r),total:i(u)},null,8,["current","total"])):(x(!0),B(Fe,{key:1},ht(i(u),(A,F)=>(x(),B("span",{key:A,class:T([i(h).b("indicator"),i(h).is("active",F===i(r))])},null,2))),128))],2),H("div",{class:T(i(h).b("buttons"))},[i(r)>0?(x(),oe(i(Sn),rt({key:0,size:"small",type:i(f)},C(e.prevButtonProps),{onClick:S}),{default:Z(()=>[mt(ke(e.prevButtonProps?.children??i(l)("el.tour.previous")),1)]),_:1},16,["type"])):te("v-if",!0),i(r)<=i(u)-1?(x(),oe(i(Sn),rt({key:1,size:"small",type:i(f)==="primary"?"default":"primary"},C(e.nextButtonProps),{onClick:E}),{default:Z(()=>[mt(ke(e.nextButtonProps?.children??(i(r)===i(u)-1?i(l)("el.tour.finish"):i(l)("el.tour.next"))),1)]),_:1},16,["type"])):te("v-if",!0)],2)],2)],64))}}),A2=Vq;const Fq=nt(Dq,{TourStep:A2}),zq=Xt(A2),Hq=Ce({container:{type:q([String,Object])},offset:{type:Number,default:0},bound:{type:Number,default:15},duration:{type:Number,default:300},marker:{type:Boolean,default:!0},type:{type:q(String),default:"default"},direction:{type:q(String),default:"vertical"},selectScrollTop:Boolean}),Kq={change:e=>_e(e),click:(e,t)=>e instanceof MouseEvent&&(_e(t)||St(t))},$u=(e=>{if(!It||e==="")return null;if(_e(e))try{return document.querySelector(e)}catch{return null}return e});function Wq(e){let t=0;const n=(...a)=>{t&&jo(t),t=Fa(()=>{e(...a),t=0})};return n.cancel=()=>{jo(t),t=0},n}const _2=Symbol("anchor");var jq=le({name:"ElAnchor",__name:"anchor",props:Hq,emits:Kq,setup(e,{expose:t,emit:n}){const a=e,o=n,l=sn(),s=R(""),r=R({}),u=R(null),c=R(null),d=R(),f={};let h=!1,g=0;const v=fe("anchor"),p=y(()=>[v.b(),a.type==="underline"?v.m("underline"):"",v.m(a.direction)]),m=A=>{f[A.href]=A.el},b=A=>{delete f[A]},k=A=>{s.value!==A&&(s.value=A,o(vt,A))};let w=null,C="";const S=A=>{if(!d.value)return;const F=$u(A);if(!F)return;if(w){if(C===A)return;w()}C=A,h=!0;const K=Pg(F,d.value),Y=xp(F,K),W=K.scrollHeight-K.clientHeight,P=Math.min(Y-a.offset,W);w=EP(d.value,g,P,a.duration,()=>{setTimeout(()=>{h=!1,C=""},20)})},E=A=>{A&&(k(A),S(A))},O=(A,F)=>{o("click",A,F),E(F)},$=Wq(()=>{d.value&&(g=Rg(d.value));const A=N();h||St(A)||k(A)}),N=()=>{if(!d.value)return;const A=Rg(d.value),F=[];for(const K of Object.keys(f)){const Y=$u(K);if(!Y)continue;const W=xp(Y,Pg(Y,d.value));F.push({top:W-a.offset-a.bound,href:K})}F.sort((K,Y)=>K.top-Y.top);for(let K=0;KA))return Y.href}},I=()=>{const A=$u(a.container);!A||Ai(A)?d.value=window:d.value=A};At(d,"scroll",$);const _=()=>{Oe(()=>{if(!u.value||!c.value||!s.value){r.value={};return}const A=f[s.value];if(!A){r.value={};return}const F=u.value.getBoundingClientRect(),K=c.value.getBoundingClientRect(),Y=A.getBoundingClientRect();a.direction==="horizontal"?r.value={left:`${Y.left-F.left}px`,width:`${Y.width}px`,opacity:1}:r.value={top:`${Y.top-F.top+(Y.height-K.height)/2}px`,opacity:1}})};return re(s,_),re(()=>l.default?.(),_),ct(()=>{I();const A=decodeURIComponent(window.location.hash);$u(A)?E(A):$()}),re(()=>a.container,()=>{I()}),gt(_2,{ns:v,direction:a.direction,currentAnchor:s,addLink:m,removeLink:b,handleClick:O}),t({scrollTo:E}),(A,F)=>(x(),B("div",{ref_key:"anchorRef",ref:u,class:T(p.value)},[e.marker?(x(),B("div",{key:0,ref_key:"markerRef",ref:c,class:T(i(v).e("marker")),style:He(r.value)},null,6)):te("v-if",!0),H("div",{class:T(i(v).e("list"))},[ee(A.$slots,"default")],2)],2))}}),Yq=jq;const Uq=Ce({title:String,href:String}),qq=["href"];var Gq=le({name:"ElAnchorLink",__name:"anchor-link",props:Uq,setup(e){const t=e,n=R(null),{ns:a,direction:o,currentAnchor:l,addLink:s,removeLink:r,handleClick:u}=Re(_2),c=y(()=>[a.e("link"),a.is("active",l.value===t.href)]),d=f=>{u(f,t.href)};return re(()=>t.href,(f,h)=>{Oe(()=>{h&&r(h),f&&s({href:f,el:n.value})})}),ct(()=>{const{href:f}=t;f&&s({href:f,el:n.value})}),Rt(()=>{const{href:f}=t;f&&r(f)}),(f,h)=>(x(),B("div",{class:T(i(a).e("item"))},[H("a",{ref_key:"linkRef",ref:n,class:T(c.value),href:e.href,onClick:d},[ee(f.$slots,"default",{},()=>[mt(ke(e.title),1)])],10,qq),f.$slots["sub-link"]&&i(o)==="vertical"?(x(),B("div",{key:0,class:T(i(a).e("list"))},[ee(f.$slots,"sub-link")],2)):te("v-if",!0)],2))}}),L2=Gq;const Xq=nt(Yq,{AnchorLink:L2}),Zq=Xt(L2),D2={label:"label",value:"value",disabled:"disabled"},Jq=Ce({direction:{type:q(String),default:"horizontal"},options:{type:q(Array),default:()=>[]},modelValue:{type:[String,Number,Boolean],default:void 0},props:{type:q(Object),default:()=>D2},block:Boolean,size:bn,disabled:{type:Boolean,default:void 0},validateEvent:{type:Boolean,default:!0},id:String,name:String,...Un(["ariaLabel"])}),Qq={[Qe]:e=>_e(e)||ze(e)||Dt(e),[vt]:e=>_e(e)||ze(e)||Dt(e)},eG=["id","aria-label","aria-labelledby"],tG=["name","disabled","checked","onChange"];var nG=le({name:"ElSegmented",__name:"segmented",props:Jq,emits:Qq,setup(e,{emit:t}){const n=e,a=t,o=fe("segmented"),l=Pn(),s=vn(),r=tn(),{formItem:u}=On(),{inputId:c,isLabeledByFormItem:d}=ya(n,{formItemContext:u}),f=R(null),h=rP(),g=Nt({isInit:!1,width:0,height:0,translateX:0,translateY:0,focusVisible:!1}),v=(A,F)=>{const K=b(F);a(Qe,K),a(vt,K),A.target.checked=K===n.modelValue},p=y(()=>({...D2,...n.props})),m=A=>A,b=A=>et(A)?A[p.value.value]:A,k=A=>et(A)?A[p.value.label]:A,w=A=>!!(r.value||et(A)&&A[p.value.disabled]),C=A=>n.modelValue===b(A),S=A=>n.options.find(F=>b(F)===A),E=A=>[o.e("item"),o.is("selected",C(A)),o.is("disabled",w(A))],O=()=>{if(!f.value)return;const A=f.value.querySelector(".is-selected"),F=f.value.querySelector(".is-selected input");if(!A||!F){g.width=0,g.height=0,g.translateX=0,g.translateY=0,g.focusVisible=!1;return}g.isInit=!0,n.direction==="vertical"?(g.height=A.offsetHeight,g.translateY=A.offsetTop):(g.width=A.offsetWidth,g.translateX=A.offsetLeft);try{g.focusVisible=F.matches(":focus-visible")}catch{}},$=y(()=>[o.b(),o.m(s.value),o.is("block",n.block)]),N=y(()=>({width:n.direction==="vertical"?"100%":`${g.width}px`,height:n.direction==="vertical"?`${g.height}px`:"100%",transform:n.direction==="vertical"?`translateY(${g.translateY}px)`:`translateX(${g.translateX}px)`,display:g.isInit?"block":"none"})),I=y(()=>[o.e("item-selected"),o.is("disabled",w(S(n.modelValue))),o.is("focus-visible",g.focusVisible)]),_=y(()=>n.name||l.value);return Ut(f,O),re(h,O),re(()=>n.modelValue,()=>{O(),n.validateEvent&&u?.validate?.("change").catch(A=>ut(A))},{flush:"post"}),(A,F)=>e.options.length?(x(),B("div",{key:0,id:i(c),ref_key:"segmentedRef",ref:f,class:T($.value),role:"radiogroup","aria-label":i(d)?void 0:e.ariaLabel||"segmented","aria-labelledby":i(d)?i(u).labelId:void 0},[H("div",{class:T([i(o).e("group"),i(o).m(e.direction)])},[H("div",{style:He(N.value),class:T(I.value)},null,6),(x(!0),B(Fe,null,ht(e.options,(K,Y)=>(x(),B("label",{key:Y,class:T(E(K))},[H("input",{class:T(i(o).e("item-input")),type:"radio",name:_.value,disabled:w(K),checked:C(K),onChange:W=>v(W,K)},null,42,tG),H("div",{class:T(i(o).e("item-label"))},[ee(A.$slots,"default",{item:m(K)},()=>[mt(ke(k(K)),1)])],2)],2))),128))],2)],10,eG)):te("v-if",!0)}}),aG=nG;const oG=nt(aG),lG=(e,t)=>{const n=e.toLowerCase();return(t.label||t.value||"").toLowerCase().includes(n)},sG=(e,t,n)=>{const{selectionEnd:a}=e;if(a===null)return;const o=e.value,l=Cn(t);let s=-1,r;for(let u=a-1;u>=0;--u){const c=o[u];if(c===n||c===` -`||c==="\r"){s=u;continue}if(l.includes(c)){const d=s===-1?a:s;r={pattern:o.slice(u+1,d),start:u+1,end:d,prefix:c,prefixIndex:u,splitIndex:s,selectionEnd:a};break}}return r},rG=(e,t={debug:!1,useSelectionEnd:!1})=>{const n=e.selectionStart!==null?e.selectionStart:0,a=e.selectionEnd!==null?e.selectionEnd:0,o=t.useSelectionEnd?a:n,l=["direction","boxSizing","width","height","overflowX","overflowY","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderStyle","paddingTop","paddingRight","paddingBottom","paddingLeft","fontStyle","fontVariant","fontWeight","fontStretch","fontSize","fontSizeAdjust","lineHeight","fontFamily","textAlign","textTransform","textIndent","textDecoration","letterSpacing","wordSpacing","tabSize","MozTabSize"];if(t.debug){const h=document.querySelector("#input-textarea-caret-position-mirror-div");h?.parentNode&&h.parentNode.removeChild(h)}const s=document.createElement("div");s.id="input-textarea-caret-position-mirror-div",document.body.appendChild(s);const r=s.style,u=window.getComputedStyle(e),c=e.nodeName==="INPUT";r.whiteSpace=c?"nowrap":"pre-wrap",c||(r.wordWrap="break-word"),r.position="absolute",t.debug||(r.visibility="hidden"),l.forEach(h=>{if(c&&h==="lineHeight")if(u.boxSizing==="border-box"){const g=Number.parseInt(u.height),v=Number.parseInt(u.paddingTop)+Number.parseInt(u.paddingBottom)+Number.parseInt(u.borderTopWidth)+Number.parseInt(u.borderBottomWidth),p=v+Number.parseInt(u.lineHeight);g>p?r.lineHeight=`${g-v}px`:g===p?r.lineHeight=u.lineHeight:r.lineHeight="0"}else r.lineHeight=u.height;else r[h]=u[h]}),vd()?e.scrollHeight>Number.parseInt(u.height)&&(r.overflowY="scroll"):r.overflow="hidden",s.textContent=e.value.slice(0,Math.max(0,o)),c&&s.textContent&&(s.textContent=s.textContent.replace(/\s/g," "));const d=document.createElement("span");d.textContent=e.value.slice(Math.max(0,o))||".",d.style.position="relative",d.style.left=`${-e.scrollLeft}px`,d.style.top=`${-e.scrollTop}px`,s.appendChild(d);const f={top:d.offsetTop+Number.parseInt(u.borderTopWidth),left:d.offsetLeft+Number.parseInt(u.borderLeftWidth),height:Number.parseInt(u.fontSize)*1.5};return t.debug?d.style.backgroundColor="#aaa":document.body.removeChild(s),f.left>=e.clientWidth&&(f.left=e.clientWidth),f},iG=Ce({...Gi,options:{type:q(Array),default:()=>[]},prefix:{type:q([String,Array]),default:"@",validator:e=>_e(e)?e.length===1:e.every(t=>_e(t)&&t.length===1)},split:{type:String,default:" ",validator:e=>e.length===1},filterOption:{type:q([Boolean,Function]),default:()=>lG,validator:e=>e===!1?!0:Be(e)},placement:{type:q(String),default:"bottom"},showArrow:Boolean,offset:{type:Number,default:0},whole:Boolean,checkIsWhole:{type:q(Function)},modelValue:String,loading:Boolean,popperClass:Lt.popperClass,popperStyle:Lt.popperStyle,popperOptions:{type:q(Object),default:()=>({})},props:{type:q(Object),default:()=>B2}}),uG={[Qe]:e=>_e(e),"whole-remove":(e,t)=>_e(e)&&_e(t),input:e=>_e(e),search:(e,t)=>_e(e)&&_e(t),select:(e,t)=>et(e)&&_e(t),focus:e=>e instanceof FocusEvent,blur:e=>e instanceof FocusEvent},B2={value:"value",label:"label",disabled:"disabled"},cG=Ce({options:{type:q(Array),default:()=>[]},loading:Boolean,disabled:Boolean,contentId:String,ariaLabel:String}),dG={select:e=>_e(e.value)},fG=["id","aria-disabled","aria-selected","onMousemove","onClick"];var pG=le({name:"ElMentionDropdown",__name:"mention-dropdown",props:cG,emits:dG,setup(e,{expose:t,emit:n}){const a=e,o=n,l=fe("mention"),{t:s}=bt(),r=R(-1),u=R(),c=R(),d=R(),f=(C,S)=>[l.be("dropdown","item"),l.is("hovering",r.value===S),l.is("disabled",C.disabled||a.disabled)],h=C=>{C.disabled||a.disabled||o("select",C)},g=C=>{r.value=C},v=y(()=>a.disabled||a.options.every(C=>C.disabled)),p=y(()=>a.options[r.value]),m=()=>{!p.value||p.value.disabled||a.disabled||o("select",p.value)},b=C=>{const{options:S}=a;if(S.length===0||v.value)return;C==="next"?(r.value++,r.value===S.length&&(r.value=0)):C==="prev"&&(r.value--,r.value<0&&(r.value=S.length-1));const E=S[r.value];if(E.disabled){b(C);return}Oe(()=>k(E))},k=C=>{const{options:S}=a,E=S.findIndex($=>$.value===C.value),O=c.value?.[E];if(O){const $=d.value?.querySelector?.(`.${l.be("dropdown","wrap")}`);$&&Hv($,O)}u.value?.handleScroll()};return re(()=>a.options,()=>{v.value||a.options.length===0?r.value=-1:r.value=a.options.findIndex(C=>!C.disabled)},{immediate:!0}),t({hoveringIndex:r,navigateOptions:b,selectHoverOption:m,hoverOption:p}),(C,S)=>(x(),B("div",{ref_key:"dropdownRef",ref:d,class:T(i(l).b("dropdown"))},[C.$slots.header?(x(),B("div",{key:0,class:T(i(l).be("dropdown","header"))},[ee(C.$slots,"header")],2)):te("v-if",!0),st(U(i(Ka),{id:e.contentId,ref_key:"scrollbarRef",ref:u,tag:"ul","wrap-class":i(l).be("dropdown","wrap"),"view-class":i(l).be("dropdown","list"),role:"listbox","aria-label":e.ariaLabel,"aria-orientation":"vertical"},{default:Z(()=>[(x(!0),B(Fe,null,ht(e.options,(E,O)=>(x(),B("li",{id:`${e.contentId}-${O}`,ref_for:!0,ref_key:"optionRefs",ref:c,key:O,class:T(f(E,O)),role:"option","aria-disabled":E.disabled||e.disabled||void 0,"aria-selected":r.value===O,onMousemove:$=>g(O),onClick:qe($=>h(E),["stop"])},[ee(C.$slots,"label",{item:E,index:O},()=>[H("span",null,ke(E.label??E.value),1)])],42,fG))),128))]),_:3},8,["id","wrap-class","view-class","aria-label"]),[[Ot,e.options.length>0&&!e.loading]]),e.loading?(x(),B("div",{key:1,class:T(i(l).be("dropdown","loading"))},[ee(C.$slots,"loading",{},()=>[mt(ke(i(s)("el.mention.loading")),1)])],2)):te("v-if",!0),C.$slots.footer?(x(),B("div",{key:2,class:T(i(l).be("dropdown","footer"))},[ee(C.$slots,"footer")],2)):te("v-if",!0)],2))}}),vG=pG,hG=le({name:"ElMention",inheritAttrs:!1,__name:"mention",props:iG,emits:uG,setup(e,{expose:t,emit:n}){const a=e,o=n,l=y(()=>Wo(a,Object.keys(Gi))),s=fe("mention"),r=tn(),u=Pn(),c=R(),d=R(),f=R(),h=R(!1),g=R(),v=R(),p=y(()=>a.showArrow?a.placement:`${a.placement}-start`),m=y(()=>a.showArrow?["bottom","top"]:["bottom-start","top-start"]),b=y(()=>({...B2,...a.props})),k=P=>{const M={label:P[b.value.label],value:P[b.value.value],disabled:P[b.value.disabled]};return{...P,...M}},w=y(()=>a.options.map(k)),C=y(()=>{const{filterOption:P}=a;return!v.value||!P?w.value:w.value.filter(M=>P(v.value.pattern,M))}),S=y(()=>h.value&&(!!C.value.length||a.loading)),E=y(()=>`${u.value}-${f.value?.hoveringIndex}`),O=P=>{o(Qe,P),o(pn,P),K()},$=P=>{if(c.value?.isComposing)return;const M=Ft(P);switch(M){case we.left:case we.right:K();break;case we.up:case we.down:if(!h.value)return;P.preventDefault(),f.value?.navigateOptions(M===we.up?"prev":"next");break;case we.enter:case we.numpadEnter:if(!h.value){a.type!=="textarea"&&K();return}P.preventDefault(),f.value?.hoverOption?f.value?.selectHoverOption():h.value=!1;break;case we.esc:if(!h.value)return;P.preventDefault(),h.value=!1;break;case we.backspace:if(a.whole&&v.value){const{splitIndex:L,selectionEnd:D,pattern:V,prefixIndex:G,prefix:j}=v.value,X=F();if(!X)return;const Q=X.value,ve=w.value.find(ue=>ue.value===V);if((Be(a.checkIsWhole)?a.checkIsWhole(V,j):ve)&&L!==-1&&L+1===D){P.preventDefault();const ue=Q.slice(0,G)+Q.slice(L+1);o(Qe,ue),o(pn,ue),o("whole-remove",V,j);const ge=G;Oe(()=>{X.selectionStart=ge,X.selectionEnd=ge,W()})}}}},{wrapperRef:N}=tl(c,{disabled:r,afterFocus(){K()},beforeBlur(P){return d.value?.isFocusInsideContent(P)},afterBlur(){h.value=!1}}),I=()=>{K()},_=P=>a.options.find(M=>P.value===M[b.value.value]),A=P=>{if(!v.value)return;const M=F();if(!M)return;const L=M.value,{split:D}=a,V=L.slice(v.value.end),G=V.startsWith(D),j=`${P.value}${G?"":D}`,X=L.slice(0,v.value.start)+j+V;o(Qe,X),o(pn,X),o("select",_(P),v.value.prefix);const Q=v.value.start+j.length+(G?1:0);Oe(()=>{M.selectionStart=Q,M.selectionEnd=Q,M.focus(),W()})},F=()=>a.type==="textarea"?c.value?.textarea:c.value?.input,K=()=>{setTimeout(()=>{Y(),W(),Oe(()=>d.value?.updatePopper())},0)},Y=()=>{const P=F();if(!P)return;const M=rG(P),L=P.getBoundingClientRect(),D=N.value.getBoundingClientRect();g.value={position:"absolute",width:0,height:`${M.height}px`,left:`${M.left+L.left-D.left}px`,top:`${M.top+L.top-D.top}px`}},W=()=>{const P=F();if(document.activeElement!==P){h.value=!1;return}const{prefix:M,split:L}=a;if(v.value=sG(P,M,L),v.value&&v.value.splitIndex===-1){h.value=!0,o("search",v.value.pattern,v.value.prefix);return}h.value=!1};return t({input:c,tooltip:d,dropdownVisible:S}),(P,M)=>(x(),B("div",{ref_key:"wrapperRef",ref:N,class:T(i(s).b())},[U(i(Wn),rt(rt(l.value,P.$attrs),{ref_key:"elInputRef",ref:c,"model-value":e.modelValue,disabled:i(r),role:S.value?"combobox":void 0,"aria-activedescendant":S.value?E.value||"":void 0,"aria-controls":S.value?i(u):void 0,"aria-expanded":S.value||void 0,"aria-label":e.ariaLabel,"aria-autocomplete":S.value?"none":void 0,"aria-haspopup":S.value?"listbox":void 0,onInput:O,onKeydown:$,onMousedown:I}),Qn({_:2},[ht(P.$slots,(L,D)=>({name:D,fn:Z(V=>[ee(P.$slots,D,Lo(Do(V)))])}))]),1040,["model-value","disabled","role","aria-activedescendant","aria-controls","aria-expanded","aria-label","aria-autocomplete","aria-haspopup"]),U(i($n),{ref_key:"tooltipRef",ref:d,visible:S.value,"popper-class":[i(s).e("popper"),e.popperClass],"popper-style":e.popperStyle,"popper-options":e.popperOptions,placement:p.value,"fallback-placements":m.value,effect:"light",pure:"",offset:e.offset,"show-arrow":e.showArrow},{default:Z(()=>[H("div",{style:He(g.value)},null,4)]),content:Z(()=>[U(vG,{ref_key:"dropdownRef",ref:f,options:C.value,disabled:i(r),loading:e.loading,"content-id":i(u),"aria-label":e.ariaLabel,onSelect:A,onClick:M[0]||(M[0]=qe(L=>c.value?.focus(),["stop"]))},Qn({_:2},[ht(P.$slots,(L,D)=>({name:D,fn:Z(V=>[ee(P.$slots,D,Lo(Do(V)))])}))]),1032,["options","disabled","loading","content-id","aria-label"])]),_:3},8,["visible","popper-class","popper-style","popper-options","placement","fallback-placements","offset","show-arrow"])],2))}}),mG=hG;const gG=nt(mG),bG=Ce({layout:{type:String,default:"horizontal",values:["horizontal","vertical"]},lazy:Boolean}),yG={resizeStart:(e,t)=>!0,resize:(e,t)=>!0,resizeEnd:(e,t)=>!0,collapse:(e,t,n)=>!0},wG=Ce({min:{type:[String,Number]},max:{type:[String,Number]},size:{type:[String,Number]},resizable:{type:Boolean,default:!0},collapsible:Boolean}),CG={"update:size":e=>typeof e=="number"||typeof e=="string"};function SG(e){const t=R(),{width:n,height:a}=qf(t);return{containerEl:t,containerSize:y(()=>e.value==="horizontal"?n.value:a.value)}}function nm(e){return Number(e.slice(0,-1))/100}function am(e){return Number(e.slice(0,-2))}function om(e){return _e(e)&&e.endsWith("%")}function lm(e){return _e(e)&&e.endsWith("px")}function kG(e,t){const n=y(()=>e.value.map(s=>s.size)),a=y(()=>e.value.length),o=R([]);re([n,a,t],()=>{let s=[],r=0;for(let c=0;cc+(d||0),0);if(u>1||!r){const c=1/u;s=s.map(d=>d===void 0?0:d*c)}else{const c=(1-u)/r;s=s.map(d=>d===void 0?c:d)}o.value=s});const l=s=>s*t.value;return{percentSizes:o,pxSizes:y(()=>o.value.map(l))}}function EG(e,t,n,a){const o=m=>m*t.value||0;function l(m,b){return om(m)?o(nm(m)):lm(m)?am(m):m??b}const s=R(0),r=R(null);let u=[],c=Pt;const d=y(()=>e.value.map(m=>[m.min,m.max]));re(a,()=>{if(s.value){const m=new MouseEvent("mouseup",{bubbles:!0});window.dispatchEvent(m)}});const f=m=>{s.value=0,r.value={index:m,confirmed:!1},u=n.value},h=(m,b)=>{let k=null;if((!r.value||!r.value.confirmed)&&b!==0){if(b>0)k=m,r.value={index:m,confirmed:!0};else for(let _=m;_>=0;_-=1)if(u[_]>0){k=_,r.value={index:_,confirmed:!0};break}}const w=k??r.value?.index??m,C=[...u],S=w+1,E=l(d.value[w][0],0),O=l(d.value[S][0],0),$=l(d.value[w][1],t.value||0),N=l(d.value[S][1],t.value||0);let I=b;C[w]+I$&&(I=$-C[w]),C[S]-I>N&&(I=C[S]-N),C[w]+=I,C[S]-=I,s.value=I,c=()=>{e.value.forEach((_,A)=>{_.size=C[A]}),c=Pt},a.value||c()},g=()=>{a.value&&c(),s.value=0,r.value=null,u=[]},v=[];return{lazyOffset:s,onMoveStart:f,onMoving:h,onMoveEnd:g,movingIndex:r,onCollapse:(m,b)=>{v.length||v.push(...n.value);const k=n.value,w=b==="start"?m:m+1,C=b==="start"?m+1:m,S=k[w],E=k[C];if(S!==0&&E!==0)k[w]=0,k[C]+=S,v[m]=S;else{const O=S+E,$=v[m],N=O-$;k[C]=$,k[w]=N}e.value.forEach((O,$)=>{O.size=k[$]})}}}const V2=Symbol("splitterRootContextKey");var xG=le({name:"ElSplitter",__name:"splitter",props:bG,emits:yG,setup(e,{emit:t}){const n=fe("splitter"),a=t,o=e,l=_t(o,"layout"),s=_t(o,"lazy"),{containerEl:r,containerSize:u}=SG(l),{removeChild:c,children:d,addChild:f,ChildrenSorter:h}=Cd(it(),"ElSplitterPanel");re(d,()=>{m.value=null,d.value.forEach((I,_)=>{I.setIndex(_)})});const{percentSizes:g,pxSizes:v}=kG(d,u),{lazyOffset:p,movingIndex:m,onMoveStart:b,onMoving:k,onMoveEnd:w,onCollapse:C}=EG(d,u,v,s),S=y(()=>({[n.cssVarBlockName("bar-offset")]:s.value?`${p.value}px`:void 0}));return gt(V2,Nt({panels:d,percentSizes:g,pxSizes:v,layout:l,lazy:s,movingIndex:m,containerSize:u,onMoveStart:I=>{b(I),a("resizeStart",I,v.value)},onMoving:(I,_)=>{k(I,_),s.value||a("resize",I,v.value)},onMoveEnd:async I=>{w(),await Oe(),a("resizeEnd",I,v.value)},onCollapse:(I,_)=>{C(I,_),a("collapse",I,_,v.value)},registerPanel:f,unregisterPanel:c})),(I,_)=>(x(),B("div",{ref_key:"containerEl",ref:r,class:T([i(n).b(),i(n).e(l.value)]),style:He(S.value)},[ee(I.$slots,"default"),U(i(h)),te(" Prevent iframe touch events from breaking "),i(m)?(x(),B("div",{key:0,class:T([i(n).e("mask"),i(n).e(`mask-${l.value}`)])},null,2)):te("v-if",!0)],6))}}),TG=xG;function $G(e){return e&&et(e)?e:{start:!!e,end:!!e}}function Gy(e,t,n,a){return!!(e?.collapsible.end&&t>0||n?.collapsible.start&&a===0&&t>0)}var OG=le({name:"ElSplitterBar",__name:"split-bar",props:{index:{type:Number,required:!0},layout:{type:String,values:["horizontal","vertical"],default:"horizontal"},resizable:{type:Boolean,default:!0},lazy:Boolean,startCollapsible:Boolean,endCollapsible:Boolean},emits:["moveStart","moving","moveEnd","collapse"],setup(e,{emit:t}){const n=fe("splitter-bar"),a=e,o=t,l=y(()=>a.layout==="horizontal"),s=y(()=>l.value?{width:0}:{height:0}),r=y(()=>({width:l.value?"16px":"100%",height:l.value?"100%":"16px",cursor:a.resizable?l.value?"ew-resize":"ns-resize":"auto",touchAction:"none"})),u=y(()=>{const k=n.e("dragger");return{[`${k}-horizontal`]:l.value,[`${k}-vertical`]:!l.value,[`${k}-active`]:!!c.value}}),c=R(null),d=k=>{a.resizable&&(c.value=[k.pageX,k.pageY],o("moveStart",a.index),window.addEventListener("mouseup",v),window.addEventListener("mousemove",h))},f=k=>{if(a.resizable&&k.touches.length===1){k.preventDefault();const w=k.touches[0];c.value=[w.pageX,w.pageY],o("moveStart",a.index),window.addEventListener("touchend",p),window.addEventListener("touchmove",g)}},h=k=>{const{pageX:w,pageY:C}=k,S=w-c.value[0],E=C-c.value[1],O=l.value?S:E;o("moving",a.index,O)},g=k=>{if(k.touches.length===1){k.preventDefault();const w=k.touches[0],C=w.pageX-c.value[0],S=w.pageY-c.value[1],E=l.value?C:S;o("moving",a.index,E)}},v=()=>{c.value=null,window.removeEventListener("mouseup",v),window.removeEventListener("mousemove",h),o("moveEnd",a.index)},p=()=>{c.value=null,window.removeEventListener("touchend",p),window.removeEventListener("touchmove",g),o("moveEnd",a.index)},m=y(()=>l.value?Uo:Sd),b=y(()=>l.value?Yn:Eo);return(k,w)=>(x(),B("div",{class:T([i(n).b()]),style:He(s.value)},[e.startCollapsible?(x(),B("div",{key:0,class:T([i(n).e("collapse-icon"),i(n).e(`${e.layout}-collapse-icon-start`)]),onClick:w[0]||(w[0]=C=>o("collapse",e.index,"start"))},[ee(k.$slots,"start-collapsible",{},()=>[(x(),oe(ot(m.value),{style:{width:"12px",height:"12px"}}))])],2)):te("v-if",!0),H("div",{class:T([i(n).e("dragger"),u.value,i(n).is("disabled",!e.resizable),i(n).is("lazy",e.resizable&&e.lazy)]),style:He(r.value),onMousedown:d,onTouchstart:f},null,38),e.endCollapsible?(x(),B("div",{key:1,class:T([i(n).e("collapse-icon"),i(n).e(`${e.layout}-collapse-icon-end`)]),onClick:w[1]||(w[1]=C=>o("collapse",e.index,"end"))},[ee(k.$slots,"end-collapsible",{},()=>[(x(),oe(ot(b.value),{style:{width:"12px",height:"12px"}}))])],2)):te("v-if",!0)],6))}}),IG=OG;const Xy="ElSplitterPanel";var NG=le({name:Xy,__name:"split-panel",props:wG,emits:CG,setup(e,{expose:t,emit:n}){const a=fe("splitter-panel"),o=e,l=n,s=Re(V2);s||Gt(Xy,"usage: ");const{panels:r,layout:u,lazy:c,containerSize:d,pxSizes:f}=En(s),{registerPanel:h,unregisterPanel:g,onCollapse:v,onMoveEnd:p,onMoveStart:m,onMoving:b}=s,k=R(),w=it(),C=w.uid,S=R(0),E=y(()=>r.value[S.value]),O=M=>{S.value=M},$=y(()=>E.value?f.value[S.value]??0:0),N=y(()=>E.value?f.value[S.value+1]??0:0),I=y(()=>E.value?r.value[S.value+1]:null),_=y(()=>I.value?o.resizable&&I.value?.resizable&&($.value!==0||!o.min)&&(N.value!==0||!I.value.min):!1),A=y(()=>E.value?S.value!==r.value.length-1:!1),F=y(()=>Gy(E.value,$.value,I.value,N.value)),K=y(()=>Gy(I.value,N.value,E.value,$.value));function Y(M){return om(M)?nm(M)*d.value||0:lm(M)?am(M):M??0}let W=!1;re(()=>o.size,()=>{if(!W&&E.value){if(!d.value){E.value.size=o.size;return}const M=Y(o.size),L=Y(o.max),D=Y(o.min),V=Math.min(Math.max(M,D||0),L||M);V!==M&&l("update:size",V),E.value.size=V}}),re(()=>E.value?.size,M=>{M!==o.size&&(W=!0,l("update:size",M),Oe(()=>W=!1))}),re(()=>o.resizable,M=>{E.value&&(E.value.resizable=M)});const P=Nt({uid:C,getVnode:()=>w.vnode,setIndex:O,...o,collapsible:y(()=>$G(o.collapsible))});return h(P),Rt(()=>g(P)),t({splitterPanelRef:k}),(M,L)=>(x(),B(Fe,null,[H("div",rt({ref_key:"panelEl",ref:k,class:[i(a).b()],style:{flexBasis:`${$.value}px`}},M.$attrs),[ee(M.$slots,"default")],16),A.value?(x(),oe(IG,{key:0,index:S.value,layout:i(u),lazy:i(c),resizable:_.value,"start-collapsible":F.value,"end-collapsible":K.value,onMoveStart:i(m),onMoving:i(b),onMoveEnd:i(p),onCollapse:i(v)},{"start-collapsible":Z(()=>[ee(M.$slots,"start-collapsible")]),"end-collapsible":Z(()=>[ee(M.$slots,"end-collapsible")]),_:3},8,["index","layout","lazy","resizable","start-collapsible","end-collapsible","onMoveStart","onMoving","onMoveEnd","onCollapse"])):te("v-if",!0)],64))}}),F2=NG;const MG=nt(TG,{SplitPanel:F2}),PG=Xt(F2),fa="ElInfiniteScroll",RG=50,AG=200,_G=0,LG={delay:{type:Number,default:AG},distance:{type:Number,default:_G},disabled:{type:Boolean,default:!1},immediate:{type:Boolean,default:!0}},sm=(e,t)=>Object.entries(LG).reduce((n,[a,o])=>{const{type:l,default:s}=o,r=e.getAttribute(`infinite-scroll-${a}`);let u=t[r]??r??s;return u=u==="false"?!1:u,u=l(u),n[a]=Number.isNaN(u)?s:u,n},{}),z2=e=>{const{observer:t}=e[fa];t&&(t.disconnect(),delete e[fa].observer)},DG=(e,t)=>{const{container:n,containerEl:a,instance:o,observer:l,lastScrollTop:s}=e[fa],{disabled:r,distance:u}=sm(e,o),{clientHeight:c,scrollHeight:d,scrollTop:f}=a,h=f-s;if(e[fa].lastScrollTop=f,l||r||h<0)return;let g=!1;if(n===e)g=d-(c+f)<=u;else{const{clientTop:v,scrollHeight:p}=e,m=xp(e,a);g=f+c>=m+v+p-u}g&&t.call(o)};function If(e,t){const{containerEl:n,instance:a}=e[fa],{disabled:o}=sm(e,a);o||n.clientHeight===0||(n.scrollHeight<=n.clientHeight?t.call(a):z2(e))}const BG={async mounted(e,t){const{instance:n,value:a}=t;co({scope:fa,from:"the directive v-infinite-scroll",replacement:"the el-scrollbar infinite scroll",version:"3.0.0",ref:"https://element-plus.org/en-US/component/scrollbar#infinite-scroll"},!0),Be(a)||Gt(fa,"'v-infinite-scroll' binding value must be a function"),await Oe();const{delay:o,immediate:l}=sm(e,n),s=zv(e,!0),r=s===window?document.documentElement:s,u=vl(DG.bind(null,e,a),o);if(s){if(e[fa]={instance:n,container:s,containerEl:r,delay:o,cb:a,onScroll:u,lastScrollTop:r.scrollTop},l){const c=new MutationObserver(vl(If.bind(null,e,a),RG));e[fa].observer=c,c.observe(e,{childList:!0,subtree:!0}),If(e,a)}s.addEventListener("scroll",u)}},unmounted(e){if(!e[fa])return;const{container:t,onScroll:n}=e[fa];t?.removeEventListener("scroll",n),z2(e)},async updated(e){if(!e[fa])await Oe();else{const{containerEl:t,cb:n,observer:a}=e[fa];t.clientHeight&&a&&If(e,n)}}},qp=BG;qp.install=e=>{e.directive("InfiniteScroll",qp)};const VG=qp;function FG(e,t){let n;const a=R(!1),o=Nt({...e,originalPosition:"",originalOverflow:"",visible:!1});function l(h){o.text=h}function s(){const h=o.parent,g=f.ns;if(!h.vLoadingAddClassList){let v=h.getAttribute("loading-number");v=Number.parseInt(v)-1,v?h.setAttribute("loading-number",v.toString()):(jn(h,g.bm("parent","relative")),h.removeAttribute("loading-number")),jn(h,g.bm("parent","hidden"))}r(),d.unmount()}function r(){f.$el?.parentNode?.removeChild(f.$el)}function u(){e.beforeClose&&!e.beforeClose()||(a.value=!0,clearTimeout(n),n=setTimeout(c,400),o.visible=!1,e.closed?.())}function c(){if(!a.value)return;const h=o.parent;a.value=!1,h.vLoadingAddClassList=void 0,s()}const d=hT(le({name:"ElLoading",setup(h,{expose:g}){const{ns:v,zIndex:p}=Td("loading");return g({ns:v,zIndex:p}),()=>{const m=o.spinner||o.svg,b=Ye("svg",{class:"circular",viewBox:o.svgViewBox?o.svgViewBox:"0 0 50 50",...m?{innerHTML:m}:{}},[Ye("circle",{class:"path",cx:"25",cy:"25",r:"20",fill:"none"})]),k=o.text?Ye("p",{class:v.b("text")},[o.text]):void 0;return Ye(Mn,{name:v.b("fade"),onAfterLeave:c},{default:Z(()=>[st(U("div",{style:{backgroundColor:o.background||""},class:[v.b("mask"),o.customClass,v.is("fullscreen",o.fullscreen)]},[Ye("div",{class:v.b("spinner")},[b,k])]),[[Ot,o.visible]])])})}}}));Object.assign(d._context,t??{});const f=d.mount(document.createElement("div"));return{...En(o),setText:l,removeElLoadingChild:r,close:u,handleAfterLeave:c,vm:f,get $el(){return f.$el}}}let Ou;const zs=function(e={},t){if(!It)return;const n=zG(e);if(n.fullscreen&&Ou)return Ou;const a=FG({...n,closed:()=>{n.closed?.(),n.fullscreen&&(Ou=void 0)}},t??zs._context);HG(n,n.parent,a),Zy(n,n.parent,a),n.parent.vLoadingAddClassList=()=>Zy(n,n.parent,a);let o=n.parent.getAttribute("loading-number");return o?o=`${Number.parseInt(o)+1}`:o="1",n.parent.setAttribute("loading-number",o),n.parent.appendChild(a.$el),Oe(()=>a.visible.value=n.visible),n.fullscreen&&(Ou=a),a},zG=e=>{let t;return _e(e.target)?t=document.querySelector(e.target)??document.body:t=e.target||document.body,{parent:t===document.body||e.body?document.body:t,background:e.background||"",svg:e.svg||"",svgViewBox:e.svgViewBox||"",spinner:e.spinner||!1,text:e.text||"",fullscreen:t===document.body&&(e.fullscreen??!0),lock:e.lock??!1,customClass:e.customClass||"",visible:e.visible??!0,beforeClose:e.beforeClose,closed:e.closed,target:t}},HG=async(e,t,n)=>{const{nextZIndex:a}=n.vm.zIndex||n.vm._.exposed.zIndex,o={};if(e.fullscreen)n.originalPosition.value=Ro(document.body,"position"),n.originalOverflow.value=Ro(document.body,"overflow"),o.zIndex=a();else if(e.parent===document.body){n.originalPosition.value=Ro(document.body,"position"),await Oe();for(const l of["top","left"]){const s=l==="top"?"scrollTop":"scrollLeft";o[l]=`${e.target.getBoundingClientRect()[l]+document.body[s]+document.documentElement[s]-Number.parseInt(Ro(document.body,`margin-${l}`),10)}px`}for(const l of["height","width"])o[l]=`${e.target.getBoundingClientRect()[l]}px`}else n.originalPosition.value=Ro(t,"position");for(const[l,s]of Object.entries(o))n.$el.style[l]=s},Zy=(e,t,n)=>{const a=n.vm.ns||n.vm._.exposed.ns;["absolute","fixed","sticky"].includes(n.originalPosition.value)?jn(t,a.bm("parent","relative")):ka(t,a.bm("parent","relative")),e.fullscreen&&e.lock?ka(t,a.bm("parent","hidden")):jn(t,a.bm("parent","hidden"))};zs._context=null;const Mr=Symbol("ElLoading"),Ll=e=>`element-loading-${Go(e)}`,Jy=(e,t)=>{const n=t.instance,a=c=>et(t.value)?t.value[c]:void 0,o=c=>R(_e(c)&&n?.[c]||c),l=c=>o(a(c)||e.getAttribute(Ll(c))),s=a("fullscreen")??t.modifiers.fullscreen,r={text:l("text"),svg:l("svg"),svgViewBox:l("svgViewBox"),spinner:l("spinner"),background:l("background"),customClass:l("customClass"),fullscreen:s,target:a("target")??(s?void 0:e),body:a("body")??t.modifiers.body,lock:a("lock")??t.modifiers.lock},u=zs(r);u._context=Ur._context,e[Mr]={options:r,instance:u}},KG=(e,t)=>{for(const n of Object.keys(e))Yt(e[n])&&(e[n].value=t[n])},Ur={mounted(e,t){t.value&&Jy(e,t)},updated(e,t){const n=e[Mr];if(!t.value){n?.instance.close(),e[Mr]=null;return}n?KG(n.options,et(t.value)?t.value:{text:e.getAttribute(Ll("text")),svg:e.getAttribute(Ll("svg")),svgViewBox:e.getAttribute(Ll("svgViewBox")),spinner:e.getAttribute(Ll("spinner")),background:e.getAttribute(Ll("background")),customClass:e.getAttribute(Ll("customClass"))}):Jy(e,t)},unmounted(e){e[Mr]?.instance.close(),e[Mr]=null}};Ur._context=null;const WG={install(e){zs._context=e._context,Ur._context=e._context,e.directive("loading",Ur),e.config.globalProperties.$loading=zs},directive:Ur,service:zs},H2=["primary","success","info","warning","error"],K2=["top","top-left","top-right","bottom","bottom-left","bottom-right"],Hs="top",Dn=Qt({customClass:"",dangerouslyUseHTMLString:!1,duration:3e3,icon:void 0,id:"",message:"",onClose:void 0,showClose:!1,type:"info",plain:!1,offset:16,placement:void 0,zIndex:0,grouping:!1,repeatNum:1,appendTo:It?document.body:void 0}),jG=Ce({customClass:{type:String,default:Dn.customClass},dangerouslyUseHTMLString:{type:Boolean,default:Dn.dangerouslyUseHTMLString},duration:{type:Number,default:Dn.duration},icon:{type:Bt,default:Dn.icon},id:{type:String,default:Dn.id},message:{type:q([String,Object,Function]),default:Dn.message},onClose:{type:q(Function),default:Dn.onClose},showClose:{type:Boolean,default:Dn.showClose},type:{type:String,values:H2,default:Dn.type},plain:{type:Boolean,default:Dn.plain},offset:{type:Number,default:Dn.offset},placement:{type:String,values:K2,default:Dn.placement},zIndex:{type:Number,default:Dn.zIndex},grouping:{type:Boolean,default:Dn.grouping},repeatNum:{type:Number,default:Dn.repeatNum}}),YG={destroy:()=>!0},La=lv({}),UG=e=>(La[e]||(La[e]=lv([])),La[e]),qG=(e,t)=>{const n=La[t]||[],a=n.findIndex(s=>s.id===e),o=n[a];let l;return a>0&&(l=n[a-1]),{current:o,prev:l}},GG=(e,t)=>{const{prev:n}=qG(e,t);return n?n.vm.exposed.bottom.value:0},XG=(e,t,n)=>(La[n]||[]).findIndex(a=>a.id===e)>0?16:t,ZG=["id"],JG=["innerHTML"];var QG=le({name:"ElMessage",__name:"message",props:jG,emits:YG,setup(e,{expose:t,emit:n}){const{Close:a}=sh,o=e,l=n,s=R(!1),{ns:r,zIndex:u}=Td("message"),{currentZIndex:c,nextZIndex:d}=u,f=R(),h=R(!1),g=R(0);let v;const p=y(()=>o.type?o.type==="error"?"danger":o.type:"info"),m=y(()=>{const F=o.type;return{[r.bm("icon",F)]:F&&xl[F]}}),b=y(()=>o.icon||xl[o.type]||""),k=y(()=>o.placement||Hs),w=y(()=>GG(o.id,k.value)),C=y(()=>XG(o.id,o.offset,k.value)+w.value),S=y(()=>g.value+C.value),E=y(()=>k.value.includes("left")?r.is("left"):k.value.includes("right")?r.is("right"):r.is("center")),O=y(()=>k.value.startsWith("top")?"top":"bottom"),$=y(()=>({[O.value]:`${C.value}px`,zIndex:c.value}));function N(){o.duration!==0&&({stop:v}=qs(()=>{_()},o.duration))}function I(){v?.()}function _(){h.value=!1,Oe(()=>{s.value||(o.onClose?.(),l("destroy"))})}function A(F){Ft(F)===we.esc&&_()}return ct(()=>{N(),d(),h.value=!0}),re(()=>o.repeatNum,()=>{I(),N()}),At(document,"keydown",A),Ut(f,()=>{g.value=f.value.getBoundingClientRect().height}),t({visible:h,bottom:S,close:_}),(F,K)=>(x(),oe(Mn,{name:i(r).b("fade"),onBeforeEnter:K[0]||(K[0]=Y=>s.value=!0),onBeforeLeave:e.onClose,onAfterLeave:K[1]||(K[1]=Y=>F.$emit("destroy")),persisted:""},{default:Z(()=>[st(H("div",{id:e.id,ref_key:"messageRef",ref:f,class:T([i(r).b(),{[i(r).m(e.type)]:e.type},i(r).is("closable",e.showClose),i(r).is("plain",e.plain),i(r).is("bottom",O.value==="bottom"),E.value,e.customClass]),style:He($.value),role:"alert",onMouseenter:I,onMouseleave:N},[e.repeatNum>1?(x(),oe(i(FC),{key:0,value:e.repeatNum,type:p.value,class:T(i(r).e("badge"))},null,8,["value","type","class"])):te("v-if",!0),b.value?(x(),oe(i(Le),{key:1,class:T([i(r).e("icon"),m.value])},{default:Z(()=>[(x(),oe(ot(b.value)))]),_:1},8,["class"])):te("v-if",!0),ee(F.$slots,"default",{},()=>[e.dangerouslyUseHTMLString?(x(),B(Fe,{key:1},[te(" Caution here, message could've been compromised, never use user's input as message "),H("p",{class:T(i(r).e("content")),innerHTML:e.message},null,10,JG)],2112)):(x(),B("p",{key:0,class:T(i(r).e("content"))},ke(e.message),3))]),e.showClose?(x(),oe(i(Le),{key:2,class:T(i(r).e("closeBtn")),onClick:qe(_,["stop"])},{default:Z(()=>[U(i(a))]),_:1},8,["class"])):te("v-if",!0)],46,ZG),[[Ot,h.value]])]),_:3},8,["name","onBeforeLeave"]))}}),eX=QG;let tX=1;const nX=e=>{if(!e.appendTo)e.appendTo=document.body;else if(_e(e.appendTo)){let t=document.querySelector(e.appendTo);oa(t)||(ut("ElMessage","the appendTo option is not an HTMLElement. Falling back to document.body."),t=document.body),e.appendTo=t}},aX=e=>{!e.placement&&_e(Fn.placement)&&Fn.placement&&(e.placement=Fn.placement),e.placement||(e.placement=Hs),K2.includes(e.placement)||(ut("ElMessage",`Invalid placement: ${e.placement}. Falling back to '${Hs}'.`),e.placement=Hs)},W2=e=>{const t=!e||_e(e)||zt(e)||Be(e)?{message:e}:e,n={...Dn,...t};return nX(n),aX(n),Dt(Fn.grouping)&&!n.grouping&&(n.grouping=Fn.grouping),ze(Fn.duration)&&n.duration===3e3&&(n.duration=Fn.duration),ze(Fn.offset)&&n.offset===16&&(n.offset=Fn.offset),Dt(Fn.showClose)&&!n.showClose&&(n.showClose=Fn.showClose),Dt(Fn.plain)&&!n.plain&&(n.plain=Fn.plain),n},oX=e=>{const t=La[e.props.placement||Hs],n=t.indexOf(e);if(n===-1)return;t.splice(n,1);const{handler:a}=e;a.close()},lX=({appendTo:e,...t},n)=>{const a=`message_${tX++}`,o=t.onClose,l=document.createElement("div"),s={...t,id:a,onClose:()=>{o?.(),oX(c)},onDestroy:()=>{Cl(null,l)}},r=U(eX,s,Be(s.message)||zt(s.message)?{default:Be(s.message)?s.message:()=>s.message}:null);r.appContext=n||rs._context,Cl(r,l),e.appendChild(l.firstElementChild);const u=r.component,c={id:a,vnode:r,vm:u,handler:{close:()=>{u.exposed.close()}},props:r.component.props};return c},rs=(e={},t)=>{if(!It)return{close:()=>{}};const n=W2(e),a=UG(n.placement||Hs);if(n.grouping&&a.length){const l=a.find(({vnode:s})=>s.props?.message===n.message);if(l)return l.props.repeatNum+=1,l.props.type=n.type,l.handler}if(ze(Fn.max)&&a.length>=Fn.max)return{close:()=>{}};const o=lX(n,t);return a.push(o),o.handler};H2.forEach(e=>{rs[e]=(t={},n)=>rs({...W2(t),type:e},n)});function sX(e){for(const t in La)if(Tt(La,t)){const n=[...La[t]];for(const a of n)(!e||e===a.props.type)&&a.handler.close()}}function rX(e){La[e]&&[...La[e]].forEach(t=>t.handler.close())}rs.closeAll=sX;rs.closeAllByPlacement=rX;rs._context=null;const iX=hC(rs,"$message");var uX=le({name:"ElMessageBox",directives:{TrapFocus:OD},components:{ElButton:Sn,ElFocusTrap:hr,ElInput:Wn,ElOverlay:Ih,ElIcon:Le,...sh},inheritAttrs:!1,props:{buttonSize:{type:String,validator:jk},modal:{type:Boolean,default:!0},lockScroll:{type:Boolean,default:!0},showClose:{type:Boolean,default:!0},closeOnClickModal:{type:Boolean,default:!0},closeOnPressEscape:{type:Boolean,default:!0},closeOnHashChange:{type:Boolean,default:!0},center:Boolean,draggable:Boolean,overflow:Boolean,roundButton:Boolean,container:{type:String,default:"body"},boxType:{type:String,default:""}},emits:["vanish","action"],setup(e,{emit:t}){const{locale:n,zIndex:a,ns:o,size:l}=Td("message-box",y(()=>e.buttonSize)),{t:s}=n,{nextZIndex:r}=a,u=R(!1),c=Nt({autofocus:!0,beforeClose:null,callback:null,cancelButtonText:"",cancelButtonClass:"",confirmButtonText:"",confirmButtonClass:"",cancelButtonType:"",confirmButtonType:"primary",customClass:"",customStyle:{},dangerouslyUseHTMLString:!1,distinguishCancelAndClose:!1,icon:"",closeIcon:"",inputPattern:null,inputPlaceholder:"",inputType:"text",inputValue:"",inputValidator:void 0,inputErrorMessage:"",message:"",modalFade:!0,modalClass:"",showCancelButton:!1,showConfirmButton:!0,type:"",title:void 0,showInput:!1,action:"",confirmButtonLoading:!1,cancelButtonLoading:!1,confirmButtonLoadingIcon:uo(wo),cancelButtonLoadingIcon:uo(wo),confirmButtonDisabled:!1,editorErrorMessage:"",validateError:!1,zIndex:r()}),d=y(()=>{const Y=c.type;return{[o.bm("icon",Y)]:Y&&xl[Y]}}),f=Pn(),h=Pn(),g=y(()=>{const Y=c.type;return c.icon||Y&&xl[Y]||""}),v=y(()=>!!c.message),p=R(),m=R(),b=R(),k=R(),w=R(),C=y(()=>c.confirmButtonClass);re(()=>c.inputValue,async Y=>{await Oe(),e.boxType==="prompt"&&Y&&_()},{immediate:!0}),re(()=>u.value,Y=>{Y&&(e.boxType!=="prompt"&&(c.autofocus?b.value=w.value?.$el??p.value:b.value=p.value),c.zIndex=r()),e.boxType==="prompt"&&(Y?Oe().then(()=>{k.value&&k.value.$el&&(c.autofocus?b.value=A()??p.value:b.value=p.value)}):(c.editorErrorMessage="",c.validateError=!1))});const{isDragging:S}=M1(p,m,y(()=>e.draggable),y(()=>e.overflow));ct(async()=>{await Oe(),e.closeOnHashChange&&window.addEventListener("hashchange",E)}),Rt(()=>{e.closeOnHashChange&&window.removeEventListener("hashchange",E)});function E(){u.value&&(u.value=!1,Oe(()=>{c.action&&t("action",c.action)}))}const O=()=>{e.closeOnClickModal&&I(c.distinguishCancelAndClose?"close":"cancel")},$=Zv(O),N=Y=>{if(c.inputType!=="textarea"&&!k.value?.isComposing)return Y.preventDefault(),I("confirm")},I=Y=>{e.boxType==="prompt"&&Y==="confirm"&&!_()||(c.action=Y,c.beforeClose?c.beforeClose?.(Y,c,E):E())},_=()=>{if(e.boxType==="prompt"){const Y=c.inputPattern;if(Y&&!Y.test(c.inputValue||""))return c.editorErrorMessage=c.inputErrorMessage||s("el.messagebox.error"),c.validateError=!0,!1;const W=c.inputValidator;if(Be(W)){const P=W(c.inputValue);if(P===!1)return c.editorErrorMessage=c.inputErrorMessage||s("el.messagebox.error"),c.validateError=!0,!1;if(_e(P))return c.editorErrorMessage=P,c.validateError=!0,!1}}return c.editorErrorMessage="",c.validateError=!1,!0},A=()=>{const Y=k.value?.$refs;return Y?.input??Y?.textarea},F=()=>{I("close")},K=()=>{e.closeOnPressEscape&&F()};return e.lockScroll&&hd(u,{ns:o}),{...En(c),ns:o,overlayEvent:$,visible:u,hasMessage:v,typeClass:d,contentId:f,inputId:h,btnSize:l,iconComponent:g,confirmButtonClasses:C,rootRef:p,focusStartRef:b,headerRef:m,inputRef:k,isDragging:S,confirmRef:w,doClose:E,handleClose:F,onCloseRequested:K,handleWrapperClick:O,handleInputEnter:N,handleAction:I,t:s}}});const cX=["aria-label","aria-describedby"],dX=["aria-label"],fX=["id"];function pX(e,t,n,a,o,l){const s=$t("el-icon"),r=$t("el-input"),u=$t("el-button"),c=$t("el-focus-trap"),d=$t("el-overlay");return x(),oe(Mn,{name:"fade-in-linear",onAfterLeave:t[11]||(t[11]=f=>e.$emit("vanish")),persisted:""},{default:Z(()=>[st(U(d,{"z-index":e.zIndex,"overlay-class":[e.ns.is("message-box"),e.modalClass],mask:e.modal},{default:Z(()=>[H("div",{role:"dialog","aria-label":e.title,"aria-modal":"true","aria-describedby":e.showInput?void 0:e.contentId,class:T(`${e.ns.namespace.value}-overlay-message-box`),onClick:t[8]||(t[8]=(...f)=>e.overlayEvent.onClick&&e.overlayEvent.onClick(...f)),onMousedown:t[9]||(t[9]=(...f)=>e.overlayEvent.onMousedown&&e.overlayEvent.onMousedown(...f)),onMouseup:t[10]||(t[10]=(...f)=>e.overlayEvent.onMouseup&&e.overlayEvent.onMouseup(...f))},[U(c,{loop:"",trapped:e.visible,"focus-trap-el":e.rootRef,"focus-start-el":e.focusStartRef,onReleaseRequested:e.onCloseRequested},{default:Z(()=>[H("div",{ref:"rootRef",class:T([e.ns.b(),e.customClass,e.ns.is("draggable",e.draggable),e.ns.is("dragging",e.isDragging),{[e.ns.m("center")]:e.center}]),style:He(e.customStyle),tabindex:"-1",onClick:t[7]||(t[7]=qe(()=>{},["stop"]))},[e.title!==null&&e.title!==void 0?(x(),B("div",{key:0,ref:"headerRef",class:T([e.ns.e("header"),{"show-close":e.showClose}])},[H("div",{class:T(e.ns.e("title"))},[e.iconComponent&&e.center?(x(),oe(s,{key:0,class:T([e.ns.e("status"),e.typeClass])},{default:Z(()=>[(x(),oe(ot(e.iconComponent)))]),_:1},8,["class"])):te("v-if",!0),H("span",null,ke(e.title),1)],2),e.showClose?(x(),B("button",{key:0,type:"button",class:T(e.ns.e("headerbtn")),"aria-label":e.t("el.messagebox.close"),onClick:t[0]||(t[0]=f=>e.handleAction(e.distinguishCancelAndClose?"close":"cancel")),onKeydown:t[1]||(t[1]=Zt(qe(f=>e.handleAction(e.distinguishCancelAndClose?"close":"cancel"),["prevent"]),["enter"]))},[U(s,{class:T(e.ns.e("close"))},{default:Z(()=>[(x(),oe(ot(e.closeIcon||"close")))]),_:1},8,["class"])],42,dX)):te("v-if",!0)],2)):te("v-if",!0),H("div",{id:e.contentId,class:T(e.ns.e("content"))},[H("div",{class:T(e.ns.e("container"))},[e.iconComponent&&!e.center&&e.hasMessage?(x(),oe(s,{key:0,class:T([e.ns.e("status"),e.typeClass])},{default:Z(()=>[(x(),oe(ot(e.iconComponent)))]),_:1},8,["class"])):te("v-if",!0),e.hasMessage?(x(),B("div",{key:1,class:T(e.ns.e("message"))},[ee(e.$slots,"default",{},()=>[e.dangerouslyUseHTMLString?(x(),oe(ot(e.showInput?"label":"p"),{key:1,for:e.showInput?e.inputId:void 0,innerHTML:e.message},null,8,["for","innerHTML"])):(x(),oe(ot(e.showInput?"label":"p"),{key:0,for:e.showInput?e.inputId:void 0,textContent:ke(e.message)},null,8,["for","textContent"]))])],2)):te("v-if",!0)],2),st(H("div",{class:T(e.ns.e("input"))},[U(r,{id:e.inputId,ref:"inputRef",modelValue:e.inputValue,"onUpdate:modelValue":t[2]||(t[2]=f=>e.inputValue=f),type:e.inputType,placeholder:e.inputPlaceholder,"aria-invalid":e.validateError,class:T({invalid:e.validateError}),onKeydown:Zt(e.handleInputEnter,["enter"])},null,8,["id","modelValue","type","placeholder","aria-invalid","class","onKeydown"]),H("div",{class:T(e.ns.e("errormsg")),style:He({visibility:e.editorErrorMessage?"visible":"hidden"})},ke(e.editorErrorMessage),7)],2),[[Ot,e.showInput]])],10,fX),H("div",{class:T(e.ns.e("btns"))},[e.showCancelButton?(x(),oe(u,{key:0,type:e.cancelButtonType==="text"?"":e.cancelButtonType,text:e.cancelButtonType==="text",loading:e.cancelButtonLoading,"loading-icon":e.cancelButtonLoadingIcon,class:T([e.cancelButtonClass]),round:e.roundButton,size:e.btnSize,onClick:t[3]||(t[3]=f=>e.handleAction("cancel")),onKeydown:t[4]||(t[4]=Zt(qe(f=>e.handleAction("cancel"),["prevent"]),["enter"]))},{default:Z(()=>[mt(ke(e.cancelButtonText||e.t("el.messagebox.cancel")),1)]),_:1},8,["type","text","loading","loading-icon","class","round","size"])):te("v-if",!0),st(U(u,{ref:"confirmRef",type:e.confirmButtonType==="text"?"":e.confirmButtonType,text:e.confirmButtonType==="text",loading:e.confirmButtonLoading,"loading-icon":e.confirmButtonLoadingIcon,class:T([e.confirmButtonClasses]),round:e.roundButton,disabled:e.confirmButtonDisabled,size:e.btnSize,onClick:t[5]||(t[5]=f=>e.handleAction("confirm")),onKeydown:t[6]||(t[6]=Zt(qe(f=>e.handleAction("confirm"),["prevent"]),["enter"]))},{default:Z(()=>[mt(ke(e.confirmButtonText||e.t("el.messagebox.confirm")),1)]),_:1},8,["type","text","loading","loading-icon","class","round","disabled","size"]),[[Ot,e.showConfirmButton]])],2)],6)]),_:3},8,["trapped","focus-trap-el","focus-start-el","onReleaseRequested"])],42,cX)]),_:3},8,["z-index","overlay-class","mask"]),[[Ot,e.visible]])]),_:3})}var vX=yn(uX,[["render",pX]]);const ki=new Map,hX=e=>{let t=document.body;return e.appendTo&&(_e(e.appendTo)&&(t=document.querySelector(e.appendTo)),oa(e.appendTo)&&(t=e.appendTo),oa(t)||(ut("ElMessageBox","the appendTo option is not an HTMLElement. Falling back to document.body."),t=document.body)),t},mX=(e,t,n=null)=>{const a=U(vX,e,Be(e.message)||zt(e.message)?{default:Be(e.message)?e.message:()=>e.message}:null);return a.appContext=n,Cl(a,t),hX(e).appendChild(t.firstElementChild),a.component},gX=()=>document.createElement("div"),bX=(e,t)=>{const n=gX();e.onVanish=()=>{Cl(null,n),ki.delete(o)},e.onAction=l=>{const s=ki.get(o);let r;e.showInput?r={value:o.inputValue,action:l}:r=l,e.callback?e.callback(r,a.proxy):l==="cancel"||l==="close"?e.distinguishCancelAndClose&&l!=="cancel"?s.reject("close"):s.reject("cancel"):s.resolve(r)};const a=mX(e,n,t),o=a.proxy;for(const l in e)Tt(e,l)&&!Tt(o.$props,l)&&(l==="closeIcon"&&et(e[l])?o[l]=uo(e[l]):o[l]=e[l]);return o.visible=!0,o};function gr(e,t=null){if(!It)return Promise.reject();let n;return _e(e)||zt(e)?e={message:e}:n=e.callback,new Promise((a,o)=>{const l=bX(e,t??gr._context);ki.set(l,{options:e,callback:n,resolve:a,reject:o})})}const yX=["alert","confirm","prompt"],wX={alert:{closeOnPressEscape:!1,closeOnClickModal:!1},confirm:{showCancelButton:!0},prompt:{showCancelButton:!0,showInput:!0}};yX.forEach(e=>{gr[e]=CX(e)});function CX(e){return(t,n,a,o)=>{let l="";return et(n)?(a=n,l=""):St(n)?l="":l=n,gr(Object.assign({title:l,message:t,type:"",...wX[e]},a,{boxType:e}),o)}}gr.close=()=>{ki.forEach((e,t)=>{t.doClose()}),ki.clear()};gr._context=null;const ul=gr;ul.install=e=>{ul._context=e._context,e.config.globalProperties.$msgbox=ul,e.config.globalProperties.$messageBox=ul,e.config.globalProperties.$alert=ul.alert,e.config.globalProperties.$confirm=ul.confirm,e.config.globalProperties.$prompt=ul.prompt};const SX=ul,j2=["primary","success","info","warning","error"],kX=Ce({customClass:{type:String,default:""},dangerouslyUseHTMLString:Boolean,duration:{type:Number,default:4500},icon:{type:Bt},id:{type:String,default:""},message:{type:q([String,Object,Function]),default:""},offset:{type:Number,default:0},onClick:{type:q(Function),default:()=>{}},onClose:{type:q(Function),required:!0},position:{type:String,values:["top-right","top-left","bottom-right","bottom-left"],default:"top-right"},showClose:{type:Boolean,default:!0},title:{type:String,default:""},type:{type:String,values:[...j2,""],default:""},zIndex:Number,closeIcon:{type:Bt,default:Ia}}),EX={destroy:()=>!0},xX=["id"],TX=["textContent"],$X={key:0},OX=["innerHTML"];var IX=le({name:"ElNotification",__name:"notification",props:kX,emits:EX,setup(e,{expose:t}){const n=e,{ns:a,zIndex:o}=Td("notification"),{nextZIndex:l,currentZIndex:s}=o,r=R(!1);let u;const c=y(()=>{const k=n.type;return k&&xl[n.type]?a.m(k):""}),d=y(()=>n.type&&xl[n.type]||n.icon),f=y(()=>n.position.endsWith("right")?"right":"left"),h=y(()=>n.position.startsWith("top")?"top":"bottom"),g=y(()=>({[h.value]:`${n.offset}px`,zIndex:n.zIndex??s.value}));function v(){n.duration>0&&({stop:u}=qs(()=>{r.value&&m()},n.duration))}function p(){u?.()}function m(){r.value=!1}function b(k){switch(Ft(k)){case we.delete:case we.backspace:p();break;case we.esc:r.value&&m();break;default:v();break}}return ct(()=>{v(),l(),r.value=!0}),At(document,"keydown",b),t({visible:r,close:m}),(k,w)=>(x(),oe(Mn,{name:i(a).b("fade"),onBeforeLeave:e.onClose,onAfterLeave:w[1]||(w[1]=C=>k.$emit("destroy")),persisted:""},{default:Z(()=>[st(H("div",{id:e.id,class:T([i(a).b(),e.customClass,f.value]),style:He(g.value),role:"alert",onMouseenter:p,onMouseleave:v,onClick:w[0]||(w[0]=(...C)=>e.onClick&&e.onClick(...C))},[d.value?(x(),oe(i(Le),{key:0,class:T([i(a).e("icon"),c.value])},{default:Z(()=>[(x(),oe(ot(d.value)))]),_:1},8,["class"])):te("v-if",!0),H("div",{class:T(i(a).e("group"))},[H("h2",{class:T(i(a).e("title")),textContent:ke(e.title)},null,10,TX),st(H("div",{class:T(i(a).e("content")),style:He(e.title?void 0:{margin:0})},[ee(k.$slots,"default",{},()=>[e.dangerouslyUseHTMLString?(x(),B(Fe,{key:1},[te(" Caution here, message could've been compromised, never use user's input as message "),H("p",{innerHTML:e.message},null,8,OX)],2112)):(x(),B("p",$X,ke(e.message),1))])],6),[[Ot,e.message]]),e.showClose?(x(),oe(i(Le),{key:0,class:T(i(a).e("closeBtn")),onClick:qe(m,["stop"])},{default:Z(()=>[(x(),oe(ot(e.closeIcon)))]),_:1},8,["class"])):te("v-if",!0)],2)],46,xX),[[Ot,r.value]])]),_:3},8,["name","onBeforeLeave"]))}}),NX=IX;const sr={"top-left":[],"top-right":[],"bottom-left":[],"bottom-right":[]},Kc=16;let MX=1;const is=function(e={},t){if(!It)return{close:()=>{}};(_e(e)||zt(e))&&(e={message:e});const n=e.position||"top-right";let a=e.offset||0;sr[n].forEach(({vm:d})=>{a+=(d.el?.offsetHeight||0)+Kc}),a+=Kc;const o=`notification_${MX++}`,l=e.onClose,s={...e,offset:a,id:o,onClose:()=>{PX(o,n,l)}};let r=document.body;oa(e.appendTo)?r=e.appendTo:_e(e.appendTo)&&(r=document.querySelector(e.appendTo)),oa(r)||(ut("ElNotification","the appendTo option is not an HTMLElement. Falling back to document.body."),r=document.body);const u=document.createElement("div"),c=U(NX,s,Be(s.message)?s.message:zt(s.message)?()=>s.message:null);return c.appContext=St(t)?is._context:t,c.props.onDestroy=()=>{Cl(null,u)},Cl(c,u),sr[n].push({vm:c}),r.appendChild(u.firstElementChild),{close:()=>{c.component.exposed.visible.value=!1}}};j2.forEach(e=>{is[e]=(t={},n)=>((_e(t)||zt(t))&&(t={message:t}),is({...t,type:e},n))});function PX(e,t,n){const a=sr[t],o=a.findIndex(({vm:c})=>c.component?.props.id===e);if(o===-1)return;const{vm:l}=a[o];if(!l)return;n?.(l);const s=l.el.offsetHeight,r=t.split("-")[0];a.splice(o,1);const u=a.length;if(!(u<1))for(let c=o;c{t.component.exposed.visible.value=!1})}function AX(e="top-right"){let t=sr[e][0]?.vm.component?.props?.offset||0;for(const{vm:n}of sr[e])n.component.props.offset=t,t+=(n.el?.offsetHeight||0)+Kc}is.closeAll=RX;is.updateOffsets=AX;is._context=null;const _X=hC(is,"$notify"),LX=Ce({trigger:ho.trigger,triggerKeys:ho.triggerKeys,placement:Qu.placement,disabled:ho.disabled,visible:Lt.visible,transition:Lt.transition,popperOptions:Qu.popperOptions,tabindex:Qu.tabindex,content:Lt.content,popperStyle:Lt.popperStyle,popperClass:Lt.popperClass,enterable:{...Lt.enterable,default:!0},effect:{...Lt.effect,default:"light"},teleported:Lt.teleported,appendTo:Lt.appendTo,title:String,width:{type:[String,Number],default:150},offset:{type:Number,default:void 0},showAfter:{type:Number,default:0},hideAfter:{type:Number,default:200},autoClose:{type:Number,default:0},showArrow:{type:Boolean,default:!0},persistent:{type:Boolean,default:!0},"onUpdate:visible":{type:Function}}),DX={"update:visible":e=>Dt(e),"before-enter":()=>!0,"before-leave":()=>!0,"after-enter":()=>!0,"after-leave":()=>!0},BX="onUpdate:visible";var VX=le({name:"ElPopover",__name:"popover",props:LX,emits:DX,setup(e,{expose:t,emit:n}){const a=e,o=n,l=y(()=>a[BX]),s=fe("popover"),r=R(),u=y(()=>i(r)?.popperRef),c=y(()=>[{width:en(a.width)},a.popperStyle]),d=y(()=>[s.b(),a.popperClass,{[s.m("plain")]:!!a.content}]),f=y(()=>a.transition===`${s.namespace.value}-fade-in-linear`),h=()=>{r.value?.hide()},g=()=>{o("before-enter")},v=()=>{o("before-leave")},p=()=>{o("after-enter")},m=()=>{o("update:visible",!1),o("after-leave")};return t({popperRef:u,hide:h}),(b,k)=>(x(),oe(i($n),rt({ref_key:"tooltipRef",ref:r},b.$attrs,{trigger:e.trigger,"trigger-keys":e.triggerKeys,placement:e.placement,disabled:e.disabled,visible:e.visible,transition:e.transition,"popper-options":e.popperOptions,tabindex:e.tabindex,content:e.content,offset:e.offset,"show-after":e.showAfter,"hide-after":e.hideAfter,"auto-close":e.autoClose,"show-arrow":e.showArrow,"aria-label":e.title,effect:e.effect,enterable:e.enterable,"popper-class":d.value,"popper-style":c.value,teleported:e.teleported,"append-to":e.appendTo,persistent:e.persistent,"gpu-acceleration":f.value,"onUpdate:visible":l.value,onBeforeShow:g,onBeforeHide:v,onShow:p,onHide:m}),{content:Z(()=>[e.title?(x(),B("div",{key:0,class:T(i(s).e("title")),role:"title"},ke(e.title),3)):te("v-if",!0),ee(b.$slots,"default",{hide:h},()=>[mt(ke(e.content),1)])]),default:Z(()=>[b.$slots.reference?ee(b.$slots,"reference",{key:0}):te("v-if",!0)]),_:3},16,["trigger","trigger-keys","placement","disabled","visible","transition","popper-options","tabindex","content","offset","show-after","hide-after","auto-close","show-arrow","aria-label","effect","enterable","popper-class","popper-style","teleported","append-to","persistent","gpu-acceleration","onUpdate:visible"]))}}),FX=VX;const Qy=(e,t)=>{const n=(t.arg||t.value)?.popperRef;n&&(n.triggerRef=e)};var zX={mounted(e,t){Qy(e,t)},updated(e,t){Qy(e,t)}};const HX="popover",Y2=VA(zX,HX),KX=nt(FX,{directive:Y2}),WX="2.13.5",jX=(e=[])=>({version:WX,install:(n,a)=>{n[Zm]||(n[Zm]=!0,e.forEach(o=>n.use(o)),a&&fh(a,n,!0))}});var YX=[WA,i4,gL,rY,kL,EL,NL,FC,FL,zL,Sn,UC,W8,q8,uB,cB,oV,RS,uV,ja,TB,wh,yV,AV,_V,Od,jS,u6,UL,m6,g6,b6,y6,w6,wz,JS,Iz,Nz,jz,sk,o5,j5,Y5,U5,hk,s_,r_,Le,_H,mk,Wn,gk,JH,oK,wK,CK,SK,kK,IK,uW,vW,KX,AC,kk,PS,BB,DB,IW,RW,mV,Ka,$l,Oc,S8,C9,$9,O9,q9,Q9,XS,I6,sj,rj,gj,x7,T7,sY,wY,CY,Fo,Gh,XD,IY,AY,_Y,$n,qY,Jh,mU,PU,lq,hq,Fq,zq,Xq,Zq,oG,gG,MG,PG],UX=[VG,WG,iX,SX,_X,Y2],rm=jX([...YX,...UX]);rm.install;rm.version;var XX=rm;const ZX=(e,t)=>{const n=e.__vccOpts||e;for(const[a,o]of t)n[a]=o;return n};let Gp,e0=!1;function U2(){return Gp=window.pywebview?.api,Gp}function qX(){e0||typeof window>"u"||!window.addEventListener||(e0=!0,window.addEventListener("pywebviewready",()=>{U2()}))}qX();function JX(){return U2()||Gp}export{T7 as A,x7 as B,qe as C,i as D,iX as E,Fe as F,oe as G,Oc as H,$l as I,wz as J,tt as K,gk as L,bD as M,re as N,Rt as O,Nt as P,jz as Q,ZX as _,x as a,U as b,B as c,le as d,H as e,te as f,R as g,y as h,JX as i,hT as j,XX as k,Tw as l,mt as m,T as n,ct as o,Ew as p,rr as q,ht as r,GX as s,ke as t,He as u,xw as v,st as w,Zt as x,Wn as y,Z as z}; diff --git a/app/assets/pywebview-xvHHTGU_.css b/app/assets/pywebview-xvHHTGU_.css deleted file mode 100644 index ae5e9f7..0000000 --- a/app/assets/pywebview-xvHHTGU_.css +++ /dev/null @@ -1 +0,0 @@ -:root{--el-color-white:#fff;--el-color-black:#000;--el-color-primary-rgb:64, 158, 255;--el-color-success-rgb:103, 194, 58;--el-color-warning-rgb:230, 162, 60;--el-color-danger-rgb:245, 108, 108;--el-color-error-rgb:245, 108, 108;--el-color-info-rgb:144, 147, 153;--el-font-size-extra-large:20px;--el-font-size-large:18px;--el-font-size-medium:16px;--el-font-size-base:14px;--el-font-size-small:13px;--el-font-size-extra-small:12px;--el-font-family:"Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "微软雅黑", Arial, sans-serif;--el-font-weight-primary:500;--el-font-line-height-primary:24px;--el-index-normal:1;--el-index-top:1000;--el-index-popper:2000;--el-border-radius-base:4px;--el-border-radius-small:2px;--el-border-radius-round:20px;--el-border-radius-circle:100%;--el-transition-duration:.3s;--el-transition-duration-fast:.2s;--el-transition-function-ease-in-out-bezier:cubic-bezier(.645, .045, .355, 1);--el-transition-function-fast-bezier:cubic-bezier(.23, 1, .32, 1);--el-transition-all:all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier);--el-transition-fade:opacity var(--el-transition-duration) var(--el-transition-function-fast-bezier);--el-transition-md-fade:transform var(--el-transition-duration) var(--el-transition-function-fast-bezier), opacity var(--el-transition-duration) var(--el-transition-function-fast-bezier);--el-transition-fade-linear:opacity var(--el-transition-duration-fast) linear;--el-transition-border:border-color var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-transition-box-shadow:box-shadow var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-transition-color:color var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-component-size-large:40px;--el-component-size:32px;--el-component-size-small:24px;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--el-color-primary:#409eff;--el-color-primary-light-3:#79bbff;--el-color-primary-light-5:#a0cfff;--el-color-primary-light-7:#c6e2ff;--el-color-primary-light-8:#d9ecff;--el-color-primary-light-9:#ecf5ff;--el-color-primary-dark-2:#337ecc;--el-color-success:#67c23a;--el-color-success-light-3:#95d475;--el-color-success-light-5:#b3e19d;--el-color-success-light-7:#d1edc4;--el-color-success-light-8:#e1f3d8;--el-color-success-light-9:#f0f9eb;--el-color-success-dark-2:#529b2e;--el-color-warning:#e6a23c;--el-color-warning-light-3:#eebe77;--el-color-warning-light-5:#f3d19e;--el-color-warning-light-7:#f8e3c5;--el-color-warning-light-8:#faecd8;--el-color-warning-light-9:#fdf6ec;--el-color-warning-dark-2:#b88230;--el-color-danger:#f56c6c;--el-color-danger-light-3:#f89898;--el-color-danger-light-5:#fab6b6;--el-color-danger-light-7:#fcd3d3;--el-color-danger-light-8:#fde2e2;--el-color-danger-light-9:#fef0f0;--el-color-danger-dark-2:#c45656;--el-color-error:#f56c6c;--el-color-error-light-3:#f89898;--el-color-error-light-5:#fab6b6;--el-color-error-light-7:#fcd3d3;--el-color-error-light-8:#fde2e2;--el-color-error-light-9:#fef0f0;--el-color-error-dark-2:#c45656;--el-color-info:#909399;--el-color-info-light-3:#b1b3b8;--el-color-info-light-5:#c8c9cc;--el-color-info-light-7:#dedfe0;--el-color-info-light-8:#e9e9eb;--el-color-info-light-9:#f4f4f5;--el-color-info-dark-2:#73767a;--el-bg-color:#fff;--el-bg-color-page:#f2f3f5;--el-bg-color-overlay:#fff;--el-text-color-primary:#303133;--el-text-color-regular:#606266;--el-text-color-secondary:#909399;--el-text-color-placeholder:#a8abb2;--el-text-color-disabled:#c0c4cc;--el-border-color:#dcdfe6;--el-border-color-light:#e4e7ed;--el-border-color-lighter:#ebeef5;--el-border-color-extra-light:#f2f6fc;--el-border-color-dark:#d4d7de;--el-border-color-darker:#cdd0d6;--el-fill-color:#f0f2f5;--el-fill-color-light:#f5f7fa;--el-fill-color-lighter:#fafafa;--el-fill-color-extra-light:#fafcff;--el-fill-color-dark:#ebedf0;--el-fill-color-darker:#e6e8eb;--el-fill-color-blank:#fff;--el-box-shadow:0px 12px 32px 4px #0000000a, 0px 8px 20px #00000014;--el-box-shadow-light:0px 0px 12px #0000001f;--el-box-shadow-lighter:0px 0px 6px #0000001f;--el-box-shadow-dark:0px 16px 48px 16px #00000014, 0px 12px 32px #0000001f, 0px 8px 16px -8px #00000029;--el-disabled-bg-color:var(--el-fill-color-light);--el-disabled-text-color:var(--el-text-color-placeholder);--el-disabled-border-color:var(--el-border-color-light);--el-overlay-color:#000c;--el-overlay-color-light:#000000b3;--el-overlay-color-lighter:#00000080;--el-mask-color:#ffffffe6;--el-mask-color-extra-light:#ffffff4d;--el-border-width:1px;--el-border-style:solid;--el-border-color-hover:var(--el-text-color-disabled);--el-border:var(--el-border-width) var(--el-border-style) var(--el-border-color);--el-svg-monochrome-grey:var(--el-border-color)}.fade-in-linear-enter-active,.fade-in-linear-leave-active{transition:var(--el-transition-fade-linear)}.fade-in-linear-enter-from,.fade-in-linear-leave-to{opacity:0}.el-fade-in-linear-enter-active,.el-fade-in-linear-leave-active{transition:var(--el-transition-fade-linear)}.el-fade-in-linear-enter-from,.el-fade-in-linear-leave-to{opacity:0}.el-fade-in-enter-active,.el-fade-in-leave-active{transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-fade-in-enter-from,.el-fade-in-leave-active{opacity:0}.el-zoom-in-center-enter-active,.el-zoom-in-center-leave-active{transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-zoom-in-center-enter-from,.el-zoom-in-center-leave-active{opacity:0;transform:scaleX(0)}.el-zoom-in-top-enter-active,.el-zoom-in-top-leave-active{opacity:1;transition:var(--el-transition-md-fade);transform-origin:top;transform:scaleY(1)}.el-zoom-in-top-enter-active[data-popper-placement^=top],.el-zoom-in-top-leave-active[data-popper-placement^=top]{transform-origin:bottom}.el-zoom-in-top-enter-from,.el-zoom-in-top-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-bottom-enter-active,.el-zoom-in-bottom-leave-active{opacity:1;transition:var(--el-transition-md-fade);transform-origin:bottom;transform:scaleY(1)}.el-zoom-in-bottom-enter-from,.el-zoom-in-bottom-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-left-enter-active,.el-zoom-in-left-leave-active{opacity:1;transition:var(--el-transition-md-fade);transform-origin:0 0;transform:scale(1)}.el-zoom-in-left-enter-from,.el-zoom-in-left-leave-active{opacity:0;transform:scale(.45)}.collapse-transition{transition:var(--el-transition-duration) height ease-in-out,var(--el-transition-duration) padding-top ease-in-out,var(--el-transition-duration) padding-bottom ease-in-out}.el-collapse-transition-leave-active,.el-collapse-transition-enter-active{transition:var(--el-transition-duration) max-height ease-in-out,var(--el-transition-duration) padding-top ease-in-out,var(--el-transition-duration) padding-bottom ease-in-out}.horizontal-collapse-transition{transition:var(--el-transition-duration) width ease-in-out,var(--el-transition-duration) padding-left ease-in-out,var(--el-transition-duration) padding-right ease-in-out}.el-list-enter-active,.el-list-leave-active{transition:all 1s}.el-list-enter-from,.el-list-leave-to{opacity:0;transform:translateY(-30px)}.el-list-leave-active{position:absolute!important}.el-opacity-transition{transition:opacity var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-icon--right{margin-left:5px}.el-icon--left{margin-right:5px}@keyframes rotating{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.el-icon{--color:inherit;fill:currentColor;width:1em;height:1em;color:var(--color);line-height:1em;font-size:inherit;justify-content:center;align-items:center;display:inline-flex;position:relative}.el-icon.is-loading{animation:2s linear infinite rotating}.el-icon svg{width:1em;height:1em}.el-affix--fixed{position:fixed}.el-alert{--el-alert-padding:8px 16px;--el-alert-border-radius-base:var(--el-border-radius-base);--el-alert-title-font-size:14px;--el-alert-title-with-description-font-size:16px;--el-alert-description-font-size:14px;--el-alert-close-font-size:16px;--el-alert-close-customed-font-size:14px;--el-alert-icon-size:16px;--el-alert-icon-large-size:28px;width:100%;padding:var(--el-alert-padding);box-sizing:border-box;border-radius:var(--el-alert-border-radius-base);background-color:var(--el-color-white);opacity:1;transition:opacity var(--el-transition-duration-fast);align-items:center;margin:0;display:flex;position:relative;overflow:hidden}.el-alert.is-light .el-alert__close-btn{color:var(--el-text-color-placeholder)}.el-alert.is-dark .el-alert__close-btn,.el-alert.is-dark .el-alert__description{color:var(--el-color-white)}.el-alert.is-center{justify-content:center}.el-alert--primary{--el-alert-bg-color:var(--el-color-primary-light-9)}.el-alert--primary.is-light{background-color:var(--el-alert-bg-color);color:var(--el-color-primary)}.el-alert--primary.is-light .el-alert__description{color:var(--el-color-primary)}.el-alert--primary.is-dark{background-color:var(--el-color-primary);color:var(--el-color-white)}.el-alert--success{--el-alert-bg-color:var(--el-color-success-light-9)}.el-alert--success.is-light{background-color:var(--el-alert-bg-color);color:var(--el-color-success)}.el-alert--success.is-light .el-alert__description{color:var(--el-color-success)}.el-alert--success.is-dark{background-color:var(--el-color-success);color:var(--el-color-white)}.el-alert--info{--el-alert-bg-color:var(--el-color-info-light-9)}.el-alert--info.is-light{background-color:var(--el-alert-bg-color);color:var(--el-color-info)}.el-alert--info.is-light .el-alert__description{color:var(--el-color-info)}.el-alert--info.is-dark{background-color:var(--el-color-info);color:var(--el-color-white)}.el-alert--warning{--el-alert-bg-color:var(--el-color-warning-light-9)}.el-alert--warning.is-light{background-color:var(--el-alert-bg-color);color:var(--el-color-warning)}.el-alert--warning.is-light .el-alert__description{color:var(--el-color-warning)}.el-alert--warning.is-dark{background-color:var(--el-color-warning);color:var(--el-color-white)}.el-alert--error{--el-alert-bg-color:var(--el-color-error-light-9)}.el-alert--error.is-light{background-color:var(--el-alert-bg-color);color:var(--el-color-error)}.el-alert--error.is-light .el-alert__description{color:var(--el-color-error)}.el-alert--error.is-dark{background-color:var(--el-color-error);color:var(--el-color-white)}.el-alert__content{flex-direction:column;gap:4px;display:flex}.el-alert .el-alert__icon{font-size:var(--el-alert-icon-size);width:var(--el-alert-icon-size);margin-right:8px}.el-alert .el-alert__icon.is-big{font-size:var(--el-alert-icon-large-size);width:var(--el-alert-icon-large-size);margin-right:12px}.el-alert__title{font-size:var(--el-alert-title-font-size);line-height:24px}.el-alert__title.with-description{font-size:var(--el-alert-title-with-description-font-size)}.el-alert .el-alert__description{font-size:var(--el-alert-description-font-size);margin:0}.el-alert .el-alert__close-btn{font-size:var(--el-alert-close-font-size);opacity:1;cursor:pointer;position:absolute;top:12px;right:16px}.el-alert .el-alert__close-btn.is-customed{font-style:normal;font-size:var(--el-alert-close-customed-font-size);line-height:24px;top:8px}.el-alert-fade-enter-from,.el-alert-fade-leave-active{opacity:0}.el-aside{box-sizing:border-box;width:var(--el-aside-width,300px);flex-shrink:0;overflow:auto}.el-autocomplete{--el-input-text-color:var(--el-text-color-regular);--el-input-border:var(--el-border);--el-input-hover-border:var(--el-border-color-hover);--el-input-focus-border:var(--el-color-primary);--el-input-transparent-border:0 0 0 1px transparent inset;--el-input-border-color:var(--el-border-color);--el-input-border-radius:var(--el-border-radius-base);--el-input-bg-color:var(--el-fill-color-blank);--el-input-icon-color:var(--el-text-color-placeholder);--el-input-placeholder-color:var(--el-text-color-placeholder);--el-input-hover-border-color:var(--el-border-color-hover);--el-input-clear-hover-color:var(--el-text-color-secondary);--el-input-focus-border-color:var(--el-color-primary);--el-input-width:100%;width:var(--el-input-width);display:inline-block;position:relative}.el-autocomplete__popper.el-popper{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light);box-shadow:var(--el-box-shadow-light)}.el-autocomplete__popper.el-popper .el-popper__arrow:before{border:1px solid var(--el-border-color-light)}.el-autocomplete__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-top-color:#0000;border-left-color:#0000}.el-autocomplete__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:#0000;border-right-color:#0000}.el-autocomplete__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-bottom-color:#0000;border-left-color:#0000}.el-autocomplete__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-top-color:#0000;border-right-color:#0000}.el-autocomplete-suggestion{border-radius:var(--el-border-radius-base);box-sizing:border-box}.el-autocomplete-suggestion__header{border-bottom:1px solid var(--el-border-color-lighter);padding:10px}.el-autocomplete-suggestion__footer{border-top:1px solid var(--el-border-color-lighter);padding:10px}.el-autocomplete-suggestion__wrap{box-sizing:border-box;max-height:280px;padding:10px 0}.el-autocomplete-suggestion__list{margin:0;padding:0}.el-autocomplete-suggestion li{cursor:pointer;color:var(--el-text-color-regular);line-height:34px;font-size:var(--el-font-size-base);text-align:left;text-overflow:ellipsis;white-space:nowrap;margin:0;padding:0 20px;list-style:none;overflow:hidden}.el-autocomplete-suggestion li:hover,.el-autocomplete-suggestion li.highlighted{background-color:var(--el-fill-color-light)}.el-autocomplete-suggestion li.divider{border-top:1px solid var(--el-color-black);margin-top:6px}.el-autocomplete-suggestion li.divider:last-child{margin-bottom:-6px}.el-autocomplete-suggestion.is-loading li{cursor:default;height:100px;color:var(--el-text-color-secondary);justify-content:center;align-items:center;font-size:20px;display:flex}.el-autocomplete-suggestion.is-loading li:hover{background-color:var(--el-bg-color-overlay)}.el-avatar{--el-avatar-text-color:var(--el-color-white);--el-avatar-bg-color:var(--el-text-color-disabled);--el-avatar-text-size:14px;--el-avatar-icon-size:18px;--el-avatar-border-radius:var(--el-border-radius-base);--el-avatar-size-large:56px;--el-avatar-size:40px;--el-avatar-size-small:24px;box-sizing:border-box;text-align:center;color:var(--el-avatar-text-color);background:var(--el-avatar-bg-color);width:var(--el-avatar-size);height:var(--el-avatar-size);font-size:var(--el-avatar-text-size);outline:none;justify-content:center;align-items:center;display:inline-flex;overflow:hidden}.el-avatar>img{width:100%;height:100%;display:block}.el-avatar--circle{border-radius:50%}.el-avatar--square{border-radius:var(--el-avatar-border-radius)}.el-avatar--icon{font-size:var(--el-avatar-icon-size)}.el-avatar--small{--el-avatar-size:24px}.el-avatar--large{--el-avatar-size:56px}.el-avatar-group{--el-avatar-group-item-gap:-8px;--el-avatar-group-collapse-item-gap:4px;display:inline-flex}.el-avatar-group .el-avatar{border:1px solid var(--el-border-color-extra-light)}.el-avatar-group .el-avatar:not(:first-child){margin-left:var(--el-avatar-group-item-gap)}.el-avatar-group__collapse-avatars{--el-avatar-group-item-gap:-8px;--el-avatar-group-collapse-item-gap:4px}.el-avatar-group__collapse-avatars .el-avatar:not(:first-child){margin-left:var(--el-avatar-group-collapse-item-gap)}.el-backtop{--el-backtop-bg-color:var(--el-bg-color-overlay);--el-backtop-text-color:var(--el-color-primary);--el-backtop-hover-bg-color:var(--el-border-color-extra-light);background-color:var(--el-backtop-bg-color);width:40px;height:40px;color:var(--el-backtop-text-color);box-shadow:var(--el-box-shadow-lighter);cursor:pointer;z-index:5;border-radius:50%;justify-content:center;align-items:center;font-size:20px;display:flex;position:fixed}.el-backtop:hover{background-color:var(--el-backtop-hover-bg-color)}.el-backtop__icon{font-size:20px}.el-badge{--el-badge-bg-color:var(--el-color-danger);--el-badge-radius:10px;--el-badge-font-size:12px;--el-badge-padding:6px;--el-badge-size:18px;vertical-align:middle;width:-moz-fit-content;width:fit-content;display:inline-block;position:relative}.el-badge__content{background-color:var(--el-badge-bg-color);border-radius:var(--el-badge-radius);color:var(--el-color-white);font-size:var(--el-badge-font-size);height:var(--el-badge-size);padding:0 var(--el-badge-padding);white-space:nowrap;border:1px solid var(--el-bg-color);justify-content:center;align-items:center;display:inline-flex}.el-badge__content.is-fixed{top:0;right:calc(1px + var(--el-badge-size) / 2);z-index:var(--el-index-normal);position:absolute;transform:translateY(-50%)translate(100%)}.el-badge__content.is-fixed.is-dot{right:5px}.el-badge__content.is-dot{border-radius:50%;width:8px;height:8px;padding:0;right:0}.el-badge__content.is-hide-zero{display:none}.el-badge__content--primary{background-color:var(--el-color-primary)}.el-badge__content--success{background-color:var(--el-color-success)}.el-badge__content--warning{background-color:var(--el-color-warning)}.el-badge__content--info{background-color:var(--el-color-info)}.el-badge__content--danger{background-color:var(--el-color-danger)}.el-breadcrumb__separator{color:var(--el-text-color-placeholder);margin:0 9px;font-weight:700}.el-breadcrumb__separator.el-icon{margin:0 6px;font-weight:400}.el-breadcrumb__separator.el-icon svg{vertical-align:middle}.el-breadcrumb__item{float:left;align-items:center;display:inline-flex}.el-breadcrumb__inner{color:var(--el-text-color-regular)}.el-breadcrumb__inner.is-link,.el-breadcrumb__inner a{transition:var(--el-transition-color);color:var(--el-text-color-primary);font-weight:700;text-decoration:none}.el-breadcrumb__inner.is-link:hover,.el-breadcrumb__inner a:hover{color:var(--el-color-primary);cursor:pointer}.el-breadcrumb__item:last-child .el-breadcrumb__inner,.el-breadcrumb__item:last-child .el-breadcrumb__inner:hover,.el-breadcrumb__item:last-child .el-breadcrumb__inner a,.el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover{color:var(--el-text-color-regular);cursor:text;font-weight:400}.el-breadcrumb__item:last-child .el-breadcrumb__separator{display:none}.el-breadcrumb{font-size:14px;line-height:1}.el-breadcrumb:before,.el-breadcrumb:after{content:"";display:table}.el-breadcrumb:after{clear:both}.el-button-group>.el-button+.el-button{margin-left:0}.el-button-group>.el-button:first-child:last-child{border-top-right-radius:var(--el-border-radius-base);border-bottom-right-radius:var(--el-border-radius-base);border-top-left-radius:var(--el-border-radius-base);border-bottom-left-radius:var(--el-border-radius-base)}.el-button-group>.el-button:first-child:last-child.is-round{border-radius:var(--el-border-radius-round)}.el-button-group>.el-button:first-child:last-child.is-circle{border-radius:50%}.el-button-group>.el-button:not(:first-child):not(:last-child){border-radius:0}.el-button-group>.el-button:hover,.el-button-group>.el-button:focus,.el-button-group>.el-button:active,.el-button-group>.el-button.is-active{z-index:1}.el-button-group--horizontal{vertical-align:middle;display:inline-block}.el-button-group--horizontal:before,.el-button-group--horizontal:after{content:"";display:table}.el-button-group--horizontal:after{clear:both}.el-button-group--horizontal>.el-button{float:left;position:relative}.el-button-group--horizontal>.el-button:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.el-button-group--horizontal>.el-button:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.el-button-group--horizontal>.el-button:not(:last-child){margin-right:-1px}.el-button-group--horizontal .el-button--primary:first-child{border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--primary:last-child{border-left-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--primary:not(:first-child):not(:last-child){border-left-color:var(--el-button-divide-border-color);border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--success:first-child{border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--success:last-child{border-left-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--success:not(:first-child):not(:last-child){border-left-color:var(--el-button-divide-border-color);border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--warning:first-child{border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--warning:last-child{border-left-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--warning:not(:first-child):not(:last-child){border-left-color:var(--el-button-divide-border-color);border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--danger:first-child{border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--danger:last-child{border-left-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--danger:not(:first-child):not(:last-child){border-left-color:var(--el-button-divide-border-color);border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--info:first-child{border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--info:last-child{border-left-color:var(--el-button-divide-border-color)}.el-button-group--horizontal .el-button--info:not(:first-child):not(:last-child){border-left-color:var(--el-button-divide-border-color);border-right-color:var(--el-button-divide-border-color)}.el-button-group--horizontal>.el-dropdown>.el-button{border-left-color:var(--el-button-divide-border-color);border-top-left-radius:0;border-bottom-left-radius:0}.el-button-group--vertical{flex-direction:column;align-items:stretch;display:inline-flex}.el-button-group--vertical>.el-button{margin-top:-1px}.el-button-group--vertical>.el-button:first-child{border-bottom-right-radius:0;border-bottom-left-radius:0}.el-button-group--vertical>.el-button:last-child{border-top-left-radius:0;border-top-right-radius:0}.el-button-group--vertical>.el-dropdown{margin-top:-1px}.el-button-group--vertical>.el-dropdown>.el-button{border-left-color:var(--el-button-divide-border-color);border-top-left-radius:0;border-top-right-radius:0}.el-button-group--vertical .el-button--primary:first-child{border-bottom-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--primary:last-child{border-top-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--primary:not(:first-child):not(:last-child){border-top-color:var(--el-button-divide-border-color);border-bottom-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--success:first-child{border-bottom-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--success:last-child{border-top-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--success:not(:first-child):not(:last-child){border-top-color:var(--el-button-divide-border-color);border-bottom-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--warning:first-child{border-bottom-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--warning:last-child{border-top-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--warning:not(:first-child):not(:last-child){border-top-color:var(--el-button-divide-border-color);border-bottom-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--danger:first-child{border-bottom-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--danger:last-child{border-top-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--danger:not(:first-child):not(:last-child){border-top-color:var(--el-button-divide-border-color);border-bottom-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--info:first-child{border-bottom-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--info:last-child{border-top-color:var(--el-button-divide-border-color)}.el-button-group--vertical .el-button--info:not(:first-child):not(:last-child){border-top-color:var(--el-button-divide-border-color);border-bottom-color:var(--el-button-divide-border-color)}.el-button{--el-button-font-weight:var(--el-font-weight-primary);--el-button-border-color:var(--el-border-color);--el-button-bg-color:var(--el-fill-color-blank);--el-button-text-color:var(--el-text-color-regular);--el-button-disabled-text-color:var(--el-disabled-text-color);--el-button-disabled-bg-color:var(--el-fill-color-blank);--el-button-disabled-border-color:var(--el-border-color-light);--el-button-divide-border-color:#ffffff80;--el-button-hover-text-color:var(--el-color-primary);--el-button-hover-bg-color:var(--el-color-primary-light-9);--el-button-hover-border-color:var(--el-color-primary-light-7);--el-button-active-text-color:var(--el-button-hover-text-color);--el-button-active-border-color:var(--el-color-primary);--el-button-active-bg-color:var(--el-button-hover-bg-color);--el-button-outline-color:var(--el-color-primary-light-5);--el-button-hover-link-text-color:var(--el-text-color-secondary);--el-button-active-color:var(--el-text-color-primary);white-space:nowrap;cursor:pointer;height:32px;color:var(--el-button-text-color);text-align:center;box-sizing:border-box;line-height:1;font-weight:var(--el-button-font-weight);-webkit-user-select:none;user-select:none;vertical-align:middle;-webkit-appearance:none;background-color:var(--el-button-bg-color);border:var(--el-border);border-color:var(--el-button-border-color);outline:none;justify-content:center;align-items:center;transition:all .1s;display:inline-flex}.el-button:hover{color:var(--el-button-hover-text-color);border-color:var(--el-button-hover-border-color);background-color:var(--el-button-hover-bg-color);outline:none}.el-button:active{color:var(--el-button-active-text-color);border-color:var(--el-button-active-border-color);background-color:var(--el-button-active-bg-color);outline:none}.el-button:focus-visible{outline:2px solid var(--el-button-outline-color);outline-offset:1px;transition:outline-offset,outline}.el-button>span{align-items:center;display:inline-flex}.el-button+.el-button{margin-left:12px}.el-button{font-size:var(--el-font-size-base);border-radius:var(--el-border-radius-base);padding:8px 15px}.el-button.is-round{padding:8px 15px}.el-button::-moz-focus-inner{border:0}.el-button [class*=el-icon]+span{margin-left:6px}.el-button [class*=el-icon] svg{vertical-align:bottom}.el-button.is-plain{--el-button-hover-text-color:var(--el-color-primary);--el-button-hover-bg-color:var(--el-fill-color-blank);--el-button-hover-border-color:var(--el-color-primary)}.el-button.is-active{color:var(--el-button-active-text-color);border-color:var(--el-button-active-border-color);background-color:var(--el-button-active-bg-color);outline:none}.el-button.is-disabled,.el-button.is-disabled:hover{color:var(--el-button-disabled-text-color);cursor:not-allowed;background-image:none;background-color:var(--el-button-disabled-bg-color);border-color:var(--el-button-disabled-border-color)}.el-button.is-loading{pointer-events:none;position:relative}.el-button.is-loading:before{z-index:1;pointer-events:none;content:"";border-radius:inherit;background-color:var(--el-mask-color-extra-light);position:absolute;inset:-1px}.el-button.is-round{border-radius:var(--el-border-radius-round)}.el-button.is-dashed{--el-button-hover-text-color:var(--el-color-primary);--el-button-hover-bg-color:var(--el-fill-color-blank);--el-button-hover-border-color:var(--el-color-primary);border-style:dashed}.el-button.is-circle{border-radius:50%;width:32px;padding:8px}.el-button.is-text{color:var(--el-button-text-color);background-color:#0000;border:0 solid #0000}.el-button.is-text.is-disabled{color:var(--el-button-disabled-text-color);background-color:#0000!important}.el-button.is-text:not(.is-disabled):hover{background-color:var(--el-fill-color-light)}.el-button.is-text:not(.is-disabled):focus-visible{outline:2px solid var(--el-button-outline-color);outline-offset:1px;transition:outline-offset,outline}.el-button.is-text:not(.is-disabled):active{background-color:var(--el-fill-color)}.el-button.is-text:not(.is-disabled).is-has-bg{background-color:var(--el-fill-color-light)}.el-button.is-text:not(.is-disabled).is-has-bg:hover{background-color:var(--el-fill-color)}.el-button.is-text:not(.is-disabled).is-has-bg:active{background-color:var(--el-fill-color-dark)}.el-button__text--expand{letter-spacing:.3em;margin-right:-.3em}.el-button.is-link{color:var(--el-button-text-color);background:0 0;border-color:#0000;height:auto;padding:2px}.el-button.is-link:hover{color:var(--el-button-hover-link-text-color)}.el-button.is-link.is-disabled{color:var(--el-button-disabled-text-color);background-color:#0000!important;border-color:#0000!important}.el-button.is-link:not(.is-disabled):hover{background-color:#0000;border-color:#0000}.el-button.is-link:not(.is-disabled):active{color:var(--el-button-active-color);background-color:#0000;border-color:#0000}.el-button--text{color:var(--el-color-primary);background:0 0;border-color:#0000;padding-left:0;padding-right:0}.el-button--text.is-disabled{color:var(--el-button-disabled-text-color);background-color:#0000!important;border-color:#0000!important}.el-button--text:not(.is-disabled):hover{color:var(--el-color-primary-light-3);background-color:#0000;border-color:#0000}.el-button--text:not(.is-disabled):active{color:var(--el-color-primary-dark-2);background-color:#0000;border-color:#0000}.el-button__link--expand{letter-spacing:.3em;margin-right:-.3em}.el-button--primary{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-primary);--el-button-border-color:var(--el-color-primary);--el-button-outline-color:var(--el-color-primary-light-5);--el-button-active-color:var(--el-color-primary-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-primary-light-5);--el-button-hover-bg-color:var(--el-color-primary-light-3);--el-button-hover-border-color:var(--el-color-primary-light-3);--el-button-active-bg-color:var(--el-color-primary-dark-2);--el-button-active-border-color:var(--el-color-primary-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-primary-light-5);--el-button-disabled-border-color:var(--el-color-primary-light-5)}.el-button--primary.is-plain,.el-button--primary.is-text,.el-button--primary.is-link{--el-button-text-color:var(--el-color-primary);--el-button-bg-color:var(--el-color-primary-light-9);--el-button-border-color:var(--el-color-primary-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-primary);--el-button-hover-border-color:var(--el-color-primary);--el-button-active-text-color:var(--el-color-white)}.el-button--primary.is-plain.is-disabled,.el-button--primary.is-plain.is-disabled:hover,.el-button--primary.is-plain.is-disabled:focus,.el-button--primary.is-plain.is-disabled:active,.el-button--primary.is-text.is-disabled,.el-button--primary.is-text.is-disabled:hover,.el-button--primary.is-text.is-disabled:focus,.el-button--primary.is-text.is-disabled:active,.el-button--primary.is-link.is-disabled,.el-button--primary.is-link.is-disabled:hover,.el-button--primary.is-link.is-disabled:focus,.el-button--primary.is-link.is-disabled:active{color:var(--el-color-primary-light-5);background-color:var(--el-color-primary-light-9);border-color:var(--el-color-primary-light-8)}.el-button--primary.is-dashed{--el-button-text-color:var(--el-color-primary);--el-button-bg-color:var(--el-color-primary-light-9);--el-button-border-color:var(--el-color-primary-light-5);--el-button-hover-text-color:var(--el-color-primary);--el-button-hover-bg-color:var(--el-color-primary-light-9);--el-button-hover-border-color:var(--el-color-primary-light-3);--el-button-active-text-color:var(--el-color-primary-dark-2);--el-button-active-bg-color:var(--el-color-primary-light-9);--el-button-active-border-color:var(--el-color-primary-dark-2)}.el-button--primary.is-dashed.is-disabled,.el-button--primary.is-dashed.is-disabled:hover,.el-button--primary.is-dashed.is-disabled:focus,.el-button--primary.is-dashed.is-disabled:active{color:var(--el-color-primary-light-5);background-color:var(--el-color-primary-light-9);border-color:var(--el-color-primary-light-8)}.el-button--success{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-success);--el-button-border-color:var(--el-color-success);--el-button-outline-color:var(--el-color-success-light-5);--el-button-active-color:var(--el-color-success-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-success-light-5);--el-button-hover-bg-color:var(--el-color-success-light-3);--el-button-hover-border-color:var(--el-color-success-light-3);--el-button-active-bg-color:var(--el-color-success-dark-2);--el-button-active-border-color:var(--el-color-success-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-success-light-5);--el-button-disabled-border-color:var(--el-color-success-light-5)}.el-button--success.is-plain,.el-button--success.is-text,.el-button--success.is-link{--el-button-text-color:var(--el-color-success);--el-button-bg-color:var(--el-color-success-light-9);--el-button-border-color:var(--el-color-success-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-success);--el-button-hover-border-color:var(--el-color-success);--el-button-active-text-color:var(--el-color-white)}.el-button--success.is-plain.is-disabled,.el-button--success.is-plain.is-disabled:hover,.el-button--success.is-plain.is-disabled:focus,.el-button--success.is-plain.is-disabled:active,.el-button--success.is-text.is-disabled,.el-button--success.is-text.is-disabled:hover,.el-button--success.is-text.is-disabled:focus,.el-button--success.is-text.is-disabled:active,.el-button--success.is-link.is-disabled,.el-button--success.is-link.is-disabled:hover,.el-button--success.is-link.is-disabled:focus,.el-button--success.is-link.is-disabled:active{color:var(--el-color-success-light-5);background-color:var(--el-color-success-light-9);border-color:var(--el-color-success-light-8)}.el-button--success.is-dashed{--el-button-text-color:var(--el-color-success);--el-button-bg-color:var(--el-color-success-light-9);--el-button-border-color:var(--el-color-success-light-5);--el-button-hover-text-color:var(--el-color-success);--el-button-hover-bg-color:var(--el-color-success-light-9);--el-button-hover-border-color:var(--el-color-success-light-3);--el-button-active-text-color:var(--el-color-success-dark-2);--el-button-active-bg-color:var(--el-color-success-light-9);--el-button-active-border-color:var(--el-color-success-dark-2)}.el-button--success.is-dashed.is-disabled,.el-button--success.is-dashed.is-disabled:hover,.el-button--success.is-dashed.is-disabled:focus,.el-button--success.is-dashed.is-disabled:active{color:var(--el-color-success-light-5);background-color:var(--el-color-success-light-9);border-color:var(--el-color-success-light-8)}.el-button--warning{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-warning);--el-button-border-color:var(--el-color-warning);--el-button-outline-color:var(--el-color-warning-light-5);--el-button-active-color:var(--el-color-warning-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-warning-light-5);--el-button-hover-bg-color:var(--el-color-warning-light-3);--el-button-hover-border-color:var(--el-color-warning-light-3);--el-button-active-bg-color:var(--el-color-warning-dark-2);--el-button-active-border-color:var(--el-color-warning-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-warning-light-5);--el-button-disabled-border-color:var(--el-color-warning-light-5)}.el-button--warning.is-plain,.el-button--warning.is-text,.el-button--warning.is-link{--el-button-text-color:var(--el-color-warning);--el-button-bg-color:var(--el-color-warning-light-9);--el-button-border-color:var(--el-color-warning-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-warning);--el-button-hover-border-color:var(--el-color-warning);--el-button-active-text-color:var(--el-color-white)}.el-button--warning.is-plain.is-disabled,.el-button--warning.is-plain.is-disabled:hover,.el-button--warning.is-plain.is-disabled:focus,.el-button--warning.is-plain.is-disabled:active,.el-button--warning.is-text.is-disabled,.el-button--warning.is-text.is-disabled:hover,.el-button--warning.is-text.is-disabled:focus,.el-button--warning.is-text.is-disabled:active,.el-button--warning.is-link.is-disabled,.el-button--warning.is-link.is-disabled:hover,.el-button--warning.is-link.is-disabled:focus,.el-button--warning.is-link.is-disabled:active{color:var(--el-color-warning-light-5);background-color:var(--el-color-warning-light-9);border-color:var(--el-color-warning-light-8)}.el-button--warning.is-dashed{--el-button-text-color:var(--el-color-warning);--el-button-bg-color:var(--el-color-warning-light-9);--el-button-border-color:var(--el-color-warning-light-5);--el-button-hover-text-color:var(--el-color-warning);--el-button-hover-bg-color:var(--el-color-warning-light-9);--el-button-hover-border-color:var(--el-color-warning-light-3);--el-button-active-text-color:var(--el-color-warning-dark-2);--el-button-active-bg-color:var(--el-color-warning-light-9);--el-button-active-border-color:var(--el-color-warning-dark-2)}.el-button--warning.is-dashed.is-disabled,.el-button--warning.is-dashed.is-disabled:hover,.el-button--warning.is-dashed.is-disabled:focus,.el-button--warning.is-dashed.is-disabled:active{color:var(--el-color-warning-light-5);background-color:var(--el-color-warning-light-9);border-color:var(--el-color-warning-light-8)}.el-button--danger{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-danger);--el-button-border-color:var(--el-color-danger);--el-button-outline-color:var(--el-color-danger-light-5);--el-button-active-color:var(--el-color-danger-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-danger-light-5);--el-button-hover-bg-color:var(--el-color-danger-light-3);--el-button-hover-border-color:var(--el-color-danger-light-3);--el-button-active-bg-color:var(--el-color-danger-dark-2);--el-button-active-border-color:var(--el-color-danger-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-danger-light-5);--el-button-disabled-border-color:var(--el-color-danger-light-5)}.el-button--danger.is-plain,.el-button--danger.is-text,.el-button--danger.is-link{--el-button-text-color:var(--el-color-danger);--el-button-bg-color:var(--el-color-danger-light-9);--el-button-border-color:var(--el-color-danger-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-danger);--el-button-hover-border-color:var(--el-color-danger);--el-button-active-text-color:var(--el-color-white)}.el-button--danger.is-plain.is-disabled,.el-button--danger.is-plain.is-disabled:hover,.el-button--danger.is-plain.is-disabled:focus,.el-button--danger.is-plain.is-disabled:active,.el-button--danger.is-text.is-disabled,.el-button--danger.is-text.is-disabled:hover,.el-button--danger.is-text.is-disabled:focus,.el-button--danger.is-text.is-disabled:active,.el-button--danger.is-link.is-disabled,.el-button--danger.is-link.is-disabled:hover,.el-button--danger.is-link.is-disabled:focus,.el-button--danger.is-link.is-disabled:active{color:var(--el-color-danger-light-5);background-color:var(--el-color-danger-light-9);border-color:var(--el-color-danger-light-8)}.el-button--danger.is-dashed{--el-button-text-color:var(--el-color-danger);--el-button-bg-color:var(--el-color-danger-light-9);--el-button-border-color:var(--el-color-danger-light-5);--el-button-hover-text-color:var(--el-color-danger);--el-button-hover-bg-color:var(--el-color-danger-light-9);--el-button-hover-border-color:var(--el-color-danger-light-3);--el-button-active-text-color:var(--el-color-danger-dark-2);--el-button-active-bg-color:var(--el-color-danger-light-9);--el-button-active-border-color:var(--el-color-danger-dark-2)}.el-button--danger.is-dashed.is-disabled,.el-button--danger.is-dashed.is-disabled:hover,.el-button--danger.is-dashed.is-disabled:focus,.el-button--danger.is-dashed.is-disabled:active{color:var(--el-color-danger-light-5);background-color:var(--el-color-danger-light-9);border-color:var(--el-color-danger-light-8)}.el-button--info{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-info);--el-button-border-color:var(--el-color-info);--el-button-outline-color:var(--el-color-info-light-5);--el-button-active-color:var(--el-color-info-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-info-light-5);--el-button-hover-bg-color:var(--el-color-info-light-3);--el-button-hover-border-color:var(--el-color-info-light-3);--el-button-active-bg-color:var(--el-color-info-dark-2);--el-button-active-border-color:var(--el-color-info-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-info-light-5);--el-button-disabled-border-color:var(--el-color-info-light-5)}.el-button--info.is-plain,.el-button--info.is-text,.el-button--info.is-link{--el-button-text-color:var(--el-color-info);--el-button-bg-color:var(--el-color-info-light-9);--el-button-border-color:var(--el-color-info-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-info);--el-button-hover-border-color:var(--el-color-info);--el-button-active-text-color:var(--el-color-white)}.el-button--info.is-plain.is-disabled,.el-button--info.is-plain.is-disabled:hover,.el-button--info.is-plain.is-disabled:focus,.el-button--info.is-plain.is-disabled:active,.el-button--info.is-text.is-disabled,.el-button--info.is-text.is-disabled:hover,.el-button--info.is-text.is-disabled:focus,.el-button--info.is-text.is-disabled:active,.el-button--info.is-link.is-disabled,.el-button--info.is-link.is-disabled:hover,.el-button--info.is-link.is-disabled:focus,.el-button--info.is-link.is-disabled:active{color:var(--el-color-info-light-5);background-color:var(--el-color-info-light-9);border-color:var(--el-color-info-light-8)}.el-button--info.is-dashed{--el-button-text-color:var(--el-color-info);--el-button-bg-color:var(--el-color-info-light-9);--el-button-border-color:var(--el-color-info-light-5);--el-button-hover-text-color:var(--el-color-info);--el-button-hover-bg-color:var(--el-color-info-light-9);--el-button-hover-border-color:var(--el-color-info-light-3);--el-button-active-text-color:var(--el-color-info-dark-2);--el-button-active-bg-color:var(--el-color-info-light-9);--el-button-active-border-color:var(--el-color-info-dark-2)}.el-button--info.is-dashed.is-disabled,.el-button--info.is-dashed.is-disabled:hover,.el-button--info.is-dashed.is-disabled:focus,.el-button--info.is-dashed.is-disabled:active{color:var(--el-color-info-light-5);background-color:var(--el-color-info-light-9);border-color:var(--el-color-info-light-8)}.el-button--large{--el-button-size:40px;height:var(--el-button-size)}.el-button--large [class*=el-icon]+span{margin-left:8px}.el-button--large{font-size:var(--el-font-size-base);border-radius:var(--el-border-radius-base);padding:12px 19px}.el-button--large.is-round{padding:12px 19px}.el-button--large.is-circle{width:var(--el-button-size);padding:12px}.el-button--small{--el-button-size:24px;height:var(--el-button-size)}.el-button--small [class*=el-icon]+span{margin-left:4px}.el-button--small{border-radius:calc(var(--el-border-radius-base) - 1px);padding:5px 11px;font-size:12px}.el-button--small.is-round{padding:5px 11px}.el-button--small.is-circle{width:var(--el-button-size);padding:5px}.el-calendar{--el-calendar-border:var(--el-table-border,1px solid var(--el-border-color-lighter));--el-calendar-header-border-bottom:var(--el-calendar-border);--el-calendar-selected-bg-color:var(--el-color-primary-light-9);--el-calendar-cell-width:85px;background-color:var(--el-fill-color-blank)}.el-calendar__header{border-bottom:var(--el-calendar-header-border-bottom);justify-content:space-between;padding:12px 20px;display:flex}.el-calendar__title{color:var(--el-text-color);align-self:center}.el-calendar__body{padding:12px 20px 35px}.el-calendar__select-controller .el-select{margin-right:8px}.el-calendar__select-controller .el-calendar-select__year{width:120px}.el-calendar__select-controller .el-calendar-select__month{width:60px}.el-calendar-table{table-layout:fixed;width:100%}.el-calendar-table thead th{color:var(--el-text-color-regular);padding:12px 0;font-weight:400}.el-calendar-table:not(.is-range) td.prev,.el-calendar-table:not(.is-range) td.next{color:var(--el-text-color-placeholder)}.el-calendar-table td{border-bottom:var(--el-calendar-border);border-right:var(--el-calendar-border);vertical-align:top;transition:background-color var(--el-transition-duration-fast) ease}.el-calendar-table td.is-selected{background-color:var(--el-calendar-selected-bg-color)}.el-calendar-table td.is-today{color:var(--el-color-primary)}.el-calendar-table tr:first-child td{border-top:var(--el-calendar-border)}.el-calendar-table tr td:first-child{border-left:var(--el-calendar-border)}.el-calendar-table tr.el-calendar-table__row--hide-border td{border-top:none}.el-calendar-table .el-calendar-day{box-sizing:border-box;height:var(--el-calendar-cell-width);padding:8px}.el-calendar-table .el-calendar-day:hover{cursor:pointer;background-color:var(--el-calendar-selected-bg-color)}.el-card{--el-card-border-color:var(--el-border-color-light);--el-card-border-radius:4px;--el-card-padding:20px;--el-card-bg-color:var(--el-fill-color-blank);border-radius:var(--el-card-border-radius);border:1px solid var(--el-card-border-color);background-color:var(--el-card-bg-color);color:var(--el-text-color-primary);transition:var(--el-transition-duration);flex-direction:column;display:flex;overflow:hidden}.el-card.is-always-shadow,.el-card.is-hover-shadow:hover,.el-card.is-hover-shadow:focus{box-shadow:var(--el-box-shadow-light)}.el-card__header{padding:calc(var(--el-card-padding) - 2px) var(--el-card-padding);border-bottom:1px solid var(--el-card-border-color);box-sizing:border-box}.el-card__body{padding:var(--el-card-padding);flex-grow:1;overflow:auto}.el-card__footer{padding:calc(var(--el-card-padding) - 2px) var(--el-card-padding);border-top:1px solid var(--el-card-border-color);box-sizing:border-box}.el-carousel__item{width:100%;height:100%;z-index:calc(var(--el-index-normal) - 1);display:inline-block;position:absolute;top:0;left:0;overflow:hidden}.el-carousel__item.is-active{z-index:calc(var(--el-index-normal) - 1)}.el-carousel__item.is-animating{transition:transform .4s ease-in-out}.el-carousel__item--card{width:50%;transition:transform .4s ease-in-out}.el-carousel__item--card.is-in-stage{cursor:pointer;z-index:var(--el-index-normal)}.el-carousel__item--card.is-in-stage:hover .el-carousel__mask,.el-carousel__item--card.is-in-stage.is-hover .el-carousel__mask{opacity:.12}.el-carousel__item--card.is-active{z-index:calc(var(--el-index-normal) + 1)}.el-carousel__item--card-vertical{width:100%;height:50%}.el-carousel__mask{background-color:var(--el-color-white);opacity:.24;width:100%;height:100%;transition:var(--el-transition-duration-fast);position:absolute;top:0;left:0}.el-carousel{--el-carousel-arrow-font-size:12px;--el-carousel-arrow-size:36px;--el-carousel-arrow-background:#1f2d3d1c;--el-carousel-arrow-hover-background:#1f2d3d3b;--el-carousel-indicator-width:30px;--el-carousel-indicator-height:2px;--el-carousel-indicator-padding-horizontal:4px;--el-carousel-indicator-padding-vertical:12px;--el-carousel-indicator-out-color:var(--el-border-color-hover);position:relative}.el-carousel--horizontal,.el-carousel--vertical{overflow:hidden}.el-carousel.is-vertical-outside{flex-direction:row;align-items:center;display:flex}.el-carousel.is-vertical-outside .el-carousel__container{flex:1}.el-carousel__container{height:300px;position:relative}.el-carousel__arrow{height:var(--el-carousel-arrow-size);width:var(--el-carousel-arrow-size);cursor:pointer;transition:var(--el-transition-duration);background-color:var(--el-carousel-arrow-background);color:#fff;z-index:10;text-align:center;font-size:var(--el-carousel-arrow-font-size);border:none;border-radius:50%;outline:none;justify-content:center;align-items:center;margin:0;padding:0;display:inline-flex;position:absolute;top:50%;transform:translateY(-50%)}.el-carousel__arrow--left{left:16px}.el-carousel__arrow--right{right:16px}.el-carousel__arrow:hover{background-color:var(--el-carousel-arrow-hover-background)}.el-carousel__arrow i{cursor:pointer}.el-carousel__indicators{z-index:calc(var(--el-index-normal) + 1);margin:0;padding:0;list-style:none;position:absolute}.el-carousel__indicators--horizontal{bottom:0;left:50%;transform:translate(-50%)}.el-carousel__indicators--vertical{top:50%;right:0;transform:translateY(-50%)}.el-carousel__indicators--outside{text-align:center;position:static;transform:none}.el-carousel__indicators--outside .el-carousel__indicator:hover button{opacity:.64}.el-carousel__indicators--outside button{background-color:var(--el-carousel-indicator-out-color);opacity:.24}.el-carousel__indicators--right{right:0}.el-carousel__indicators--labels .el-carousel__button{color:#000;padding:2px 18px;font-size:12px}.el-carousel__indicators--labels .el-carousel__indicator{padding:6px 4px}.el-carousel__indicator{cursor:pointer;background-color:#0000}.el-carousel__indicator:hover button{opacity:.72}.el-carousel__indicator--horizontal{padding:var(--el-carousel-indicator-padding-vertical) var(--el-carousel-indicator-padding-horizontal);display:inline-block}.el-carousel__indicator--vertical{padding:var(--el-carousel-indicator-padding-horizontal) var(--el-carousel-indicator-padding-vertical)}.el-carousel__indicator--vertical .el-carousel__button{width:var(--el-carousel-indicator-height);height:calc(var(--el-carousel-indicator-width) / 2)}.el-carousel__indicator.is-active button{opacity:1}.el-carousel__button{opacity:.48;width:var(--el-carousel-indicator-width);height:var(--el-carousel-indicator-height);cursor:pointer;transition:var(--el-transition-duration);background-color:#fff;border:none;outline:none;margin:0;padding:0;display:block}.el-carousel__indicators--labels .el-carousel__button{width:auto;height:auto}.carousel-arrow-left-enter-from,.carousel-arrow-left-leave-active{opacity:0;transform:translateY(-50%)translate(-10px)}.carousel-arrow-right-enter-from,.carousel-arrow-right-leave-active{opacity:0;transform:translateY(-50%)translate(10px)}.el-transitioning{filter:url(#elCarouselHorizontal)}.el-transitioning-vertical{filter:url(#elCarouselVertical)}.el-cascader-panel{--el-cascader-menu-text-color:var(--el-text-color-regular);--el-cascader-menu-selected-text-color:var(--el-color-primary);--el-cascader-menu-fill:var(--el-bg-color-overlay);--el-cascader-menu-font-size:var(--el-font-size-base);--el-cascader-menu-radius:var(--el-border-radius-base);--el-cascader-menu-border:solid 1px var(--el-border-color-light);--el-cascader-menu-shadow:var(--el-box-shadow-light);--el-cascader-node-background-hover:var(--el-fill-color-light);--el-cascader-node-color-disabled:var(--el-text-color-placeholder);--el-cascader-color-empty:var(--el-text-color-placeholder);--el-cascader-tag-background:var(--el-fill-color);border-radius:var(--el-cascader-menu-radius);width:-moz-fit-content;width:fit-content;font-size:var(--el-cascader-menu-font-size);display:flex}.el-cascader-panel.is-bordered{border:var(--el-cascader-menu-border);border-radius:var(--el-cascader-menu-radius)}.el-cascader-menu{box-sizing:border-box;min-width:180px;color:var(--el-cascader-menu-text-color);border-right:var(--el-cascader-menu-border)}.el-cascader-menu:last-child{border-right:none}.el-cascader-menu:last-child .el-cascader-node{padding-right:20px}.el-cascader-menu__wrap.el-scrollbar__wrap{height:204px}.el-cascader-menu__list{box-sizing:border-box;min-height:100%;margin:0;padding:6px 0;list-style:none;position:relative}.el-cascader-menu__hover-zone{pointer-events:none;width:100%;height:100%;position:absolute;top:0;left:0}.el-cascader-menu__empty-text{color:var(--el-cascader-color-empty);align-items:center;display:flex;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.el-cascader-menu__empty-text .is-loading{margin-right:2px}.el-cascader-node{outline:none;align-items:center;height:34px;padding:0 30px 0 20px;line-height:34px;display:flex;position:relative}.el-cascader-node.is-selectable.in-active-path{color:var(--el-cascader-menu-text-color)}.el-cascader-node.in-active-path,.el-cascader-node.is-selectable.in-checked-path,.el-cascader-node.is-active{color:var(--el-cascader-menu-selected-text-color);font-weight:700}.el-cascader-node:not(.is-disabled){cursor:pointer}.el-cascader-node:not(.is-disabled):hover,.el-cascader-node:not(.is-disabled):focus{background:var(--el-cascader-node-background-hover)}.el-cascader-node.is-disabled{color:var(--el-cascader-node-color-disabled);cursor:not-allowed}.el-cascader-node__prefix{position:absolute;left:10px}.el-cascader-node__postfix{position:absolute;right:10px}.el-cascader-node__label{text-align:left;white-space:nowrap;text-overflow:ellipsis;flex:1;padding:0 8px;overflow:hidden}.el-cascader-node>.el-checkbox,.el-cascader-node>.el-radio{margin-right:0}.el-cascader-node>.el-radio .el-radio__label{padding-left:0}.el-cascader{--el-cascader-menu-text-color:var(--el-text-color-regular);--el-cascader-menu-selected-text-color:var(--el-color-primary);--el-cascader-menu-fill:var(--el-bg-color-overlay);--el-cascader-menu-font-size:var(--el-font-size-base);--el-cascader-menu-radius:var(--el-border-radius-base);--el-cascader-menu-border:solid 1px var(--el-border-color-light);--el-cascader-menu-shadow:var(--el-box-shadow-light);--el-cascader-node-background-hover:var(--el-fill-color-light);--el-cascader-node-color-disabled:var(--el-text-color-placeholder);--el-cascader-color-empty:var(--el-text-color-placeholder);--el-cascader-tag-background:var(--el-fill-color);vertical-align:middle;font-size:var(--el-font-size-base);outline:none;line-height:32px;display:inline-block;position:relative}.el-cascader:not(.is-disabled):hover .el-input__wrapper{cursor:pointer;box-shadow:0 0 0 1px var(--el-input-hover-border-color) inset}.el-cascader .el-input{cursor:pointer;display:flex}.el-cascader .el-input .el-input__inner{text-overflow:ellipsis}.el-cascader .el-input .el-input__inner:read-only{cursor:pointer}.el-cascader .el-input .el-input__inner:disabled{cursor:not-allowed}.el-cascader .el-input .el-input__suffix-inner .el-icon svg{vertical-align:middle}.el-cascader .el-input .icon-arrow-down{transition:transform var(--el-transition-duration);font-size:14px}.el-cascader .el-input .icon-arrow-down.is-reverse{transform:rotate(180deg)}.el-cascader .el-input .icon-circle-close:hover{color:var(--el-input-clear-hover-color,var(--el-text-color-secondary))}.el-cascader .el-input.is-focus .el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-focus-border-color,var(--el-color-primary)) inset}.el-cascader--large{font-size:14px;line-height:40px}.el-cascader--large .el-cascader__tags{gap:6px;padding:8px}.el-cascader--large .el-cascader__search-input{height:24px;margin-left:7px}.el-cascader--small{font-size:12px;line-height:24px}.el-cascader--small .el-cascader__tags{gap:4px;padding:2px}.el-cascader--small .el-cascader__search-input{height:20px;margin-left:5px}.el-cascader.is-disabled .el-cascader__label{z-index:calc(var(--el-index-normal) + 1);color:var(--el-disabled-text-color)}.el-cascader__dropdown{--el-cascader-menu-text-color:var(--el-text-color-regular);--el-cascader-menu-selected-text-color:var(--el-color-primary);--el-cascader-menu-fill:var(--el-bg-color-overlay);--el-cascader-menu-font-size:var(--el-font-size-base);--el-cascader-menu-radius:var(--el-border-radius-base);--el-cascader-menu-border:solid 1px var(--el-border-color-light);--el-cascader-menu-shadow:var(--el-box-shadow-light);--el-cascader-node-background-hover:var(--el-fill-color-light);--el-cascader-node-color-disabled:var(--el-text-color-placeholder);--el-cascader-color-empty:var(--el-text-color-placeholder);--el-cascader-tag-background:var(--el-fill-color);font-size:var(--el-cascader-menu-font-size);border-radius:var(--el-cascader-menu-radius)}.el-cascader__dropdown.el-popper{background:var(--el-cascader-menu-fill);border:var(--el-cascader-menu-border);box-shadow:var(--el-cascader-menu-shadow)}.el-cascader__dropdown.el-popper .el-popper__arrow:before{border:var(--el-cascader-menu-border)}.el-cascader__dropdown.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-top-color:#0000;border-left-color:#0000}.el-cascader__dropdown.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:#0000;border-right-color:#0000}.el-cascader__dropdown.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-bottom-color:#0000;border-left-color:#0000}.el-cascader__dropdown.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-top-color:#0000;border-right-color:#0000}.el-cascader__dropdown.el-popper{box-shadow:var(--el-cascader-menu-shadow)}.el-cascader__header{border-bottom:1px solid var(--el-border-color-light);padding:10px}.el-cascader__footer{border-top:1px solid var(--el-border-color-light);padding:10px}.el-cascader__tags{text-align:left;box-sizing:border-box;flex-wrap:wrap;gap:6px;padding:4px;line-height:normal;display:flex;position:absolute;top:50%;left:0;right:30px;transform:translateY(-50%)}.el-cascader__tags .el-tag{text-overflow:ellipsis;background:var(--el-cascader-tag-background);align-items:center;max-width:100%;display:inline-flex}.el-cascader__tags .el-tag.el-tag--dark,.el-cascader__tags .el-tag.el-tag--plain{background-color:var(--el-tag-bg-color)}.el-cascader__tags .el-tag:not(.is-hit){border-color:#0000}.el-cascader__tags .el-tag:not(.is-hit).el-tag--dark,.el-cascader__tags .el-tag:not(.is-hit).el-tag--plain{border-color:var(--el-tag-border-color)}.el-cascader__tags .el-tag>span{text-overflow:ellipsis;flex:1;line-height:normal;overflow:hidden}.el-cascader__tags .el-tag .el-icon-close{background-color:var(--el-text-color-placeholder);color:var(--el-color-white);flex:none}.el-cascader__tags .el-tag .el-icon-close:hover{background-color:var(--el-text-color-secondary)}.el-cascader__tags .el-tag+input{margin-left:0}.el-cascader__tags.is-validate{right:55px}.el-cascader__collapse-tags{white-space:normal;z-index:var(--el-index-normal)}.el-cascader__collapse-tags .el-tag{text-overflow:ellipsis;background:var(--el-fill-color);align-items:center;max-width:100%;display:inline-flex}.el-cascader__collapse-tags .el-tag.el-tag--dark,.el-cascader__collapse-tags .el-tag.el-tag--plain{background-color:var(--el-tag-bg-color)}.el-cascader__collapse-tags .el-tag:not(.is-hit){border-color:#0000}.el-cascader__collapse-tags .el-tag:not(.is-hit).el-tag--dark,.el-cascader__collapse-tags .el-tag:not(.is-hit).el-tag--plain{border-color:var(--el-tag-border-color)}.el-cascader__collapse-tags .el-tag>span{text-overflow:ellipsis;flex:1;line-height:normal;overflow:hidden}.el-cascader__collapse-tags .el-tag .el-icon-close{background-color:var(--el-text-color-placeholder);color:var(--el-color-white);flex:none}.el-cascader__collapse-tags .el-tag .el-icon-close:hover{background-color:var(--el-text-color-secondary)}.el-cascader__collapse-tags .el-tag+input{margin-left:0}.el-cascader__collapse-tags .el-tag{margin:2px 0}.el-cascader__suggestion-panel{border-radius:var(--el-cascader-menu-radius)}.el-cascader__suggestion-list{max-height:204px;font-size:var(--el-font-size-base);color:var(--el-cascader-menu-text-color);text-align:center;margin:0;padding:6px 0}.el-cascader__suggestion-item{text-align:left;cursor:pointer;outline:none;justify-content:space-between;align-items:center;height:34px;padding:0 15px;display:flex}.el-cascader__suggestion-item:hover,.el-cascader__suggestion-item:focus{background:var(--el-cascader-node-background-hover)}.el-cascader__suggestion-item.is-checked{color:var(--el-cascader-menu-selected-text-color);font-weight:700}.el-cascader__suggestion-item>span{margin-right:10px}.el-cascader__empty-text{color:var(--el-cascader-color-empty);margin:10px 0}.el-cascader__search-input{min-width:60px;height:24px;color:var(--el-cascader-menu-text-color);box-sizing:border-box;background:0 0;border:none;outline:none;flex:1;margin-left:7px;padding:0}.el-cascader__search-input::placeholder{color:#0000}.el-check-tag{background-color:var(--el-color-info-light-9);border-radius:var(--el-border-radius-base);color:var(--el-color-info);cursor:pointer;font-size:var(--el-font-size-base);line-height:var(--el-font-size-base);transition:var(--el-transition-all);padding:7px 15px;font-weight:700;display:inline-block}.el-check-tag:hover{background-color:var(--el-color-info-light-7)}.el-check-tag.el-check-tag--primary.is-checked{background-color:var(--el-color-primary-light-8);color:var(--el-color-primary)}.el-check-tag.el-check-tag--primary.is-checked:hover{background-color:var(--el-color-primary-light-7)}.el-check-tag.el-check-tag--primary.is-checked.is-disabled{background-color:var(--el-color-primary-light-8);color:var(--el-disabled-text-color);cursor:not-allowed}.el-check-tag.el-check-tag--primary.is-checked.is-disabled:hover{background-color:var(--el-color-primary-light-8)}.el-check-tag.el-check-tag--primary.is-disabled{background-color:var(--el-color-info-light-9);color:var(--el-disabled-text-color);cursor:not-allowed}.el-check-tag.el-check-tag--primary.is-disabled:hover{background-color:var(--el-color-info-light-9)}.el-check-tag.el-check-tag--success.is-checked{background-color:var(--el-color-success-light-8);color:var(--el-color-success)}.el-check-tag.el-check-tag--success.is-checked:hover{background-color:var(--el-color-success-light-7)}.el-check-tag.el-check-tag--success.is-checked.is-disabled{background-color:var(--el-color-success-light-8);color:var(--el-disabled-text-color);cursor:not-allowed}.el-check-tag.el-check-tag--success.is-checked.is-disabled:hover{background-color:var(--el-color-success-light-8)}.el-check-tag.el-check-tag--success.is-disabled{background-color:var(--el-color-success-light-9);color:var(--el-disabled-text-color);cursor:not-allowed}.el-check-tag.el-check-tag--success.is-disabled:hover{background-color:var(--el-color-success-light-9)}.el-check-tag.el-check-tag--warning.is-checked{background-color:var(--el-color-warning-light-8);color:var(--el-color-warning)}.el-check-tag.el-check-tag--warning.is-checked:hover{background-color:var(--el-color-warning-light-7)}.el-check-tag.el-check-tag--warning.is-checked.is-disabled{background-color:var(--el-color-warning-light-8);color:var(--el-disabled-text-color);cursor:not-allowed}.el-check-tag.el-check-tag--warning.is-checked.is-disabled:hover{background-color:var(--el-color-warning-light-8)}.el-check-tag.el-check-tag--warning.is-disabled{background-color:var(--el-color-warning-light-9);color:var(--el-disabled-text-color);cursor:not-allowed}.el-check-tag.el-check-tag--warning.is-disabled:hover{background-color:var(--el-color-warning-light-9)}.el-check-tag.el-check-tag--danger.is-checked{background-color:var(--el-color-danger-light-8);color:var(--el-color-danger)}.el-check-tag.el-check-tag--danger.is-checked:hover{background-color:var(--el-color-danger-light-7)}.el-check-tag.el-check-tag--danger.is-checked.is-disabled{background-color:var(--el-color-danger-light-8);color:var(--el-disabled-text-color);cursor:not-allowed}.el-check-tag.el-check-tag--danger.is-checked.is-disabled:hover{background-color:var(--el-color-danger-light-8)}.el-check-tag.el-check-tag--danger.is-disabled{background-color:var(--el-color-danger-light-9);color:var(--el-disabled-text-color);cursor:not-allowed}.el-check-tag.el-check-tag--danger.is-disabled:hover{background-color:var(--el-color-danger-light-9)}.el-check-tag.el-check-tag--error.is-checked{background-color:var(--el-color-error-light-8);color:var(--el-color-error)}.el-check-tag.el-check-tag--error.is-checked:hover{background-color:var(--el-color-error-light-7)}.el-check-tag.el-check-tag--error.is-checked.is-disabled{background-color:var(--el-color-error-light-8);color:var(--el-disabled-text-color);cursor:not-allowed}.el-check-tag.el-check-tag--error.is-checked.is-disabled:hover{background-color:var(--el-color-error-light-8)}.el-check-tag.el-check-tag--error.is-disabled{background-color:var(--el-color-error-light-9);color:var(--el-disabled-text-color);cursor:not-allowed}.el-check-tag.el-check-tag--error.is-disabled:hover{background-color:var(--el-color-error-light-9)}.el-check-tag.el-check-tag--info.is-checked{background-color:var(--el-color-info-light-8);color:var(--el-color-info)}.el-check-tag.el-check-tag--info.is-checked:hover{background-color:var(--el-color-info-light-7)}.el-check-tag.el-check-tag--info.is-checked.is-disabled{background-color:var(--el-color-info-light-8);color:var(--el-disabled-text-color);cursor:not-allowed}.el-check-tag.el-check-tag--info.is-checked.is-disabled:hover{background-color:var(--el-color-info-light-8)}.el-check-tag.el-check-tag--info.is-disabled{background-color:var(--el-color-info-light-9);color:var(--el-disabled-text-color);cursor:not-allowed}.el-check-tag.el-check-tag--info.is-disabled:hover{background-color:var(--el-color-info-light-9)}.el-checkbox-button{--el-checkbox-button-checked-bg-color:var(--el-color-primary);--el-checkbox-button-checked-text-color:var(--el-color-white);--el-checkbox-button-checked-border-color:var(--el-color-primary);--el-checkbox-button-disabled-checked-fill:var(--el-border-color-extra-light);display:inline-block;position:relative}.el-checkbox-button__inner{line-height:1;font-weight:var(--el-checkbox-font-weight);white-space:nowrap;vertical-align:middle;cursor:pointer;background:var(--el-button-bg-color,var(--el-fill-color-blank));outline:var(--el-border);color:var(--el-button-text-color,var(--el-text-color-regular));-webkit-appearance:none;text-align:center;box-sizing:border-box;transition:var(--el-transition-all);-webkit-user-select:none;user-select:none;font-size:var(--el-font-size-base);border-radius:0;margin:0;padding:8px 15px;display:inline-block;position:relative}.el-checkbox-button__inner.is-round{padding:8px 15px}.el-checkbox-button__inner:hover{color:var(--el-color-primary)}.el-checkbox-button__inner [class*=el-icon-]{line-height:.9}.el-checkbox-button__inner [class*=el-icon-]+span{margin-left:5px}.el-checkbox-button__original{opacity:0;z-index:-1;outline:none;margin:0;position:absolute}.el-checkbox-button.is-checked .el-checkbox-button__inner{color:var(--el-checkbox-button-checked-text-color);background-color:var(--el-checkbox-button-checked-bg-color);border-color:var(--el-checkbox-button-checked-border-color);box-shadow:-1px 0 0 0 var(--el-color-primary-light-7)}.el-checkbox-button.is-checked:first-child .el-checkbox-button__inner{border-left-color:var(--el-checkbox-button-checked-border-color)}.el-checkbox-button.is-disabled .el-checkbox-button__inner{color:var(--el-disabled-text-color);cursor:not-allowed;background-image:none;background-color:var(--el-button-disabled-bg-color,var(--el-fill-color-blank));border-color:var(--el-button-disabled-border-color,var(--el-border-color-light));box-shadow:none}.el-checkbox-button.is-disabled:first-child .el-checkbox-button__inner{border-left-color:var(--el-button-disabled-border-color,var(--el-border-color-light))}.el-checkbox-button.is-disabled.is-checked .el-checkbox-button__inner{background-color:var(--el-checkbox-button-disabled-checked-fill)}.el-checkbox-button:first-child .el-checkbox-button__inner{border-top-left-radius:var(--el-border-radius-base);border-bottom-left-radius:var(--el-border-radius-base);box-shadow:none!important}.el-checkbox-button.is-focus .el-checkbox-button__inner{border-color:var(--el-checkbox-button-checked-border-color)}.el-checkbox-button:last-child .el-checkbox-button__inner{border-top-right-radius:var(--el-border-radius-base);border-bottom-right-radius:var(--el-border-radius-base)}.el-checkbox-button--large .el-checkbox-button__inner{font-size:var(--el-font-size-base);border-radius:0;padding:12px 19px}.el-checkbox-button--large .el-checkbox-button__inner.is-round{padding:12px 19px}.el-checkbox-button--small .el-checkbox-button__inner{border-radius:0;padding:5px 11px;font-size:12px}.el-checkbox-button--small .el-checkbox-button__inner.is-round{padding:5px 11px}.el-checkbox-group{font-size:0;line-height:0}.el-checkbox{--el-checkbox-font-size:14px;--el-checkbox-font-weight:var(--el-font-weight-primary);--el-checkbox-text-color:var(--el-text-color-regular);--el-checkbox-input-height:14px;--el-checkbox-input-width:14px;--el-checkbox-border-radius:var(--el-border-radius-small);--el-checkbox-bg-color:var(--el-fill-color-blank);--el-checkbox-input-border:var(--el-border);--el-checkbox-disabled-border-color:var(--el-border-color);--el-checkbox-disabled-input-fill:var(--el-fill-color-light);--el-checkbox-disabled-icon-color:var(--el-text-color-placeholder);--el-checkbox-disabled-checked-input-fill:var(--el-border-color-extra-light);--el-checkbox-disabled-checked-input-border-color:var(--el-border-color);--el-checkbox-disabled-checked-icon-color:var(--el-text-color-placeholder);--el-checkbox-checked-text-color:var(--el-color-primary);--el-checkbox-checked-input-border-color:var(--el-color-primary);--el-checkbox-checked-bg-color:var(--el-color-primary);--el-checkbox-checked-icon-color:var(--el-color-white);--el-checkbox-input-border-color-hover:var(--el-color-primary);color:var(--el-checkbox-text-color);font-weight:var(--el-checkbox-font-weight);font-size:var(--el-font-size-base);cursor:pointer;white-space:nowrap;-webkit-user-select:none;user-select:none;height:var(--el-checkbox-height,32px);align-items:center;margin-right:30px;display:inline-flex;position:relative}.el-checkbox.is-disabled{cursor:not-allowed}.el-checkbox.is-bordered{border-radius:var(--el-border-radius-base);border:var(--el-border);box-sizing:border-box;padding:0 15px 0 9px}.el-checkbox.is-bordered.is-checked{border-color:var(--el-color-primary)}.el-checkbox.is-bordered.is-disabled{border-color:var(--el-border-color-lighter)}.el-checkbox.is-bordered.el-checkbox--large{border-radius:var(--el-border-radius-base);padding:0 19px 0 11px}.el-checkbox.is-bordered.el-checkbox--large .el-checkbox__label{font-size:var(--el-font-size-base)}.el-checkbox.is-bordered.el-checkbox--large .el-checkbox__inner{width:14px;height:14px}.el-checkbox.is-bordered.el-checkbox--small{border-radius:calc(var(--el-border-radius-base) - 1px);padding:0 11px 0 7px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label{font-size:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner{width:12px;height:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner:after{width:2px;height:6px}.el-checkbox input:focus-visible+.el-checkbox__inner{outline:2px solid var(--el-checkbox-input-border-color-hover);outline-offset:1px;border-radius:var(--el-checkbox-border-radius)}.el-checkbox__input{white-space:nowrap;cursor:pointer;outline:none;display:inline-flex;position:relative}.el-checkbox__input.is-disabled .el-checkbox__inner{background-color:var(--el-checkbox-disabled-input-fill);border-color:var(--el-checkbox-disabled-border-color);cursor:not-allowed}.el-checkbox__input.is-disabled .el-checkbox__inner:after{cursor:not-allowed;border-color:var(--el-checkbox-disabled-icon-color);will-change:transform}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{background-color:var(--el-checkbox-disabled-checked-input-fill);border-color:var(--el-checkbox-disabled-checked-input-border-color)}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner:after{border-color:var(--el-checkbox-disabled-checked-icon-color)}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner{background-color:var(--el-checkbox-disabled-checked-input-fill);border-color:var(--el-checkbox-disabled-checked-input-border-color)}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner:before{background-color:var(--el-checkbox-disabled-checked-icon-color);border-color:var(--el-checkbox-disabled-checked-icon-color)}.el-checkbox__input.is-disabled+span.el-checkbox__label{color:var(--el-disabled-text-color);cursor:not-allowed}.el-checkbox__input.is-checked .el-checkbox__inner{background-color:var(--el-checkbox-checked-bg-color);border-color:var(--el-checkbox-checked-input-border-color)}.el-checkbox__input.is-checked .el-checkbox__inner:after{border-color:var(--el-checkbox-checked-icon-color);transform:translate(-45%,-60%)rotate(45deg)scaleY(1)}.el-checkbox__input.is-checked+.el-checkbox__label{color:var(--el-checkbox-checked-text-color)}.el-checkbox__input.is-focus:not(.is-checked) .el-checkbox__original:not(:focus-visible){border-color:var(--el-checkbox-input-border-color-hover)}.el-checkbox__input.is-indeterminate .el-checkbox__inner{background-color:var(--el-checkbox-checked-bg-color);border-color:var(--el-checkbox-checked-input-border-color)}.el-checkbox__input.is-indeterminate .el-checkbox__inner:before{content:"";background-color:var(--el-checkbox-checked-icon-color);height:2px;display:block;position:absolute;top:5px;left:0;right:0;transform:scale(.5)}.el-checkbox__input.is-indeterminate .el-checkbox__inner:after{display:none}.el-checkbox__inner{border:var(--el-checkbox-input-border);border-radius:var(--el-checkbox-border-radius);box-sizing:border-box;width:var(--el-checkbox-input-width);height:var(--el-checkbox-input-height);background-color:var(--el-checkbox-bg-color);z-index:var(--el-index-normal);transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46),outline .25s cubic-bezier(.71,-.46,.29,1.46);display:inline-block;position:relative}.el-checkbox__inner:hover{border-color:var(--el-checkbox-input-border-color-hover)}.el-checkbox__inner:after{box-sizing:content-box;content:"";transform-origin:50%;border:1px solid #0000;border-top:0;border-left:0;width:3px;height:7px;transition:transform .15s ease-in 50ms;position:absolute;top:50%;left:50%;transform:translate(-45%,-60%)rotate(45deg)scaleY(0)}.el-checkbox__original{opacity:0;z-index:-1;outline:none;width:0;height:0;margin:0;position:absolute}.el-checkbox__label{line-height:1;font-size:var(--el-checkbox-font-size);padding-left:8px;display:inline-block}.el-checkbox.el-checkbox--large{height:40px}.el-checkbox.el-checkbox--large .el-checkbox__label{font-size:14px}.el-checkbox.el-checkbox--large .el-checkbox__inner{width:14px;height:14px}.el-checkbox.el-checkbox--small{height:24px}.el-checkbox.el-checkbox--small .el-checkbox__label{font-size:12px}.el-checkbox.el-checkbox--small .el-checkbox__inner{width:12px;height:12px}.el-checkbox.el-checkbox--small .el-checkbox__input.is-indeterminate .el-checkbox__inner:before{top:4px}.el-checkbox.el-checkbox--small .el-checkbox__inner:after{width:2px;height:6px}.el-checkbox:last-of-type{margin-right:0}[class*=el-col-]{box-sizing:border-box}[class*=el-col-].is-guttered{min-height:1px;display:block}.el-col-0{flex:0 0;max-width:0%;display:none}.el-col-0.is-guttered{display:none}.el-col-offset-0{margin-left:0%}.el-col-pull-0{position:relative;right:0%}.el-col-push-0{position:relative;left:0%}.el-col-1{flex:0 0 4.16667%;max-width:4.16667%;display:block}.el-col-1.is-guttered{display:block}.el-col-offset-1{margin-left:4.16667%}.el-col-pull-1{position:relative;right:4.16667%}.el-col-push-1{position:relative;left:4.16667%}.el-col-2{flex:0 0 8.33333%;max-width:8.33333%;display:block}.el-col-2.is-guttered{display:block}.el-col-offset-2{margin-left:8.33333%}.el-col-pull-2{position:relative;right:8.33333%}.el-col-push-2{position:relative;left:8.33333%}.el-col-3{flex:0 0 12.5%;max-width:12.5%;display:block}.el-col-3.is-guttered{display:block}.el-col-offset-3{margin-left:12.5%}.el-col-pull-3{position:relative;right:12.5%}.el-col-push-3{position:relative;left:12.5%}.el-col-4{flex:0 0 16.6667%;max-width:16.6667%;display:block}.el-col-4.is-guttered{display:block}.el-col-offset-4{margin-left:16.6667%}.el-col-pull-4{position:relative;right:16.6667%}.el-col-push-4{position:relative;left:16.6667%}.el-col-5{flex:0 0 20.8333%;max-width:20.8333%;display:block}.el-col-5.is-guttered{display:block}.el-col-offset-5{margin-left:20.8333%}.el-col-pull-5{position:relative;right:20.8333%}.el-col-push-5{position:relative;left:20.8333%}.el-col-6{flex:0 0 25%;max-width:25%;display:block}.el-col-6.is-guttered{display:block}.el-col-offset-6{margin-left:25%}.el-col-pull-6{position:relative;right:25%}.el-col-push-6{position:relative;left:25%}.el-col-7{flex:0 0 29.1667%;max-width:29.1667%;display:block}.el-col-7.is-guttered{display:block}.el-col-offset-7{margin-left:29.1667%}.el-col-pull-7{position:relative;right:29.1667%}.el-col-push-7{position:relative;left:29.1667%}.el-col-8{flex:0 0 33.3333%;max-width:33.3333%;display:block}.el-col-8.is-guttered{display:block}.el-col-offset-8{margin-left:33.3333%}.el-col-pull-8{position:relative;right:33.3333%}.el-col-push-8{position:relative;left:33.3333%}.el-col-9{flex:0 0 37.5%;max-width:37.5%;display:block}.el-col-9.is-guttered{display:block}.el-col-offset-9{margin-left:37.5%}.el-col-pull-9{position:relative;right:37.5%}.el-col-push-9{position:relative;left:37.5%}.el-col-10{flex:0 0 41.6667%;max-width:41.6667%;display:block}.el-col-10.is-guttered{display:block}.el-col-offset-10{margin-left:41.6667%}.el-col-pull-10{position:relative;right:41.6667%}.el-col-push-10{position:relative;left:41.6667%}.el-col-11{flex:0 0 45.8333%;max-width:45.8333%;display:block}.el-col-11.is-guttered{display:block}.el-col-offset-11{margin-left:45.8333%}.el-col-pull-11{position:relative;right:45.8333%}.el-col-push-11{position:relative;left:45.8333%}.el-col-12{flex:0 0 50%;max-width:50%;display:block}.el-col-12.is-guttered{display:block}.el-col-offset-12{margin-left:50%}.el-col-pull-12{position:relative;right:50%}.el-col-push-12{position:relative;left:50%}.el-col-13{flex:0 0 54.1667%;max-width:54.1667%;display:block}.el-col-13.is-guttered{display:block}.el-col-offset-13{margin-left:54.1667%}.el-col-pull-13{position:relative;right:54.1667%}.el-col-push-13{position:relative;left:54.1667%}.el-col-14{flex:0 0 58.3333%;max-width:58.3333%;display:block}.el-col-14.is-guttered{display:block}.el-col-offset-14{margin-left:58.3333%}.el-col-pull-14{position:relative;right:58.3333%}.el-col-push-14{position:relative;left:58.3333%}.el-col-15{flex:0 0 62.5%;max-width:62.5%;display:block}.el-col-15.is-guttered{display:block}.el-col-offset-15{margin-left:62.5%}.el-col-pull-15{position:relative;right:62.5%}.el-col-push-15{position:relative;left:62.5%}.el-col-16{flex:0 0 66.6667%;max-width:66.6667%;display:block}.el-col-16.is-guttered{display:block}.el-col-offset-16{margin-left:66.6667%}.el-col-pull-16{position:relative;right:66.6667%}.el-col-push-16{position:relative;left:66.6667%}.el-col-17{flex:0 0 70.8333%;max-width:70.8333%;display:block}.el-col-17.is-guttered{display:block}.el-col-offset-17{margin-left:70.8333%}.el-col-pull-17{position:relative;right:70.8333%}.el-col-push-17{position:relative;left:70.8333%}.el-col-18{flex:0 0 75%;max-width:75%;display:block}.el-col-18.is-guttered{display:block}.el-col-offset-18{margin-left:75%}.el-col-pull-18{position:relative;right:75%}.el-col-push-18{position:relative;left:75%}.el-col-19{flex:0 0 79.1667%;max-width:79.1667%;display:block}.el-col-19.is-guttered{display:block}.el-col-offset-19{margin-left:79.1667%}.el-col-pull-19{position:relative;right:79.1667%}.el-col-push-19{position:relative;left:79.1667%}.el-col-20{flex:0 0 83.3333%;max-width:83.3333%;display:block}.el-col-20.is-guttered{display:block}.el-col-offset-20{margin-left:83.3333%}.el-col-pull-20{position:relative;right:83.3333%}.el-col-push-20{position:relative;left:83.3333%}.el-col-21{flex:0 0 87.5%;max-width:87.5%;display:block}.el-col-21.is-guttered{display:block}.el-col-offset-21{margin-left:87.5%}.el-col-pull-21{position:relative;right:87.5%}.el-col-push-21{position:relative;left:87.5%}.el-col-22{flex:0 0 91.6667%;max-width:91.6667%;display:block}.el-col-22.is-guttered{display:block}.el-col-offset-22{margin-left:91.6667%}.el-col-pull-22{position:relative;right:91.6667%}.el-col-push-22{position:relative;left:91.6667%}.el-col-23{flex:0 0 95.8333%;max-width:95.8333%;display:block}.el-col-23.is-guttered{display:block}.el-col-offset-23{margin-left:95.8333%}.el-col-pull-23{position:relative;right:95.8333%}.el-col-push-23{position:relative;left:95.8333%}.el-col-24{flex:0 0 100%;max-width:100%;display:block}.el-col-24.is-guttered{display:block}.el-col-offset-24{margin-left:100%}.el-col-pull-24{position:relative;right:100%}.el-col-push-24{position:relative;left:100%}@media only screen and (max-width:767px){.el-col-xs-0{flex:0 0;max-width:0%;display:none}.el-col-xs-0.is-guttered{display:none}.el-col-xs-offset-0{margin-left:0%}.el-col-xs-pull-0{position:relative;right:0%}.el-col-xs-push-0{position:relative;left:0%}.el-col-xs-1{flex:0 0 4.16667%;max-width:4.16667%;display:block}.el-col-xs-1.is-guttered{display:block}.el-col-xs-offset-1{margin-left:4.16667%}.el-col-xs-pull-1{position:relative;right:4.16667%}.el-col-xs-push-1{position:relative;left:4.16667%}.el-col-xs-2{flex:0 0 8.33333%;max-width:8.33333%;display:block}.el-col-xs-2.is-guttered{display:block}.el-col-xs-offset-2{margin-left:8.33333%}.el-col-xs-pull-2{position:relative;right:8.33333%}.el-col-xs-push-2{position:relative;left:8.33333%}.el-col-xs-3{flex:0 0 12.5%;max-width:12.5%;display:block}.el-col-xs-3.is-guttered{display:block}.el-col-xs-offset-3{margin-left:12.5%}.el-col-xs-pull-3{position:relative;right:12.5%}.el-col-xs-push-3{position:relative;left:12.5%}.el-col-xs-4{flex:0 0 16.6667%;max-width:16.6667%;display:block}.el-col-xs-4.is-guttered{display:block}.el-col-xs-offset-4{margin-left:16.6667%}.el-col-xs-pull-4{position:relative;right:16.6667%}.el-col-xs-push-4{position:relative;left:16.6667%}.el-col-xs-5{flex:0 0 20.8333%;max-width:20.8333%;display:block}.el-col-xs-5.is-guttered{display:block}.el-col-xs-offset-5{margin-left:20.8333%}.el-col-xs-pull-5{position:relative;right:20.8333%}.el-col-xs-push-5{position:relative;left:20.8333%}.el-col-xs-6{flex:0 0 25%;max-width:25%;display:block}.el-col-xs-6.is-guttered{display:block}.el-col-xs-offset-6{margin-left:25%}.el-col-xs-pull-6{position:relative;right:25%}.el-col-xs-push-6{position:relative;left:25%}.el-col-xs-7{flex:0 0 29.1667%;max-width:29.1667%;display:block}.el-col-xs-7.is-guttered{display:block}.el-col-xs-offset-7{margin-left:29.1667%}.el-col-xs-pull-7{position:relative;right:29.1667%}.el-col-xs-push-7{position:relative;left:29.1667%}.el-col-xs-8{flex:0 0 33.3333%;max-width:33.3333%;display:block}.el-col-xs-8.is-guttered{display:block}.el-col-xs-offset-8{margin-left:33.3333%}.el-col-xs-pull-8{position:relative;right:33.3333%}.el-col-xs-push-8{position:relative;left:33.3333%}.el-col-xs-9{flex:0 0 37.5%;max-width:37.5%;display:block}.el-col-xs-9.is-guttered{display:block}.el-col-xs-offset-9{margin-left:37.5%}.el-col-xs-pull-9{position:relative;right:37.5%}.el-col-xs-push-9{position:relative;left:37.5%}.el-col-xs-10{flex:0 0 41.6667%;max-width:41.6667%;display:block}.el-col-xs-10.is-guttered{display:block}.el-col-xs-offset-10{margin-left:41.6667%}.el-col-xs-pull-10{position:relative;right:41.6667%}.el-col-xs-push-10{position:relative;left:41.6667%}.el-col-xs-11{flex:0 0 45.8333%;max-width:45.8333%;display:block}.el-col-xs-11.is-guttered{display:block}.el-col-xs-offset-11{margin-left:45.8333%}.el-col-xs-pull-11{position:relative;right:45.8333%}.el-col-xs-push-11{position:relative;left:45.8333%}.el-col-xs-12{flex:0 0 50%;max-width:50%;display:block}.el-col-xs-12.is-guttered{display:block}.el-col-xs-offset-12{margin-left:50%}.el-col-xs-pull-12{position:relative;right:50%}.el-col-xs-push-12{position:relative;left:50%}.el-col-xs-13{flex:0 0 54.1667%;max-width:54.1667%;display:block}.el-col-xs-13.is-guttered{display:block}.el-col-xs-offset-13{margin-left:54.1667%}.el-col-xs-pull-13{position:relative;right:54.1667%}.el-col-xs-push-13{position:relative;left:54.1667%}.el-col-xs-14{flex:0 0 58.3333%;max-width:58.3333%;display:block}.el-col-xs-14.is-guttered{display:block}.el-col-xs-offset-14{margin-left:58.3333%}.el-col-xs-pull-14{position:relative;right:58.3333%}.el-col-xs-push-14{position:relative;left:58.3333%}.el-col-xs-15{flex:0 0 62.5%;max-width:62.5%;display:block}.el-col-xs-15.is-guttered{display:block}.el-col-xs-offset-15{margin-left:62.5%}.el-col-xs-pull-15{position:relative;right:62.5%}.el-col-xs-push-15{position:relative;left:62.5%}.el-col-xs-16{flex:0 0 66.6667%;max-width:66.6667%;display:block}.el-col-xs-16.is-guttered{display:block}.el-col-xs-offset-16{margin-left:66.6667%}.el-col-xs-pull-16{position:relative;right:66.6667%}.el-col-xs-push-16{position:relative;left:66.6667%}.el-col-xs-17{flex:0 0 70.8333%;max-width:70.8333%;display:block}.el-col-xs-17.is-guttered{display:block}.el-col-xs-offset-17{margin-left:70.8333%}.el-col-xs-pull-17{position:relative;right:70.8333%}.el-col-xs-push-17{position:relative;left:70.8333%}.el-col-xs-18{flex:0 0 75%;max-width:75%;display:block}.el-col-xs-18.is-guttered{display:block}.el-col-xs-offset-18{margin-left:75%}.el-col-xs-pull-18{position:relative;right:75%}.el-col-xs-push-18{position:relative;left:75%}.el-col-xs-19{flex:0 0 79.1667%;max-width:79.1667%;display:block}.el-col-xs-19.is-guttered{display:block}.el-col-xs-offset-19{margin-left:79.1667%}.el-col-xs-pull-19{position:relative;right:79.1667%}.el-col-xs-push-19{position:relative;left:79.1667%}.el-col-xs-20{flex:0 0 83.3333%;max-width:83.3333%;display:block}.el-col-xs-20.is-guttered{display:block}.el-col-xs-offset-20{margin-left:83.3333%}.el-col-xs-pull-20{position:relative;right:83.3333%}.el-col-xs-push-20{position:relative;left:83.3333%}.el-col-xs-21{flex:0 0 87.5%;max-width:87.5%;display:block}.el-col-xs-21.is-guttered{display:block}.el-col-xs-offset-21{margin-left:87.5%}.el-col-xs-pull-21{position:relative;right:87.5%}.el-col-xs-push-21{position:relative;left:87.5%}.el-col-xs-22{flex:0 0 91.6667%;max-width:91.6667%;display:block}.el-col-xs-22.is-guttered{display:block}.el-col-xs-offset-22{margin-left:91.6667%}.el-col-xs-pull-22{position:relative;right:91.6667%}.el-col-xs-push-22{position:relative;left:91.6667%}.el-col-xs-23{flex:0 0 95.8333%;max-width:95.8333%;display:block}.el-col-xs-23.is-guttered{display:block}.el-col-xs-offset-23{margin-left:95.8333%}.el-col-xs-pull-23{position:relative;right:95.8333%}.el-col-xs-push-23{position:relative;left:95.8333%}.el-col-xs-24{flex:0 0 100%;max-width:100%;display:block}.el-col-xs-24.is-guttered{display:block}.el-col-xs-offset-24{margin-left:100%}.el-col-xs-pull-24{position:relative;right:100%}.el-col-xs-push-24{position:relative;left:100%}}@media only screen and (min-width:768px){.el-col-sm-0{flex:0 0;max-width:0%;display:none}.el-col-sm-0.is-guttered{display:none}.el-col-sm-offset-0{margin-left:0%}.el-col-sm-pull-0{position:relative;right:0%}.el-col-sm-push-0{position:relative;left:0%}.el-col-sm-1{flex:0 0 4.16667%;max-width:4.16667%;display:block}.el-col-sm-1.is-guttered{display:block}.el-col-sm-offset-1{margin-left:4.16667%}.el-col-sm-pull-1{position:relative;right:4.16667%}.el-col-sm-push-1{position:relative;left:4.16667%}.el-col-sm-2{flex:0 0 8.33333%;max-width:8.33333%;display:block}.el-col-sm-2.is-guttered{display:block}.el-col-sm-offset-2{margin-left:8.33333%}.el-col-sm-pull-2{position:relative;right:8.33333%}.el-col-sm-push-2{position:relative;left:8.33333%}.el-col-sm-3{flex:0 0 12.5%;max-width:12.5%;display:block}.el-col-sm-3.is-guttered{display:block}.el-col-sm-offset-3{margin-left:12.5%}.el-col-sm-pull-3{position:relative;right:12.5%}.el-col-sm-push-3{position:relative;left:12.5%}.el-col-sm-4{flex:0 0 16.6667%;max-width:16.6667%;display:block}.el-col-sm-4.is-guttered{display:block}.el-col-sm-offset-4{margin-left:16.6667%}.el-col-sm-pull-4{position:relative;right:16.6667%}.el-col-sm-push-4{position:relative;left:16.6667%}.el-col-sm-5{flex:0 0 20.8333%;max-width:20.8333%;display:block}.el-col-sm-5.is-guttered{display:block}.el-col-sm-offset-5{margin-left:20.8333%}.el-col-sm-pull-5{position:relative;right:20.8333%}.el-col-sm-push-5{position:relative;left:20.8333%}.el-col-sm-6{flex:0 0 25%;max-width:25%;display:block}.el-col-sm-6.is-guttered{display:block}.el-col-sm-offset-6{margin-left:25%}.el-col-sm-pull-6{position:relative;right:25%}.el-col-sm-push-6{position:relative;left:25%}.el-col-sm-7{flex:0 0 29.1667%;max-width:29.1667%;display:block}.el-col-sm-7.is-guttered{display:block}.el-col-sm-offset-7{margin-left:29.1667%}.el-col-sm-pull-7{position:relative;right:29.1667%}.el-col-sm-push-7{position:relative;left:29.1667%}.el-col-sm-8{flex:0 0 33.3333%;max-width:33.3333%;display:block}.el-col-sm-8.is-guttered{display:block}.el-col-sm-offset-8{margin-left:33.3333%}.el-col-sm-pull-8{position:relative;right:33.3333%}.el-col-sm-push-8{position:relative;left:33.3333%}.el-col-sm-9{flex:0 0 37.5%;max-width:37.5%;display:block}.el-col-sm-9.is-guttered{display:block}.el-col-sm-offset-9{margin-left:37.5%}.el-col-sm-pull-9{position:relative;right:37.5%}.el-col-sm-push-9{position:relative;left:37.5%}.el-col-sm-10{flex:0 0 41.6667%;max-width:41.6667%;display:block}.el-col-sm-10.is-guttered{display:block}.el-col-sm-offset-10{margin-left:41.6667%}.el-col-sm-pull-10{position:relative;right:41.6667%}.el-col-sm-push-10{position:relative;left:41.6667%}.el-col-sm-11{flex:0 0 45.8333%;max-width:45.8333%;display:block}.el-col-sm-11.is-guttered{display:block}.el-col-sm-offset-11{margin-left:45.8333%}.el-col-sm-pull-11{position:relative;right:45.8333%}.el-col-sm-push-11{position:relative;left:45.8333%}.el-col-sm-12{flex:0 0 50%;max-width:50%;display:block}.el-col-sm-12.is-guttered{display:block}.el-col-sm-offset-12{margin-left:50%}.el-col-sm-pull-12{position:relative;right:50%}.el-col-sm-push-12{position:relative;left:50%}.el-col-sm-13{flex:0 0 54.1667%;max-width:54.1667%;display:block}.el-col-sm-13.is-guttered{display:block}.el-col-sm-offset-13{margin-left:54.1667%}.el-col-sm-pull-13{position:relative;right:54.1667%}.el-col-sm-push-13{position:relative;left:54.1667%}.el-col-sm-14{flex:0 0 58.3333%;max-width:58.3333%;display:block}.el-col-sm-14.is-guttered{display:block}.el-col-sm-offset-14{margin-left:58.3333%}.el-col-sm-pull-14{position:relative;right:58.3333%}.el-col-sm-push-14{position:relative;left:58.3333%}.el-col-sm-15{flex:0 0 62.5%;max-width:62.5%;display:block}.el-col-sm-15.is-guttered{display:block}.el-col-sm-offset-15{margin-left:62.5%}.el-col-sm-pull-15{position:relative;right:62.5%}.el-col-sm-push-15{position:relative;left:62.5%}.el-col-sm-16{flex:0 0 66.6667%;max-width:66.6667%;display:block}.el-col-sm-16.is-guttered{display:block}.el-col-sm-offset-16{margin-left:66.6667%}.el-col-sm-pull-16{position:relative;right:66.6667%}.el-col-sm-push-16{position:relative;left:66.6667%}.el-col-sm-17{flex:0 0 70.8333%;max-width:70.8333%;display:block}.el-col-sm-17.is-guttered{display:block}.el-col-sm-offset-17{margin-left:70.8333%}.el-col-sm-pull-17{position:relative;right:70.8333%}.el-col-sm-push-17{position:relative;left:70.8333%}.el-col-sm-18{flex:0 0 75%;max-width:75%;display:block}.el-col-sm-18.is-guttered{display:block}.el-col-sm-offset-18{margin-left:75%}.el-col-sm-pull-18{position:relative;right:75%}.el-col-sm-push-18{position:relative;left:75%}.el-col-sm-19{flex:0 0 79.1667%;max-width:79.1667%;display:block}.el-col-sm-19.is-guttered{display:block}.el-col-sm-offset-19{margin-left:79.1667%}.el-col-sm-pull-19{position:relative;right:79.1667%}.el-col-sm-push-19{position:relative;left:79.1667%}.el-col-sm-20{flex:0 0 83.3333%;max-width:83.3333%;display:block}.el-col-sm-20.is-guttered{display:block}.el-col-sm-offset-20{margin-left:83.3333%}.el-col-sm-pull-20{position:relative;right:83.3333%}.el-col-sm-push-20{position:relative;left:83.3333%}.el-col-sm-21{flex:0 0 87.5%;max-width:87.5%;display:block}.el-col-sm-21.is-guttered{display:block}.el-col-sm-offset-21{margin-left:87.5%}.el-col-sm-pull-21{position:relative;right:87.5%}.el-col-sm-push-21{position:relative;left:87.5%}.el-col-sm-22{flex:0 0 91.6667%;max-width:91.6667%;display:block}.el-col-sm-22.is-guttered{display:block}.el-col-sm-offset-22{margin-left:91.6667%}.el-col-sm-pull-22{position:relative;right:91.6667%}.el-col-sm-push-22{position:relative;left:91.6667%}.el-col-sm-23{flex:0 0 95.8333%;max-width:95.8333%;display:block}.el-col-sm-23.is-guttered{display:block}.el-col-sm-offset-23{margin-left:95.8333%}.el-col-sm-pull-23{position:relative;right:95.8333%}.el-col-sm-push-23{position:relative;left:95.8333%}.el-col-sm-24{flex:0 0 100%;max-width:100%;display:block}.el-col-sm-24.is-guttered{display:block}.el-col-sm-offset-24{margin-left:100%}.el-col-sm-pull-24{position:relative;right:100%}.el-col-sm-push-24{position:relative;left:100%}}@media only screen and (min-width:992px){.el-col-md-0{flex:0 0;max-width:0%;display:none}.el-col-md-0.is-guttered{display:none}.el-col-md-offset-0{margin-left:0%}.el-col-md-pull-0{position:relative;right:0%}.el-col-md-push-0{position:relative;left:0%}.el-col-md-1{flex:0 0 4.16667%;max-width:4.16667%;display:block}.el-col-md-1.is-guttered{display:block}.el-col-md-offset-1{margin-left:4.16667%}.el-col-md-pull-1{position:relative;right:4.16667%}.el-col-md-push-1{position:relative;left:4.16667%}.el-col-md-2{flex:0 0 8.33333%;max-width:8.33333%;display:block}.el-col-md-2.is-guttered{display:block}.el-col-md-offset-2{margin-left:8.33333%}.el-col-md-pull-2{position:relative;right:8.33333%}.el-col-md-push-2{position:relative;left:8.33333%}.el-col-md-3{flex:0 0 12.5%;max-width:12.5%;display:block}.el-col-md-3.is-guttered{display:block}.el-col-md-offset-3{margin-left:12.5%}.el-col-md-pull-3{position:relative;right:12.5%}.el-col-md-push-3{position:relative;left:12.5%}.el-col-md-4{flex:0 0 16.6667%;max-width:16.6667%;display:block}.el-col-md-4.is-guttered{display:block}.el-col-md-offset-4{margin-left:16.6667%}.el-col-md-pull-4{position:relative;right:16.6667%}.el-col-md-push-4{position:relative;left:16.6667%}.el-col-md-5{flex:0 0 20.8333%;max-width:20.8333%;display:block}.el-col-md-5.is-guttered{display:block}.el-col-md-offset-5{margin-left:20.8333%}.el-col-md-pull-5{position:relative;right:20.8333%}.el-col-md-push-5{position:relative;left:20.8333%}.el-col-md-6{flex:0 0 25%;max-width:25%;display:block}.el-col-md-6.is-guttered{display:block}.el-col-md-offset-6{margin-left:25%}.el-col-md-pull-6{position:relative;right:25%}.el-col-md-push-6{position:relative;left:25%}.el-col-md-7{flex:0 0 29.1667%;max-width:29.1667%;display:block}.el-col-md-7.is-guttered{display:block}.el-col-md-offset-7{margin-left:29.1667%}.el-col-md-pull-7{position:relative;right:29.1667%}.el-col-md-push-7{position:relative;left:29.1667%}.el-col-md-8{flex:0 0 33.3333%;max-width:33.3333%;display:block}.el-col-md-8.is-guttered{display:block}.el-col-md-offset-8{margin-left:33.3333%}.el-col-md-pull-8{position:relative;right:33.3333%}.el-col-md-push-8{position:relative;left:33.3333%}.el-col-md-9{flex:0 0 37.5%;max-width:37.5%;display:block}.el-col-md-9.is-guttered{display:block}.el-col-md-offset-9{margin-left:37.5%}.el-col-md-pull-9{position:relative;right:37.5%}.el-col-md-push-9{position:relative;left:37.5%}.el-col-md-10{flex:0 0 41.6667%;max-width:41.6667%;display:block}.el-col-md-10.is-guttered{display:block}.el-col-md-offset-10{margin-left:41.6667%}.el-col-md-pull-10{position:relative;right:41.6667%}.el-col-md-push-10{position:relative;left:41.6667%}.el-col-md-11{flex:0 0 45.8333%;max-width:45.8333%;display:block}.el-col-md-11.is-guttered{display:block}.el-col-md-offset-11{margin-left:45.8333%}.el-col-md-pull-11{position:relative;right:45.8333%}.el-col-md-push-11{position:relative;left:45.8333%}.el-col-md-12{flex:0 0 50%;max-width:50%;display:block}.el-col-md-12.is-guttered{display:block}.el-col-md-offset-12{margin-left:50%}.el-col-md-pull-12{position:relative;right:50%}.el-col-md-push-12{position:relative;left:50%}.el-col-md-13{flex:0 0 54.1667%;max-width:54.1667%;display:block}.el-col-md-13.is-guttered{display:block}.el-col-md-offset-13{margin-left:54.1667%}.el-col-md-pull-13{position:relative;right:54.1667%}.el-col-md-push-13{position:relative;left:54.1667%}.el-col-md-14{flex:0 0 58.3333%;max-width:58.3333%;display:block}.el-col-md-14.is-guttered{display:block}.el-col-md-offset-14{margin-left:58.3333%}.el-col-md-pull-14{position:relative;right:58.3333%}.el-col-md-push-14{position:relative;left:58.3333%}.el-col-md-15{flex:0 0 62.5%;max-width:62.5%;display:block}.el-col-md-15.is-guttered{display:block}.el-col-md-offset-15{margin-left:62.5%}.el-col-md-pull-15{position:relative;right:62.5%}.el-col-md-push-15{position:relative;left:62.5%}.el-col-md-16{flex:0 0 66.6667%;max-width:66.6667%;display:block}.el-col-md-16.is-guttered{display:block}.el-col-md-offset-16{margin-left:66.6667%}.el-col-md-pull-16{position:relative;right:66.6667%}.el-col-md-push-16{position:relative;left:66.6667%}.el-col-md-17{flex:0 0 70.8333%;max-width:70.8333%;display:block}.el-col-md-17.is-guttered{display:block}.el-col-md-offset-17{margin-left:70.8333%}.el-col-md-pull-17{position:relative;right:70.8333%}.el-col-md-push-17{position:relative;left:70.8333%}.el-col-md-18{flex:0 0 75%;max-width:75%;display:block}.el-col-md-18.is-guttered{display:block}.el-col-md-offset-18{margin-left:75%}.el-col-md-pull-18{position:relative;right:75%}.el-col-md-push-18{position:relative;left:75%}.el-col-md-19{flex:0 0 79.1667%;max-width:79.1667%;display:block}.el-col-md-19.is-guttered{display:block}.el-col-md-offset-19{margin-left:79.1667%}.el-col-md-pull-19{position:relative;right:79.1667%}.el-col-md-push-19{position:relative;left:79.1667%}.el-col-md-20{flex:0 0 83.3333%;max-width:83.3333%;display:block}.el-col-md-20.is-guttered{display:block}.el-col-md-offset-20{margin-left:83.3333%}.el-col-md-pull-20{position:relative;right:83.3333%}.el-col-md-push-20{position:relative;left:83.3333%}.el-col-md-21{flex:0 0 87.5%;max-width:87.5%;display:block}.el-col-md-21.is-guttered{display:block}.el-col-md-offset-21{margin-left:87.5%}.el-col-md-pull-21{position:relative;right:87.5%}.el-col-md-push-21{position:relative;left:87.5%}.el-col-md-22{flex:0 0 91.6667%;max-width:91.6667%;display:block}.el-col-md-22.is-guttered{display:block}.el-col-md-offset-22{margin-left:91.6667%}.el-col-md-pull-22{position:relative;right:91.6667%}.el-col-md-push-22{position:relative;left:91.6667%}.el-col-md-23{flex:0 0 95.8333%;max-width:95.8333%;display:block}.el-col-md-23.is-guttered{display:block}.el-col-md-offset-23{margin-left:95.8333%}.el-col-md-pull-23{position:relative;right:95.8333%}.el-col-md-push-23{position:relative;left:95.8333%}.el-col-md-24{flex:0 0 100%;max-width:100%;display:block}.el-col-md-24.is-guttered{display:block}.el-col-md-offset-24{margin-left:100%}.el-col-md-pull-24{position:relative;right:100%}.el-col-md-push-24{position:relative;left:100%}}@media only screen and (min-width:1200px){.el-col-lg-0{flex:0 0;max-width:0%;display:none}.el-col-lg-0.is-guttered{display:none}.el-col-lg-offset-0{margin-left:0%}.el-col-lg-pull-0{position:relative;right:0%}.el-col-lg-push-0{position:relative;left:0%}.el-col-lg-1{flex:0 0 4.16667%;max-width:4.16667%;display:block}.el-col-lg-1.is-guttered{display:block}.el-col-lg-offset-1{margin-left:4.16667%}.el-col-lg-pull-1{position:relative;right:4.16667%}.el-col-lg-push-1{position:relative;left:4.16667%}.el-col-lg-2{flex:0 0 8.33333%;max-width:8.33333%;display:block}.el-col-lg-2.is-guttered{display:block}.el-col-lg-offset-2{margin-left:8.33333%}.el-col-lg-pull-2{position:relative;right:8.33333%}.el-col-lg-push-2{position:relative;left:8.33333%}.el-col-lg-3{flex:0 0 12.5%;max-width:12.5%;display:block}.el-col-lg-3.is-guttered{display:block}.el-col-lg-offset-3{margin-left:12.5%}.el-col-lg-pull-3{position:relative;right:12.5%}.el-col-lg-push-3{position:relative;left:12.5%}.el-col-lg-4{flex:0 0 16.6667%;max-width:16.6667%;display:block}.el-col-lg-4.is-guttered{display:block}.el-col-lg-offset-4{margin-left:16.6667%}.el-col-lg-pull-4{position:relative;right:16.6667%}.el-col-lg-push-4{position:relative;left:16.6667%}.el-col-lg-5{flex:0 0 20.8333%;max-width:20.8333%;display:block}.el-col-lg-5.is-guttered{display:block}.el-col-lg-offset-5{margin-left:20.8333%}.el-col-lg-pull-5{position:relative;right:20.8333%}.el-col-lg-push-5{position:relative;left:20.8333%}.el-col-lg-6{flex:0 0 25%;max-width:25%;display:block}.el-col-lg-6.is-guttered{display:block}.el-col-lg-offset-6{margin-left:25%}.el-col-lg-pull-6{position:relative;right:25%}.el-col-lg-push-6{position:relative;left:25%}.el-col-lg-7{flex:0 0 29.1667%;max-width:29.1667%;display:block}.el-col-lg-7.is-guttered{display:block}.el-col-lg-offset-7{margin-left:29.1667%}.el-col-lg-pull-7{position:relative;right:29.1667%}.el-col-lg-push-7{position:relative;left:29.1667%}.el-col-lg-8{flex:0 0 33.3333%;max-width:33.3333%;display:block}.el-col-lg-8.is-guttered{display:block}.el-col-lg-offset-8{margin-left:33.3333%}.el-col-lg-pull-8{position:relative;right:33.3333%}.el-col-lg-push-8{position:relative;left:33.3333%}.el-col-lg-9{flex:0 0 37.5%;max-width:37.5%;display:block}.el-col-lg-9.is-guttered{display:block}.el-col-lg-offset-9{margin-left:37.5%}.el-col-lg-pull-9{position:relative;right:37.5%}.el-col-lg-push-9{position:relative;left:37.5%}.el-col-lg-10{flex:0 0 41.6667%;max-width:41.6667%;display:block}.el-col-lg-10.is-guttered{display:block}.el-col-lg-offset-10{margin-left:41.6667%}.el-col-lg-pull-10{position:relative;right:41.6667%}.el-col-lg-push-10{position:relative;left:41.6667%}.el-col-lg-11{flex:0 0 45.8333%;max-width:45.8333%;display:block}.el-col-lg-11.is-guttered{display:block}.el-col-lg-offset-11{margin-left:45.8333%}.el-col-lg-pull-11{position:relative;right:45.8333%}.el-col-lg-push-11{position:relative;left:45.8333%}.el-col-lg-12{flex:0 0 50%;max-width:50%;display:block}.el-col-lg-12.is-guttered{display:block}.el-col-lg-offset-12{margin-left:50%}.el-col-lg-pull-12{position:relative;right:50%}.el-col-lg-push-12{position:relative;left:50%}.el-col-lg-13{flex:0 0 54.1667%;max-width:54.1667%;display:block}.el-col-lg-13.is-guttered{display:block}.el-col-lg-offset-13{margin-left:54.1667%}.el-col-lg-pull-13{position:relative;right:54.1667%}.el-col-lg-push-13{position:relative;left:54.1667%}.el-col-lg-14{flex:0 0 58.3333%;max-width:58.3333%;display:block}.el-col-lg-14.is-guttered{display:block}.el-col-lg-offset-14{margin-left:58.3333%}.el-col-lg-pull-14{position:relative;right:58.3333%}.el-col-lg-push-14{position:relative;left:58.3333%}.el-col-lg-15{flex:0 0 62.5%;max-width:62.5%;display:block}.el-col-lg-15.is-guttered{display:block}.el-col-lg-offset-15{margin-left:62.5%}.el-col-lg-pull-15{position:relative;right:62.5%}.el-col-lg-push-15{position:relative;left:62.5%}.el-col-lg-16{flex:0 0 66.6667%;max-width:66.6667%;display:block}.el-col-lg-16.is-guttered{display:block}.el-col-lg-offset-16{margin-left:66.6667%}.el-col-lg-pull-16{position:relative;right:66.6667%}.el-col-lg-push-16{position:relative;left:66.6667%}.el-col-lg-17{flex:0 0 70.8333%;max-width:70.8333%;display:block}.el-col-lg-17.is-guttered{display:block}.el-col-lg-offset-17{margin-left:70.8333%}.el-col-lg-pull-17{position:relative;right:70.8333%}.el-col-lg-push-17{position:relative;left:70.8333%}.el-col-lg-18{flex:0 0 75%;max-width:75%;display:block}.el-col-lg-18.is-guttered{display:block}.el-col-lg-offset-18{margin-left:75%}.el-col-lg-pull-18{position:relative;right:75%}.el-col-lg-push-18{position:relative;left:75%}.el-col-lg-19{flex:0 0 79.1667%;max-width:79.1667%;display:block}.el-col-lg-19.is-guttered{display:block}.el-col-lg-offset-19{margin-left:79.1667%}.el-col-lg-pull-19{position:relative;right:79.1667%}.el-col-lg-push-19{position:relative;left:79.1667%}.el-col-lg-20{flex:0 0 83.3333%;max-width:83.3333%;display:block}.el-col-lg-20.is-guttered{display:block}.el-col-lg-offset-20{margin-left:83.3333%}.el-col-lg-pull-20{position:relative;right:83.3333%}.el-col-lg-push-20{position:relative;left:83.3333%}.el-col-lg-21{flex:0 0 87.5%;max-width:87.5%;display:block}.el-col-lg-21.is-guttered{display:block}.el-col-lg-offset-21{margin-left:87.5%}.el-col-lg-pull-21{position:relative;right:87.5%}.el-col-lg-push-21{position:relative;left:87.5%}.el-col-lg-22{flex:0 0 91.6667%;max-width:91.6667%;display:block}.el-col-lg-22.is-guttered{display:block}.el-col-lg-offset-22{margin-left:91.6667%}.el-col-lg-pull-22{position:relative;right:91.6667%}.el-col-lg-push-22{position:relative;left:91.6667%}.el-col-lg-23{flex:0 0 95.8333%;max-width:95.8333%;display:block}.el-col-lg-23.is-guttered{display:block}.el-col-lg-offset-23{margin-left:95.8333%}.el-col-lg-pull-23{position:relative;right:95.8333%}.el-col-lg-push-23{position:relative;left:95.8333%}.el-col-lg-24{flex:0 0 100%;max-width:100%;display:block}.el-col-lg-24.is-guttered{display:block}.el-col-lg-offset-24{margin-left:100%}.el-col-lg-pull-24{position:relative;right:100%}.el-col-lg-push-24{position:relative;left:100%}}@media only screen and (min-width:1920px){.el-col-xl-0{flex:0 0;max-width:0%;display:none}.el-col-xl-0.is-guttered{display:none}.el-col-xl-offset-0{margin-left:0%}.el-col-xl-pull-0{position:relative;right:0%}.el-col-xl-push-0{position:relative;left:0%}.el-col-xl-1{flex:0 0 4.16667%;max-width:4.16667%;display:block}.el-col-xl-1.is-guttered{display:block}.el-col-xl-offset-1{margin-left:4.16667%}.el-col-xl-pull-1{position:relative;right:4.16667%}.el-col-xl-push-1{position:relative;left:4.16667%}.el-col-xl-2{flex:0 0 8.33333%;max-width:8.33333%;display:block}.el-col-xl-2.is-guttered{display:block}.el-col-xl-offset-2{margin-left:8.33333%}.el-col-xl-pull-2{position:relative;right:8.33333%}.el-col-xl-push-2{position:relative;left:8.33333%}.el-col-xl-3{flex:0 0 12.5%;max-width:12.5%;display:block}.el-col-xl-3.is-guttered{display:block}.el-col-xl-offset-3{margin-left:12.5%}.el-col-xl-pull-3{position:relative;right:12.5%}.el-col-xl-push-3{position:relative;left:12.5%}.el-col-xl-4{flex:0 0 16.6667%;max-width:16.6667%;display:block}.el-col-xl-4.is-guttered{display:block}.el-col-xl-offset-4{margin-left:16.6667%}.el-col-xl-pull-4{position:relative;right:16.6667%}.el-col-xl-push-4{position:relative;left:16.6667%}.el-col-xl-5{flex:0 0 20.8333%;max-width:20.8333%;display:block}.el-col-xl-5.is-guttered{display:block}.el-col-xl-offset-5{margin-left:20.8333%}.el-col-xl-pull-5{position:relative;right:20.8333%}.el-col-xl-push-5{position:relative;left:20.8333%}.el-col-xl-6{flex:0 0 25%;max-width:25%;display:block}.el-col-xl-6.is-guttered{display:block}.el-col-xl-offset-6{margin-left:25%}.el-col-xl-pull-6{position:relative;right:25%}.el-col-xl-push-6{position:relative;left:25%}.el-col-xl-7{flex:0 0 29.1667%;max-width:29.1667%;display:block}.el-col-xl-7.is-guttered{display:block}.el-col-xl-offset-7{margin-left:29.1667%}.el-col-xl-pull-7{position:relative;right:29.1667%}.el-col-xl-push-7{position:relative;left:29.1667%}.el-col-xl-8{flex:0 0 33.3333%;max-width:33.3333%;display:block}.el-col-xl-8.is-guttered{display:block}.el-col-xl-offset-8{margin-left:33.3333%}.el-col-xl-pull-8{position:relative;right:33.3333%}.el-col-xl-push-8{position:relative;left:33.3333%}.el-col-xl-9{flex:0 0 37.5%;max-width:37.5%;display:block}.el-col-xl-9.is-guttered{display:block}.el-col-xl-offset-9{margin-left:37.5%}.el-col-xl-pull-9{position:relative;right:37.5%}.el-col-xl-push-9{position:relative;left:37.5%}.el-col-xl-10{flex:0 0 41.6667%;max-width:41.6667%;display:block}.el-col-xl-10.is-guttered{display:block}.el-col-xl-offset-10{margin-left:41.6667%}.el-col-xl-pull-10{position:relative;right:41.6667%}.el-col-xl-push-10{position:relative;left:41.6667%}.el-col-xl-11{flex:0 0 45.8333%;max-width:45.8333%;display:block}.el-col-xl-11.is-guttered{display:block}.el-col-xl-offset-11{margin-left:45.8333%}.el-col-xl-pull-11{position:relative;right:45.8333%}.el-col-xl-push-11{position:relative;left:45.8333%}.el-col-xl-12{flex:0 0 50%;max-width:50%;display:block}.el-col-xl-12.is-guttered{display:block}.el-col-xl-offset-12{margin-left:50%}.el-col-xl-pull-12{position:relative;right:50%}.el-col-xl-push-12{position:relative;left:50%}.el-col-xl-13{flex:0 0 54.1667%;max-width:54.1667%;display:block}.el-col-xl-13.is-guttered{display:block}.el-col-xl-offset-13{margin-left:54.1667%}.el-col-xl-pull-13{position:relative;right:54.1667%}.el-col-xl-push-13{position:relative;left:54.1667%}.el-col-xl-14{flex:0 0 58.3333%;max-width:58.3333%;display:block}.el-col-xl-14.is-guttered{display:block}.el-col-xl-offset-14{margin-left:58.3333%}.el-col-xl-pull-14{position:relative;right:58.3333%}.el-col-xl-push-14{position:relative;left:58.3333%}.el-col-xl-15{flex:0 0 62.5%;max-width:62.5%;display:block}.el-col-xl-15.is-guttered{display:block}.el-col-xl-offset-15{margin-left:62.5%}.el-col-xl-pull-15{position:relative;right:62.5%}.el-col-xl-push-15{position:relative;left:62.5%}.el-col-xl-16{flex:0 0 66.6667%;max-width:66.6667%;display:block}.el-col-xl-16.is-guttered{display:block}.el-col-xl-offset-16{margin-left:66.6667%}.el-col-xl-pull-16{position:relative;right:66.6667%}.el-col-xl-push-16{position:relative;left:66.6667%}.el-col-xl-17{flex:0 0 70.8333%;max-width:70.8333%;display:block}.el-col-xl-17.is-guttered{display:block}.el-col-xl-offset-17{margin-left:70.8333%}.el-col-xl-pull-17{position:relative;right:70.8333%}.el-col-xl-push-17{position:relative;left:70.8333%}.el-col-xl-18{flex:0 0 75%;max-width:75%;display:block}.el-col-xl-18.is-guttered{display:block}.el-col-xl-offset-18{margin-left:75%}.el-col-xl-pull-18{position:relative;right:75%}.el-col-xl-push-18{position:relative;left:75%}.el-col-xl-19{flex:0 0 79.1667%;max-width:79.1667%;display:block}.el-col-xl-19.is-guttered{display:block}.el-col-xl-offset-19{margin-left:79.1667%}.el-col-xl-pull-19{position:relative;right:79.1667%}.el-col-xl-push-19{position:relative;left:79.1667%}.el-col-xl-20{flex:0 0 83.3333%;max-width:83.3333%;display:block}.el-col-xl-20.is-guttered{display:block}.el-col-xl-offset-20{margin-left:83.3333%}.el-col-xl-pull-20{position:relative;right:83.3333%}.el-col-xl-push-20{position:relative;left:83.3333%}.el-col-xl-21{flex:0 0 87.5%;max-width:87.5%;display:block}.el-col-xl-21.is-guttered{display:block}.el-col-xl-offset-21{margin-left:87.5%}.el-col-xl-pull-21{position:relative;right:87.5%}.el-col-xl-push-21{position:relative;left:87.5%}.el-col-xl-22{flex:0 0 91.6667%;max-width:91.6667%;display:block}.el-col-xl-22.is-guttered{display:block}.el-col-xl-offset-22{margin-left:91.6667%}.el-col-xl-pull-22{position:relative;right:91.6667%}.el-col-xl-push-22{position:relative;left:91.6667%}.el-col-xl-23{flex:0 0 95.8333%;max-width:95.8333%;display:block}.el-col-xl-23.is-guttered{display:block}.el-col-xl-offset-23{margin-left:95.8333%}.el-col-xl-pull-23{position:relative;right:95.8333%}.el-col-xl-push-23{position:relative;left:95.8333%}.el-col-xl-24{flex:0 0 100%;max-width:100%;display:block}.el-col-xl-24.is-guttered{display:block}.el-col-xl-offset-24{margin-left:100%}.el-col-xl-pull-24{position:relative;right:100%}.el-col-xl-push-24{position:relative;left:100%}}.el-collapse-item.is-disabled .el-collapse-item__header{color:var(--el-text-color-disabled);cursor:not-allowed}.el-collapse-item__header{width:100%;min-height:var(--el-collapse-header-height);line-height:var(--el-collapse-header-height);background-color:var(--el-collapse-header-bg-color);color:var(--el-collapse-header-text-color);cursor:pointer;border:none;border-bottom:1px solid var(--el-collapse-border-color);font-size:var(--el-collapse-header-font-size);transition:border-bottom-color var(--el-transition-duration);box-sizing:border-box;outline:none;align-items:center;padding:0;font-weight:500;display:flex}.el-collapse-item__arrow{transition:transform var(--el-transition-duration);font-weight:300}.el-collapse-item__arrow.is-active{transform:rotate(90deg)}.el-collapse-item__title{text-align:left;flex:auto}.el-collapse-item__header.focusing:focus:not(:hover){color:var(--el-color-primary)}.el-collapse-item__header.is-active{border-bottom-color:#0000}.el-collapse-item__wrap{will-change:height;background-color:var(--el-collapse-content-bg-color);box-sizing:border-box;border-bottom:1px solid var(--el-collapse-border-color);overflow:hidden}.el-collapse-item__content{font-size:var(--el-collapse-content-font-size);color:var(--el-collapse-content-text-color);padding-bottom:25px;line-height:1.76923}.el-collapse-item:last-child{margin-bottom:-1px}.el-collapse{--el-collapse-border-color:var(--el-border-color-lighter);--el-collapse-header-height:48px;--el-collapse-header-bg-color:var(--el-fill-color-blank);--el-collapse-header-text-color:var(--el-text-color-primary);--el-collapse-header-font-size:13px;--el-collapse-content-bg-color:var(--el-fill-color-blank);--el-collapse-content-font-size:13px;--el-collapse-content-text-color:var(--el-text-color-primary);border-top:1px solid var(--el-collapse-border-color);border-bottom:1px solid var(--el-collapse-border-color)}.el-collapse-icon-position-left .el-collapse-item__header{gap:8px}.el-collapse-icon-position-left .el-collapse-item__title{order:1}.el-collapse-icon-position-right .el-collapse-item__header{padding-right:8px}.el-color-picker-panel{--el-colorpicker-bg-color:var(--el-bg-color-overlay);--el-fill-color-blank:var(--el-colorpicker-bg-color);box-sizing:content-box;background:var(--el-colorpicker-bg-color);width:300px;padding:12px}.el-color-picker-panel.is-border{border:solid 1px var(--el-border-color-lighter);border-radius:4px}.el-color-picker-panel__wrapper{margin-bottom:6px}.el-color-picker-panel__footer{text-align:right;justify-content:space-between;margin-top:12px;display:flex}.el-color-picker-panel__footer .el-input{color:#000;width:160px;font-size:12px;line-height:26px}.el-color-picker-panel.is-disabled .el-color-svpanel,.el-color-picker-panel.is-disabled .el-color-hue-slider{cursor:not-allowed;opacity:.3}.el-color-picker-panel.is-disabled .el-color-hue-slider__thumb{cursor:not-allowed}.el-color-picker-panel.is-disabled .el-color-alpha-slider,.el-color-picker-panel.is-disabled .el-color-predefine .el-color-predefine__color-selector{cursor:not-allowed;opacity:.3}.el-color-predefine{width:280px;margin-top:8px;font-size:12px;display:flex}.el-color-predefine__colors{flex-wrap:wrap;flex:1;gap:8px;display:flex}.el-color-predefine__color-selector{border-radius:var(--el-border-radius-base);cursor:pointer;border:none;outline:none;width:20px;height:20px;padding:0;overflow:hidden}.el-color-predefine__color-selector.selected{box-shadow:0 0 3px 2px var(--el-color-primary)}.el-color-predefine__color-selector:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-color-predefine__color-selector>div{height:100%;display:flex}.el-color-predefine__color-selector.is-alpha{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-hue-slider{box-sizing:border-box;float:right;background-color:red;width:280px;height:12px;padding:0 2px;position:relative}.el-color-hue-slider__bar{background:linear-gradient(90deg,red,#ff0 17%,#0f0 33%,#0ff,#00f 67%,#f0f 83%,red);height:100%;position:relative}.el-color-hue-slider__thumb{cursor:pointer;box-sizing:border-box;border:1px solid var(--el-border-color-lighter);z-index:1;background:#fff;border-radius:1px;width:4px;height:100%;position:absolute;top:0;left:0;box-shadow:0 0 2px #0009}.el-color-hue-slider__thumb:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:1px}.el-color-hue-slider.is-vertical{width:12px;height:180px;padding:2px 0}.el-color-hue-slider.is-vertical .el-color-hue-slider__bar{background:linear-gradient(red,#ff0 17%,#0f0 33%,#0ff,#00f 67%,#f0f 83%,red)}.el-color-hue-slider.is-vertical .el-color-hue-slider__thumb{width:100%;height:4px;top:0;left:0}.el-color-svpanel{background-image:linear-gradient(#0000,#000),linear-gradient(90deg,#fff,#fff0);width:280px;height:180px;position:relative}.el-color-svpanel__cursor{cursor:pointer;border-radius:50%;width:4px;height:4px;position:absolute;transform:translate(-2px,-2px);box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px #0000004d,0 0 1px 2px #0006}.el-color-svpanel__cursor:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-color-alpha-slider{box-sizing:border-box;background-image:linear-gradient(45deg,var(--el-color-picker-alpha-bg-a) 25%,var(--el-color-picker-alpha-bg-b) 25%),linear-gradient(135deg,var(--el-color-picker-alpha-bg-a) 25%,var(--el-color-picker-alpha-bg-b) 25%),linear-gradient(45deg,var(--el-color-picker-alpha-bg-b) 75%,var(--el-color-picker-alpha-bg-a) 75%),linear-gradient(135deg,var(--el-color-picker-alpha-bg-b) 75%,var(--el-color-picker-alpha-bg-a) 75%);background-position:0 0,6px 0,6px -6px,0 6px;background-size:12px 12px;width:280px;height:12px;position:relative}.el-color-alpha-slider.is-disabled .el-color-alpha-slider__thumb{cursor:not-allowed}.el-color-alpha-slider__bar{background:linear-gradient(to right,#fff0 0%,var(--el-bg-color) 100%);height:100%;position:relative}.el-color-alpha-slider__thumb{cursor:pointer;box-sizing:border-box;border:1px solid var(--el-border-color-lighter);z-index:1;background:#fff;border-radius:1px;width:4px;height:100%;position:absolute;top:0;left:0;box-shadow:0 0 2px #0009}.el-color-alpha-slider__thumb:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:1px}.el-color-alpha-slider.is-vertical{width:20px;height:180px}.el-color-alpha-slider.is-vertical .el-color-alpha-slider__bar{background:linear-gradient(#fff0,#fff)}.el-color-alpha-slider.is-vertical .el-color-alpha-slider__thumb{width:100%;height:4px;top:0;left:0}.el-color-picker-panel{--el-color-picker-alpha-bg-a:#ccc;--el-color-picker-alpha-bg-b:transparent}.dark .el-color-picker-panel{--el-color-picker-alpha-bg-a:#333}.el-color-picker{outline:none;width:32px;height:32px;line-height:normal;display:inline-block;position:relative}.el-color-picker:hover:not(:-webkit-any(.is-disabled,.is-focused)) .el-color-picker__trigger{border-color:var(--el-border-color-hover)}.el-color-picker:hover:not(:is(.is-disabled,.is-focused)) .el-color-picker__trigger{border-color:var(--el-border-color-hover)}.el-color-picker:focus-visible:not(.is-disabled) .el-color-picker__trigger{outline:2px solid var(--el-color-primary);outline-offset:1px}.el-color-picker.is-focused .el-color-picker__trigger{border-color:var(--el-color-primary)}.el-color-picker.is-disabled .el-color-picker__trigger{cursor:not-allowed;background-color:var(--el-fill-color-light)}.el-color-picker.is-disabled .el-color-picker__color{opacity:.3}.el-color-picker--large{width:40px;height:40px}.el-color-picker--small{width:24px;height:24px}.el-color-picker--small .el-color-picker__icon,.el-color-picker--small .el-color-picker__empty{transform:scale(.8)}.el-color-picker__trigger{box-sizing:border-box;border:1px solid var(--el-border-color);cursor:pointer;border-radius:4px;justify-content:center;align-items:center;width:100%;height:100%;padding:4px;font-size:0;display:inline-flex;position:relative}.el-color-picker__color{box-sizing:border-box;border:1px solid var(--el-text-color-secondary);border-radius:var(--el-border-radius-small);text-align:center;width:100%;height:100%;display:block;position:relative}.el-color-picker__color.is-alpha{background-image:linear-gradient(45deg,var(--el-color-picker-alpha-bg-a) 25%,var(--el-color-picker-alpha-bg-b) 25%),linear-gradient(135deg,var(--el-color-picker-alpha-bg-a) 25%,var(--el-color-picker-alpha-bg-b) 25%),linear-gradient(45deg,var(--el-color-picker-alpha-bg-b) 75%,var(--el-color-picker-alpha-bg-a) 75%),linear-gradient(135deg,var(--el-color-picker-alpha-bg-b) 75%,var(--el-color-picker-alpha-bg-a) 75%);background-position:0 0,6px 0,6px -6px,0 6px;background-size:12px 12px}.el-color-picker__color-inner{justify-content:center;align-items:center;width:100%;height:100%;display:inline-flex}.el-color-picker .el-color-picker__empty{color:var(--el-text-color-secondary);font-size:12px}.el-color-picker .el-color-picker__icon{color:#fff;justify-content:center;align-items:center;font-size:12px;display:inline-flex}.el-color-picker__panel{border-radius:var(--el-border-radius-base);box-shadow:var(--el-box-shadow-light);background-color:#fff}.el-color-picker__panel.el-popper{border:1px solid var(--el-border-color-lighter)}.el-color-picker,.el-color-picker__panel{--el-color-picker-alpha-bg-a:#ccc;--el-color-picker-alpha-bg-b:transparent}.dark .el-color-picker,.dark .el-color-picker__panel{--el-color-picker-alpha-bg-a:#333}.el-container{box-sizing:border-box;flex-direction:row;flex:auto;min-width:0;display:flex}.el-container.is-vertical{flex-direction:column}.el-date-table{-webkit-user-select:none;user-select:none;font-size:12px}.el-date-table.is-week-mode .el-date-table__row:hover .el-date-table-cell{background-color:var(--el-datepicker-inrange-bg-color)}.el-date-table.is-week-mode .el-date-table__row:hover td.available:hover{color:var(--el-datepicker-text-color)}.el-date-table.is-week-mode .el-date-table__row:hover td:first-child .el-date-table-cell{border-top-left-radius:15px;border-bottom-left-radius:15px;margin-left:5px}.el-date-table.is-week-mode .el-date-table__row:hover td:last-child .el-date-table-cell{border-top-right-radius:15px;border-bottom-right-radius:15px;margin-right:5px}.el-date-table.is-week-mode .el-date-table__row.current .el-date-table-cell{background-color:var(--el-datepicker-inrange-bg-color)}.el-date-table td{box-sizing:border-box;text-align:center;cursor:pointer;width:32px;height:30px;padding:4px 0;position:relative}.el-date-table td .el-date-table-cell{box-sizing:border-box;height:30px;padding:3px 0}.el-date-table td .el-date-table-cell .el-date-table-cell__text{border-radius:50%;width:24px;height:24px;margin:0 auto;line-height:24px;display:block;position:absolute;left:50%;transform:translate(-50%)}.el-date-table td.next-month,.el-date-table td.prev-month{color:var(--el-datepicker-off-text-color)}.el-date-table td.today{position:relative}.el-date-table td.today .el-date-table-cell__text{color:var(--el-color-primary);font-weight:700}.el-date-table td.today.start-date .el-date-table-cell__text,.el-date-table td.today.end-date .el-date-table-cell__text{color:#fff}.el-date-table td.available:hover{color:var(--el-datepicker-hover-text-color)}.el-date-table td.in-range .el-date-table-cell{background-color:var(--el-datepicker-inrange-bg-color)}.el-date-table td.in-range .el-date-table-cell:hover{background-color:var(--el-datepicker-inrange-hover-bg-color)}.el-date-table td.current:not(.disabled) .el-date-table-cell__text{color:#fff;background-color:var(--el-datepicker-active-color)}.el-date-table td.current:not(.disabled):focus-visible .el-date-table-cell__text{outline:2px solid var(--el-datepicker-active-color);outline-offset:1px}.el-date-table td.start-date .el-date-table-cell,.el-date-table td.end-date .el-date-table-cell{color:#fff}.el-date-table td.start-date .el-date-table-cell__text,.el-date-table td.end-date .el-date-table-cell__text{background-color:var(--el-datepicker-active-color)}.el-date-table td.start-date .el-date-table-cell{border-top-left-radius:15px;border-bottom-left-radius:15px;margin-left:5px}.el-date-table td.end-date .el-date-table-cell{border-top-right-radius:15px;border-bottom-right-radius:15px;margin-right:5px}.el-date-table td.disabled .el-date-table-cell{background-color:var(--el-fill-color-light);opacity:1;cursor:not-allowed;color:var(--el-text-color-placeholder)}.el-date-table td.selected .el-date-table-cell{border-radius:15px;margin-left:5px;margin-right:5px}.el-date-table td.selected .el-date-table-cell__text{background-color:var(--el-datepicker-active-color);color:#fff;border-radius:15px}.el-date-table td.week{color:var(--el-datepicker-off-text-color);cursor:default;font-size:80%}.el-date-table td:focus{outline:none}.el-date-table th{color:var(--el-datepicker-header-text-color);border-bottom:solid 1px var(--el-border-color-lighter);padding:5px;font-weight:400}.el-date-table th.el-date-table__week-header{width:24px;padding:0}.el-month-table{border-collapse:collapse;margin:-1px;font-size:12px}.el-month-table td{text-align:center;cursor:pointer;width:68px;padding:8px 0;position:relative}.el-month-table td .el-date-table-cell{box-sizing:border-box;height:48px;padding:6px 0}.el-month-table td.today .el-date-table-cell__text{color:var(--el-color-primary);font-weight:700}.el-month-table td.today.start-date .el-date-table-cell__text,.el-month-table td.today.end-date .el-date-table-cell__text{color:#fff}.el-month-table td.disabled .el-date-table-cell__text{background-color:var(--el-fill-color-light);cursor:not-allowed;color:var(--el-text-color-placeholder)}.el-month-table td.disabled .el-date-table-cell__text:hover{color:var(--el-text-color-placeholder)}.el-month-table td .el-date-table-cell__text{width:54px;height:36px;color:var(--el-datepicker-text-color);border-radius:18px;margin:0 auto;line-height:36px;display:block;position:absolute;left:50%;transform:translate(-50%)}.el-month-table td .el-date-table-cell__text:hover{color:var(--el-datepicker-hover-text-color)}.el-month-table td.in-range .el-date-table-cell{background-color:var(--el-datepicker-inrange-bg-color)}.el-month-table td.in-range .el-date-table-cell:hover{background-color:var(--el-datepicker-inrange-hover-bg-color)}.el-month-table td.start-date .el-date-table-cell,.el-month-table td.end-date .el-date-table-cell{color:#fff}.el-month-table td.start-date .el-date-table-cell__text,.el-month-table td.end-date .el-date-table-cell__text{color:#fff;background-color:var(--el-datepicker-active-color)}.el-month-table td.start-date .el-date-table-cell{border-top-left-radius:24px;border-bottom-left-radius:24px;margin-left:3px}.el-month-table td.end-date .el-date-table-cell{border-top-right-radius:24px;border-bottom-right-radius:24px;margin-right:3px}.el-month-table td.current:not(.disabled) .el-date-table-cell{border-radius:24px;margin-left:3px;margin-right:3px}.el-month-table td.current:not(.disabled) .el-date-table-cell__text{color:#fff;background-color:var(--el-datepicker-active-color)}.el-month-table td:focus-visible{outline:none}.el-month-table td:focus-visible .el-date-table-cell__text{outline:2px solid var(--el-datepicker-active-color);outline-offset:1px}.el-year-table{border-collapse:collapse;margin:-1px;font-size:12px}.el-year-table .el-icon{color:var(--el-datepicker-icon-color)}.el-year-table td{text-align:center;cursor:pointer;width:68px;padding:8px 0;position:relative}.el-year-table td .el-date-table-cell{box-sizing:border-box;height:48px;padding:6px 0}.el-year-table td.today .el-date-table-cell__text{color:var(--el-color-primary);font-weight:700}.el-year-table td.today.start-date .el-date-table-cell__text,.el-year-table td.today.end-date .el-date-table-cell__text{color:#fff}.el-year-table td.disabled .el-date-table-cell__text{background-color:var(--el-fill-color-light);cursor:not-allowed;color:var(--el-text-color-placeholder)}.el-year-table td.disabled .el-date-table-cell__text:hover{color:var(--el-text-color-placeholder)}.el-year-table td .el-date-table-cell__text{width:60px;height:36px;color:var(--el-datepicker-text-color);border-radius:18px;margin:0 auto;line-height:36px;display:block;position:absolute;left:50%;transform:translate(-50%)}.el-year-table td .el-date-table-cell__text:hover{color:var(--el-datepicker-hover-text-color)}.el-year-table td.in-range .el-date-table-cell{background-color:var(--el-datepicker-inrange-bg-color)}.el-year-table td.in-range .el-date-table-cell:hover{background-color:var(--el-datepicker-inrange-hover-bg-color)}.el-year-table td.start-date .el-date-table-cell,.el-year-table td.end-date .el-date-table-cell{color:#fff}.el-year-table td.start-date .el-date-table-cell__text,.el-year-table td.end-date .el-date-table-cell__text{color:#fff;background-color:var(--el-datepicker-active-color)}.el-year-table td.start-date .el-date-table-cell{border-top-left-radius:24px;border-bottom-left-radius:24px}.el-year-table td.end-date .el-date-table-cell{border-top-right-radius:24px;border-bottom-right-radius:24px}.el-year-table td.current:not(.disabled) .el-date-table-cell__text{color:#fff;background-color:var(--el-datepicker-active-color)}.el-year-table td:focus-visible{outline:none}.el-year-table td:focus-visible .el-date-table-cell__text{outline:2px solid var(--el-datepicker-active-color);outline-offset:1px}.el-time-spinner.has-seconds .el-time-spinner__wrapper{width:33.3%}.el-time-spinner__wrapper{vertical-align:top;width:50%;max-height:192px;display:inline-block;position:relative;overflow:auto}.el-time-spinner__wrapper.el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default){padding-bottom:15px}.el-time-spinner__wrapper.is-arrow{box-sizing:border-box;text-align:center;overflow:hidden}.el-time-spinner__wrapper.is-arrow .el-time-spinner__list{transform:translateY(-32px)}.el-time-spinner__wrapper.is-arrow .el-time-spinner__item:hover:not(.is-disabled):not(.is-active){background:var(--el-fill-color-light);cursor:default}.el-time-spinner__arrow{color:var(--el-text-color-secondary);width:100%;z-index:var(--el-index-normal);text-align:center;cursor:pointer;height:30px;font-size:12px;line-height:30px;position:absolute;left:0}.el-time-spinner__arrow:hover{color:var(--el-color-primary)}.el-time-spinner__arrow.arrow-up{top:10px}.el-time-spinner__arrow.arrow-down{bottom:10px}.el-time-spinner__input.el-input{width:70%}.el-time-spinner__input.el-input .el-input__inner{text-align:center;padding:0}.el-time-spinner__list{text-align:center;margin:0;padding:0;list-style:none}.el-time-spinner__list:after,.el-time-spinner__list:before{content:"";width:100%;height:80px;display:block}.el-time-spinner__item{height:32px;color:var(--el-text-color-regular);font-size:12px;line-height:32px}.el-time-spinner__item:hover:not(.is-disabled):not(.is-active){background:var(--el-fill-color-light);cursor:pointer}.el-time-spinner__item.is-active:not(.is-disabled){color:var(--el-text-color-primary);font-weight:700}.el-time-spinner__item.is-disabled{color:var(--el-text-color-placeholder);cursor:not-allowed}.el-picker__popper{--el-datepicker-border-color:var(--el-disabled-border-color)}.el-picker__popper.el-popper{background:var(--el-bg-color-overlay);border:1px solid var(--el-datepicker-border-color);box-shadow:var(--el-box-shadow-light)}.el-picker__popper.el-popper .el-popper__arrow:before{border:1px solid var(--el-datepicker-border-color)}.el-picker__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-top-color:#0000;border-left-color:#0000}.el-picker__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:#0000;border-right-color:#0000}.el-picker__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-bottom-color:#0000;border-left-color:#0000}.el-picker__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-top-color:#0000;border-right-color:#0000}.el-date-editor{--el-date-editor-width:220px;--el-date-editor-monthrange-width:300px;--el-date-editor-daterange-width:350px;--el-date-editor-datetimerange-width:400px;--el-input-text-color:var(--el-text-color-regular);--el-input-border:var(--el-border);--el-input-hover-border:var(--el-border-color-hover);--el-input-focus-border:var(--el-color-primary);--el-input-transparent-border:0 0 0 1px transparent inset;--el-input-border-color:var(--el-border-color);--el-input-border-radius:var(--el-border-radius-base);--el-input-bg-color:var(--el-fill-color-blank);--el-input-icon-color:var(--el-text-color-placeholder);--el-input-placeholder-color:var(--el-text-color-placeholder);--el-input-hover-border-color:var(--el-border-color-hover);--el-input-clear-hover-color:var(--el-text-color-secondary);--el-input-focus-border-color:var(--el-color-primary);--el-input-width:100%;text-align:left;vertical-align:middle;position:relative}.el-date-editor.el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-border-color,var(--el-border-color)) inset}.el-date-editor.el-input__wrapper:hover{box-shadow:0 0 0 1px var(--el-input-hover-border-color) inset}.el-date-editor.is-focus .el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset}.el-date-editor.el-input,.el-date-editor.el-input__wrapper{width:var(--el-date-editor-width);height:var(--el-input-height,var(--el-component-size))}.el-date-editor--monthrange{--el-date-editor-width:var(--el-date-editor-monthrange-width)}.el-date-editor--daterange,.el-date-editor--timerange{--el-date-editor-width:var(--el-date-editor-daterange-width)}.el-date-editor--datetimerange{--el-date-editor-width:var(--el-date-editor-datetimerange-width)}.el-date-editor--dates .el-input__wrapper{text-overflow:ellipsis;white-space:nowrap}.el-date-editor .close-icon,.el-date-editor .clear-icon{cursor:pointer}.el-date-editor .clear-icon:hover{color:var(--el-input-clear-hover-color)}.el-date-editor .el-range__icon{height:inherit;color:var(--el-text-color-placeholder);float:left;font-size:14px}.el-date-editor .el-range__icon svg{vertical-align:middle}.el-date-editor .el-range-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;text-align:center;width:39%;height:30px;line-height:30px;font-size:var(--el-font-size-base);color:var(--el-text-color-regular);background-color:#0000;border:none;outline:none;margin:0;padding:0;display:inline-block}.el-date-editor .el-range-input::placeholder{color:var(--el-text-color-placeholder)}.el-date-editor .el-range-separator{overflow-wrap:break-word;height:100%;color:var(--el-text-color-primary);flex:1;justify-content:center;align-items:center;margin:0;padding:0 5px;font-size:14px;display:inline-flex}.el-date-editor .el-range__close-icon{color:var(--el-text-color-placeholder);height:inherit;width:unset;cursor:pointer;font-size:14px}.el-date-editor .el-range__close-icon:hover{color:var(--el-input-clear-hover-color)}.el-date-editor .el-range__close-icon svg{vertical-align:middle}.el-date-editor .el-range__close-icon--hidden{opacity:0;visibility:hidden}.el-range-editor.el-input__wrapper{vertical-align:middle;align-items:center;padding:0 10px;display:inline-flex}.el-range-editor.is-active,.el-range-editor.is-active:hover{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset}.el-range-editor--large{line-height:var(--el-component-size-large)}.el-range-editor--large.el-input__wrapper{height:var(--el-component-size-large)}.el-range-editor--large .el-range-separator{font-size:14px;line-height:40px}.el-range-editor--large .el-range-input{height:38px;font-size:14px;line-height:38px}.el-range-editor--small{line-height:var(--el-component-size-small)}.el-range-editor--small.el-input__wrapper{height:var(--el-component-size-small)}.el-range-editor--small .el-range-separator{font-size:12px;line-height:24px}.el-range-editor--small .el-range-input{height:22px;font-size:12px;line-height:22px}.el-range-editor.is-disabled{background-color:var(--el-disabled-bg-color);border-color:var(--el-disabled-border-color);color:var(--el-disabled-text-color);cursor:not-allowed}.el-range-editor.is-disabled:hover,.el-range-editor.is-disabled:focus{border-color:var(--el-disabled-border-color)}.el-range-editor.is-disabled input{background-color:var(--el-disabled-bg-color);color:var(--el-disabled-text-color);cursor:not-allowed}.el-range-editor.is-disabled input::placeholder{color:var(--el-text-color-placeholder)}.el-range-editor.is-disabled .el-range-separator{color:var(--el-disabled-text-color)}.el-picker-panel{color:var(--el-text-color-regular);background:var(--el-datepicker-bg-color);border-radius:var(--el-popper-border-radius,var(--el-border-radius-base));line-height:30px}.el-picker-panel .el-time-panel{border:solid 1px var(--el-datepicker-border-color);background-color:var(--el-datepicker-bg-color);box-shadow:var(--el-box-shadow-light);margin:5px 0}.el-picker-panel__body:after,.el-picker-panel__body-wrapper:after{content:"";clear:both;display:table}.el-picker-panel__content{margin:15px;position:relative}.el-picker-panel__footer{border-top:1px solid var(--el-datepicker-inner-border-color);text-align:right;background-color:var(--el-datepicker-bg-color);padding:4px 12px;font-size:0;position:relative}.el-picker-panel__shortcut{width:100%;color:var(--el-datepicker-text-color);text-align:left;cursor:pointer;background-color:#0000;border:0;outline:none;padding-left:12px;font-size:14px;line-height:28px;display:block}.el-picker-panel__shortcut:hover{color:var(--el-datepicker-hover-text-color)}.el-picker-panel__shortcut.active{color:var(--el-datepicker-active-color);background-color:#e6f1fe}.el-picker-panel__btn{border:1px solid var(--el-fill-color-darker);color:var(--el-text-color-primary);cursor:pointer;background-color:#0000;border-radius:2px;outline:none;padding:0 20px;font-size:12px;line-height:24px}.el-picker-panel__btn[disabled]{color:var(--el-text-color-disabled);cursor:not-allowed}.el-picker-panel__icon-btn{color:var(--el-datepicker-icon-color);cursor:pointer;background:0 0;border:0;outline:none;margin-top:8px;padding:1px 6px;font-size:12px;line-height:1}.el-picker-panel__icon-btn:hover{color:var(--el-datepicker-hover-text-color)}.el-picker-panel__icon-btn:focus-visible{color:var(--el-datepicker-hover-text-color)}.el-picker-panel__icon-btn.is-disabled{color:var(--el-text-color-disabled)}.el-picker-panel__icon-btn.is-disabled:hover{cursor:not-allowed}.el-picker-panel__icon-btn.is-disabled .el-icon{cursor:inherit}.el-picker-panel__icon-btn .el-icon{cursor:pointer;font-size:inherit}.el-picker-panel__link-btn{vertical-align:middle}.el-picker-panel.is-disabled .el-picker-panel__prev-btn{color:var(--el-text-color-disabled)}.el-picker-panel.is-disabled .el-picker-panel__prev-btn:hover{cursor:not-allowed}.el-picker-panel.is-disabled .el-picker-panel__prev-btn .el-icon{cursor:inherit}.el-picker-panel.is-disabled .el-picker-panel__next-btn{color:var(--el-text-color-disabled)}.el-picker-panel.is-disabled .el-picker-panel__next-btn:hover{cursor:not-allowed}.el-picker-panel.is-disabled .el-picker-panel__next-btn .el-icon{cursor:inherit}.el-picker-panel.is-disabled .el-picker-panel__icon-btn{color:var(--el-text-color-disabled)}.el-picker-panel.is-disabled .el-picker-panel__icon-btn:hover{cursor:not-allowed}.el-picker-panel.is-disabled .el-picker-panel__icon-btn .el-icon{cursor:inherit}.el-picker-panel.is-disabled .el-picker-panel__shortcut{color:var(--el-text-color-disabled)}.el-picker-panel.is-disabled .el-picker-panel__shortcut:hover{cursor:not-allowed}.el-picker-panel.is-disabled .el-picker-panel__shortcut .el-icon{cursor:inherit}.el-picker-panel [slot=sidebar],.el-picker-panel__sidebar{border-right:1px solid var(--el-datepicker-inner-border-color);box-sizing:border-box;width:110px;padding-top:6px;position:absolute;top:0;bottom:0;overflow:auto}.el-picker-panel [slot=sidebar]+.el-picker-panel__body,.el-picker-panel__sidebar+.el-picker-panel__body{margin-left:110px}.el-date-picker{--el-datepicker-text-color:var(--el-text-color-regular);--el-datepicker-off-text-color:var(--el-text-color-placeholder);--el-datepicker-header-text-color:var(--el-text-color-regular);--el-datepicker-icon-color:var(--el-text-color-primary);--el-datepicker-border-color:var(--el-disabled-border-color);--el-datepicker-inner-border-color:var(--el-border-color-light);--el-datepicker-inrange-bg-color:var(--el-border-color-extra-light);--el-datepicker-inrange-hover-bg-color:var(--el-border-color-extra-light);--el-datepicker-active-color:var(--el-color-primary);--el-datepicker-hover-text-color:var(--el-color-primary);--el-datepicker-bg-color:var(--el-bg-color-overlay);--el-fill-color-blank:var(--el-datepicker-bg-color);width:322px}.el-date-picker.has-sidebar.has-time{width:434px}.el-date-picker.has-sidebar{width:438px}.el-date-picker.has-time .el-picker-panel__body-wrapper{position:relative}.el-date-picker .el-picker-panel__content{width:292px}.el-date-picker table{table-layout:fixed;width:100%}.el-date-picker__editor-wrap{padding:0 5px;display:table-cell;position:relative}.el-date-picker__time-header{border-bottom:1px solid var(--el-datepicker-inner-border-color);box-sizing:border-box;width:100%;padding:8px 5px 5px;font-size:12px;display:table;position:relative}.el-date-picker__header{text-align:center;padding:12px 12px 0}.el-date-picker__header--bordered{border-bottom:solid 1px var(--el-border-color-lighter);margin-bottom:0;padding-bottom:12px}.el-date-picker__header--bordered+.el-picker-panel__content{margin-top:0}.el-date-picker__header-label{text-align:center;cursor:pointer;color:var(--el-text-color-regular);padding:0 5px;font-size:16px;font-weight:500;line-height:22px}.el-date-picker__header-label:hover{color:var(--el-datepicker-hover-text-color)}.el-date-picker__header-label:focus-visible{color:var(--el-datepicker-hover-text-color);outline:none}.el-date-picker__header-label.active{color:var(--el-datepicker-active-color)}.el-date-picker__prev-btn{float:left}.el-date-picker__next-btn{float:right}.el-date-picker__time-wrap{text-align:center;padding:10px}.el-date-picker__time-label{float:left;cursor:pointer;margin-left:10px;line-height:30px}.el-date-picker .el-time-panel{position:absolute}.el-date-picker.is-disabled .el-date-picker__header-label{color:var(--el-text-color-disabled)}.el-date-picker.is-disabled .el-date-picker__header-label:hover{cursor:not-allowed}.el-date-picker.is-disabled .el-date-picker__header-label .el-icon{cursor:inherit}.el-date-range-picker{--el-datepicker-text-color:var(--el-text-color-regular);--el-datepicker-off-text-color:var(--el-text-color-placeholder);--el-datepicker-header-text-color:var(--el-text-color-regular);--el-datepicker-icon-color:var(--el-text-color-primary);--el-datepicker-border-color:var(--el-disabled-border-color);--el-datepicker-inner-border-color:var(--el-border-color-light);--el-datepicker-inrange-bg-color:var(--el-border-color-extra-light);--el-datepicker-inrange-hover-bg-color:var(--el-border-color-extra-light);--el-datepicker-active-color:var(--el-color-primary);--el-datepicker-hover-text-color:var(--el-color-primary);--el-datepicker-bg-color:var(--el-bg-color-overlay);width:646px}.el-date-range-picker.has-sidebar{width:756px}.el-date-range-picker.has-time .el-picker-panel__body-wrapper{position:relative}.el-date-range-picker table{table-layout:fixed;width:100%}.el-date-range-picker .el-picker-panel__body{min-width:513px}.el-date-range-picker .el-picker-panel__content{margin:0}.el-date-range-picker__header{text-align:center;height:28px;position:relative}.el-date-range-picker__header [class*=arrow-left]{float:left}.el-date-range-picker__header [class*=arrow-right]{float:right}.el-date-range-picker__header div{margin-right:50px;font-size:16px;font-weight:500}.el-date-range-picker__header-label{text-align:center;cursor:pointer;color:var(--el-text-color-regular);padding:0 5px;font-size:16px;font-weight:500;line-height:22px}.el-date-range-picker__header-label:hover{color:var(--el-datepicker-hover-text-color)}.el-date-range-picker__header-label:focus-visible{color:var(--el-datepicker-hover-text-color);outline:none}.el-date-range-picker__header-label.active{color:var(--el-datepicker-active-color)}.el-date-range-picker__content{box-sizing:border-box;width:50%;margin:0;padding:16px;display:table-cell}.el-date-range-picker__content.is-left{border-right:1px solid var(--el-datepicker-inner-border-color)}.el-date-range-picker__content .el-date-range-picker__header div{margin-left:50px;margin-right:50px}.el-date-range-picker__editors-wrap{box-sizing:border-box;display:table-cell}.el-date-range-picker__editors-wrap.is-right{text-align:right}.el-date-range-picker__time-header{border-bottom:1px solid var(--el-datepicker-inner-border-color);box-sizing:border-box;width:100%;padding:8px 5px 5px;font-size:12px;display:table;position:relative}.el-date-range-picker__time-header>.el-icon-arrow-right{vertical-align:middle;color:var(--el-datepicker-icon-color);font-size:20px;display:table-cell}.el-date-range-picker__time-picker-wrap{padding:0 5px;display:table-cell;position:relative}.el-date-range-picker__time-picker-wrap .el-picker-panel{z-index:1;background:#fff;position:absolute;top:13px;right:0}.el-date-range-picker__time-picker-wrap .el-time-panel{position:absolute}.el-date-range-picker.is-disabled .el-date-range-picker__header-label{color:var(--el-text-color-disabled)}.el-date-range-picker.is-disabled .el-date-range-picker__header-label:hover{cursor:not-allowed}.el-date-range-picker.is-disabled .el-date-range-picker__header-label .el-icon{cursor:inherit}.el-time-range-picker{width:354px;overflow:visible}.el-time-range-picker__content{text-align:center;z-index:1;padding:10px;position:relative}.el-time-range-picker__cell{box-sizing:border-box;width:50%;margin:0;padding:4px 7px 7px;display:inline-block}.el-time-range-picker__header{text-align:center;margin-bottom:5px;font-size:14px}.el-time-range-picker__body{border:1px solid var(--el-datepicker-border-color);border-radius:2px}.el-time-panel{width:180px;z-index:var(--el-index-top);-webkit-user-select:none;user-select:none;box-sizing:content-box;border-radius:2px;position:relative;left:0}.el-time-panel__content{font-size:0;position:relative;overflow:hidden}.el-time-panel__content:after,.el-time-panel__content:before{content:"";z-index:-1;box-sizing:border-box;text-align:left;height:32px;margin-top:-16px;padding-top:6px;position:absolute;top:50%;left:0;right:0}.el-time-panel__content:after{margin-left:12%;margin-right:12%;left:50%}.el-time-panel__content:before{border-top:1px solid var(--el-border-color-light);border-bottom:1px solid var(--el-border-color-light);margin-left:12%;margin-right:12%;padding-left:50%}.el-time-panel__content.has-seconds:after{left:66.6667%}.el-time-panel__content.has-seconds:before{padding-left:33.3333%}.el-time-panel__footer{border-top:1px solid var(--el-timepicker-inner-border-color,var(--el-border-color-light));text-align:right;box-sizing:border-box;height:36px;padding:4px;line-height:25px}.el-time-panel__btn{cursor:pointer;color:var(--el-text-color-primary);background-color:#0000;border:none;outline:none;margin:0 5px;padding:0 5px;font-size:12px;line-height:28px}.el-time-panel__btn.confirm{color:var(--el-timepicker-active-color,var(--el-color-primary));font-weight:800}.el-picker-panel.is-border{border:solid 1px var(--el-border-color-lighter)}.el-picker-panel.is-border .el-picker-panel__body-wrapper{position:relative}.el-picker-panel.is-border.el-picker-panel [slot=sidebar],.el-picker-panel.is-border.el-picker-panel__sidebar{border-right:1px solid var(--el-datepicker-inner-border-color);box-sizing:border-box;width:110px;height:100%;padding-top:6px;position:absolute;top:0;overflow:auto}.el-descriptions{--el-descriptions-table-border:1px solid var(--el-border-color-lighter);--el-descriptions-item-bordered-label-background:var(--el-fill-color-light);box-sizing:border-box;font-size:var(--el-font-size-base);color:var(--el-text-color-primary)}.el-descriptions__header{justify-content:space-between;align-items:center;margin-bottom:16px;display:flex}.el-descriptions__title{color:var(--el-text-color-primary);font-size:16px;font-weight:700}.el-descriptions__body{background-color:var(--el-fill-color-blank)}.el-descriptions__body .el-descriptions__table{border-collapse:collapse;width:100%}.el-descriptions__body .el-descriptions__table .el-descriptions__cell{box-sizing:border-box;text-align:left;font-size:14px;line-height:23px}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-left{text-align:left}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-center{text-align:center}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-right{text-align:right}.el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{border:var(--el-descriptions-table-border);padding:8px 11px}.el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:12px}.el-descriptions--large{font-size:14px}.el-descriptions--large .el-descriptions__header{margin-bottom:20px}.el-descriptions--large .el-descriptions__header .el-descriptions__title{font-size:16px}.el-descriptions--large .el-descriptions__body .el-descriptions__table .el-descriptions__cell{font-size:14px}.el-descriptions--large .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{padding:12px 15px}.el-descriptions--large .el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:16px}.el-descriptions--small{font-size:12px}.el-descriptions--small .el-descriptions__header{margin-bottom:12px}.el-descriptions--small .el-descriptions__header .el-descriptions__title{font-size:14px}.el-descriptions--small .el-descriptions__body .el-descriptions__table .el-descriptions__cell{font-size:12px}.el-descriptions--small .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{padding:4px 7px}.el-descriptions--small .el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:8px}.el-descriptions__label.el-descriptions__cell.is-bordered-label{color:var(--el-text-color-regular);background:var(--el-descriptions-item-bordered-label-background);font-weight:700}.el-descriptions__label:not(.is-bordered-label){color:var(--el-text-color-primary);margin-right:16px}.el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:6px}.el-descriptions__content.el-descriptions__cell.is-bordered-content{color:var(--el-text-color-primary)}.el-descriptions__content:not(.is-bordered-label){color:var(--el-text-color-regular)}.el-descriptions--large .el-descriptions__label:not(.is-bordered-label){margin-right:16px}.el-descriptions--large .el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:8px}.el-descriptions--small .el-descriptions__label:not(.is-bordered-label){margin-right:12px}.el-descriptions--small .el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:4px}:root{--el-popup-modal-bg-color:var(--el-color-black);--el-popup-modal-opacity:.5}.v-modal-enter{animation:v-modal-in var(--el-transition-duration-fast) ease}.v-modal-leave{animation:v-modal-out var(--el-transition-duration-fast) ease forwards}@keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-out{to{opacity:0}}.v-modal{width:100%;height:100%;opacity:var(--el-popup-modal-opacity);background:var(--el-popup-modal-bg-color);position:fixed;top:0;left:0}.el-popup-parent--hidden{overflow:hidden}.el-dialog{--el-dialog-width:50%;--el-dialog-margin-top:15vh;--el-dialog-bg-color:var(--el-bg-color);--el-dialog-box-shadow:var(--el-box-shadow);--el-dialog-title-font-size:var(--el-font-size-large);--el-dialog-content-font-size:14px;--el-dialog-font-line-height:var(--el-font-line-height-primary);--el-dialog-padding-primary:16px;--el-dialog-border-radius:var(--el-border-radius-base);margin:var(--el-dialog-margin-top,15vh) auto 50px;background:var(--el-dialog-bg-color);border-radius:var(--el-dialog-border-radius);box-shadow:var(--el-dialog-box-shadow);box-sizing:border-box;padding:var(--el-dialog-padding-primary);width:var(--el-dialog-width,50%);overflow-wrap:break-word;position:relative}.el-dialog:focus{outline:none!important}.el-dialog.is-align-center{margin:auto}.el-dialog.is-fullscreen{--el-dialog-width:100%;--el-dialog-margin-top:0;border-radius:0;height:100%;margin-bottom:0;overflow:auto}.el-dialog__wrapper{margin:0;position:fixed;inset:0;overflow:auto}.el-dialog.is-draggable .el-dialog__header{cursor:move;-webkit-user-select:none;user-select:none}.el-dialog__header{padding-bottom:var(--el-dialog-padding-primary)}.el-dialog__header.show-close{padding-right:calc(var(--el-dialog-padding-primary) + var(--el-message-close-size,16px))}.el-dialog__headerbtn{cursor:pointer;width:48px;height:48px;font-size:var(--el-message-close-size,16px);background:0 0;border:none;outline:none;padding:0;position:absolute;top:0;right:0}.el-dialog__headerbtn .el-dialog__close{color:var(--el-color-info);font-size:inherit}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:var(--el-color-primary)}.el-dialog__title{line-height:var(--el-dialog-font-line-height);font-size:var(--el-dialog-title-font-size);color:var(--el-text-color-primary)}.el-dialog__body{color:var(--el-text-color-regular);font-size:var(--el-dialog-content-font-size)}.el-dialog__footer{padding-top:var(--el-dialog-padding-primary);text-align:right;box-sizing:border-box}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial}.el-dialog--center .el-dialog__footer{text-align:inherit}.el-modal-dialog.is-penetrable{pointer-events:none}.el-modal-dialog.is-penetrable .el-dialog{pointer-events:auto}.el-overlay-dialog{position:fixed;inset:0;overflow:auto}.el-overlay-dialog.is-closing .el-dialog{pointer-events:none}.dialog-fade-enter-active{animation:modal-fade-in var(--el-transition-duration)}.dialog-fade-enter-active .el-overlay-dialog{animation:dialog-fade-in var(--el-transition-duration)}.dialog-fade-leave-active{animation:modal-fade-out var(--el-transition-duration)}.dialog-fade-leave-active .el-overlay-dialog{animation:dialog-fade-out var(--el-transition-duration)}@keyframes dialog-fade-in{0%{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translate(0)}}@keyframes dialog-fade-out{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translateY(-20px)}}@keyframes modal-fade-in{0%{opacity:0}to{opacity:1}}@keyframes modal-fade-out{0%{opacity:1}to{opacity:0}}.el-divider{position:relative}.el-divider--horizontal{border-top:1px var(--el-border-color) var(--el-border-style);width:100%;height:1px;margin:24px 0;display:block}.el-divider--vertical{vertical-align:middle;border-left:1px var(--el-border-color) var(--el-border-style);width:1px;height:1em;margin:0 8px;display:inline-block;position:relative}.el-divider__text{background-color:var(--el-bg-color);color:var(--el-text-color-primary);padding:0 20px;font-size:14px;font-weight:500;position:absolute}.el-divider__text.is-left{left:20px;transform:translateY(-50%)}.el-divider__text.is-center{left:50%;transform:translate(-50%)translateY(-50%)}.el-divider__text.is-right{right:20px;transform:translateY(-50%)}.el-overlay.is-drawer{overflow:hidden}.el-drawer{--el-drawer-bg-color:var(--el-dialog-bg-color,var(--el-bg-color));--el-drawer-padding-primary:var(--el-dialog-padding-primary,20px);--el-drawer-dragger-size:8px;box-sizing:border-box;background-color:var(--el-drawer-bg-color);box-shadow:var(--el-box-shadow-dark);transition:all var(--el-transition-duration);flex-direction:column;display:flex;position:absolute}.el-drawer .rtl,.el-drawer .ltr,.el-drawer .ttb,.el-drawer .btt{transform:translate(0)}.el-drawer__sr-focus:focus{outline:none!important}.el-drawer__header{color:var(--el-text-color-primary);padding:var(--el-drawer-padding-primary);align-items:center;margin-bottom:32px;padding-bottom:0;display:flex;overflow:hidden}.el-drawer__header>:first-child{flex:1}.el-drawer__title{line-height:inherit;flex:1;margin:0;font-size:16px}.el-drawer__footer{padding:var(--el-drawer-padding-primary);text-align:right;padding-top:10px;overflow:hidden}.el-drawer__close-btn{cursor:pointer;font-size:var(--el-font-size-extra-large);color:inherit;background-color:#0000;border:none;outline:none;display:inline-flex}.el-drawer__close-btn:focus i,.el-drawer__close-btn:hover i{color:var(--el-color-primary)}.el-drawer__body{padding:var(--el-drawer-padding-primary);flex:1;overflow:auto}.el-drawer__body>*{box-sizing:border-box}.el-drawer.is-dragging{transition:none}.el-drawer__dragger{-webkit-user-select:none;user-select:none;background-color:#0000;transition:all .2s;position:absolute}.el-drawer__dragger:before{content:"";background-color:#0000;transition:all .2s;position:absolute}.el-drawer__dragger:hover:before{background-color:var(--el-color-primary)}.el-drawer.ltr,.el-drawer.rtl{height:100%;top:0;bottom:0}.el-drawer.ltr>.el-drawer__dragger,.el-drawer.rtl>.el-drawer__dragger{height:100%;width:var(--el-drawer-dragger-size);cursor:ew-resize;top:0;bottom:0}.el-drawer.ltr>.el-drawer__dragger:before,.el-drawer.rtl>.el-drawer__dragger:before{width:3px;top:0;bottom:0}.el-drawer.ttb,.el-drawer.btt{width:100%;left:0;right:0}.el-drawer.ttb>.el-drawer__dragger,.el-drawer.btt>.el-drawer__dragger{width:100%;height:var(--el-drawer-dragger-size);cursor:ns-resize;left:0;right:0}.el-drawer.ttb>.el-drawer__dragger:before,.el-drawer.btt>.el-drawer__dragger:before{height:3px;left:0;right:0}.el-drawer.ltr{left:0}.el-drawer.ltr>.el-drawer__dragger{right:0}.el-drawer.ltr>.el-drawer__dragger:before{right:-2px}.el-drawer.rtl{right:0}.el-drawer.rtl>.el-drawer__dragger{left:0}.el-drawer.rtl>.el-drawer__dragger:before{left:-2px}.el-drawer.ttb{top:0}.el-drawer.ttb>.el-drawer__dragger{bottom:0}.el-drawer.ttb>.el-drawer__dragger:before{bottom:-2px}.el-drawer.btt{bottom:0}.el-drawer.btt>.el-drawer__dragger{top:0}.el-drawer.btt>.el-drawer__dragger:before{top:-2px}.el-modal-drawer.is-penetrable{pointer-events:none}.el-modal-drawer.is-penetrable .el-drawer{pointer-events:auto}.el-drawer-fade-enter-active,.el-drawer-fade-leave-active{transition:all var(--el-transition-duration)}.el-drawer-fade-enter-from,.el-drawer-fade-enter-active,.el-drawer-fade-enter-to,.el-drawer-fade-leave-from,.el-drawer-fade-leave-active,.el-drawer-fade-leave-to{overflow:hidden!important}.el-drawer-fade-enter-from,.el-drawer-fade-leave-to{background-color:#0000!important}.el-drawer-fade-enter-from .rtl,.el-drawer-fade-leave-to .rtl{transform:translate(100%)}.el-drawer-fade-enter-from .ltr,.el-drawer-fade-leave-to .ltr{transform:translate(-100%)}.el-drawer-fade-enter-from .ttb,.el-drawer-fade-leave-to .ttb{transform:translateY(-100%)}.el-drawer-fade-enter-from .btt,.el-drawer-fade-leave-to .btt{transform:translateY(100%)}.el-dropdown{--el-dropdown-menu-box-shadow:var(--el-box-shadow-light);--el-dropdown-menuItem-hover-fill:var(--el-color-primary-light-9);--el-dropdown-menuItem-hover-color:var(--el-color-primary);--el-dropdown-menu-index:10;color:var(--el-text-color-regular);font-size:var(--el-font-size-base);vertical-align:top;line-height:1;display:inline-flex;position:relative}.el-dropdown.is-disabled{color:var(--el-text-color-placeholder);cursor:not-allowed}.el-dropdown__popper{--el-dropdown-menu-box-shadow:var(--el-box-shadow-light);--el-dropdown-menuItem-hover-fill:var(--el-color-primary-light-9);--el-dropdown-menuItem-hover-color:var(--el-color-primary);--el-dropdown-menu-index:10}.el-dropdown__popper.el-popper{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light);box-shadow:var(--el-dropdown-menu-box-shadow)}.el-dropdown__popper.el-popper .el-popper__arrow:before{border:1px solid var(--el-border-color-light)}.el-dropdown__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-top-color:#0000;border-left-color:#0000}.el-dropdown__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:#0000;border-right-color:#0000}.el-dropdown__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-bottom-color:#0000;border-left-color:#0000}.el-dropdown__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-top-color:#0000;border-right-color:#0000}.el-dropdown__popper .el-dropdown-menu{border:none}.el-dropdown__popper .el-dropdown__popper-selfdefine{outline:none}.el-dropdown__popper .el-scrollbar__bar{z-index:calc(var(--el-dropdown-menu-index) + 1)}.el-dropdown__popper .el-dropdown__list{box-sizing:border-box;margin:0;padding:0;list-style:none}.el-dropdown .el-dropdown__caret-button{border-left:none;justify-content:center;align-items:center;width:32px;padding-left:0;padding-right:0;display:inline-flex}.el-dropdown .el-dropdown__caret-button>span{display:inline-flex}.el-dropdown .el-dropdown__caret-button:before{content:"";background:var(--el-overlay-color-lighter);width:1px;display:block;position:absolute;top:-1px;bottom:-1px;left:0}.el-dropdown .el-dropdown__caret-button.el-button:before{background:var(--el-border-color);opacity:.5}.el-dropdown .el-dropdown__caret-button .el-dropdown__icon{font-size:inherit;padding-left:0}.el-dropdown .el-dropdown-selfdefine{outline:none}.el-dropdown--large .el-dropdown__caret-button{width:40px}.el-dropdown--small .el-dropdown__caret-button{width:24px}.el-dropdown-menu{z-index:var(--el-dropdown-menu-index);background-color:var(--el-bg-color-overlay);border-radius:var(--el-border-radius-base);box-shadow:none;border:none;margin:0;padding:5px 0;list-style:none;position:relative;top:0;left:0}.el-dropdown-menu__item{white-space:nowrap;line-height:22px;font-size:var(--el-font-size-base);color:var(--el-text-color-regular);cursor:pointer;outline:none;align-items:center;margin:0;padding:5px 16px;list-style:none;display:flex}.el-dropdown-menu__item:not(.is-disabled):hover,.el-dropdown-menu__item:not(.is-disabled):focus{background-color:var(--el-dropdown-menuItem-hover-fill);color:var(--el-dropdown-menuItem-hover-color)}.el-dropdown-menu__item i{margin-right:5px}.el-dropdown-menu__item--divided{border-top:1px solid var(--el-border-color-lighter);margin:6px 0}.el-dropdown-menu__item.is-disabled{cursor:not-allowed;color:var(--el-text-color-disabled)}.el-dropdown-menu--large{padding:7px 0}.el-dropdown-menu--large .el-dropdown-menu__item{padding:7px 20px;font-size:14px;line-height:22px}.el-dropdown-menu--large .el-dropdown-menu__item--divided{margin:8px 0}.el-dropdown-menu--small{padding:3px 0}.el-dropdown-menu--small .el-dropdown-menu__item{padding:2px 12px;font-size:12px;line-height:20px}.el-dropdown-menu--small .el-dropdown-menu__item--divided{margin:4px 0}.el-empty{--el-empty-padding:40px 0;--el-empty-image-width:160px;--el-empty-description-margin-top:20px;--el-empty-bottom-margin-top:20px;--el-empty-fill-color-0:var(--el-color-white);--el-empty-fill-color-1:#fcfcfd;--el-empty-fill-color-2:#f8f9fb;--el-empty-fill-color-3:#f7f8fc;--el-empty-fill-color-4:#eeeff3;--el-empty-fill-color-5:#edeef2;--el-empty-fill-color-6:#e9ebef;--el-empty-fill-color-7:#e5e7e9;--el-empty-fill-color-8:#e0e3e9;--el-empty-fill-color-9:#d5d7de;text-align:center;box-sizing:border-box;padding:var(--el-empty-padding);flex-direction:column;justify-content:center;align-items:center;display:flex}.el-empty__image{width:var(--el-empty-image-width)}.el-empty__image img{-webkit-user-select:none;user-select:none;vertical-align:top;object-fit:contain;width:100%;height:100%}.el-empty__image svg{color:var(--el-svg-monochrome-grey);fill:currentColor;vertical-align:top;width:100%;height:100%}.el-empty__description{margin-top:var(--el-empty-description-margin-top)}.el-empty__description p{font-size:var(--el-font-size-base);color:var(--el-text-color-secondary);margin:0}.el-empty__bottom{margin-top:var(--el-empty-bottom-margin-top)}.el-footer{--el-footer-padding:0 20px;--el-footer-height:60px;padding:var(--el-footer-padding);box-sizing:border-box;height:var(--el-footer-height);flex-shrink:0}.el-form-item{--font-size:14px;margin-bottom:18px;display:flex}.el-form-item .el-form-item{margin-bottom:0}.el-form-item .el-input__validateIcon{display:none}.el-form-item--large{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:22px}.el-form-item--large .el-form-item__label{height:40px;line-height:40px}.el-form-item--large .el-form-item__content{line-height:40px}.el-form-item--large .el-form-item__error{padding-top:4px}.el-form-item--default{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--default .el-form-item__label{height:32px;line-height:32px}.el-form-item--default .el-form-item__content{line-height:32px}.el-form-item--default .el-form-item__error{padding-top:2px}.el-form-item--small{--font-size:12px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--small .el-form-item__label{height:24px;line-height:24px}.el-form-item--small .el-form-item__content{line-height:24px}.el-form-item--small .el-form-item__error{padding-top:2px}.el-form-item--label-left .el-form-item__label{text-align:left;justify-content:flex-start}.el-form-item--label-right .el-form-item__label{text-align:right;justify-content:flex-end}.el-form-item--label-top{display:block}.el-form-item--label-top .el-form-item__label{text-align:left;width:-moz-fit-content;width:fit-content;height:auto;margin-bottom:8px;padding-right:0;line-height:22px;display:block}.el-form-item__label-wrap{display:flex}.el-form-item__label{font-size:var(--el-form-label-font-size);color:var(--el-text-color-regular);box-sizing:border-box;flex:none;align-items:flex-start;height:32px;padding:0 12px 0 0;line-height:32px;display:inline-flex}.el-form-item__content{line-height:32px;font-size:var(--font-size);flex-wrap:wrap;flex:1;align-items:center;min-width:0;display:flex;position:relative}.el-form-item__content .el-input-group{vertical-align:top}.el-form-item__error{color:var(--el-color-danger);padding-top:2px;font-size:12px;line-height:1;position:absolute;top:100%;left:0}.el-form-item__error--inline{margin-left:10px;display:inline-block;position:relative;top:auto;left:auto}.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label:before,.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label-wrap>.el-form-item__label:before{content:"*";color:var(--el-color-danger);margin-right:4px}.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label:after,.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label-wrap>.el-form-item__label:after{content:"*";color:var(--el-color-danger);margin-left:4px}.el-form-item.is-error .el-form-item__content .el-input__wrapper,.el-form-item.is-error .el-form-item__content .el-input__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-input__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-input__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-textarea__inner,.el-form-item.is-error .el-form-item__content .el-textarea__inner:hover,.el-form-item.is-error .el-form-item__content .el-textarea__inner:focus,.el-form-item.is-error .el-form-item__content .el-textarea__inner.is-focus,.el-form-item.is-error .el-form-item__content .el-select__wrapper,.el-form-item.is-error .el-form-item__content .el-select__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-select__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-select__wrapper.is-focus,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper:hover,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper:focus,.el-form-item.is-error .el-form-item__content .el-input-tag__wrapper.is-focus{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-form-item.is-error .el-form-item__content .el-input-group__append .el-input__wrapper,.el-form-item.is-error .el-form-item__content .el-input-group__prepend .el-input__wrapper{box-shadow:inset 0 0 0 1px #0000}.el-form-item.is-error .el-form-item__content .el-input-group__append .el-input__validateIcon,.el-form-item.is-error .el-form-item__content .el-input-group__prepend .el-input__validateIcon{display:none}.el-form-item.is-error .el-form-item__content .el-input__validateIcon{color:var(--el-color-danger)}.el-form-item--feedback .el-input__validateIcon{display:inline-flex}.el-form{--el-form-label-font-size:var(--el-font-size-base);--el-form-inline-content-width:220px}.el-form--inline .el-form-item{vertical-align:middle;margin-right:32px;display:inline-flex}.el-form--inline.el-form--label-top{flex-wrap:wrap;display:flex}.el-form--inline.el-form--label-top .el-form-item{display:block}.el-header{--el-header-padding:0 20px;--el-header-height:60px;padding:var(--el-header-padding);box-sizing:border-box;height:var(--el-header-height);flex-shrink:0}.el-image-viewer__wrapper{position:fixed;inset:0}.el-image-viewer__wrapper:focus{outline:none!important}.el-image-viewer__btn{z-index:1;opacity:.8;cursor:pointer;box-sizing:border-box;-webkit-user-select:none;user-select:none;border-radius:50%;justify-content:center;align-items:center;display:flex;position:absolute}.el-image-viewer__btn .el-icon{cursor:pointer}.el-image-viewer__close{width:40px;height:40px;font-size:40px;top:40px;right:40px}.el-image-viewer__canvas{-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;width:100%;height:100%;display:flex;position:static}.el-image-viewer__actions{background-color:var(--el-text-color-regular);border-color:#fff;border-radius:22px;height:44px;padding:0 23px;bottom:30px;left:50%;transform:translate(-50%)}.el-image-viewer__actions__inner{cursor:default;color:#fff;justify-content:space-around;align-items:center;gap:22px;width:100%;height:100%;padding:0 6px;font-size:23px;display:flex}.el-image-viewer__actions__divider{margin:0 -6px}.el-image-viewer__progress{cursor:default;color:#fff;bottom:90px;left:50%;transform:translate(-50%)}.el-image-viewer__prev{color:#fff;background-color:var(--el-text-color-regular);border-color:#fff;width:44px;height:44px;font-size:24px;top:50%;left:40px;transform:translateY(-50%)}.el-image-viewer__next{text-indent:2px;color:#fff;background-color:var(--el-text-color-regular);border-color:#fff;width:44px;height:44px;font-size:24px;top:50%;right:40px;transform:translateY(-50%)}.el-image-viewer__close{color:#fff;background-color:var(--el-text-color-regular);border-color:#fff;width:44px;height:44px;font-size:24px}.el-image-viewer__mask{opacity:.5;background:#000;width:100%;height:100%;position:absolute;top:0;left:0}.el-image-viewer-parent--hidden{overflow:hidden}.viewer-fade-enter-active{animation:viewer-fade-in var(--el-transition-duration)}.viewer-fade-leave-active{animation:viewer-fade-out var(--el-transition-duration)}@keyframes viewer-fade-in{0%{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translate(0)}}@keyframes viewer-fade-out{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translateY(-20px)}}.el-image__error,.el-image__placeholder,.el-image__wrapper,.el-image__inner{width:100%;height:100%}.el-image{display:inline-block;position:relative;overflow:hidden}.el-image__inner{vertical-align:top;opacity:1}.el-image__inner.is-loading{opacity:0}.el-image__wrapper{position:absolute;top:0;left:0}.el-image__placeholder{background:var(--el-fill-color-light)}.el-image__error{background:var(--el-fill-color-light);color:var(--el-text-color-placeholder);vertical-align:middle;justify-content:center;align-items:center;font-size:14px;display:flex}.el-image__preview{cursor:pointer}.el-textarea{--el-input-text-color:var(--el-text-color-regular);--el-input-border:var(--el-border);--el-input-hover-border:var(--el-border-color-hover);--el-input-focus-border:var(--el-color-primary);--el-input-transparent-border:0 0 0 1px transparent inset;--el-input-border-color:var(--el-border-color);--el-input-border-radius:var(--el-border-radius-base);--el-input-bg-color:var(--el-fill-color-blank);--el-input-icon-color:var(--el-text-color-placeholder);--el-input-placeholder-color:var(--el-text-color-placeholder);--el-input-hover-border-color:var(--el-border-color-hover);--el-input-clear-hover-color:var(--el-text-color-secondary);--el-input-focus-border-color:var(--el-color-primary);--el-input-width:100%;vertical-align:bottom;width:100%;font-size:var(--el-font-size-base);display:inline-block;position:relative}.el-textarea__inner{resize:vertical;box-sizing:border-box;width:100%;line-height:1.5;font-size:inherit;color:var(--el-input-text-color,var(--el-text-color-regular));background-color:var(--el-input-bg-color,var(--el-fill-color-blank));-webkit-appearance:none;box-shadow:0 0 0 1px var(--el-input-border-color,var(--el-border-color)) inset;border-radius:var(--el-input-border-radius,var(--el-border-radius-base));transition:var(--el-transition-box-shadow);background-image:none;border:none;padding:5px 11px;font-family:inherit;display:block;position:relative}.el-textarea__inner.is-clearable{padding:5px 26px 5px 11px}.el-textarea__inner::placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-textarea__inner:hover{box-shadow:0 0 0 1px var(--el-input-hover-border-color) inset}.el-textarea__inner:focus{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset;outline:none}.el-textarea__clear{color:var(--el-input-icon-color);cursor:pointer;font-size:14px;position:absolute;top:15px;right:11px;transform:translateY(-50%)}.el-textarea__clear:hover{color:var(--el-input-clear-hover-color)}.el-textarea .el-input__count{color:var(--el-color-info);background:var(--el-fill-color-blank);font-size:12px;line-height:14px;position:absolute;bottom:5px;right:10px}.el-textarea .el-input__count.is-outside{top:100%;right:0;bottom:unset;background:0 0;padding-top:2px;line-height:1;position:absolute}.el-textarea.is-disabled .el-textarea__inner{box-shadow:0 0 0 1px var(--el-disabled-border-color) inset;background-color:var(--el-disabled-bg-color);color:var(--el-disabled-text-color);cursor:not-allowed}.el-textarea.is-disabled .el-textarea__inner::placeholder{color:var(--el-text-color-placeholder)}.el-textarea.is-exceed .el-textarea__inner{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-textarea.is-exceed .el-input__count{color:var(--el-color-danger)}.el-input{--el-input-text-color:var(--el-text-color-regular);--el-input-border:var(--el-border);--el-input-hover-border:var(--el-border-color-hover);--el-input-focus-border:var(--el-color-primary);--el-input-transparent-border:0 0 0 1px transparent inset;--el-input-border-color:var(--el-border-color);--el-input-border-radius:var(--el-border-radius-base);--el-input-bg-color:var(--el-fill-color-blank);--el-input-icon-color:var(--el-text-color-placeholder);--el-input-placeholder-color:var(--el-text-color-placeholder);--el-input-hover-border-color:var(--el-border-color-hover);--el-input-clear-hover-color:var(--el-text-color-secondary);--el-input-focus-border-color:var(--el-color-primary);--el-input-width:100%;--el-input-height:var(--el-component-size);font-size:var(--el-font-size-base);width:var(--el-input-width);line-height:var(--el-input-height);box-sizing:border-box;vertical-align:middle;display:inline-flex;position:relative}.el-input::-webkit-scrollbar{z-index:11;width:6px}.el-input::-webkit-scrollbar:horizontal{height:6px}.el-input::-webkit-scrollbar-thumb{background:var(--el-text-color-disabled);border-radius:5px;width:6px}.el-input::-webkit-scrollbar-corner{background:var(--el-fill-color-blank)}.el-input::-webkit-scrollbar-track{background:var(--el-fill-color-blank)}.el-input::-webkit-scrollbar-track-piece{background:var(--el-fill-color-blank);width:6px}.el-input .el-input__clear,.el-input .el-input__password{color:var(--el-input-icon-color);cursor:pointer;font-size:14px}.el-input .el-input__clear:hover,.el-input .el-input__password:hover{color:var(--el-input-clear-hover-color)}.el-input .el-input__count{height:100%;color:var(--el-color-info);align-items:center;font-size:12px;display:inline-flex}.el-input .el-input__count .el-input__count-inner{background:var(--el-fill-color-blank);line-height:initial;padding-left:8px;display:inline-block}.el-input .el-input__count.is-outside{height:unset;padding-top:2px;position:absolute;top:100%;right:0}.el-input .el-input__count.is-outside .el-input__count-inner{background:0 0;padding-left:0;line-height:1}.el-input__wrapper{background-color:var(--el-input-bg-color,var(--el-fill-color-blank));border-radius:var(--el-input-border-radius,var(--el-border-radius-base));cursor:text;transition:var(--el-transition-box-shadow);box-shadow:0 0 0 1px var(--el-input-border-color,var(--el-border-color)) inset;background-image:none;flex-grow:1;justify-content:center;align-items:center;padding:1px 11px;display:inline-flex;transform:translate(0)}.el-input__wrapper:hover{box-shadow:0 0 0 1px var(--el-input-hover-border-color) inset}.el-input__wrapper.is-focus{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset}.el-input{--el-input-inner-height:calc(var(--el-input-height,32px) - 2px)}.el-input__inner{-webkit-appearance:none;width:100%;color:var(--el-input-text-color,var(--el-text-color-regular));font-size:inherit;height:var(--el-input-inner-height);line-height:var(--el-input-inner-height);box-sizing:border-box;background:0 0;border:none;outline:none;flex-grow:1;padding:0}.el-input__inner:focus{outline:none}.el-input__inner::placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-input__inner[type=password]::-ms-reveal{display:none}.el-input__inner[type=number]{line-height:1}.el-input__prefix{white-space:nowrap;height:100%;line-height:var(--el-input-inner-height);text-align:center;color:var(--el-input-icon-color,var(--el-text-color-placeholder));transition:all var(--el-transition-duration);pointer-events:none;flex-wrap:nowrap;flex-shrink:0;display:inline-flex}.el-input__prefix-inner{pointer-events:all;justify-content:center;align-items:center;display:inline-flex}.el-input__prefix-inner>:last-child{margin-right:8px}.el-input__prefix-inner>:first-child,.el-input__prefix-inner>:first-child.el-input__icon{margin-left:0}.el-input__suffix{white-space:nowrap;height:100%;line-height:var(--el-input-inner-height);text-align:center;color:var(--el-input-icon-color,var(--el-text-color-placeholder));transition:all var(--el-transition-duration);pointer-events:none;flex-wrap:nowrap;flex-shrink:0;display:inline-flex}.el-input__suffix-inner{pointer-events:all;justify-content:center;align-items:center;display:inline-flex}.el-input__suffix-inner>:first-child{margin-left:8px}.el-input .el-input__icon{height:inherit;line-height:inherit;transition:all var(--el-transition-duration);justify-content:center;align-items:center;margin-left:8px;display:flex}.el-input__validateIcon{pointer-events:none}.el-input.is-active .el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-focus-color, ) inset}.el-input.is-disabled{cursor:not-allowed}.el-input.is-disabled .el-input__wrapper{background-color:var(--el-disabled-bg-color);cursor:not-allowed;box-shadow:0 0 0 1px var(--el-disabled-border-color) inset}.el-input.is-disabled .el-input__inner{color:var(--el-disabled-text-color);-webkit-text-fill-color:var(--el-disabled-text-color);cursor:not-allowed}.el-input.is-disabled .el-input__inner::placeholder{color:var(--el-text-color-placeholder)}.el-input.is-disabled .el-input__icon{cursor:not-allowed}.el-input.is-disabled .el-input__prefix-inner,.el-input.is-disabled .el-input__suffix-inner{pointer-events:none}.el-input.is-exceed .el-input__wrapper{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-input.is-exceed .el-input__suffix .el-input__count{color:var(--el-color-danger)}.el-input--large{--el-input-height:var(--el-component-size-large);font-size:14px}.el-input--large .el-input__wrapper{padding:1px 15px}.el-input--large{--el-input-inner-height:calc(var(--el-input-height,40px) - 2px)}.el-input--small{--el-input-height:var(--el-component-size-small);font-size:12px}.el-input--small .el-input__wrapper{padding:1px 7px}.el-input--small{--el-input-inner-height:calc(var(--el-input-height,24px) - 2px)}.el-input-group{align-items:stretch;width:100%;display:inline-flex}.el-input-group__append,.el-input-group__prepend{background-color:var(--el-fill-color-light);color:var(--el-color-info);border-radius:var(--el-input-border-radius);white-space:nowrap;justify-content:center;align-items:center;min-height:100%;padding:0 20px;display:inline-flex;position:relative}.el-input-group__append:focus,.el-input-group__prepend:focus{outline:none}.el-input-group__append .el-select,.el-input-group__append .el-button,.el-input-group__prepend .el-select,.el-input-group__prepend .el-button{flex:1;margin:0 -20px;display:inline-block}.el-input-group__append button.el-button,.el-input-group__append button.el-button:hover,.el-input-group__append div.el-select .el-select__wrapper,.el-input-group__append div.el-select:hover .el-select__wrapper,.el-input-group__prepend button.el-button,.el-input-group__prepend button.el-button:hover,.el-input-group__prepend div.el-select .el-select__wrapper,.el-input-group__prepend div.el-select:hover .el-select__wrapper{color:inherit;background-color:#0000;border-color:#0000}.el-input-group__append .el-button,.el-input-group__append .el-input,.el-input-group__prepend .el-button,.el-input-group__prepend .el-input{font-size:inherit}.el-input-group__prepend{box-shadow:1px 0 0 0 var(--el-input-border-color) inset,0 1px 0 0 var(--el-input-border-color) inset,0 -1px 0 0 var(--el-input-border-color) inset;border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.el-input-group__append{box-shadow:0 1px 0 0 var(--el-input-border-color) inset,0 -1px 0 0 var(--el-input-border-color) inset,-1px 0 0 0 var(--el-input-border-color) inset;border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.el-input-group--prepend>.el-input__wrapper{border-top-left-radius:0;border-bottom-left-radius:0}.el-input-group--prepend .el-input-group__prepend .el-select .el-select__wrapper{box-shadow:1px 0 0 0 var(--el-input-border-color) inset,0 1px 0 0 var(--el-input-border-color) inset,0 -1px 0 0 var(--el-input-border-color) inset;border-top-right-radius:0;border-bottom-right-radius:0}.el-input-group--append>.el-input__wrapper{border-top-right-radius:0;border-bottom-right-radius:0}.el-input-group--append .el-input-group__append .el-select .el-select__wrapper{box-shadow:0 1px 0 0 var(--el-input-border-color) inset,0 -1px 0 0 var(--el-input-border-color) inset,-1px 0 0 0 var(--el-input-border-color) inset;border-top-left-radius:0;border-bottom-left-radius:0}.el-input-hidden{display:none!important}.el-input-number{vertical-align:middle;width:150px;line-height:30px;display:inline-flex;position:relative}.el-input-number .el-input__wrapper{padding-left:42px;padding-right:42px}.el-input-number .el-input__inner{-webkit-appearance:none;-moz-appearance:textfield;text-align:center;line-height:1}.el-input-number .el-input__inner::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.el-input-number .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-input-number.is-left .el-input__inner{text-align:left}.el-input-number.is-right .el-input__inner{text-align:right}.el-input-number.is-center .el-input__inner{text-align:center}.el-input-number__increase,.el-input-number__decrease{z-index:1;background:var(--el-fill-color-light);width:32px;height:auto;color:var(--el-text-color-regular);cursor:pointer;-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;font-size:13px;display:flex;position:absolute;top:1px;bottom:1px}.el-input-number__increase:hover,.el-input-number__decrease:hover{color:var(--el-color-primary)}.el-input-number__increase:hover~.el-input:not(.is-disabled) .el-input__wrapper,.el-input-number__decrease:hover~.el-input:not(.is-disabled) .el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-focus-border-color,var(--el-color-primary)) inset}.el-input-number__increase.is-disabled,.el-input-number__decrease.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-input-number__increase{border-radius:0 var(--el-border-radius-base) var(--el-border-radius-base) 0;border-left:var(--el-border);right:1px}.el-input-number__decrease{border-radius:var(--el-border-radius-base) 0 0 var(--el-border-radius-base);border-right:var(--el-border);left:1px}.el-input-number.is-disabled .el-input-number__increase,.el-input-number.is-disabled .el-input-number__decrease{border-color:var(--el-disabled-border-color);color:var(--el-disabled-border-color)}.el-input-number.is-disabled .el-input-number__increase:hover,.el-input-number.is-disabled .el-input-number__decrease:hover{color:var(--el-disabled-border-color);cursor:not-allowed}.el-input-number--large{width:180px;line-height:38px}.el-input-number--large .el-input-number__increase,.el-input-number--large .el-input-number__decrease{width:40px;font-size:14px}.el-input-number--large.is-controls-right .el-input--large .el-input__wrapper{padding-right:47px}.el-input-number--large .el-input--large .el-input__wrapper{padding-left:47px;padding-right:47px}.el-input-number--small{width:120px;line-height:22px}.el-input-number--small .el-input-number__increase,.el-input-number--small .el-input-number__decrease{width:24px;font-size:12px}.el-input-number--small.is-controls-right .el-input--small .el-input__wrapper{padding-right:31px}.el-input-number--small .el-input--small .el-input__wrapper{padding-left:31px;padding-right:31px}.el-input-number--small .el-input-number__increase [class*=el-icon],.el-input-number--small .el-input-number__decrease [class*=el-icon]{transform:scale(.9)}.el-input-number.is-without-controls .el-input__wrapper{padding-left:15px;padding-right:15px}.el-input-number.is-controls-right .el-input__wrapper{padding-left:15px;padding-right:42px}.el-input-number.is-controls-right .el-input-number__increase,.el-input-number.is-controls-right .el-input-number__decrease{--el-input-number-controls-height:15px;height:var(--el-input-number-controls-height);line-height:var(--el-input-number-controls-height)}.el-input-number.is-controls-right .el-input-number__increase [class*=el-icon],.el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon]{transform:scale(.8)}.el-input-number.is-controls-right .el-input-number__increase{border-radius:0 var(--el-border-radius-base) 0 0;border-bottom:var(--el-border);bottom:auto;left:auto}.el-input-number.is-controls-right .el-input-number__decrease{border-right:none;border-left:var(--el-border);border-radius:0 0 var(--el-border-radius-base) 0;top:auto;left:auto;right:1px}.el-input-number.is-controls-right[class*=large] [class*=increase],.el-input-number.is-controls-right[class*=large] [class*=decrease]{--el-input-number-controls-height:19px}.el-input-number.is-controls-right[class*=small] [class*=increase],.el-input-number.is-controls-right[class*=small] [class*=decrease]{--el-input-number-controls-height:11px}.el-input-tag{--el-input-tag-border-color-hover:var(--el-border-color-hover);--el-input-tag-placeholder-color:var(--el-text-color-placeholder);--el-input-tag-disabled-color:var(--el-disabled-text-color);--el-input-tag-disabled-border:var(--el-disabled-border-color);--el-input-tag-font-size:var(--el-font-size-base);--el-input-tag-close-hover-color:var(--el-text-color-secondary);--el-input-tag-text-color:var(--el-text-color-regular);--el-input-tag-input-focus-border-color:var(--el-color-primary);--el-input-tag-width:100%;--el-input-tag-mini-height:var(--el-component-size);--el-input-tag-gap:6px;--el-input-tag-padding:4px;--el-input-tag-inner-padding:8px;--el-input-tag-line-height:24px;box-sizing:border-box;cursor:pointer;font-size:var(--el-input-tag-font-size);padding:var(--el-input-tag-padding);width:var(--el-input-tag-width);min-height:var(--el-input-tag-mini-height);line-height:var(--el-input-tag-line-height);border-radius:var(--el-border-radius-base);background-color:var(--el-fill-color-blank);transition:var(--el-transition-duration);box-shadow:0 0 0 1px var(--el-border-color) inset;align-items:center;display:flex;transform:translate(0)}.el-input-tag.is-focused{box-shadow:0 0 0 1px var(--el-color-primary) inset}.el-input-tag.is-hovering:not(.is-focused){box-shadow:0 0 0 1px var(--el-border-color-hover) inset}.el-input-tag.is-disabled{cursor:not-allowed;background-color:var(--el-fill-color-light);box-shadow:0 0 0 1px var(--el-input-tag-disabled-border) inset}.el-input-tag.is-disabled:hover{box-shadow:0 0 0 1px var(--el-input-tag-disabled-border) inset}.el-input-tag.is-disabled.is-focus{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset}.el-input-tag.is-disabled .el-input-tag__inner .el-input-tag__input,.el-input-tag.is-disabled .el-input-tag__inner .el-tag{cursor:not-allowed}.el-input-tag__prefix{padding:0 var(--el-input-tag-inner-padding);color:var(--el-input-icon-color,var(--el-text-color-placeholder));flex-shrink:0;align-items:center;display:flex}.el-input-tag__suffix{padding:0 var(--el-input-tag-inner-padding);color:var(--el-input-icon-color,var(--el-text-color-placeholder));flex-shrink:0;align-items:center;gap:8px;display:flex}.el-input-tag__collapse-tag{line-height:1}.el-input-tag__input-tag-list{flex-wrap:wrap;flex:1;align-items:center;gap:6px;min-width:0;display:flex;position:relative}.el-input-tag__input-tag-list.is-near{margin-left:-8px}.el-input-tag__input-tag-list .el-tag{cursor:pointer;border-color:#0000}.el-input-tag__input-tag-list .el-tag.el-tag--plain{border-color:var(--el-tag-border-color)}.el-input-tag__input-tag-list .el-tag .el-tag__content{min-width:0}.el-input-tag__inner{align-items:center;gap:var(--el-input-tag-gap);flex-wrap:wrap;flex:1;min-width:0;max-width:100%;display:flex;position:relative}.el-input-tag__inner.is-left-space{margin-left:var(--el-input-tag-inner-padding)}.el-input-tag__inner.is-right-space{margin-right:var(--el-input-tag-inner-padding)}.el-input-tag__inner.is-draggable .el-tag{cursor:move;-webkit-user-select:none;user-select:none}.el-input-tag__drop-indicator{width:1px;height:var(--el-input-tag-line-height);background-color:var(--el-color-primary);position:absolute;top:0}.el-input-tag__inner .el-tag{cursor:pointer;border-color:#0000;max-width:100%}.el-input-tag__inner .el-tag.el-tag--plain{border-color:var(--el-tag-border-color)}.el-input-tag__inner .el-tag .el-tag__content{text-overflow:ellipsis;white-space:nowrap;min-width:0;line-height:normal;overflow:hidden}.el-input-tag__input-wrapper{flex:1}.el-input-tag__input{color:var(--el-input-tag-text-color);font-size:inherit;font-family:inherit;line-height:inherit;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#0000;border:none;outline:none;width:100%;padding:0}.el-input-tag__input::placeholder{color:var(--el-input-tag-placeholder-color)}.el-input-tag__input-calculator{visibility:hidden;white-space:pre;max-width:100%;position:absolute;top:0;left:0;overflow:hidden}.el-input-tag--large{--el-input-tag-gap:6px;--el-input-tag-padding:8px;--el-input-tag-padding-left:8px;--el-input-tag-font-size:14px}.el-input-tag--small{--el-input-tag-gap:4px;--el-input-tag-padding:2px;--el-input-tag-padding-left:6px;--el-input-tag-font-size:12px;--el-input-tag-line-height:20px;--el-input-tag-mini-height:var(--el-component-size-small)}.el-link{--el-link-font-size:var(--el-font-size-base);--el-link-font-weight:var(--el-font-weight-primary);--el-link-text-color:var(--el-text-color-regular);--el-link-hover-text-color:var(--el-color-primary);--el-link-disabled-text-color:var(--el-text-color-placeholder);vertical-align:middle;cursor:pointer;font-size:var(--el-link-font-size);font-weight:var(--el-link-font-weight);color:var(--el-link-text-color);outline:none;flex-direction:row;justify-content:center;align-items:center;padding:0;text-decoration:none;display:inline-flex;position:relative}.el-link.is-hover-underline:hover:after{content:"";border-bottom:1px solid var(--el-link-hover-text-color);height:0;position:absolute;bottom:0;left:0;right:0}.el-link.is-underline:after{content:"";border-bottom:1px solid var(--el-link-text-color);height:0;position:absolute;bottom:0;left:0;right:0}.el-link:hover{color:var(--el-link-hover-text-color)}.el-link:hover:after{border-color:var(--el-link-hover-text-color)}.el-link [class*=el-icon-]+span{margin-left:5px}.el-link__inner{justify-content:center;align-items:center;display:inline-flex}.el-link.el-link--primary{--el-link-text-color:var(--el-color-primary);--el-link-hover-text-color:var(--el-color-primary-light-3);--el-link-disabled-text-color:var(--el-color-primary-light-5)}.el-link.el-link--success{--el-link-text-color:var(--el-color-success);--el-link-hover-text-color:var(--el-color-success-light-3);--el-link-disabled-text-color:var(--el-color-success-light-5)}.el-link.el-link--warning{--el-link-text-color:var(--el-color-warning);--el-link-hover-text-color:var(--el-color-warning-light-3);--el-link-disabled-text-color:var(--el-color-warning-light-5)}.el-link.el-link--danger{--el-link-text-color:var(--el-color-danger);--el-link-hover-text-color:var(--el-color-danger-light-3);--el-link-disabled-text-color:var(--el-color-danger-light-5)}.el-link.el-link--error{--el-link-text-color:var(--el-color-error);--el-link-hover-text-color:var(--el-color-error-light-3);--el-link-disabled-text-color:var(--el-color-error-light-5)}.el-link.el-link--info{--el-link-text-color:var(--el-color-info);--el-link-hover-text-color:var(--el-color-info-light-3);--el-link-disabled-text-color:var(--el-color-info-light-5)}.el-link.is-disabled{color:var(--el-link-disabled-text-color);cursor:not-allowed}.el-link.is-disabled:after{border-color:var(--el-link-disabled-text-color)}:root{--el-loading-spinner-size:42px;--el-loading-fullscreen-spinner-size:50px}.el-loading-parent--relative{position:relative!important}.el-loading-parent--hidden{overflow:hidden!important}.el-loading-mask{z-index:2000;background-color:var(--el-mask-color);transition:opacity var(--el-transition-duration);margin:0;position:absolute;inset:0}.el-loading-mask.is-fullscreen{position:fixed}.el-loading-mask.is-fullscreen .el-loading-spinner{margin-top:calc((0px - var(--el-loading-fullscreen-spinner-size)) / 2)}.el-loading-mask.is-fullscreen .el-loading-spinner .circular{height:var(--el-loading-fullscreen-spinner-size);width:var(--el-loading-fullscreen-spinner-size)}.el-loading-spinner{margin-top:calc((0px - var(--el-loading-spinner-size)) / 2);text-align:center;width:100%;position:absolute;top:50%}.el-loading-spinner .el-loading-text{color:var(--el-color-primary);margin:3px 0;font-size:14px}.el-loading-spinner .circular{height:var(--el-loading-spinner-size);width:var(--el-loading-spinner-size);animation:2s linear infinite loading-rotate;display:inline}.el-loading-spinner .path{stroke-dasharray:90 150;stroke-dashoffset:0;stroke-width:2px;stroke:var(--el-color-primary);stroke-linecap:round;animation:1.5s ease-in-out infinite loading-dash}.el-loading-spinner i{color:var(--el-color-primary)}.el-loading-fade-enter-from,.el-loading-fade-leave-to{opacity:0}@keyframes loading-rotate{to{transform:rotate(360deg)}}@keyframes loading-dash{0%{stroke-dasharray:1 200;stroke-dashoffset:0}50%{stroke-dasharray:90 150;stroke-dashoffset:-40px}to{stroke-dasharray:90 150;stroke-dashoffset:-120px}}.el-main{--el-main-padding:20px;box-sizing:border-box;padding:var(--el-main-padding);flex:auto;display:block;overflow:auto}:root{--el-menu-active-color:var(--el-color-primary);--el-menu-text-color:var(--el-text-color-primary);--el-menu-hover-text-color:var(--el-color-primary);--el-menu-bg-color:var(--el-fill-color-blank);--el-menu-hover-bg-color:var(--el-color-primary-light-9);--el-menu-item-height:56px;--el-menu-sub-item-height:calc(var(--el-menu-item-height) - 6px);--el-menu-horizontal-height:60px;--el-menu-horizontal-sub-item-height:36px;--el-menu-item-font-size:var(--el-font-size-base);--el-menu-item-hover-fill:var(--el-color-primary-light-9);--el-menu-border-color:var(--el-border-color);--el-menu-base-level-padding:20px;--el-menu-level-padding:20px;--el-menu-icon-width:24px}.el-menu{border-right:solid 1px var(--el-menu-border-color);background-color:var(--el-menu-bg-color);box-sizing:border-box;margin:0;padding-left:0;list-style:none;position:relative}.el-menu--vertical:not(.el-menu--collapse):not(.el-menu--popup-container) .el-menu-item,.el-menu--vertical:not(.el-menu--collapse):not(.el-menu--popup-container) .el-sub-menu__title,.el-menu--vertical:not(.el-menu--collapse):not(.el-menu--popup-container) .el-menu-item-group__title{white-space:nowrap;padding-left:calc(var(--el-menu-base-level-padding) + var(--el-menu-level) * var(--el-menu-level-padding))}.el-menu:not(.el-menu--collapse) .el-sub-menu__title{padding-right:calc(var(--el-menu-base-level-padding) + var(--el-menu-icon-width))}.el-menu--horizontal{height:var(--el-menu-horizontal-height);border-right:none;flex-wrap:nowrap;display:flex}.el-menu--horizontal.el-menu--popup-container{height:unset}.el-menu--horizontal.el-menu{border-bottom:solid 1px var(--el-menu-border-color)}.el-menu--horizontal>.el-menu-item{height:100%;color:var(--el-menu-text-color);border-bottom:2px solid #0000;justify-content:center;align-items:center;margin:0;display:inline-flex}.el-menu--horizontal>.el-menu-item a,.el-menu--horizontal>.el-menu-item a:hover{color:inherit}.el-menu--horizontal>.el-sub-menu:focus,.el-menu--horizontal>.el-sub-menu:hover{outline:none}.el-menu--horizontal>.el-sub-menu:hover .el-sub-menu__title{color:var(--el-menu-hover-text-color)}.el-menu--horizontal>.el-sub-menu.is-active .el-sub-menu__title{border-bottom:2px solid var(--el-menu-active-color);color:var(--el-menu-active-color)}.el-menu--horizontal>.el-sub-menu .el-sub-menu__title{height:100%;color:var(--el-menu-text-color);border-bottom:2px solid #0000}.el-menu--horizontal>.el-sub-menu .el-sub-menu__title:hover{background-color:var(--el-menu-bg-color)}.el-menu--horizontal .el-menu .el-menu-item,.el-menu--horizontal .el-menu .el-sub-menu__title{background-color:var(--el-menu-bg-color);height:var(--el-menu-horizontal-sub-item-height);line-height:var(--el-menu-horizontal-sub-item-height);color:var(--el-menu-text-color);align-items:center;padding:0 10px;display:flex}.el-menu--horizontal .el-menu .el-sub-menu__title{padding-right:40px}.el-menu--horizontal .el-menu .el-menu-item.is-active,.el-menu--horizontal .el-menu .el-menu-item.is-active:hover,.el-menu--horizontal .el-menu .el-sub-menu.is-active>.el-sub-menu__title,.el-menu--horizontal .el-menu .el-sub-menu.is-active>.el-sub-menu__title:hover{color:var(--el-menu-active-color)}.el-menu--horizontal .el-menu-item:not(.is-disabled):hover,.el-menu--horizontal .el-menu-item:not(.is-disabled):focus{color:var(--el-menu-active-color,var(--el-menu-hover-text-color));background-color:var(--el-menu-hover-bg-color);outline:none}.el-menu--horizontal>.el-menu-item.is-active{border-bottom:2px solid var(--el-menu-active-color);color:var(--el-menu-active-color)!important}.el-menu--collapse{width:calc(var(--el-menu-icon-width) + var(--el-menu-base-level-padding) * 2)}.el-menu--collapse>.el-menu-item [class^=el-icon],.el-menu--collapse>.el-sub-menu>.el-sub-menu__title [class^=el-icon],.el-menu--collapse>.el-menu-item-group>ul>.el-sub-menu>.el-sub-menu__title [class^=el-icon]{vertical-align:middle;width:var(--el-menu-icon-width);text-align:center;margin:0}.el-menu--collapse>.el-menu-item .el-sub-menu__icon-arrow,.el-menu--collapse>.el-sub-menu>.el-sub-menu__title .el-sub-menu__icon-arrow,.el-menu--collapse>.el-menu-item-group>ul>.el-sub-menu>.el-sub-menu__title .el-sub-menu__icon-arrow{display:none}.el-menu--collapse>.el-menu-item>span,.el-menu--collapse>.el-sub-menu>.el-sub-menu__title>span,.el-menu--collapse>.el-menu-item-group>ul>.el-sub-menu>.el-sub-menu__title>span{visibility:hidden;width:0;height:0;display:inline-block;overflow:hidden}.el-menu--collapse>.el-menu-item.is-active i{color:inherit}.el-menu--collapse .el-menu .el-sub-menu{min-width:200px}.el-menu--collapse .el-sub-menu.is-active .el-sub-menu__title{color:var(--el-menu-active-color)}.el-menu--popup{z-index:100;border-radius:var(--el-border-radius-small);min-width:200px;box-shadow:var(--el-box-shadow-light);border:none;padding:5px 0}.el-menu .el-icon{flex-shrink:0}.el-menu-item{height:var(--el-menu-item-height);line-height:var(--el-menu-item-height);font-size:var(--el-menu-item-font-size);color:var(--el-menu-text-color);padding:0 var(--el-menu-base-level-padding);cursor:pointer;transition:border-color var(--el-transition-duration),background-color var(--el-transition-duration),color var(--el-transition-duration);box-sizing:border-box;white-space:nowrap;align-items:center;list-style:none;display:flex;position:relative}.el-menu-item *{vertical-align:bottom}.el-menu-item i{color:inherit}.el-menu-item:hover,.el-menu-item:focus{outline:none}.el-menu-item:hover{background-color:var(--el-menu-hover-bg-color)}.el-menu-item.is-disabled{opacity:.25;cursor:not-allowed;background:0 0!important}.el-menu-item [class^=el-icon]{width:var(--el-menu-icon-width);text-align:center;vertical-align:middle;margin-right:5px;font-size:18px}.el-menu-item.is-active{color:var(--el-menu-active-color)}.el-menu-item.is-active i{color:inherit}.el-menu-item .el-menu-tooltip__trigger{box-sizing:border-box;width:100%;height:100%;padding:0 var(--el-menu-base-level-padding);align-items:center;display:inline-flex;position:absolute;top:0;left:0}.el-sub-menu{margin:0;padding-left:0;list-style:none}.el-sub-menu__title{height:var(--el-menu-item-height);line-height:var(--el-menu-item-height);font-size:var(--el-menu-item-font-size);color:var(--el-menu-text-color);padding:0 var(--el-menu-base-level-padding);cursor:pointer;transition:border-color var(--el-transition-duration),background-color var(--el-transition-duration),color var(--el-transition-duration);box-sizing:border-box;white-space:nowrap;align-items:center;list-style:none;display:flex;position:relative}.el-sub-menu__title *{vertical-align:bottom}.el-sub-menu__title i{color:inherit}.el-sub-menu__title:hover,.el-sub-menu__title:focus{outline:none}.el-sub-menu__title.is-disabled{opacity:.25;cursor:not-allowed;background:0 0!important}.el-sub-menu__title:hover{background-color:var(--el-menu-hover-bg-color)}.el-sub-menu .el-menu{border:none}.el-sub-menu .el-menu-item{height:var(--el-menu-sub-item-height);line-height:var(--el-menu-sub-item-height)}.el-sub-menu.el-sub-menu__hide-arrow .el-sub-menu__title{padding-right:var(--el-menu-base-level-padding)}.el-sub-menu__hide-arrow .el-sub-menu__icon-arrow{display:none!important}.el-sub-menu.is-active .el-sub-menu__title{border-bottom-color:var(--el-menu-active-color)}.el-sub-menu.is-disabled .el-sub-menu__title,.el-sub-menu.is-disabled .el-menu-item{opacity:.25;cursor:not-allowed;background:0 0!important}.el-sub-menu .el-icon{vertical-align:middle;width:var(--el-menu-icon-width);text-align:center;margin-right:5px;font-size:18px}.el-sub-menu .el-icon.el-sub-menu__icon-more{margin-right:0!important}.el-sub-menu .el-sub-menu__icon-arrow{top:50%;right:var(--el-menu-base-level-padding);transition:transform var(--el-transition-duration);width:inherit;margin-top:-6px;margin-right:0;font-size:12px;position:absolute}.el-menu-item-group>ul{padding:0}.el-menu-item-group__title{padding:7px 0 7px var(--el-menu-base-level-padding);color:var(--el-text-color-secondary);font-size:12px;line-height:normal}.horizontal-collapse-transition .el-sub-menu__title .el-sub-menu__icon-arrow{transition:var(--el-transition-duration-fast);opacity:0}.el-popper,.el-menu--popup-container,.el-menu{outline:none}.el-message-box{--el-messagebox-title-color:var(--el-text-color-primary);--el-messagebox-width:420px;--el-messagebox-border-radius:4px;--el-messagebox-box-shadow:var(--el-box-shadow);--el-messagebox-font-size:var(--el-font-size-large);--el-messagebox-content-font-size:var(--el-font-size-base);--el-messagebox-content-color:var(--el-text-color-regular);--el-messagebox-error-font-size:12px;--el-messagebox-padding-primary:12px;--el-messagebox-font-line-height:var(--el-font-line-height-primary);max-width:var(--el-messagebox-width);width:100%;padding:var(--el-messagebox-padding-primary);vertical-align:middle;background-color:var(--el-bg-color);border-radius:var(--el-messagebox-border-radius);font-size:var(--el-messagebox-font-size);box-shadow:var(--el-messagebox-box-shadow);text-align:left;-webkit-backface-visibility:hidden;backface-visibility:hidden;box-sizing:border-box;overflow-wrap:break-word;display:inline-block;position:relative;overflow:hidden}.el-message-box:focus{outline:none!important}.is-message-box .el-overlay-message-box{text-align:center;padding:16px;position:fixed;inset:0;overflow:auto}.is-message-box .el-overlay-message-box:after{content:"";vertical-align:middle;width:0;height:100%;display:inline-block}.el-message-box.is-draggable .el-message-box__header{cursor:move;-webkit-user-select:none;user-select:none}.el-message-box__header{padding-bottom:var(--el-messagebox-padding-primary)}.el-message-box__header.show-close{padding-right:calc(var(--el-messagebox-padding-primary) + var(--el-message-close-size,16px))}.el-message-box__title{font-size:var(--el-messagebox-font-size);line-height:var(--el-messagebox-font-line-height);color:var(--el-messagebox-title-color)}.el-message-box__headerbtn{width:40px;height:40px;font-size:var(--el-message-close-size,16px);cursor:pointer;background:0 0;border:none;outline:none;padding:0;position:absolute;top:0;right:0}.el-message-box__headerbtn .el-message-box__close{color:var(--el-color-info);font-size:inherit}.el-message-box__headerbtn:focus .el-message-box__close,.el-message-box__headerbtn:hover .el-message-box__close{color:var(--el-color-primary)}.el-message-box__content{color:var(--el-messagebox-content-color);font-size:var(--el-messagebox-content-font-size)}.el-message-box__container{align-items:center;gap:12px;display:flex}.el-message-box__input{padding-top:12px}.el-message-box__input div.invalid>input,.el-message-box__input div.invalid>input:focus{border-color:var(--el-color-error)}.el-message-box__status{font-size:24px}.el-message-box__status.el-message-box-icon--primary{--el-messagebox-color:var(--el-color-primary);color:var(--el-messagebox-color)}.el-message-box__status.el-message-box-icon--success{--el-messagebox-color:var(--el-color-success);color:var(--el-messagebox-color)}.el-message-box__status.el-message-box-icon--info{--el-messagebox-color:var(--el-color-info);color:var(--el-messagebox-color)}.el-message-box__status.el-message-box-icon--warning{--el-messagebox-color:var(--el-color-warning);color:var(--el-messagebox-color)}.el-message-box__status.el-message-box-icon--error{--el-messagebox-color:var(--el-color-error);color:var(--el-messagebox-color)}.el-message-box__message{min-width:0;margin:0}.el-message-box__message p{line-height:var(--el-messagebox-font-line-height);margin:0}.el-message-box__errormsg{color:var(--el-color-error);font-size:var(--el-messagebox-error-font-size);line-height:var(--el-messagebox-font-line-height)}.el-message-box__btns{padding-top:var(--el-messagebox-padding-primary);flex-wrap:wrap;justify-content:flex-end;align-items:center;display:flex}.el-message-box--center .el-message-box__title{justify-content:center;align-items:center;gap:6px;display:flex}.el-message-box--center .el-message-box__status{font-size:inherit}.el-message-box--center .el-message-box__btns,.el-message-box--center .el-message-box__container{justify-content:center}.el-message-box-parent--hidden{overflow:hidden}.fade-in-linear-enter-active .el-overlay-message-box{animation:msgbox-fade-in var(--el-transition-duration)}.fade-in-linear-leave-active .el-overlay-message-box{animation:msgbox-fade-in var(--el-transition-duration) reverse}@keyframes msgbox-fade-in{0%{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translate(0)}}.el-message{--el-message-bg-color:var(--el-color-info-light-9);--el-message-border-color:var(--el-border-color-lighter);--el-message-padding:11px 15px;--el-message-close-size:16px;--el-message-close-icon-color:var(--el-text-color-placeholder);--el-message-close-hover-color:var(--el-text-color-secondary);box-sizing:border-box;border-radius:var(--el-border-radius-base);border-width:var(--el-border-width);border-style:var(--el-border-style);border-color:var(--el-message-border-color);background-color:var(--el-message-bg-color);width:max-content;max-width:calc(100% - 32px);transition:opacity var(--el-transition-duration),transform .4s,top .4s,bottom .4s;padding:var(--el-message-padding);align-items:center;gap:8px;display:flex;position:fixed}.el-message.is-left{left:16px}.el-message.is-right{right:16px}.el-message.is-center{left:50%;transform:translate(-50%)}.el-message.is-plain{background-color:var(--el-bg-color-overlay);border-color:var(--el-bg-color-overlay);box-shadow:var(--el-box-shadow-light)}.el-message p{margin:0}.el-message--primary{--el-message-bg-color:var(--el-color-primary-light-9);--el-message-border-color:var(--el-color-primary-light-8);--el-message-text-color:var(--el-color-primary)}.el-message--primary .el-message__content{color:var(--el-message-text-color);overflow-wrap:break-word}.el-message .el-message-icon--primary{color:var(--el-message-text-color)}.el-message--success{--el-message-bg-color:var(--el-color-success-light-9);--el-message-border-color:var(--el-color-success-light-8);--el-message-text-color:var(--el-color-success)}.el-message--success .el-message__content{color:var(--el-message-text-color);overflow-wrap:break-word}.el-message .el-message-icon--success{color:var(--el-message-text-color)}.el-message--info{--el-message-bg-color:var(--el-color-info-light-9);--el-message-border-color:var(--el-color-info-light-8);--el-message-text-color:var(--el-color-info)}.el-message--info .el-message__content{color:var(--el-message-text-color);overflow-wrap:break-word}.el-message .el-message-icon--info{color:var(--el-message-text-color)}.el-message--warning{--el-message-bg-color:var(--el-color-warning-light-9);--el-message-border-color:var(--el-color-warning-light-8);--el-message-text-color:var(--el-color-warning)}.el-message--warning .el-message__content{color:var(--el-message-text-color);overflow-wrap:break-word}.el-message .el-message-icon--warning{color:var(--el-message-text-color)}.el-message--error{--el-message-bg-color:var(--el-color-error-light-9);--el-message-border-color:var(--el-color-error-light-8);--el-message-text-color:var(--el-color-error)}.el-message--error .el-message__content{color:var(--el-message-text-color);overflow-wrap:break-word}.el-message .el-message-icon--error{color:var(--el-message-text-color)}.el-message .el-message__badge{position:absolute;top:-8px;right:-8px}.el-message__content{padding:0;font-size:14px;line-height:1}.el-message__content:focus{outline-width:0}.el-message .el-message__closeBtn{cursor:pointer;color:var(--el-message-close-icon-color);font-size:var(--el-message-close-size)}.el-message .el-message__closeBtn:focus{outline-width:0}.el-message .el-message__closeBtn:hover{color:var(--el-message-close-hover-color)}.el-message-fade-enter-from,.el-message-fade-leave-to{opacity:0}.el-message-fade-enter-from.is-left,.el-message-fade-enter-from.is-right,.el-message-fade-leave-to.is-left,.el-message-fade-leave-to.is-right{transform:translateY(-100%)}.el-message-fade-enter-from.is-left.is-bottom,.el-message-fade-enter-from.is-right.is-bottom,.el-message-fade-leave-to.is-left.is-bottom,.el-message-fade-leave-to.is-right.is-bottom{transform:translateY(100%)}.el-message-fade-enter-from.is-center,.el-message-fade-leave-to.is-center{transform:translate(-50%,-100%)}.el-message-fade-enter-from.is-center.is-bottom,.el-message-fade-leave-to.is-center.is-bottom{transform:translate(-50%,100%)}.el-notification{--el-notification-width:330px;--el-notification-padding:14px 26px 14px 13px;--el-notification-radius:8px;--el-notification-shadow:var(--el-box-shadow-light);--el-notification-border-color:var(--el-border-color-lighter);--el-notification-icon-size:24px;--el-notification-close-font-size:var(--el-message-close-size,16px);--el-notification-group-margin-left:13px;--el-notification-group-margin-right:8px;--el-notification-content-font-size:var(--el-font-size-base);--el-notification-content-color:var(--el-text-color-regular);--el-notification-title-font-size:16px;--el-notification-title-color:var(--el-text-color-primary);--el-notification-close-color:var(--el-text-color-secondary);--el-notification-close-hover-color:var(--el-text-color-regular);width:var(--el-notification-width);padding:var(--el-notification-padding);border-radius:var(--el-notification-radius);box-sizing:border-box;border:1px solid var(--el-notification-border-color);background-color:var(--el-bg-color-overlay);box-shadow:var(--el-notification-shadow);transition:opacity var(--el-transition-duration),transform var(--el-transition-duration),left var(--el-transition-duration),right var(--el-transition-duration),top .4s,bottom var(--el-transition-duration);overflow-wrap:break-word;z-index:9999;display:flex;position:fixed;overflow:hidden}.el-notification.right{right:16px}.el-notification.left{left:16px}.el-notification__group{min-width:0;margin-left:var(--el-notification-group-margin-left);margin-right:var(--el-notification-group-margin-right);flex:1}.el-notification__title{font-weight:700;font-size:var(--el-notification-title-font-size);line-height:var(--el-notification-icon-size);color:var(--el-notification-title-color);margin:0}.el-notification__content{font-size:var(--el-notification-content-font-size);color:var(--el-notification-content-color);margin:6px 0 0;line-height:24px}.el-notification__content p{margin:0}.el-notification .el-notification__icon{height:var(--el-notification-icon-size);width:var(--el-notification-icon-size);font-size:var(--el-notification-icon-size);flex-shrink:0}.el-notification .el-notification__closeBtn{cursor:pointer;color:var(--el-notification-close-color);font-size:var(--el-notification-close-font-size);position:absolute;top:18px;right:15px}.el-notification .el-notification__closeBtn:hover{color:var(--el-notification-close-hover-color)}.el-notification .el-notification--primary{--el-notification-icon-color:var(--el-color-primary);color:var(--el-notification-icon-color)}.el-notification .el-notification--success{--el-notification-icon-color:var(--el-color-success);color:var(--el-notification-icon-color)}.el-notification .el-notification--info{--el-notification-icon-color:var(--el-color-info);color:var(--el-notification-icon-color)}.el-notification .el-notification--warning{--el-notification-icon-color:var(--el-color-warning);color:var(--el-notification-icon-color)}.el-notification .el-notification--error{--el-notification-icon-color:var(--el-color-error);color:var(--el-notification-icon-color)}.el-notification-fade-enter-from.right{right:0;transform:translate(100%)}.el-notification-fade-enter-from.left{left:0;transform:translate(-100%)}.el-notification-fade-leave-to{opacity:0}.el-overlay{z-index:2000;background-color:var(--el-overlay-color-lighter);height:100%;position:fixed;inset:0;overflow:auto}.el-overlay .el-overlay-root{height:0}.el-page-header.is-contentful .el-page-header__main{border-top:1px solid var(--el-border-color-light);margin-top:16px}.el-page-header__header{justify-content:space-between;align-items:center;line-height:24px;display:flex}.el-page-header__left{align-items:center;margin-right:40px;display:flex;position:relative}.el-page-header__back{cursor:pointer;align-items:center;display:flex}.el-page-header__left .el-divider--vertical{margin:0 16px}.el-page-header__icon{align-items:center;margin-right:10px;font-size:16px;display:flex}.el-page-header__icon .el-icon{font-size:inherit}.el-page-header__title{font-size:14px;font-weight:500}.el-page-header__content{color:var(--el-text-color-primary);font-size:18px}.el-page-header__breadcrumb{margin-bottom:16px}.el-pagination{--el-pagination-font-size:14px;--el-pagination-bg-color:var(--el-fill-color-blank);--el-pagination-text-color:var(--el-text-color-primary);--el-pagination-border-radius:2px;--el-pagination-button-color:var(--el-text-color-primary);--el-pagination-button-width:32px;--el-pagination-button-height:32px;--el-pagination-button-disabled-color:var(--el-text-color-placeholder);--el-pagination-button-disabled-bg-color:var(--el-fill-color-blank);--el-pagination-button-bg-color:var(--el-fill-color);--el-pagination-hover-color:var(--el-color-primary);--el-pagination-font-size-small:12px;--el-pagination-button-width-small:24px;--el-pagination-button-height-small:24px;--el-pagination-button-width-large:40px;--el-pagination-button-height-large:40px;--el-pagination-item-gap:16px;white-space:nowrap;color:var(--el-pagination-text-color);font-size:var(--el-pagination-font-size);align-items:center;font-weight:400;display:flex}.el-pagination .el-input__inner{text-align:center;-moz-appearance:textfield}.el-pagination .el-select{width:128px}.el-pagination .btn-prev,.el-pagination .btn-next{font-size:var(--el-pagination-font-size);min-width:var(--el-pagination-button-width);height:var(--el-pagination-button-height);line-height:var(--el-pagination-button-height);color:var(--el-pagination-button-color);background:var(--el-pagination-bg-color);border-radius:var(--el-pagination-border-radius);cursor:pointer;text-align:center;box-sizing:border-box;border:none;justify-content:center;align-items:center;padding:0 4px;display:flex}.el-pagination .btn-prev *,.el-pagination .btn-next *{pointer-events:none}.el-pagination .btn-prev:focus,.el-pagination .btn-next:focus{outline:none}.el-pagination .btn-prev:hover,.el-pagination .btn-next:hover{color:var(--el-pagination-hover-color)}.el-pagination .btn-prev.is-active,.el-pagination .btn-next.is-active{color:var(--el-pagination-hover-color);cursor:default;font-weight:700}.el-pagination .btn-prev.is-active.is-disabled,.el-pagination .btn-next.is-active.is-disabled{color:var(--el-text-color-secondary);font-weight:700}.el-pagination .btn-prev:disabled,.el-pagination .btn-prev.is-disabled,.el-pagination .btn-next:disabled,.el-pagination .btn-next.is-disabled{color:var(--el-pagination-button-disabled-color);background-color:var(--el-pagination-button-disabled-bg-color);cursor:not-allowed}.el-pagination .btn-prev:focus-visible{outline:1px solid var(--el-pagination-hover-color);outline-offset:-1px}.el-pagination .btn-next:focus-visible{outline:1px solid var(--el-pagination-hover-color);outline-offset:-1px}.el-pagination .btn-prev .el-icon,.el-pagination .btn-next .el-icon{width:inherit;font-size:12px;font-weight:700;display:block}.el-pagination>.is-first{margin-left:0!important}.el-pagination>.is-last{margin-right:0!important}.el-pagination .btn-prev{margin-left:var(--el-pagination-item-gap)}.el-pagination__sizes,.el-pagination__total{margin-left:var(--el-pagination-item-gap);color:var(--el-text-color-regular);font-weight:400}.el-pagination__total[disabled=true]{color:var(--el-text-color-placeholder)}.el-pagination__jump{margin-left:var(--el-pagination-item-gap);color:var(--el-text-color-regular);align-items:center;font-weight:400;display:flex}.el-pagination__jump[disabled=true]{color:var(--el-text-color-placeholder)}.el-pagination__goto{margin-right:8px}.el-pagination__editor{text-align:center;box-sizing:border-box}.el-pagination__editor.el-input{width:56px}.el-pagination__editor .el-input__inner::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.el-pagination__editor .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-pagination__classifier{margin-left:8px}.el-pagination__rightwrapper{flex:1;justify-content:flex-end;align-items:center;display:flex}.el-pagination.is-background .btn-prev,.el-pagination.is-background .btn-next,.el-pagination.is-background .el-pager li{background-color:var(--el-pagination-button-bg-color);margin:0 4px}.el-pagination.is-background .btn-prev.is-active,.el-pagination.is-background .btn-next.is-active,.el-pagination.is-background .el-pager li.is-active{background-color:var(--el-color-primary);color:var(--el-color-white)}.el-pagination.is-background .btn-prev:disabled,.el-pagination.is-background .btn-prev.is-disabled,.el-pagination.is-background .btn-next:disabled,.el-pagination.is-background .btn-next.is-disabled,.el-pagination.is-background .el-pager li:disabled,.el-pagination.is-background .el-pager li.is-disabled{color:var(--el-text-color-placeholder);background-color:var(--el-disabled-bg-color)}.el-pagination.is-background .btn-prev:disabled.is-active,.el-pagination.is-background .btn-prev.is-disabled.is-active,.el-pagination.is-background .btn-next:disabled.is-active,.el-pagination.is-background .btn-next.is-disabled.is-active,.el-pagination.is-background .el-pager li:disabled.is-active,.el-pagination.is-background .el-pager li.is-disabled.is-active{color:var(--el-text-color-secondary);background-color:var(--el-fill-color-dark)}.el-pagination.is-background .btn-prev{margin-left:var(--el-pagination-item-gap)}.el-pagination--small .btn-prev,.el-pagination--small .btn-next,.el-pagination--small .el-pager li{height:var(--el-pagination-button-height-small);line-height:var(--el-pagination-button-height-small);font-size:var(--el-pagination-font-size-small);min-width:var(--el-pagination-button-width-small)}.el-pagination--small span:not([class*=suffix]),.el-pagination--small button{font-size:var(--el-pagination-font-size-small)}.el-pagination--small .el-select{width:100px}.el-pagination--large .btn-prev,.el-pagination--large .btn-next,.el-pagination--large .el-pager li{height:var(--el-pagination-button-height-large);line-height:var(--el-pagination-button-height-large);min-width:var(--el-pagination-button-width-large)}.el-pagination--large .el-select .el-input{width:160px}.el-pager{-webkit-user-select:none;user-select:none;align-items:center;margin:0;padding:0;font-size:0;list-style:none;display:flex}.el-pager li{font-size:var(--el-pagination-font-size);min-width:var(--el-pagination-button-width);height:var(--el-pagination-button-height);line-height:var(--el-pagination-button-height);color:var(--el-pagination-button-color);background:var(--el-pagination-bg-color);border-radius:var(--el-pagination-border-radius);cursor:pointer;text-align:center;box-sizing:border-box;border:none;justify-content:center;align-items:center;padding:0 4px;display:flex}.el-pager li *{pointer-events:none}.el-pager li:focus{outline:none}.el-pager li:hover{color:var(--el-pagination-hover-color)}.el-pager li.is-active{color:var(--el-pagination-hover-color);cursor:default;font-weight:700}.el-pager li.is-active.is-disabled{color:var(--el-text-color-secondary);font-weight:700}.el-pager li:disabled,.el-pager li.is-disabled{color:var(--el-pagination-button-disabled-color);background-color:var(--el-pagination-button-disabled-bg-color);cursor:not-allowed}.el-pager li:focus-visible{outline:1px solid var(--el-pagination-hover-color);outline-offset:-1px}.el-popconfirm{outline:none}.el-popconfirm__main{align-items:center;display:flex}.el-popconfirm__icon{margin-right:5px}.el-popconfirm__action{text-align:right;margin-top:8px}.el-popover{--el-popover-bg-color:var(--el-bg-color-overlay);--el-popover-font-size:var(--el-font-size-base);--el-popover-border-color:var(--el-border-color-lighter);--el-popover-padding:12px;--el-popover-padding-large:18px 20px;--el-popover-title-font-size:16px;--el-popover-title-text-color:var(--el-text-color-primary);--el-popover-border-radius:4px}.el-popover.el-popper{background:var(--el-popover-bg-color);border-radius:var(--el-popover-border-radius);border:1px solid var(--el-popover-border-color);min-width:150px;padding:var(--el-popover-padding);z-index:var(--el-index-popper);color:var(--el-text-color-regular);line-height:1.4;font-size:var(--el-popover-font-size);box-shadow:var(--el-box-shadow-light);overflow-wrap:break-word;box-sizing:border-box}.el-popover.el-popper--plain{padding:var(--el-popover-padding-large)}.el-popover__title{color:var(--el-popover-title-text-color);font-size:var(--el-popover-title-font-size);margin-bottom:12px;line-height:1}.el-popover__reference:focus:not(.focusing),.el-popover__reference:focus:hover{outline-width:0}.el-popover.el-popper.is-dark{--el-popover-bg-color:var(--el-text-color-primary);--el-popover-border-color:var(--el-text-color-primary);--el-popover-title-text-color:var(--el-bg-color);color:var(--el-bg-color)}.el-popover.el-popper:focus:active,.el-popover.el-popper:focus{outline-width:0}.el-progress{align-items:center;line-height:1;display:flex;position:relative}.el-progress__text{color:var(--el-text-color-regular);min-width:50px;margin-left:5px;font-size:14px;line-height:1}.el-progress__text i{vertical-align:middle;display:block}.el-progress--circle,.el-progress--dashboard{display:inline-block}.el-progress--circle .el-progress__text,.el-progress--dashboard .el-progress__text{text-align:center;width:100%;margin:0;position:absolute;top:50%;left:0;transform:translateY(-50%)}.el-progress--circle .el-progress__text i,.el-progress--dashboard .el-progress__text i{vertical-align:middle;display:inline-block}.el-progress--without-text .el-progress__text{display:none}.el-progress--without-text .el-progress-bar{margin-right:0;padding-right:0;display:block}.el-progress--text-inside .el-progress-bar{margin-right:0;padding-right:0}.el-progress.is-success .el-progress-bar__inner{background-color:var(--el-color-success)}.el-progress.is-success .el-progress__text{color:var(--el-color-success)}.el-progress.is-warning .el-progress-bar__inner{background-color:var(--el-color-warning)}.el-progress.is-warning .el-progress__text{color:var(--el-color-warning)}.el-progress.is-exception .el-progress-bar__inner{background-color:var(--el-color-danger)}.el-progress.is-exception .el-progress__text{color:var(--el-color-danger)}.el-progress-bar{box-sizing:border-box;flex-grow:1}.el-progress-bar__outer{background-color:var(--el-border-color-lighter);vertical-align:middle;border-radius:100px;height:6px;position:relative;overflow:hidden}.el-progress-bar__inner{background-color:var(--el-color-primary);text-align:right;white-space:nowrap;border-radius:100px;height:100%;line-height:1;transition:width .6s;position:absolute;top:0;left:0}.el-progress-bar__inner:after{content:"";vertical-align:middle;height:100%;display:inline-block}.el-progress-bar__inner--indeterminate{animation:3s infinite indeterminate;transform:translateZ(0)}.el-progress-bar__inner--striped{background-image:linear-gradient(45deg,#0000001a 25%,#0000 25% 50%,#0000001a 50% 75%,#0000 75%,#0000);background-size:1.25em 1.25em}.el-progress-bar__inner--striped.el-progress-bar__inner--striped-flow{animation:3s linear infinite striped-flow}.el-progress-bar__innerText{vertical-align:middle;color:#fff;margin:0 5px;font-size:12px;display:inline-block}@keyframes progress{0%{background-position:0 0}to{background-position:32px 0}}@keyframes indeterminate{0%{left:-100%}to{left:100%}}@keyframes striped-flow{0%{background-position:-100%}to{background-position:100%}}.el-radio-button{--el-radio-button-checked-bg-color:var(--el-color-primary);--el-radio-button-checked-text-color:var(--el-color-white);--el-radio-button-checked-border-color:var(--el-color-primary);--el-radio-button-disabled-checked-fill:var(--el-border-color-extra-light);outline:none;display:inline-block;position:relative}.el-radio-button__inner{white-space:nowrap;vertical-align:middle;background:var(--el-button-bg-color,var(--el-fill-color-blank));outline:var(--el-border);line-height:1;font-weight:var(--el-button-font-weight,var(--el-font-weight-primary));color:var(--el-button-text-color,var(--el-text-color-regular));-webkit-appearance:none;text-align:center;box-sizing:border-box;cursor:pointer;transition:var(--el-transition-all);-webkit-user-select:none;user-select:none;font-size:var(--el-font-size-base);border-radius:0;margin:0;padding:8px 15px;display:inline-block;position:relative}.el-radio-button__inner.is-round{padding:8px 15px}.el-radio-button__inner:hover{color:var(--el-color-primary)}.el-radio-button__inner [class*=el-icon-]{line-height:.9}.el-radio-button__inner [class*=el-icon-]+span{margin-left:5px}.el-radio-button:first-child .el-radio-button__inner{border-radius:var(--el-border-radius-base) 0 0 var(--el-border-radius-base);box-shadow:none!important}.el-radio-button.is-active .el-radio-button__original-radio:not(:disabled)+.el-radio-button__inner{color:var(--el-radio-button-checked-text-color,var(--el-color-white));background-color:var(--el-radio-button-checked-bg-color,var(--el-color-primary));border-color:var(--el-radio-button-checked-border-color,var(--el-color-primary));box-shadow:-1px 0 0 0 var(--el-radio-button-checked-border-color,var(--el-color-primary))}.el-radio-button__original-radio{opacity:0;z-index:-1;outline:none;position:absolute}.el-radio-button__original-radio:focus-visible+.el-radio-button__inner{border-left:var(--el-border);border-left-color:var(--el-radio-button-checked-border-color,var(--el-color-primary));outline:2px solid var(--el-radio-button-checked-border-color);outline-offset:1px;z-index:2;border-radius:var(--el-border-radius-base);box-shadow:none}.el-radio-button__original-radio:disabled+.el-radio-button__inner{color:var(--el-disabled-text-color);cursor:not-allowed;background-image:none;background-color:var(--el-button-disabled-bg-color,var(--el-fill-color-blank));border-color:var(--el-button-disabled-border-color,var(--el-border-color-light));box-shadow:none}.el-radio-button__original-radio:disabled:checked+.el-radio-button__inner{background-color:var(--el-radio-button-disabled-checked-fill)}.el-radio-button:last-child .el-radio-button__inner{border-radius:0 var(--el-border-radius-base) var(--el-border-radius-base) 0}.el-radio-button:first-child:last-child .el-radio-button__inner{border-radius:var(--el-border-radius-base)}.el-radio-button--large .el-radio-button__inner{font-size:var(--el-font-size-base);border-radius:0;padding:12px 19px}.el-radio-button--large .el-radio-button__inner.is-round{padding:12px 19px}.el-radio-button--small .el-radio-button__inner{border-radius:0;padding:5px 11px;font-size:12px}.el-radio-button--small .el-radio-button__inner.is-round{padding:5px 11px}.el-radio-group{flex-wrap:wrap;align-items:center;font-size:0;display:inline-flex}.el-radio{--el-radio-font-size:var(--el-font-size-base);--el-radio-text-color:var(--el-text-color-regular);--el-radio-font-weight:var(--el-font-weight-primary);--el-radio-input-height:14px;--el-radio-input-width:14px;--el-radio-input-border-radius:var(--el-border-radius-circle);--el-radio-input-bg-color:var(--el-fill-color-blank);--el-radio-input-border:var(--el-border);--el-radio-input-border-color:var(--el-border-color);--el-radio-input-border-color-hover:var(--el-color-primary);color:var(--el-radio-text-color);font-weight:var(--el-radio-font-weight);cursor:pointer;white-space:nowrap;font-size:var(--el-font-size-base);-webkit-user-select:none;user-select:none;outline:none;align-items:center;height:32px;margin-right:30px;display:inline-flex;position:relative}.el-radio.el-radio--large{height:40px}.el-radio.el-radio--small{height:24px}.el-radio.is-bordered{border-radius:var(--el-border-radius-base);border:var(--el-border);box-sizing:border-box;padding:0 15px 0 9px}.el-radio.is-bordered.is-checked{border-color:var(--el-color-primary)}.el-radio.is-bordered.is-disabled{cursor:not-allowed;border-color:var(--el-border-color-lighter)}.el-radio.is-bordered.el-radio--large{border-radius:var(--el-border-radius-base);padding:0 19px 0 11px}.el-radio.is-bordered.el-radio--large .el-radio__label{font-size:var(--el-font-size-base)}.el-radio.is-bordered.el-radio--large .el-radio__inner{width:14px;height:14px}.el-radio.is-bordered.el-radio--small{border-radius:var(--el-border-radius-base);padding:0 11px 0 7px}.el-radio.is-bordered.el-radio--small .el-radio__label{font-size:12px}.el-radio.is-bordered.el-radio--small .el-radio__inner{width:12px;height:12px}.el-radio:last-child{margin-right:0}.el-radio__input{white-space:nowrap;cursor:pointer;vertical-align:middle;outline:none;display:inline-flex;position:relative}.el-radio__input.is-disabled .el-radio__inner{background-color:var(--el-disabled-bg-color);border-color:var(--el-disabled-border-color);cursor:not-allowed}.el-radio__input.is-disabled .el-radio__inner:after{cursor:not-allowed;background-color:var(--el-disabled-bg-color)}.el-radio__input.is-disabled .el-radio__inner+.el-radio__label{cursor:not-allowed}.el-radio__input.is-disabled.is-checked .el-radio__inner{background-color:var(--el-disabled-bg-color);border-color:var(--el-disabled-border-color)}.el-radio__input.is-disabled.is-checked .el-radio__inner:after{background-color:var(--el-text-color-placeholder)}.el-radio__input.is-disabled+span.el-radio__label{color:var(--el-text-color-placeholder);cursor:not-allowed}.el-radio__input.is-checked .el-radio__inner{border-color:var(--el-color-primary);background:var(--el-color-primary)}.el-radio__input.is-checked .el-radio__inner:after{background-color:var(--el-color-white);transform:translate(-50%,-50%)scale(1)}.el-radio__input.is-checked+.el-radio__label{color:var(--el-color-primary)}.el-radio__input.is-focus .el-radio__inner{border-color:var(--el-radio-input-border-color-hover)}.el-radio__inner{border:var(--el-radio-input-border);border-radius:var(--el-radio-input-border-radius);width:var(--el-radio-input-width);height:var(--el-radio-input-height);background-color:var(--el-radio-input-bg-color);cursor:pointer;box-sizing:border-box;transition:all .3s;display:inline-block;position:relative}.el-radio__inner:hover{border-color:var(--el-radio-input-border-color-hover)}.el-radio__inner:after{border-radius:var(--el-radio-input-border-radius);content:"";width:4px;height:4px;transition:transform .15s ease-in;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)scale(0)}.el-radio__original{opacity:0;z-index:-1;outline:none;margin:0;position:absolute;inset:0}.el-radio__original:focus-visible+.el-radio__inner{outline:2px solid var(--el-radio-input-border-color-hover);outline-offset:1px;border-radius:var(--el-radio-input-border-radius)}.el-radio:focus:not(:focus-visible):not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner{box-shadow:0 0 2px 2px var(--el-radio-input-border-color-hover)}.el-radio__label{font-size:var(--el-radio-font-size);padding-left:8px}.el-radio.el-radio--large .el-radio__label{font-size:14px}.el-radio.el-radio--large .el-radio__inner{width:14px;height:14px}.el-radio.el-radio--small .el-radio__label{font-size:12px}.el-radio.el-radio--small .el-radio__inner{width:12px;height:12px}.el-rate{--el-rate-height:20px;--el-rate-font-size:var(--el-font-size-base);--el-rate-icon-size:18px;--el-rate-icon-margin:6px;--el-rate-void-color:var(--el-border-color-darker);--el-rate-fill-color:#f7ba2a;--el-rate-disabled-void-color:var(--el-fill-color);--el-rate-text-color:var(--el-text-color-primary);--el-rate-outline-color:var(--el-color-primary-light-5);align-items:center;height:32px;display:inline-flex}.el-rate:focus,.el-rate:active{outline:none}.el-rate:focus-visible .el-rate__item .el-rate__icon.is-focus-visible{outline:2px solid var(--el-rate-outline-color);transition:outline-offset,outline}.el-rate__item{cursor:pointer;vertical-align:middle;color:var(--el-rate-void-color);font-size:0;line-height:normal;display:inline-block;position:relative}.el-rate .el-rate__icon{font-size:var(--el-rate-icon-size);margin-right:var(--el-rate-icon-margin);transition:var(--el-transition-duration);display:inline-block;position:relative}.el-rate .el-rate__icon.hover{transform:scale(1.15)}.el-rate .el-rate__icon .path2{position:absolute;top:0;left:0}.el-rate .el-rate__icon.is-active{color:var(--el-rate-fill-color)}.el-rate__decimal{color:var(--el-rate-fill-color);display:inline-block;position:absolute;top:0;left:0;overflow:hidden}.el-rate__decimal--box{position:absolute;top:0;left:0}.el-rate__text{font-size:var(--el-rate-font-size);vertical-align:middle;color:var(--el-rate-text-color)}.el-rate--large{height:40px}.el-rate--small{height:24px}.el-rate--small .el-rate__icon{font-size:14px}.el-rate.is-disabled .el-rate__item{cursor:not-allowed;color:var(--el-rate-disabled-void-color)}.el-result{--el-result-padding:40px 30px;--el-result-icon-font-size:64px;--el-result-title-font-size:20px;--el-result-title-margin-top:20px;--el-result-subtitle-margin-top:10px;--el-result-extra-margin-top:30px;text-align:center;box-sizing:border-box;padding:var(--el-result-padding);flex-direction:column;justify-content:center;align-items:center;display:flex}.el-result__icon svg{width:var(--el-result-icon-font-size);height:var(--el-result-icon-font-size)}.el-result__title{margin-top:var(--el-result-title-margin-top)}.el-result__title p{font-size:var(--el-result-title-font-size);color:var(--el-text-color-primary);margin:0;line-height:1.3}.el-result__subtitle{margin-top:var(--el-result-subtitle-margin-top)}.el-result__subtitle p{font-size:var(--el-font-size-base);color:var(--el-text-color-regular);margin:0;line-height:1.3}.el-result__extra{margin-top:var(--el-result-extra-margin-top)}.el-result .icon-primary{--el-result-color:var(--el-color-primary);color:var(--el-result-color)}.el-result .icon-success{--el-result-color:var(--el-color-success);color:var(--el-result-color)}.el-result .icon-warning{--el-result-color:var(--el-color-warning);color:var(--el-result-color)}.el-result .icon-danger{--el-result-color:var(--el-color-danger);color:var(--el-result-color)}.el-result .icon-error{--el-result-color:var(--el-color-error);color:var(--el-result-color)}.el-result .icon-info{--el-result-color:var(--el-color-info);color:var(--el-result-color)}.el-row{box-sizing:border-box;flex-wrap:wrap;display:flex;position:relative}.el-row.is-justify-center{justify-content:center}.el-row.is-justify-end{justify-content:flex-end}.el-row.is-justify-space-between{justify-content:space-between}.el-row.is-justify-space-around{justify-content:space-around}.el-row.is-justify-space-evenly{justify-content:space-evenly}.el-row.is-align-top{align-items:flex-start}.el-row.is-align-middle{align-items:center}.el-row.is-align-bottom{align-items:flex-end}.el-scrollbar{--el-scrollbar-opacity:.3;--el-scrollbar-bg-color:var(--el-text-color-secondary);--el-scrollbar-hover-opacity:.5;--el-scrollbar-hover-bg-color:var(--el-text-color-secondary);height:100%;position:relative;overflow:hidden}.el-scrollbar__wrap{height:100%;overflow:auto}.el-scrollbar__wrap--hidden-default{scrollbar-width:none}.el-scrollbar__wrap--hidden-default::-webkit-scrollbar{display:none}.el-scrollbar__thumb{cursor:pointer;border-radius:inherit;background-color:var(--el-scrollbar-bg-color,var(--el-text-color-secondary));width:0;height:0;transition:var(--el-transition-duration) background-color;opacity:var(--el-scrollbar-opacity,.3);display:block;position:relative}.el-scrollbar__thumb:hover{background-color:var(--el-scrollbar-hover-bg-color,var(--el-text-color-secondary));opacity:var(--el-scrollbar-hover-opacity,.5)}.el-scrollbar__bar{z-index:1;border-radius:4px;position:absolute;bottom:2px;right:2px}.el-scrollbar__bar.is-vertical{width:6px;top:2px}.el-scrollbar__bar.is-vertical>div{width:100%}.el-scrollbar__bar.is-horizontal{height:6px;left:2px}.el-scrollbar__bar.is-horizontal>div{height:100%}.el-scrollbar-fade-enter-active{transition:opacity .34s ease-out}.el-scrollbar-fade-leave-active{transition:opacity .12s ease-out}.el-scrollbar-fade-enter-from,.el-scrollbar-fade-leave-active{opacity:0}.el-select-dropdown{z-index:calc(var(--el-index-top) + 1);border-radius:var(--el-border-radius-base);box-sizing:border-box}.el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list{padding:0}.el-select-dropdown__loading,.el-select-dropdown__empty{text-align:center;color:var(--el-text-color-secondary);font-size:var(--el-select-font-size);margin:0;padding:10px 0}.el-select-dropdown__wrap{max-height:274px}.el-select-dropdown__list{box-sizing:border-box;margin:0;padding:6px 0;list-style:none}.el-select-dropdown__list.el-vl__window{margin:6px 0;padding:0}.el-select-dropdown__header{border-bottom:1px solid var(--el-border-color-light);padding:10px}.el-select-dropdown__footer{border-top:1px solid var(--el-border-color-light);padding:10px}.el-select-dropdown__item{font-size:var(--el-font-size-base);white-space:nowrap;text-overflow:ellipsis;color:var(--el-text-color-regular);box-sizing:border-box;cursor:pointer;height:34px;padding:0 32px 0 20px;line-height:34px;position:relative;overflow:hidden}.el-select-dropdown__item.is-hovering{background-color:var(--el-fill-color-light)}.el-select-dropdown__item.is-selected{color:var(--el-color-primary);font-weight:700}.el-select-dropdown__item.is-disabled{color:var(--el-text-color-placeholder);cursor:not-allowed;background-color:unset}.el-select-dropdown.is-multiple .el-select-dropdown__item.is-selected:after{content:"";background-position:50%;background-repeat:no-repeat;background-color:var(--el-color-primary);-webkit-mask:url("data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E") 0 0/100% 100% no-repeat;mask:url("data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E") 0 0/100% 100% no-repeat;border-top:none;border-right:none;width:12px;height:12px;position:absolute;top:50%;right:20px;transform:translateY(-50%);-webkit-mask:url("data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E") 0 0/100% 100% no-repeat}.el-select-dropdown.is-multiple .el-select-dropdown__item.is-disabled:after{background-color:var(--el-text-color-placeholder)}.el-select-group{margin:0;padding:0}.el-select-group__wrap{margin:0;padding:0;list-style:none;position:relative}.el-select-group__title{box-sizing:border-box;color:var(--el-color-info);text-overflow:ellipsis;white-space:nowrap;padding:0 20px;font-size:12px;line-height:34px;overflow:hidden}.el-select-group .el-select-dropdown__item{padding-left:20px}.el-select{--el-select-border-color-hover:var(--el-border-color-hover);--el-select-disabled-color:var(--el-disabled-text-color);--el-select-disabled-border:var(--el-disabled-border-color);--el-select-font-size:var(--el-font-size-base);--el-select-close-hover-color:var(--el-text-color-secondary);--el-select-input-color:var(--el-text-color-placeholder);--el-select-multiple-input-color:var(--el-text-color-regular);--el-select-input-focus-border-color:var(--el-color-primary);--el-select-input-font-size:14px;--el-select-width:100%;vertical-align:middle;width:var(--el-select-width);display:inline-block;position:relative}.el-select__wrapper{box-sizing:border-box;cursor:pointer;text-align:left;border-radius:var(--el-border-radius-base);background-color:var(--el-fill-color-blank);min-height:32px;transition:var(--el-transition-duration);box-shadow:0 0 0 1px var(--el-border-color) inset;align-items:center;gap:6px;padding:4px 12px;font-size:14px;line-height:24px;display:flex;position:relative;transform:translate(0)}.el-select__wrapper.is-filterable{cursor:text}.el-select__wrapper.is-focused{box-shadow:0 0 0 1px var(--el-color-primary) inset}.el-select__wrapper.is-hovering:not(.is-focused){box-shadow:0 0 0 1px var(--el-border-color-hover) inset}.el-select__wrapper.is-disabled{cursor:not-allowed;background-color:var(--el-fill-color-light);color:var(--el-text-color-placeholder);box-shadow:0 0 0 1px var(--el-select-disabled-border) inset}.el-select__wrapper.is-disabled:hover{box-shadow:0 0 0 1px var(--el-select-disabled-border) inset}.el-select__wrapper.is-disabled.is-focus{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset}.el-select__wrapper.is-disabled .el-select__selected-item{color:var(--el-select-disabled-color)}.el-select__wrapper.is-disabled .el-select__caret,.el-select__wrapper.is-disabled .el-tag,.el-select__wrapper.is-disabled input{cursor:not-allowed}.el-select__wrapper.is-disabled .el-select__prefix,.el-select__wrapper.is-disabled .el-select__suffix{pointer-events:none}.el-select__prefix,.el-select__suffix{color:var(--el-input-icon-color,var(--el-text-color-placeholder));flex-shrink:0;align-items:center;gap:6px;display:flex}.el-select__caret{color:var(--el-select-input-color);font-size:var(--el-select-input-font-size);transition:var(--el-transition-duration);cursor:pointer;transform:rotate(0)}.el-select__caret.is-reverse{transform:rotate(180deg)}.el-select__clear{cursor:pointer}.el-select__clear:hover{color:var(--el-select-close-hover-color)}.el-select__selection{flex-wrap:wrap;flex:1;align-items:center;gap:6px;min-width:0;display:flex;position:relative}.el-select__selection.is-near{margin-left:-8px}.el-select__selection .el-tag{cursor:pointer;border-color:#0000}.el-select__selection .el-tag.el-tag--plain{border-color:var(--el-tag-border-color)}.el-select__selection .el-tag .el-tag__content{min-width:0}.el-select__selected-item{-webkit-user-select:none;user-select:none;flex-wrap:wrap;display:flex}.el-select__tags-text{text-overflow:ellipsis;white-space:nowrap;line-height:normal;display:block;overflow:hidden}.el-select__placeholder{z-index:-1;text-overflow:ellipsis;white-space:nowrap;width:100%;color:var(--el-input-text-color,var(--el-text-color-regular));display:block;position:absolute;top:50%;overflow:hidden;transform:translateY(-50%)}.el-select__placeholder.is-transparent{-webkit-user-select:none;user-select:none;color:var(--el-text-color-placeholder)}.el-select__popper.el-popper{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light);box-shadow:var(--el-box-shadow-light)}.el-select__popper.el-popper .el-popper__arrow:before{border:1px solid var(--el-border-color-light)}.el-select__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-top-color:#0000;border-left-color:#0000}.el-select__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:#0000;border-right-color:#0000}.el-select__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-bottom-color:#0000;border-left-color:#0000}.el-select__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-top-color:#0000;border-right-color:#0000}.el-select__input-wrapper{flex:1}.el-select__input-wrapper.is-hidden{opacity:0;z-index:-1;position:absolute}.el-select__input{color:var(--el-select-multiple-input-color);font-size:inherit;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#0000;border:none;outline:none;width:100%;height:24px;padding:0;font-family:inherit}.el-select__input-calculator{visibility:hidden;white-space:pre;max-width:100%;position:absolute;top:0;left:0;overflow:hidden}.el-select--large .el-select__wrapper{gap:6px;min-height:40px;padding:8px 16px;font-size:14px;line-height:24px}.el-select--large .el-select__selection{gap:6px}.el-select--large .el-select__selection.is-near{margin-left:-8px}.el-select--large .el-select__prefix,.el-select--large .el-select__suffix{gap:6px}.el-select--large .el-select__input{height:24px}.el-select--small .el-select__wrapper{gap:4px;min-height:24px;padding:2px 8px;font-size:12px;line-height:20px}.el-select--small .el-select__selection{gap:4px}.el-select--small .el-select__selection.is-near{margin-left:-6px}.el-select--small .el-select__prefix,.el-select--small .el-select__suffix{gap:4px}.el-select--small .el-select__input{height:20px}.el-skeleton{--el-skeleton-circle-size:var(--el-avatar-size)}.el-skeleton__item{background:var(--el-skeleton-color);border-radius:var(--el-border-radius-base);width:100%;height:16px;display:inline-block}.el-skeleton__circle{width:var(--el-skeleton-circle-size);height:var(--el-skeleton-circle-size);line-height:var(--el-skeleton-circle-size);border-radius:50%}.el-skeleton__button{border-radius:4px;width:64px;height:40px}.el-skeleton__p{width:100%}.el-skeleton__p.is-last{width:61%}.el-skeleton__p.is-first{width:33%}.el-skeleton__text{width:100%;height:var(--el-font-size-small)}.el-skeleton__caption{height:var(--el-font-size-extra-small)}.el-skeleton__h1{height:var(--el-font-size-extra-large)}.el-skeleton__h3{height:var(--el-font-size-large)}.el-skeleton__h5{height:var(--el-font-size-medium)}.el-skeleton__image{width:unset;border-radius:0;justify-content:center;align-items:center;display:flex}.el-skeleton__image svg{color:var(--el-svg-monochrome-grey);fill:currentColor;width:22%;height:22%}.el-skeleton{--el-skeleton-color:var(--el-fill-color);--el-skeleton-to-color:var(--el-fill-color-darker)}@keyframes el-skeleton-loading{0%{background-position:100%}to{background-position:0}}.el-skeleton{width:100%}.el-skeleton__first-line,.el-skeleton__paragraph{background:var(--el-skeleton-color);height:16px;margin-top:16px}.el-skeleton.is-animated .el-skeleton__item{background:linear-gradient(90deg,var(--el-skeleton-color) 25%,var(--el-skeleton-to-color) 37%,var(--el-skeleton-color) 63%);background-size:400% 100%;animation:1.4s infinite el-skeleton-loading}.el-slider{--el-slider-main-bg-color:var(--el-color-primary);--el-slider-runway-bg-color:var(--el-border-color-light);--el-slider-stop-bg-color:var(--el-color-white);--el-slider-disabled-color:var(--el-text-color-placeholder);--el-slider-border-radius:3px;--el-slider-height:6px;--el-slider-button-size:20px;--el-slider-button-wrapper-size:36px;--el-slider-button-wrapper-offset:-15px;align-items:center;width:100%;height:32px;display:flex}.el-slider__runway{height:var(--el-slider-height);background-color:var(--el-slider-runway-bg-color);border-radius:var(--el-slider-border-radius);cursor:pointer;flex:1;position:relative}.el-slider__runway.show-input{width:auto;margin-right:30px}.el-slider__runway.is-disabled{cursor:default}.el-slider__runway.is-disabled .el-slider__bar{background-color:var(--el-slider-disabled-color)}.el-slider__runway.is-disabled .el-slider__button{border-color:var(--el-slider-disabled-color)}.el-slider__runway.is-disabled .el-slider__button-wrapper:hover,.el-slider__runway.is-disabled .el-slider__button-wrapper.hover,.el-slider__runway.is-disabled .el-slider__button-wrapper.dragging{cursor:not-allowed}.el-slider__runway.is-disabled .el-slider__button:hover,.el-slider__runway.is-disabled .el-slider__button.hover,.el-slider__runway.is-disabled .el-slider__button.dragging{cursor:not-allowed;transform:scale(1)}.el-slider__input{flex-shrink:0;width:130px}.el-slider__bar{height:var(--el-slider-height);background-color:var(--el-slider-main-bg-color);border-top-left-radius:var(--el-slider-border-radius);border-bottom-left-radius:var(--el-slider-border-radius);position:absolute}.el-slider__button-wrapper{height:var(--el-slider-button-wrapper-size);width:var(--el-slider-button-wrapper-size);z-index:1;top:var(--el-slider-button-wrapper-offset);text-align:center;-webkit-user-select:none;user-select:none;background-color:#0000;outline:none;line-height:normal;position:absolute;transform:translate(-50%)}.el-slider__button-wrapper:after{content:"";vertical-align:middle;height:100%;display:inline-block}.el-slider__button-wrapper:hover,.el-slider__button-wrapper.hover{cursor:grab}.el-slider__button-wrapper.dragging{cursor:grabbing}.el-slider__button{width:var(--el-slider-button-size);height:var(--el-slider-button-size);vertical-align:middle;border:solid 2px var(--el-slider-main-bg-color);background-color:var(--el-color-white);box-sizing:border-box;transition:var(--el-transition-duration-fast);-webkit-user-select:none;user-select:none;border-radius:50%;display:inline-block}.el-slider__button:hover,.el-slider__button.hover,.el-slider__button.dragging{transform:scale(1.2)}.el-slider__button:hover,.el-slider__button.hover{cursor:grab}.el-slider__button.dragging{cursor:grabbing}.el-slider__stop{height:var(--el-slider-height);width:var(--el-slider-height);border-radius:var(--el-border-radius-circle);background-color:var(--el-slider-stop-bg-color);position:absolute;transform:translate(-50%)}.el-slider__marks{width:18px;height:100%;top:0;left:12px}.el-slider__marks-text{color:var(--el-color-info);white-space:pre;margin-top:15px;font-size:14px;position:absolute;transform:translate(-50%)}.el-slider.is-vertical{flex:0;width:auto;height:100%;display:inline-flex;position:relative}.el-slider.is-vertical .el-slider__runway{width:var(--el-slider-height);height:100%;margin:0 16px}.el-slider.is-vertical .el-slider__bar{width:var(--el-slider-height);border-radius:0 0 3px 3px;height:auto}.el-slider.is-vertical .el-slider__button-wrapper{top:auto;left:var(--el-slider-button-wrapper-offset);transform:translateY(50%)}.el-slider.is-vertical .el-slider__stop{transform:translateY(50%)}.el-slider.is-vertical .el-slider__marks-text{margin-top:0;left:15px;transform:translateY(50%)}.el-slider--large{height:40px}.el-slider--small{height:24px}.el-space{vertical-align:top;display:inline-flex}.el-space__item{flex-wrap:wrap;display:flex}.el-space__item>*{flex:1}.el-space--vertical{flex-direction:column}.el-time-spinner{white-space:nowrap;width:100%}.el-spinner{vertical-align:middle;display:inline-block}.el-spinner-inner{width:50px;height:50px;animation:2s linear infinite rotate}.el-spinner-inner .path{stroke:var(--el-border-color-lighter);stroke-linecap:round;animation:1.5s ease-in-out infinite dash}@keyframes rotate{to{transform:rotate(360deg)}}@keyframes dash{0%{stroke-dasharray:1 150;stroke-dashoffset:0}50%{stroke-dasharray:90 150;stroke-dashoffset:-35px}to{stroke-dasharray:90 150;stroke-dashoffset:-124px}}.el-step{flex-shrink:1;position:relative}.el-step:last-of-type .el-step__line{display:none}.el-step:last-of-type.is-flex{flex-grow:0;flex-shrink:0;flex-basis:auto!important}.el-step:last-of-type .el-step__main,.el-step:last-of-type .el-step__description{padding-right:0}.el-step__head{width:100%;position:relative}.el-step__head.is-process{color:var(--el-text-color-primary);border-color:var(--el-text-color-primary)}.el-step__head.is-wait{color:var(--el-text-color-placeholder);border-color:var(--el-text-color-placeholder)}.el-step__head.is-success{color:var(--el-color-success);border-color:var(--el-color-success)}.el-step__head.is-error{color:var(--el-color-danger);border-color:var(--el-color-danger)}.el-step__head.is-finish{color:var(--el-color-primary);border-color:var(--el-color-primary)}.el-step__icon{z-index:1;box-sizing:border-box;background:var(--el-bg-color);justify-content:center;align-items:center;width:24px;height:24px;font-size:14px;transition:all .15s ease-out;display:inline-flex;position:relative}.el-step__icon.is-text{border:2px solid;border-radius:50%}.el-step__icon.is-icon{width:40px}.el-step__icon-inner{-webkit-user-select:none;user-select:none;text-align:center;color:inherit;font-weight:700;line-height:1;display:inline-block}.el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:25px;font-weight:400}.el-step__icon-inner.is-status{transform:translateY(1px)}.el-step__line{background-color:var(--el-text-color-placeholder);border-color:currentColor;position:absolute}.el-step__line-inner{box-sizing:border-box;border:1px solid;width:0;height:0;transition:all .15s ease-out;display:block}.el-step__main{white-space:normal;text-align:left}.el-step__title{font-size:16px;line-height:38px}.el-step__title.is-process{color:var(--el-text-color-primary);font-weight:700}.el-step__title.is-wait{color:var(--el-text-color-placeholder)}.el-step__title.is-success{color:var(--el-color-success)}.el-step__title.is-error{color:var(--el-color-danger)}.el-step__title.is-finish{color:var(--el-color-primary)}.el-step__description{margin-top:-5px;padding-right:10%;font-size:12px;font-weight:400;line-height:20px}.el-step__description.is-process{color:var(--el-text-color-primary)}.el-step__description.is-wait{color:var(--el-text-color-placeholder)}.el-step__description.is-success{color:var(--el-color-success)}.el-step__description.is-error{color:var(--el-color-danger)}.el-step__description.is-finish{color:var(--el-color-primary)}.el-step.is-horizontal{display:inline-block}.el-step.is-horizontal .el-step__line{height:2px;top:11px;left:0;right:0}.el-step.is-vertical{display:flex}.el-step.is-vertical .el-step__head{flex-grow:0;width:24px}.el-step.is-vertical .el-step__main{flex-grow:1;padding-left:10px}.el-step.is-vertical .el-step__title{padding-bottom:8px;line-height:24px}.el-step.is-vertical .el-step__line{width:2px;top:0;bottom:0;left:11px}.el-step.is-vertical .el-step__icon.is-icon{width:24px}.el-step.is-vertical .el-step__description{padding-right:0}.el-step.is-center .el-step__head,.el-step.is-center .el-step__main{text-align:center}.el-step.is-center .el-step__description{padding-left:20%;padding-right:20%}.el-step.is-center .el-step__line{left:50%;right:-50%}.el-step.is-simple{align-items:center;display:flex}.el-step.is-simple .el-step__head{width:auto;padding-right:10px;font-size:0}.el-step.is-simple .el-step__icon{background:0 0;width:16px;height:16px;font-size:12px}.el-step.is-simple .el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:18px}.el-step.is-simple .el-step__icon-inner.is-status{transform:scale(.8)translateY(1px)}.el-step.is-simple .el-step__main{flex-grow:1;align-items:stretch;display:flex;position:relative}.el-step.is-simple .el-step__title{font-size:16px;line-height:20px}.el-step.is-simple:not(:last-of-type) .el-step__title{overflow-wrap:break-word;max-width:50%}.el-step.is-simple .el-step__arrow{flex-grow:1;justify-content:center;align-items:center;display:flex}.el-step.is-simple .el-step__arrow:before,.el-step.is-simple .el-step__arrow:after{content:"";background:var(--el-text-color-placeholder);width:1px;height:15px;display:inline-block;position:absolute}.el-step.is-simple .el-step__arrow:before{transform-origin:0 0;transform:rotate(-45deg)translateY(-4px)}.el-step.is-simple .el-step__arrow:after{transform-origin:100% 100%;transform:rotate(45deg)translateY(4px)}.el-step.is-simple:last-of-type .el-step__arrow{display:none}.el-steps{line-height:normal;display:flex}.el-steps--simple{background:var(--el-fill-color-light);border-radius:4px;padding:13px 8%}.el-steps--horizontal{white-space:nowrap}.el-steps--vertical{flex-flow:column;height:100%}.el-switch{--el-switch-on-color:var(--el-color-primary);--el-switch-off-color:var(--el-border-color);vertical-align:middle;align-items:center;height:32px;font-size:14px;line-height:20px;display:inline-flex;position:relative}.el-switch.is-disabled .el-switch__core,.el-switch.is-disabled .el-switch__label{cursor:not-allowed}.el-switch__label{transition:var(--el-transition-duration-fast);cursor:pointer;vertical-align:middle;height:20px;color:var(--el-text-color-primary);font-size:14px;font-weight:500;display:inline-block}.el-switch__label.is-active{color:var(--el-color-primary)}.el-switch__label--left{margin-right:10px}.el-switch__label--right{margin-left:10px}.el-switch__label *{font-size:14px;line-height:1;display:inline-block}.el-switch__label .el-icon{height:inherit}.el-switch__label .el-icon svg{vertical-align:middle}.el-switch__input{opacity:0;width:0;height:0;margin:0;position:absolute}.el-switch__input:focus-visible~.el-switch__core{outline:2px solid var(--el-switch-on-color);outline-offset:1px}.el-switch__core{border:1px solid var(--el-switch-border-color,var(--el-switch-off-color));box-sizing:border-box;background:var(--el-switch-off-color);cursor:pointer;min-width:40px;height:20px;transition:border-color var(--el-transition-duration),background-color var(--el-transition-duration);border-radius:10px;outline:none;align-items:center;display:inline-flex;position:relative}.el-switch__core .el-switch__inner{width:100%;transition:all var(--el-transition-duration);justify-content:center;align-items:center;height:16px;padding:0 4px 0 18px;display:flex;overflow:hidden}.el-switch__core .el-switch__inner-wrapper{color:var(--el-color-white);-webkit-user-select:none;user-select:none;text-overflow:ellipsis;white-space:nowrap;align-items:center;font-size:12px;display:flex;overflow:hidden}.el-switch__core .el-switch__action{border-radius:var(--el-border-radius-circle);transition:all var(--el-transition-duration);background-color:var(--el-color-white);width:16px;height:16px;color:var(--el-switch-off-color);justify-content:center;align-items:center;display:flex;position:absolute;left:1px}.el-switch.is-checked .el-switch__core{border-color:var(--el-switch-border-color,var(--el-switch-on-color));background-color:var(--el-switch-on-color)}.el-switch.is-checked .el-switch__core .el-switch__action{color:var(--el-switch-on-color);left:calc(100% - 17px)}.el-switch.is-checked .el-switch__core .el-switch__inner{padding:0 18px 0 4px}.el-switch.is-disabled{opacity:.6}.el-switch--wide .el-switch__label.el-switch__label--left span{left:10px}.el-switch--wide .el-switch__label.el-switch__label--right span{right:10px}.el-switch .label-fade-enter-from,.el-switch .label-fade-leave-active{opacity:0}.el-switch--large{height:40px;font-size:14px;line-height:24px}.el-switch--large .el-switch__label{height:24px;font-size:14px}.el-switch--large .el-switch__label *{font-size:14px}.el-switch--large .el-switch__core{border-radius:12px;min-width:50px;height:24px}.el-switch--large .el-switch__core .el-switch__inner{height:20px;padding:0 6px 0 22px}.el-switch--large .el-switch__core .el-switch__action{width:20px;height:20px}.el-switch--large.is-checked .el-switch__core .el-switch__action{left:calc(100% - 21px)}.el-switch--large.is-checked .el-switch__core .el-switch__inner{padding:0 22px 0 6px}.el-switch--small{height:24px;font-size:12px;line-height:16px}.el-switch--small .el-switch__label{height:16px;font-size:12px}.el-switch--small .el-switch__label *{font-size:12px}.el-switch--small .el-switch__core{border-radius:8px;min-width:30px;height:16px}.el-switch--small .el-switch__core .el-switch__inner{height:12px;padding:0 2px 0 14px}.el-switch--small .el-switch__core .el-switch__action{width:12px;height:12px}.el-switch--small.is-checked .el-switch__core .el-switch__action{left:calc(100% - 13px)}.el-switch--small.is-checked .el-switch__core .el-switch__inner{padding:0 14px 0 2px}.el-table-column--selection .cell{padding-left:14px;padding-right:14px}.el-table-filter{border:solid 1px var(--el-border-color-lighter);box-shadow:var(--el-box-shadow-light);box-sizing:border-box;background-color:#fff;border-radius:2px}.el-table-filter__list{outline:none;min-width:100px;margin:0;padding:5px 0;list-style:none}.el-table-filter__list-item{cursor:pointer;line-height:36px;font-size:var(--el-font-size-base);outline:none;padding:0 10px}.el-table-filter__list-item:hover,.el-table-filter__list-item:focus{background-color:var(--el-color-primary-light-9);color:var(--el-color-primary)}.el-table-filter__list-item.is-active{background-color:var(--el-color-primary);color:#fff}.el-table-filter__multiple{outline:none}.el-table-filter__content{min-width:100px}.el-table-filter__bottom{border-top:1px solid var(--el-border-color-lighter);padding:8px}.el-table-filter__bottom button{cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--el-border-radius-base);transition:transform var(--el-transition-duration-fast) ease-in-out;background-color:#0000;border:none;outline:none;margin:0;padding:0}.el-table-filter__bottom button:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-table-filter__bottom button{color:var(--el-text-color-regular);font-size:var(--el-font-size-small);padding:0 3px}.el-table-filter__bottom button:hover{color:var(--el-color-primary)}.el-table-filter__bottom button.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-table-filter__wrap{max-height:280px}.el-table-filter__checkbox-group{padding:10px}.el-table-filter__checkbox-group label.el-checkbox{height:unset;align-items:center;margin-bottom:12px;margin-left:5px;margin-right:5px;display:flex}.el-table-filter__checkbox-group .el-checkbox:last-child{margin-bottom:0}.el-table{--el-table-border-color:var(--el-border-color-lighter);--el-table-border:1px solid var(--el-table-border-color);--el-table-text-color:var(--el-text-color-regular);--el-table-header-text-color:var(--el-text-color-secondary);--el-table-row-hover-bg-color:var(--el-fill-color-light);--el-table-current-row-bg-color:var(--el-color-primary-light-9);--el-table-header-bg-color:var(--el-fill-color-blank);--el-table-fixed-box-shadow:var(--el-box-shadow-light);--el-table-bg-color:var(--el-fill-color-blank);--el-table-tr-bg-color:var(--el-fill-color-blank);--el-table-expanded-cell-bg-color:var(--el-fill-color-blank);--el-table-fixed-left-column:inset 10px 0 10px -10px #00000026;--el-table-fixed-right-column:inset -10px 0 10px -10px #00000026;--el-table-index:var(--el-index-normal);box-sizing:border-box;background-color:var(--el-table-bg-color);width:100%;max-width:100%;height:-moz-fit-content;height:fit-content;font-size:var(--el-font-size-base);color:var(--el-table-text-color);position:relative;overflow:hidden}.el-table__inner-wrapper{flex-direction:column;height:100%;display:flex;position:relative}.el-table__inner-wrapper:before{height:1px;bottom:0;left:0}.el-table tbody:focus-visible{outline:none}.el-table.has-footer.el-table--scrollable-y tr:last-child td.el-table__cell,.el-table.has-footer.el-table--fluid-height tr:last-child td.el-table__cell{border-bottom-color:#0000}.el-table__empty-block{text-align:center;justify-content:center;align-items:center;width:100%;min-height:60px;display:flex;position:sticky;left:0}.el-table__empty-text{width:50%;color:var(--el-text-color-secondary);line-height:60px}.el-table__expand-column .cell{text-align:center;-webkit-user-select:none;user-select:none;padding:0}.el-table__expand-icon{cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--el-border-radius-base);transition:transform var(--el-transition-duration-fast) ease-in-out;background-color:#0000;border:none;outline:none;margin:0;padding:0}.el-table__expand-icon:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:-2px}.el-table__expand-icon{color:var(--el-text-color-regular);width:min(23px,100%);height:23px;font-size:12px;line-height:12px}.el-table__expand-icon.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-table__expand-icon--expanded{transform:rotate(90deg)}.el-table__expand-icon>.el-icon{font-size:12px}.el-table__expanded-cell{background-color:var(--el-table-expanded-cell-bg-color)}.el-table__expanded-cell[class*=cell]{padding:20px 50px}.el-table__expanded-cell:hover{background-color:#0000!important}.el-table__placeholder{width:20px;display:inline-block}.el-table__append-wrapper{overflow:hidden}.el-table--fit{border-bottom:0;border-right:0}.el-table--fit .el-table__cell.gutter{border-right-width:1px}.el-table--fit .el-table__inner-wrapper:before{width:100%}.el-table thead{color:var(--el-table-header-text-color)}.el-table thead th{font-weight:600}.el-table thead.is-group th.el-table__cell{background:var(--el-fill-color-light)}.el-table .el-table__cell{box-sizing:border-box;text-overflow:ellipsis;vertical-align:middle;text-align:left;min-width:0;z-index:var(--el-table-index);padding:8px 0;position:relative}.el-table .el-table__cell.is-center{text-align:center}.el-table .el-table__cell.is-right{text-align:right}.el-table .el-table__cell.gutter{border-bottom-width:0;border-right-width:0;width:15px;padding:0}.el-table .el-table__cell.is-hidden>*{visibility:hidden}.el-table .cell{box-sizing:border-box;text-overflow:ellipsis;white-space:normal;overflow-wrap:break-word;padding:0 12px;line-height:23px;overflow:hidden}.el-table .cell.el-tooltip{white-space:nowrap;min-width:50px}.el-table--large{font-size:var(--el-font-size-base)}.el-table--large .el-table__cell{padding:12px 0}.el-table--large .cell{padding:0 16px}.el-table--default{font-size:var(--el-font-size-base)}.el-table--default .el-table__cell{padding:8px 0}.el-table--default .cell{padding:0 12px}.el-table--small{font-size:var(--el-font-size-extra-small)}.el-table--small .el-table__cell{padding:4px 0}.el-table--small .cell{padding:0 8px}.el-table tr{background-color:var(--el-table-tr-bg-color)}.el-table tr input[type=checkbox]{margin:0}.el-table th.el-table__cell.is-leaf,.el-table td.el-table__cell{border-bottom:var(--el-table-border)}.el-table th.el-table__cell.is-sortable{cursor:pointer}.el-table th.el-table__cell{background-color:var(--el-table-header-bg-color)}.el-table th.el-table__cell>.cell.highlight{color:var(--el-color-primary)}.el-table th.el-table__cell.required>div:before{content:"";vertical-align:middle;background:#ff4d51;border-radius:50%;width:8px;height:8px;margin-right:5px;display:inline-block}.el-table td.el-table__cell div{box-sizing:border-box}.el-table td.el-table__cell.gutter{width:0}.el-table--border:after,.el-table--border:before,.el-table--border .el-table__inner-wrapper:after,.el-table__inner-wrapper:before{content:"";background-color:var(--el-table-border-color);z-index:calc(var(--el-table-index) + 2);position:absolute}.el-table--border .el-table__inner-wrapper:after{width:100%;height:1px;z-index:calc(var(--el-table-index) + 2);top:0;left:0}.el-table--border:before{width:1px;height:100%;top:-1px;left:0}.el-table--border:after{width:1px;height:100%;top:-1px;right:0}.el-table--border .el-table__inner-wrapper{border-bottom:none;border-right:none}.el-table--border .el-table__footer-wrapper{flex-shrink:0;position:relative}.el-table--border .el-table__cell{border-right:var(--el-table-border)}.el-table--border th.el-table__cell.gutter:last-of-type{border-bottom:var(--el-table-border);border-bottom-width:1px}.el-table--border th.el-table__cell{border-bottom:var(--el-table-border)}.el-table--hidden{visibility:hidden}.el-table__header-wrapper,.el-table__body-wrapper,.el-table__footer-wrapper{width:100%}.el-table__header-wrapper tr td.el-table-fixed-column--left,.el-table__header-wrapper tr td.el-table-fixed-column--right,.el-table__header-wrapper tr th.el-table-fixed-column--left,.el-table__header-wrapper tr th.el-table-fixed-column--right,.el-table__body-wrapper tr td.el-table-fixed-column--left,.el-table__body-wrapper tr td.el-table-fixed-column--right,.el-table__body-wrapper tr th.el-table-fixed-column--left,.el-table__body-wrapper tr th.el-table-fixed-column--right,.el-table__footer-wrapper tr td.el-table-fixed-column--left,.el-table__footer-wrapper tr td.el-table-fixed-column--right,.el-table__footer-wrapper tr th.el-table-fixed-column--left,.el-table__footer-wrapper tr th.el-table-fixed-column--right{background:inherit;z-index:calc(var(--el-table-index) + 1);position:sticky!important}.el-table__header-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-first-column:before{content:"";width:10px;box-shadow:none;touch-action:none;pointer-events:none;position:absolute;top:0;bottom:0;overflow:hidden}.el-table__header-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-first-column:before{left:-10px}.el-table__header-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-last-column:before{right:-10px}.el-table__header-wrapper tr td.el-table__fixed-right-patch,.el-table__header-wrapper tr th.el-table__fixed-right-patch,.el-table__body-wrapper tr td.el-table__fixed-right-patch,.el-table__body-wrapper tr th.el-table__fixed-right-patch,.el-table__footer-wrapper tr td.el-table__fixed-right-patch,.el-table__footer-wrapper tr th.el-table__fixed-right-patch{z-index:calc(var(--el-table-index) + 1);background:#fff;right:0;position:sticky!important}.el-table__header-wrapper{flex-shrink:0}.el-table__header-wrapper tr th.el-table-fixed-column--left,.el-table__header-wrapper tr th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table__header,.el-table__body,.el-table__footer{table-layout:fixed;border-collapse:separate}.el-table__header-wrapper{overflow:hidden}.el-table__header-wrapper tbody td.el-table__cell{background-color:var(--el-table-row-hover-bg-color);color:var(--el-table-text-color)}.el-table__footer-wrapper{flex-shrink:0;overflow:hidden}.el-table__footer-wrapper tfoot td.el-table__cell{background-color:var(--el-table-row-hover-bg-color);color:var(--el-table-text-color)}.el-table__header-wrapper .el-table-column--selection>.cell,.el-table__body-wrapper .el-table-column--selection>.cell{align-items:center;height:23px;display:inline-flex}.el-table__header-wrapper .el-table-column--selection .el-checkbox,.el-table__body-wrapper .el-table-column--selection .el-checkbox{height:unset}.el-table.is-scrolling-left .el-table-fixed-column--right.is-first-column:before{box-shadow:var(--el-table-fixed-right-column)}.el-table.is-scrolling-left.el-table--border .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:var(--el-table-border)}.el-table.is-scrolling-left th.el-table-fixed-column--left{background-color:var(--el-table-header-bg-color)}.el-table.is-scrolling-right .el-table-fixed-column--left.is-last-column:before{box-shadow:var(--el-table-fixed-left-column)}.el-table.is-scrolling-right .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:none}.el-table.is-scrolling-right th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table.is-scrolling-middle .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:none}.el-table.is-scrolling-middle .el-table-fixed-column--right.is-first-column:before{box-shadow:var(--el-table-fixed-right-column)}.el-table.is-scrolling-middle .el-table-fixed-column--left.is-last-column:before{box-shadow:var(--el-table-fixed-left-column)}.el-table.is-scrolling-none .el-table-fixed-column--left.is-first-column:before,.el-table.is-scrolling-none .el-table-fixed-column--left.is-last-column:before,.el-table.is-scrolling-none .el-table-fixed-column--right.is-first-column:before,.el-table.is-scrolling-none .el-table-fixed-column--right.is-last-column:before{box-shadow:none}.el-table.is-scrolling-none th.el-table-fixed-column--left,.el-table.is-scrolling-none th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table__body-wrapper{flex:1;position:relative;overflow:hidden}.el-table__body-wrapper .el-scrollbar__bar{z-index:calc(var(--el-table-index) + 2)}.el-table .caret-wrapper{cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--el-border-radius-base);transition:transform var(--el-transition-duration-fast) ease-in-out;background-color:#0000;border:none;outline:none;margin:0;padding:0}.el-table .caret-wrapper:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-table .caret-wrapper{vertical-align:middle;width:24px;height:14px;overflow:initial;flex-direction:column;align-items:center;display:inline-flex;position:relative}.el-table .sort-caret{border:5px solid #0000;width:0;height:0;position:absolute;left:7px}.el-table .sort-caret.ascending{border-bottom-color:var(--el-text-color-placeholder);top:-5px}.el-table .sort-caret.descending{border-top-color:var(--el-text-color-placeholder);bottom:-3px}.el-table .ascending .sort-caret.ascending{border-bottom-color:var(--el-color-primary)}.el-table .descending .sort-caret.descending{border-top-color:var(--el-color-primary)}.el-table .hidden-columns{visibility:hidden;z-index:-1;position:absolute}.el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell{background:var(--el-fill-color-lighter)}.el-table--striped .el-table__body tr.el-table__row--striped.current-row td.el-table__cell{background-color:var(--el-table-current-row-bg-color)}.el-table__body tr.hover-row>td.el-table__cell,.el-table__body tr.hover-row.current-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped.current-row>td.el-table__cell,.el-table__body tr>td.hover-cell{background-color:var(--el-table-row-hover-bg-color)}.el-table__body tr.current-row>td.el-table__cell{background-color:var(--el-table-current-row-bg-color)}.el-table.el-table--scrollable-y .el-table__body-header{z-index:calc(var(--el-table-index) + 2);position:sticky;top:0}.el-table.el-table--scrollable-y .el-table__body-footer{z-index:calc(var(--el-table-index) + 2);position:sticky;bottom:0}.el-table__column-resize-proxy{border-left:var(--el-table-border);width:0;z-index:calc(var(--el-table-index) + 9);position:absolute;top:0;bottom:0;left:200px}.el-table__column-filter-trigger{cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--el-border-radius-base);transition:transform var(--el-transition-duration-fast) ease-in-out;background-color:#0000;border:none;outline:none;margin:0;padding:0}.el-table__column-filter-trigger:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-table__column-filter-trigger{display:inline-block}.el-table__column-filter-trigger i{color:var(--el-color-info);vertical-align:middle;font-size:14px}.el-table__border-left-patch{width:1px;height:100%;z-index:calc(var(--el-table-index) + 2);background-color:var(--el-table-border-color);position:absolute;top:0;left:0}.el-table__border-bottom-patch{height:1px;z-index:calc(var(--el-table-index) + 2);background-color:var(--el-table-border-color);position:absolute;left:0}.el-table__border-right-patch{width:1px;height:100%;z-index:calc(var(--el-table-index) + 2);background-color:var(--el-table-border-color);position:absolute;top:0}.el-table--enable-row-transition .el-table__body td.el-table__cell{transition:background-color .25s}.el-table--enable-row-hover .el-table__body tr:hover>td.el-table__cell{background-color:var(--el-table-row-hover-bg-color)}.el-table [class*=el-table__row--level] .el-table__expand-icon{text-align:center;width:20px;display:inline-block}.el-table .el-table.el-table--border .el-table__cell{border-right:var(--el-table-border)}.el-table:not(.el-table--border) .el-table__cell{border-right:none}.el-table:not(.el-table--border)>.el-table__inner-wrapper:after{content:none}.el-table-v2{--el-table-border-color:var(--el-border-color-lighter);--el-table-border:1px solid var(--el-table-border-color);--el-table-text-color:var(--el-text-color-regular);--el-table-header-text-color:var(--el-text-color-secondary);--el-table-row-hover-bg-color:var(--el-fill-color-light);--el-table-current-row-bg-color:var(--el-color-primary-light-9);--el-table-header-bg-color:var(--el-fill-color-blank);--el-table-fixed-box-shadow:var(--el-box-shadow-light);--el-table-bg-color:var(--el-fill-color-blank);--el-table-tr-bg-color:var(--el-fill-color-blank);--el-table-expanded-cell-bg-color:var(--el-fill-color-blank);--el-table-fixed-left-column:inset 10px 0 10px -10px #00000026;--el-table-fixed-right-column:inset -10px 0 10px -10px #00000026;--el-table-index:var(--el-index-normal);font-size:var(--el-font-size-base)}.el-table-v2 *{box-sizing:border-box}.el-table-v2__root{position:relative}.el-table-v2__root:hover .el-table-v2__main .el-virtual-scrollbar{opacity:1}.el-table-v2__main{background-color:var(--el-bg-color);flex-direction:column-reverse;display:flex;position:absolute;top:0;left:0;overflow:hidden}.el-table-v2__main .el-vl__horizontal,.el-table-v2__main .el-vl__vertical{z-index:2}.el-table-v2__left{background-color:var(--el-bg-color);flex-direction:column-reverse;display:flex;position:absolute;top:0;left:0;overflow:hidden;box-shadow:2px 0 4px #0000000f}.el-table-v2__left .el-virtual-scrollbar{opacity:0}.el-table-v2__left .el-vl__vertical,.el-table-v2__left .el-vl__horizontal{z-index:-1}.el-table-v2__right{background-color:var(--el-bg-color);flex-direction:column-reverse;display:flex;position:absolute;top:0;right:0;overflow:hidden;box-shadow:-2px 0 4px #0000000f}.el-table-v2__right .el-virtual-scrollbar{opacity:0}.el-table-v2__right .el-vl__vertical,.el-table-v2__right .el-vl__horizontal{z-index:-1}.el-table-v2__header-row,.el-table-v2__row{padding-inline-end:var(--el-table-scrollbar-size)}.el-table-v2__header-wrapper{overflow:hidden}.el-table-v2__header{position:relative;overflow:hidden}.el-table-v2__header .el-checkbox{z-index:0}.el-table-v2__footer{position:absolute;bottom:0;left:0;right:0;overflow:hidden}.el-table-v2__empty{position:absolute;left:0}.el-table-v2__overlay{z-index:9999;position:absolute;inset:0}.el-table-v2__header-row{border-bottom:var(--el-table-border);display:flex}.el-table-v2__header-cell{-webkit-user-select:none;user-select:none;background-color:var(--el-table-header-bg-color);height:100%;color:var(--el-table-header-text-color);align-items:center;padding:0 8px;font-weight:700;display:flex;overflow:hidden}.el-table-v2__header-cell.is-align-center{text-align:center;justify-content:center}.el-table-v2__header-cell.is-align-right{text-align:right;justify-content:flex-end}.el-table-v2__header-cell.is-sortable{cursor:pointer}.el-table-v2__header-cell:hover .el-icon{display:block}.el-table-v2__sort-icon{cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--el-border-radius-base);transition:transform var(--el-transition-duration-fast) ease-in-out;background-color:#0000;border:none;outline:none;margin:0;padding:0}.el-table-v2__sort-icon:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-table-v2__sort-icon{transition:opacity,display var(--el-transition-duration);opacity:.6;display:none}.el-table-v2__sort-icon.is-sorting{opacity:1;display:flex}.el-table-v2__row{border-bottom:var(--el-table-border);transition:background-color var(--el-transition-duration);align-items:center;display:flex}.el-table-v2__row.is-hovered,.el-table-v2__row:hover{background-color:var(--el-table-row-hover-bg-color)}.el-table-v2__row-cell{align-items:center;height:100%;padding:0 8px;display:flex;overflow:hidden}.el-table-v2__row-cell.is-align-center{text-align:center;justify-content:center}.el-table-v2__row-cell.is-align-right{text-align:right;justify-content:flex-end}.el-table-v2__expand-icon{cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--el-border-radius-base);transition:transform var(--el-transition-duration-fast) ease-in-out;background-color:#0000;border:none;outline:none;margin:0;padding:0}.el-table-v2__expand-icon:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-table-v2__expand-icon{-webkit-user-select:none;user-select:none;margin:0 4px}.el-table-v2__expand-icon svg{transition:transform var(--el-transition-duration)}.el-table-v2__expand-icon.is-expanded svg{transform:rotate(90deg)}.el-table-v2:not(.is-dynamic) .el-table-v2__cell-text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.el-table-v2.is-dynamic .el-table-v2__row{align-items:stretch;overflow:hidden}.el-table-v2.is-dynamic .el-table-v2__row .el-table-v2__row-cell{overflow-wrap:break-word}.el-tabs{--el-tabs-header-height:40px;display:flex}.el-tabs__header{justify-content:space-between;align-items:center;margin:0 0 15px;padding:0;display:flex;position:relative}.el-tabs__header-vertical{flex-direction:column}.el-tabs__active-bar{background-color:var(--el-color-primary);z-index:1;height:2px;transition:width var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier),transform var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier);list-style:none;position:absolute;bottom:0;left:0}.el-tabs__active-bar.is-bottom{bottom:auto}.el-tabs__new-tab{border:1px solid var(--el-border-color);text-align:center;width:20px;height:20px;color:var(--el-text-color-primary);cursor:pointer;border-radius:3px;flex-shrink:0;justify-content:center;align-items:center;margin:10px 0 10px 10px;font-size:12px;line-height:20px;transition:all .15s;display:flex}.el-tabs__new-tab .is-icon-plus{height:inherit;width:inherit;transform:scale(.8)}.el-tabs__new-tab .is-icon-plus svg{vertical-align:middle}.el-tabs__new-tab:hover{color:var(--el-color-primary)}.el-tabs__new-tab-vertical{margin-left:0}.el-tabs__nav-wrap{flex:auto;margin-bottom:-1px;position:relative;overflow:hidden}.el-tabs__nav-wrap:after{content:"";background-color:var(--el-border-color-light);width:100%;height:2px;z-index:var(--el-index-normal);position:absolute;bottom:0;left:0}.el-tabs__nav-wrap.is-bottom:after{top:0;bottom:auto}.el-tabs__nav-wrap.is-scrollable{box-sizing:border-box;padding:0 20px}.el-tabs__nav-scroll{overflow:hidden}.el-tabs__nav-next,.el-tabs__nav-prev{cursor:pointer;color:var(--el-text-color-secondary);text-align:center;width:20px;font-size:12px;line-height:44px;position:absolute}.el-tabs__nav-next.is-disabled,.el-tabs__nav-prev.is-disabled{color:var(--el-text-color-disabled);cursor:not-allowed}.el-tabs__nav-next{right:0}.el-tabs__nav-prev{left:0}.el-tabs__nav{white-space:nowrap;transition:transform var(--el-transition-duration);float:left;z-index:calc(var(--el-index-normal) + 1);display:flex;position:relative}.el-tabs__nav.is-stretch{min-width:100%;display:flex}.el-tabs__nav.is-stretch>*{text-align:center;flex:1}.el-tabs__item{height:var(--el-tabs-header-height);box-sizing:border-box;font-size:var(--el-font-size-base);color:var(--el-text-color-primary);justify-content:center;align-items:center;padding:0 20px;font-weight:500;list-style:none;display:flex;position:relative}.el-tabs__item:focus,.el-tabs__item:focus:active{outline:none}.el-tabs__item:focus-visible{box-shadow:0 0 2px 2px var(--el-color-primary) inset;border-radius:3px}.el-tabs__item .is-icon-close{text-align:center;transition:all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier);border-radius:50%;margin-left:5px}.el-tabs__item .is-icon-close:before{display:inline-block;transform:scale(.9)}.el-tabs__item .is-icon-close:hover{background-color:var(--el-text-color-placeholder);color:#fff}.el-tabs__item.is-active{color:var(--el-color-primary)}.el-tabs__item:hover{color:var(--el-color-primary);cursor:pointer}.el-tabs__item.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-tabs__content{flex-grow:1;position:relative;overflow:hidden}.el-tabs--top>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom>.el-tabs__header .el-tabs__item:nth-child(2){padding-left:0}.el-tabs--top>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom>.el-tabs__header .el-tabs__item:last-child{padding-right:0}.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2){padding-left:20px}.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:last-child{padding-right:20px}.el-tabs--card>.el-tabs__header{border-bottom:1px solid var(--el-border-color-light);height:var(--el-tabs-header-height);box-sizing:border-box}.el-tabs--card>.el-tabs__header .el-tabs__nav-wrap:after{content:none}.el-tabs--card>.el-tabs__header .el-tabs__nav{border:1px solid var(--el-border-color-light);box-sizing:border-box;border-bottom:none;border-radius:4px 4px 0 0}.el-tabs--card>.el-tabs__header .el-tabs__active-bar{display:none}.el-tabs--card>.el-tabs__header .el-tabs__item .is-icon-close{transform-origin:100%;width:0;height:14px;font-size:12px;position:relative;right:-2px;overflow:hidden}.el-tabs--card>.el-tabs__header .el-tabs__item{border-bottom:1px solid #0000;border-left:1px solid var(--el-border-color-light);transition:color var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier),padding var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier);margin-top:-1px}.el-tabs--card>.el-tabs__header .el-tabs__item:first-child{border-left:none}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover{padding-left:13px;padding-right:13px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover .is-icon-close{width:14px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active{border-bottom-color:var(--el-bg-color)}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable{padding-left:20px;padding-right:20px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable .is-icon-close{width:14px}.el-tabs--border-card{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color)}.el-tabs--border-card>.el-tabs__content{padding:15px}.el-tabs--border-card>.el-tabs__header{background-color:var(--el-fill-color-light);border-bottom:1px solid var(--el-border-color-light);margin:0}.el-tabs--border-card>.el-tabs__header .el-tabs__nav-wrap:after{content:none}.el-tabs--border-card>.el-tabs__header .el-tabs__item{transition:all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier);color:var(--el-text-color-secondary);border:1px solid #0000;margin-top:-1px}.el-tabs--border-card>.el-tabs__header .el-tabs__item:first-child,.el-tabs--border-card>.el-tabs__header .el-tabs__item+.el-tabs__item{margin-left:-1px}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active{color:var(--el-color-primary);background-color:var(--el-bg-color-overlay);border-right-color:var(--el-border-color);border-left-color:var(--el-border-color)}.el-tabs--border-card>.el-tabs__header .el-tabs__item:not(.is-disabled):hover{color:var(--el-color-primary)}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-disabled{color:var(--el-disabled-text-color)}.el-tabs--border-card>.el-tabs__header .is-scrollable .el-tabs__item:first-child{margin-left:0}.el-tabs--bottom{flex-direction:column}.el-tabs--bottom .el-tabs__header.is-bottom{margin-top:10px;margin-bottom:0}.el-tabs--bottom.el-tabs--border-card .el-tabs__header.is-bottom{border-bottom:0;border-top:1px solid var(--el-border-color)}.el-tabs--bottom.el-tabs--border-card .el-tabs__nav-wrap.is-bottom{margin-top:-1px;margin-bottom:0}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom:not(.is-active){border:1px solid #0000}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom{margin:0 -1px -1px}.el-tabs--left,.el-tabs--right{overflow:hidden}.el-tabs--left .el-tabs__header.is-left,.el-tabs--left .el-tabs__header.is-right,.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--left .el-tabs__nav-scroll,.el-tabs--right .el-tabs__header.is-left,.el-tabs--right .el-tabs__header.is-right,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__nav-scroll{height:100%}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__active-bar.is-right,.el-tabs--right .el-tabs__active-bar.is-left,.el-tabs--right .el-tabs__active-bar.is-right{width:2px;height:auto;top:0;bottom:auto}.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{margin-bottom:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next{text-align:center;cursor:pointer;width:100%;height:30px;line-height:30px}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i{transform:rotate(90deg)}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev.is-disabled,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next.is-disabled,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev.is-disabled,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next.is-disabled,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev.is-disabled,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next.is-disabled,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev.is-disabled,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next.is-disabled{cursor:not-allowed}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{top:0;left:auto}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next{bottom:0;right:auto}.el-tabs--left .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--left .el-tabs__nav-wrap.is-right.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-right.is-scrollable{padding:30px 0}.el-tabs--left .el-tabs__nav-wrap.is-left:after,.el-tabs--left .el-tabs__nav-wrap.is-right:after,.el-tabs--right .el-tabs__nav-wrap.is-left:after,.el-tabs--right .el-tabs__nav-wrap.is-right:after{width:2px;height:100%;top:0;bottom:auto}.el-tabs--left .el-tabs__nav.is-left,.el-tabs--left .el-tabs__nav.is-right,.el-tabs--right .el-tabs__nav.is-left,.el-tabs--right .el-tabs__nav.is-right{flex-direction:column}.el-tabs--left .el-tabs__item.is-left,.el-tabs--right .el-tabs__item.is-left{justify-content:flex-end}.el-tabs--left .el-tabs__item.is-right,.el-tabs--right .el-tabs__item.is-right{justify-content:flex-start}.el-tabs--left{flex-direction:row}.el-tabs--left .el-tabs__header.is-left{margin-bottom:0;margin-right:10px}.el-tabs--left .el-tabs__nav-wrap.is-left{margin-right:-1px}.el-tabs--left .el-tabs__nav-wrap.is-left:after,.el-tabs--left .el-tabs__active-bar.is-left{left:auto;right:0}.el-tabs--left .el-tabs__item.is-left{text-align:right}.el-tabs--left.el-tabs--card .el-tabs__active-bar.is-left{display:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left{border-left:none;border-right:1px solid var(--el-border-color-light);border-bottom:none;border-top:1px solid var(--el-border-color-light);text-align:left}.el-tabs--left.el-tabs--card .el-tabs__item.is-left:first-child{border-right:1px solid var(--el-border-color-light);border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active{border:1px solid var(--el-border-color-light);border-bottom:none;border-left:none;border-right-color:#fff}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:first-child{border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:last-child{border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__nav{border-bottom:1px solid var(--el-border-color-light);border-right:none;border-radius:4px 0 0 4px}.el-tabs--left.el-tabs--card .el-tabs__new-tab{float:none}.el-tabs--left.el-tabs--border-card .el-tabs__header.is-left{border-right:1px solid var(--el-border-color)}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left{border:1px solid #0000;margin:-1px 0 -1px -1px}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left.is-active{border-color:#d1dbe5 #0000}.el-tabs--left>.el-tabs__content+.el-tabs__header{order:-1}.el-tabs--right .el-tabs__header.is-right{margin-bottom:0;margin-left:10px}.el-tabs--right .el-tabs__nav-wrap.is-right{margin-left:-1px}.el-tabs--right .el-tabs__nav-wrap.is-right:after{left:0;right:auto}.el-tabs--right .el-tabs__active-bar.is-right{left:0}.el-tabs--right.el-tabs--card .el-tabs__active-bar.is-right{display:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right{border-bottom:none;border-top:1px solid var(--el-border-color-light)}.el-tabs--right.el-tabs--card .el-tabs__item.is-right:first-child{border-left:1px solid var(--el-border-color-light);border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active{border:1px solid var(--el-border-color-light);border-bottom:none;border-left-color:#fff;border-right:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:first-child{border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:last-child{border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__nav{border-bottom:1px solid var(--el-border-color-light);border-left:none;border-radius:0 4px 4px 0}.el-tabs--right.el-tabs--border-card .el-tabs__header.is-right{border-left:1px solid var(--el-border-color)}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right{border:1px solid #0000;margin:-1px -1px -1px 0}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right.is-active{border-color:#d1dbe5 #0000}.el-tabs--top{flex-direction:column}.el-tabs--top>.el-tabs__content+.el-tabs__header{order:-1}.slideInRight-transition,.slideInLeft-transition{display:inline-block}.slideInRight-enter{animation:slideInRight-enter var(--el-transition-duration)}.slideInRight-leave{animation:slideInRight-leave var(--el-transition-duration);position:absolute;left:0;right:0}.slideInLeft-enter{animation:slideInLeft-enter var(--el-transition-duration)}.slideInLeft-leave{animation:slideInLeft-leave var(--el-transition-duration);position:absolute;left:0;right:0}@keyframes slideInRight-enter{0%{opacity:0;transform-origin:0 0;transform:translate(100%)}to{opacity:1;transform-origin:0 0;transform:translate(0)}}@keyframes slideInRight-leave{0%{transform-origin:0 0;opacity:1;transform:translate(0)}to{transform-origin:0 0;opacity:0;transform:translate(100%)}}@keyframes slideInLeft-enter{0%{opacity:0;transform-origin:0 0;transform:translate(-100%)}to{opacity:1;transform-origin:0 0;transform:translate(0)}}@keyframes slideInLeft-leave{0%{transform-origin:0 0;opacity:1;transform:translate(0)}to{transform-origin:0 0;opacity:0;transform:translate(-100%)}}.el-tag{--el-tag-font-size:12px;--el-tag-border-radius:4px;--el-tag-border-radius-rounded:9999px;background-color:var(--el-tag-bg-color);border-color:var(--el-tag-border-color);color:var(--el-tag-text-color);vertical-align:middle;height:24px;font-size:var(--el-tag-font-size);border-radius:var(--el-tag-border-radius);box-sizing:border-box;white-space:nowrap;--el-icon-size:14px;--el-tag-bg-color:var(--el-color-primary-light-9);--el-tag-border-color:var(--el-color-primary-light-8);--el-tag-hover-color:var(--el-color-primary);border-style:solid;border-width:1px;justify-content:center;align-items:center;padding:0 9px;line-height:1;display:inline-flex}.el-tag.el-tag--primary{--el-tag-bg-color:var(--el-color-primary-light-9);--el-tag-border-color:var(--el-color-primary-light-8);--el-tag-hover-color:var(--el-color-primary)}.el-tag.el-tag--success{--el-tag-bg-color:var(--el-color-success-light-9);--el-tag-border-color:var(--el-color-success-light-8);--el-tag-hover-color:var(--el-color-success)}.el-tag.el-tag--warning{--el-tag-bg-color:var(--el-color-warning-light-9);--el-tag-border-color:var(--el-color-warning-light-8);--el-tag-hover-color:var(--el-color-warning)}.el-tag.el-tag--danger{--el-tag-bg-color:var(--el-color-danger-light-9);--el-tag-border-color:var(--el-color-danger-light-8);--el-tag-hover-color:var(--el-color-danger)}.el-tag.el-tag--error{--el-tag-bg-color:var(--el-color-error-light-9);--el-tag-border-color:var(--el-color-error-light-8);--el-tag-hover-color:var(--el-color-error)}.el-tag.el-tag--info{--el-tag-bg-color:var(--el-color-info-light-9);--el-tag-border-color:var(--el-color-info-light-8);--el-tag-hover-color:var(--el-color-info)}.el-tag.is-hit{border-color:var(--el-color-primary)}.el-tag.is-round{border-radius:var(--el-tag-border-radius-rounded)}.el-tag .el-tag__close{color:var(--el-tag-text-color);flex-shrink:0}.el-tag .el-tag__close:hover{color:var(--el-color-white);background-color:var(--el-tag-hover-color)}.el-tag.el-tag--primary{--el-tag-text-color:var(--el-color-primary)}.el-tag.el-tag--success{--el-tag-text-color:var(--el-color-success)}.el-tag.el-tag--warning{--el-tag-text-color:var(--el-color-warning)}.el-tag.el-tag--danger{--el-tag-text-color:var(--el-color-danger)}.el-tag.el-tag--error{--el-tag-text-color:var(--el-color-error)}.el-tag.el-tag--info{--el-tag-text-color:var(--el-color-info)}.el-tag .el-icon{cursor:pointer;font-size:calc(var(--el-icon-size) - 2px);height:var(--el-icon-size);width:var(--el-icon-size);border-radius:50%;display:flex}.el-tag .el-tag__close{background-color:#0000;border:none;border-radius:50%;outline:none;margin-left:6px;padding:0;overflow:hidden}.el-tag .el-tag__close:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-tag--dark{--el-tag-text-color:var(--el-color-white);--el-tag-bg-color:var(--el-color-primary);--el-tag-border-color:var(--el-color-primary);--el-tag-hover-color:var(--el-color-primary-light-3)}.el-tag--dark.el-tag--primary{--el-tag-bg-color:var(--el-color-primary);--el-tag-border-color:var(--el-color-primary);--el-tag-hover-color:var(--el-color-primary-light-3)}.el-tag--dark.el-tag--success{--el-tag-bg-color:var(--el-color-success);--el-tag-border-color:var(--el-color-success);--el-tag-hover-color:var(--el-color-success-light-3)}.el-tag--dark.el-tag--warning{--el-tag-bg-color:var(--el-color-warning);--el-tag-border-color:var(--el-color-warning);--el-tag-hover-color:var(--el-color-warning-light-3)}.el-tag--dark.el-tag--danger{--el-tag-bg-color:var(--el-color-danger);--el-tag-border-color:var(--el-color-danger);--el-tag-hover-color:var(--el-color-danger-light-3)}.el-tag--dark.el-tag--error{--el-tag-bg-color:var(--el-color-error);--el-tag-border-color:var(--el-color-error);--el-tag-hover-color:var(--el-color-error-light-3)}.el-tag--dark.el-tag--info{--el-tag-bg-color:var(--el-color-info);--el-tag-border-color:var(--el-color-info);--el-tag-hover-color:var(--el-color-info-light-3)}.el-tag--dark.el-tag--primary,.el-tag--dark.el-tag--success,.el-tag--dark.el-tag--warning,.el-tag--dark.el-tag--danger,.el-tag--dark.el-tag--error,.el-tag--dark.el-tag--info{--el-tag-text-color:var(--el-color-white)}.el-tag--plain,.el-tag--plain.el-tag--primary{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-primary-light-5);--el-tag-hover-color:var(--el-color-primary)}.el-tag--plain.el-tag--success{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-success-light-5);--el-tag-hover-color:var(--el-color-success)}.el-tag--plain.el-tag--warning{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-warning-light-5);--el-tag-hover-color:var(--el-color-warning)}.el-tag--plain.el-tag--danger{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-danger-light-5);--el-tag-hover-color:var(--el-color-danger)}.el-tag--plain.el-tag--error{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-error-light-5);--el-tag-hover-color:var(--el-color-error)}.el-tag--plain.el-tag--info{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-info-light-5);--el-tag-hover-color:var(--el-color-info)}.el-tag.is-closable{padding-right:5px}.el-tag--large{--el-icon-size:16px;height:32px;padding:0 11px}.el-tag--large .el-tag__close{margin-left:8px}.el-tag--large.is-closable{padding-right:7px}.el-tag--small{--el-icon-size:12px;height:20px;padding:0 7px}.el-tag--small .el-tag__close{margin-left:4px}.el-tag--small.is-closable{padding-right:3px}.el-tag--small .el-icon-close{transform:scale(.8)}.el-tag.el-tag--primary.is-hit{border-color:var(--el-color-primary)}.el-tag.el-tag--success.is-hit{border-color:var(--el-color-success)}.el-tag.el-tag--warning.is-hit{border-color:var(--el-color-warning)}.el-tag.el-tag--danger.is-hit{border-color:var(--el-color-danger)}.el-tag.el-tag--error.is-hit{border-color:var(--el-color-error)}.el-tag.el-tag--info.is-hit{border-color:var(--el-color-info)}.el-text{--el-text-font-size:var(--el-font-size-base);--el-text-color:var(--el-text-color-regular);font-size:var(--el-text-font-size);color:var(--el-text-color);overflow-wrap:break-word;align-self:center;margin:0;padding:0}.el-text.is-truncated{text-overflow:ellipsis;white-space:nowrap;max-width:100%;display:inline-block;overflow:hidden}.el-text.is-line-clamp{-webkit-box-orient:vertical;display:-webkit-inline-box;overflow:hidden}.el-text--large{--el-text-font-size:var(--el-font-size-medium)}.el-text--default{--el-text-font-size:var(--el-font-size-base)}.el-text--small{--el-text-font-size:var(--el-font-size-extra-small)}.el-text.el-text--primary{--el-text-color:var(--el-color-primary)}.el-text.el-text--success{--el-text-color:var(--el-color-success)}.el-text.el-text--warning{--el-text-color:var(--el-color-warning)}.el-text.el-text--danger{--el-text-color:var(--el-color-danger)}.el-text.el-text--error{--el-text-color:var(--el-color-error)}.el-text.el-text--info{--el-text-color:var(--el-color-info)}.el-text>.el-icon{vertical-align:-2px}.time-select{min-width:0;margin:5px 0}.time-select .el-picker-panel__content{max-height:200px;margin:0}.time-select-item{padding:8px 10px;font-size:14px;line-height:20px}.time-select-item.disabled{color:var(--el-datepicker-border-color);cursor:not-allowed}.time-select-item:hover{background-color:var(--el-fill-color-light);cursor:pointer;font-weight:700}.time-select .time-select-item.selected:not(.disabled){color:var(--el-color-primary);font-weight:700}.el-timeline-item{padding-bottom:20px;position:relative}.el-timeline-item__wrapper{box-sizing:content-box;position:relative;top:-3px}.el-timeline-item__tail{border-left:2px solid var(--el-timeline-node-color);height:100%;position:absolute}.el-timeline-item .el-timeline-item__icon{color:var(--el-color-white);font-size:var(--el-font-size-small)}.el-timeline-item__node{background-color:var(--el-timeline-node-color);border-color:var(--el-timeline-node-color);box-sizing:border-box;border-radius:50%;justify-content:center;align-items:center;display:flex;position:absolute}.el-timeline-item__node--normal{width:var(--el-timeline-node-size-normal);height:var(--el-timeline-node-size-normal)}.el-timeline-item__node--large{width:var(--el-timeline-node-size-large);height:var(--el-timeline-node-size-large)}.el-timeline-item__node.is-hollow{background:var(--el-color-white);border-style:solid;border-width:2px}.el-timeline-item__node--primary{background-color:var(--el-color-primary);border-color:var(--el-color-primary)}.el-timeline-item__node--success{background-color:var(--el-color-success);border-color:var(--el-color-success)}.el-timeline-item__node--warning{background-color:var(--el-color-warning);border-color:var(--el-color-warning)}.el-timeline-item__node--danger{background-color:var(--el-color-danger);border-color:var(--el-color-danger)}.el-timeline-item__node--info{background-color:var(--el-color-info);border-color:var(--el-color-info)}.el-timeline-item__dot{justify-content:center;align-items:center;display:flex;position:absolute}.el-timeline-item__content{color:var(--el-text-color-primary)}.el-timeline-item__timestamp{color:var(--el-text-color-secondary);line-height:1;font-size:var(--el-font-size-small)}.el-timeline-item__timestamp.is-top{margin-bottom:8px;padding-top:4px}.el-timeline-item__timestamp.is-bottom{margin-top:8px}.el-timeline-item.is-start .el-timeline-item__wrapper{padding-left:28px}.el-timeline-item.is-start .el-timeline-item__tail{left:4px}.el-timeline-item.is-start .el-timeline-item__node--normal{left:-1px}.el-timeline-item.is-start .el-timeline-item__node--large{left:-2px}.el-timeline-item.is-end .el-timeline-item__wrapper{text-align:right;padding-right:28px}.el-timeline-item.is-end .el-timeline-item__tail{right:4px}.el-timeline-item.is-end .el-timeline-item__node--normal{right:-1px}.el-timeline-item.is-end .el-timeline-item__node--large{right:-2px}.el-timeline-item.is-alternate .el-timeline-item__tail,.el-timeline-item.is-alternate .el-timeline-item__node,.el-timeline-item.is-alternate-reverse .el-timeline-item__tail,.el-timeline-item.is-alternate-reverse .el-timeline-item__node{left:50%;transform:translate(-50%)}.el-timeline{--el-timeline-node-size-normal:12px;--el-timeline-node-size-large:14px;--el-timeline-node-color:var(--el-border-color-light);font-size:var(--el-font-size-base);margin:0;list-style:none}.el-timeline .el-timeline-item:last-child .el-timeline-item__tail{display:none}.el-timeline .el-timeline-item__center{align-items:center;display:flex}.el-timeline .el-timeline-item__center .el-timeline-item__wrapper{width:100%}.el-timeline .el-timeline-item__center .el-timeline-item__tail{top:0}.el-timeline .el-timeline-item__center:first-child .el-timeline-item__tail{height:calc(50% + 10px);top:calc(50% - 10px)}.el-timeline .el-timeline-item__center:last-child .el-timeline-item__tail{height:calc(50% - 10px);display:block}.el-timeline.is-start{padding-left:40px;padding-right:0}.el-timeline.is-end{padding-left:0;padding-right:40px}.el-timeline.is-alternate{padding-left:20px;padding-right:20px}.el-timeline.is-alternate .el-timeline-item:nth-child(odd) .el-timeline-item__wrapper{width:calc(50% - 28px);left:calc(50% - var(--el-timeline-node-size-large) / 2);padding-left:28px}.el-timeline.is-alternate .el-timeline-item:nth-child(2n) .el-timeline-item__wrapper{width:calc(50% - 28px + var(--el-timeline-node-size-large) / 2);text-align:right;padding-right:28px}.el-timeline.is-alternate-reverse{padding-left:20px;padding-right:20px}.el-timeline.is-alternate-reverse .el-timeline-item:nth-child(odd) .el-timeline-item__wrapper{width:calc(50% - 28px + var(--el-timeline-node-size-large) / 2);text-align:right;padding-right:28px}.el-timeline.is-alternate-reverse .el-timeline-item:nth-child(2n) .el-timeline-item__wrapper{width:calc(50% - 28px);left:calc(50% - var(--el-timeline-node-size-large) / 2);padding-left:28px}.el-transfer{--el-transfer-border-color:var(--el-border-color-lighter);--el-transfer-border-radius:var(--el-border-radius-base);--el-transfer-panel-width:200px;--el-transfer-panel-header-height:40px;--el-transfer-panel-header-bg-color:var(--el-fill-color-light);--el-transfer-panel-footer-height:40px;--el-transfer-panel-body-height:278px;--el-transfer-item-height:30px;--el-transfer-filter-height:32px;font-size:var(--el-font-size-base)}.el-transfer__buttons{vertical-align:middle;padding:0 30px;display:inline-block}.el-transfer__button{vertical-align:top}.el-transfer__button:nth-child(2){margin:0 0 0 10px}.el-transfer__button i,.el-transfer__button span{font-size:14px}.el-transfer__button .el-icon+span{margin-left:0}.el-transfer-panel{background:var(--el-bg-color-overlay);text-align:left;vertical-align:middle;width:var(--el-transfer-panel-width);box-sizing:border-box;max-height:100%;display:inline-block;position:relative;overflow:hidden}.el-transfer-panel__body{height:var(--el-transfer-panel-body-height);border-left:1px solid var(--el-transfer-border-color);border-right:1px solid var(--el-transfer-border-color);border-bottom:1px solid var(--el-transfer-border-color);border-bottom-left-radius:var(--el-transfer-border-radius);border-bottom-right-radius:var(--el-transfer-border-radius);overflow:hidden}.el-transfer-panel__body.is-with-footer{border-bottom:none;border-bottom-right-radius:0;border-bottom-left-radius:0}.el-transfer-panel__list{height:var(--el-transfer-panel-body-height);box-sizing:border-box;margin:0;padding:6px 0;list-style:none;overflow:auto}.el-transfer-panel__list.is-filterable{height:calc(100% - var(--el-transfer-filter-height) - 30px);padding-top:0}.el-transfer-panel__item{height:var(--el-transfer-item-height);line-height:var(--el-transfer-item-height);padding-left:15px;display:block!important}.el-transfer-panel__item+.el-transfer-panel__item{margin-left:0}.el-transfer-panel__item.el-checkbox{color:var(--el-text-color-regular);margin-right:30px}.el-transfer-panel__item:hover{color:var(--el-color-primary)}.el-transfer-panel__item.el-checkbox .el-checkbox__label{text-overflow:ellipsis;white-space:nowrap;box-sizing:border-box;width:100%;line-height:var(--el-transfer-item-height);padding-left:22px;display:block;overflow:hidden}.el-transfer-panel__item .el-checkbox__input{position:absolute;top:8px}.el-transfer-panel__filter{text-align:center;box-sizing:border-box;padding:15px}.el-transfer-panel__filter .el-input__inner{height:var(--el-transfer-filter-height);box-sizing:border-box;width:100%;font-size:12px;display:inline-block}.el-transfer-panel__filter .el-icon-circle-close{cursor:pointer}.el-transfer-panel .el-transfer-panel__header{height:var(--el-transfer-panel-header-height);background:var(--el-transfer-panel-header-bg-color);border:1px solid var(--el-transfer-border-color);border-top-left-radius:var(--el-transfer-border-radius);border-top-right-radius:var(--el-transfer-border-radius);box-sizing:border-box;color:var(--el-color-black);align-items:center;margin:0;padding-left:15px;display:flex}.el-transfer-panel .el-transfer-panel__header .el-checkbox{align-items:center;width:100%;display:flex;position:relative}.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label{min-width:0;color:var(--el-text-color-primary);flex:1;align-items:center;font-size:16px;font-weight:400;display:flex}.el-transfer-panel .el-transfer-panel__header-title{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.el-transfer-panel .el-transfer-panel__header-count{color:var(--el-text-color-secondary);flex-shrink:0;margin-left:8px;margin-right:15px;font-size:12px}.el-transfer-panel .el-transfer-panel__footer{height:var(--el-transfer-panel-footer-height);background:var(--el-bg-color-overlay);border:1px solid var(--el-transfer-border-color);border-bottom-left-radius:var(--el-transfer-border-radius);border-bottom-right-radius:var(--el-transfer-border-radius);margin:0;padding:0}.el-transfer-panel .el-transfer-panel__footer:after{content:"";vertical-align:middle;height:100%;display:inline-block}.el-transfer-panel .el-transfer-panel__footer .el-checkbox{color:var(--el-text-color-regular);padding-left:20px}.el-transfer-panel .el-transfer-panel__empty{height:var(--el-transfer-item-height);line-height:var(--el-transfer-item-height);color:var(--el-text-color-secondary);text-align:center;margin:0;padding:6px 15px 0}.el-transfer-panel .el-checkbox__label{padding-left:8px}.el-tree{--el-tree-node-content-height:26px;--el-tree-node-hover-bg-color:var(--el-fill-color-light);--el-tree-text-color:var(--el-text-color-regular);--el-tree-expand-icon-color:var(--el-text-color-placeholder);cursor:default;background:var(--el-fill-color-blank);color:var(--el-tree-text-color);font-size:var(--el-font-size-base);position:relative}.el-tree__empty-block{text-align:center;width:100%;height:100%;min-height:60px;position:relative}.el-tree__empty-text{color:var(--el-text-color-secondary);font-size:var(--el-font-size-base);position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.el-tree__drop-indicator{background-color:var(--el-color-primary);height:1px;position:absolute;left:0;right:0}.el-tree-node{white-space:nowrap;outline:none}.el-tree-node:focus>.el-tree-node__content{background-color:var(--el-tree-node-hover-bg-color)}.el-tree-node.is-drop-inner>.el-tree-node__content .el-tree-node__label{background-color:var(--el-color-primary);color:#fff}.el-tree-node__content{--el-checkbox-height:var(--el-tree-node-content-height);height:var(--el-tree-node-content-height);cursor:pointer;align-items:center;display:flex}.el-tree-node__content>.el-tree-node__expand-icon{box-sizing:content-box;padding:6px}.el-tree-node__content>label.el-checkbox{margin-right:8px}.el-tree-node__content:hover{background-color:var(--el-tree-node-hover-bg-color)}.el-tree.is-dragging .el-tree-node__content{cursor:move}.el-tree.is-dragging .el-tree-node__content *{pointer-events:none}.el-tree.is-dragging.is-drop-not-allow .el-tree-node__content{cursor:not-allowed}.el-tree-node__expand-icon{cursor:pointer;color:var(--el-tree-expand-icon-color);transition:transform var(--el-transition-duration) ease-in-out;font-size:12px;transform:rotate(0)}.el-tree-node__expand-icon.expanded{transform:rotate(90deg)}.el-tree-node__expand-icon.is-leaf{color:#0000;cursor:default;visibility:hidden}.el-tree-node__expand-icon.is-hidden{visibility:hidden}.el-tree-node__loading-icon{font-size:var(--el-font-size-base);color:var(--el-tree-expand-icon-color);margin-right:8px}.el-tree-node>.el-tree-node__children{background-color:#0000;overflow:hidden}.el-tree-node.is-expanded>.el-tree-node__children{display:block}.el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content{background-color:var(--el-color-primary-light-9)}.el-tree-select{--el-tree-node-content-height:26px;--el-tree-node-hover-bg-color:var(--el-fill-color-light);--el-tree-text-color:var(--el-text-color-regular);--el-tree-expand-icon-color:var(--el-text-color-placeholder)}.el-tree-select__popper .el-tree-node__expand-icon{margin-left:8px}.el-tree-select__popper .el-tree-node.is-checked>.el-tree-node__content .el-select-dropdown__item.selected:after{content:none}.el-tree-select__popper .el-select-dropdown__list>.el-select-dropdown__item{padding-left:32px}.el-tree-select__popper .el-select-dropdown__item{flex:1;height:20px;padding-left:0;line-height:20px;background:0 0!important}.el-upload{--el-upload-dragger-padding-horizontal:10px;--el-upload-dragger-padding-vertical:40px;--el-upload-list-picture-card-size:var(--el-upload-picture-card-size);--el-upload-picture-card-size:148px;cursor:pointer;outline:none;justify-content:center;align-items:center;display:inline-flex}.el-upload.is-disabled{cursor:not-allowed}.el-upload.is-disabled:focus{border-color:var(--el-border-color-darker);color:inherit}.el-upload.is-disabled:focus .el-upload-dragger{border-color:var(--el-border-color-darker)}.el-upload.is-disabled .el-upload-dragger{cursor:not-allowed;background-color:var(--el-disabled-bg-color)}.el-upload.is-disabled .el-upload-dragger .el-upload__text{color:var(--el-text-color-placeholder)}.el-upload.is-disabled .el-upload-dragger .el-upload__text em{color:var(--el-disabled-text-color)}.el-upload.is-disabled .el-upload-dragger:hover{border-color:var(--el-border-color-darker)}.el-upload__input{display:none}.el-upload__tip{color:var(--el-text-color-regular);margin-top:7px;font-size:12px}.el-upload iframe{z-index:-1;opacity:0;filter:alpha(opacity=0);position:absolute;top:0;left:0}.el-upload--picture-card{background-color:var(--el-fill-color-lighter);border:1px dashed var(--el-border-color-darker);box-sizing:border-box;width:var(--el-upload-picture-card-size);height:var(--el-upload-picture-card-size);cursor:pointer;vertical-align:top;border-radius:6px;justify-content:center;align-items:center;display:inline-flex}.el-upload--picture-card>i{color:var(--el-text-color-secondary);font-size:28px}.el-upload--picture-card:hover{border-color:var(--el-color-primary);color:var(--el-color-primary)}.el-upload.is-drag{display:block}.el-upload:focus{border-color:var(--el-color-primary);color:var(--el-color-primary)}.el-upload:focus .el-upload-dragger{border-color:var(--el-color-primary)}.el-upload-dragger{padding:var(--el-upload-dragger-padding-vertical) var(--el-upload-dragger-padding-horizontal);background-color:var(--el-fill-color-blank);border:1px dashed var(--el-border-color);box-sizing:border-box;text-align:center;cursor:pointer;border-radius:6px;position:relative;overflow:hidden}.el-upload-dragger .el-icon--upload{color:var(--el-text-color-placeholder);margin-bottom:16px;font-size:67px;line-height:50px}.el-upload-dragger+.el-upload__tip{text-align:center}.el-upload-dragger~.el-upload__files{border-top:var(--el-border);margin-top:7px;padding-top:5px}.el-upload-dragger .el-upload__text{color:var(--el-text-color-regular);text-align:center;font-size:14px}.el-upload-dragger .el-upload__text em{color:var(--el-color-primary);font-style:normal}.el-upload-dragger:hover{border-color:var(--el-color-primary)}.el-upload-dragger.is-dragover{padding:calc(var(--el-upload-dragger-padding-vertical) - 1px) calc(var(--el-upload-dragger-padding-horizontal) - 1px);background-color:var(--el-color-primary-light-9);border:2px dashed var(--el-color-primary)}.el-upload-list{--el-upload-dragger-padding-horizontal:10px;--el-upload-dragger-padding-vertical:40px;--el-upload-list-picture-card-size:var(--el-upload-picture-card-size);--el-upload-picture-card-size:148px;margin:10px 0 0;padding:0;list-style:none;position:relative}.el-upload-list__item{color:var(--el-text-color-regular);box-sizing:border-box;border-radius:4px;width:100%;margin-bottom:5px;font-size:14px;transition:all .5s cubic-bezier(.55,0,.1,1);position:relative}.el-upload-list__item .el-progress{width:100%;position:absolute;top:20px}.el-upload-list__item .el-progress__text{position:absolute;top:-13px;right:0}.el-upload-list__item .el-progress-bar{margin-right:0;padding-right:0}.el-upload-list__item .el-icon--upload-success{color:var(--el-color-success)}.el-upload-list__item .el-icon--close{cursor:pointer;opacity:.75;color:var(--el-text-color-regular);transition:opacity var(--el-transition-duration);display:none;position:absolute;top:50%;right:5px;transform:translateY(-50%)}.el-upload-list__item .el-icon--close:hover{opacity:1;color:var(--el-color-primary)}.el-upload-list__item .el-icon--close-tip{cursor:pointer;opacity:1;color:var(--el-color-primary);font-size:12px;font-style:normal;display:none;position:absolute;top:1px;right:5px}.el-upload-list__item:hover,.el-upload-list__item:focus-within{background-color:var(--el-fill-color-light)}.el-upload-list__item:hover .el-icon--close,.el-upload-list__item:focus-within .el-icon--close{display:inline-flex}.el-upload-list__item:hover .el-icon--close-tip,.el-upload-list__item:focus-within .el-icon--close-tip{right:24px}.el-upload-list__item:hover .el-progress__text,.el-upload-list__item:focus-within .el-progress__text{display:none}.el-upload-list__item .el-upload-list__item-info{flex-direction:column;justify-content:center;width:calc(100% - 30px);margin-left:4px;display:inline-flex}.el-upload-list__item.is-success .el-upload-list__item-status-label{display:inline-flex}.el-upload-list__item.is-success .el-upload-list__item-name:hover,.el-upload-list__item.is-success .el-upload-list__item-name:focus{color:var(--el-color-primary);cursor:pointer}.el-upload-list__item.is-success:focus:not(:hover) .el-icon--close-tip{display:inline-block}.el-upload-list__item.is-success:not(.focusing):focus,.el-upload-list__item.is-success:active{outline-width:0}.el-upload-list__item.is-success:not(.focusing):focus .el-icon--close-tip,.el-upload-list__item.is-success:active .el-icon--close-tip{display:none}.el-upload-list__item.is-success:hover .el-upload-list__item-status-label,.el-upload-list__item.is-success:focus .el-upload-list__item-status-label,.el-upload-list__item.is-success:focus-within .el-upload-list__item-status-label{opacity:0;display:none}.el-upload-list__item-name{color:var(--el-text-color-regular);text-align:center;transition:color var(--el-transition-duration);font-size:var(--el-font-size-base);align-items:center;padding:0 4px;display:inline-flex}.el-upload-list__item-name .el-icon{color:var(--el-text-color-secondary);margin-right:6px}.el-upload-list__item-file-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.el-upload-list__item-status-label{line-height:inherit;height:100%;transition:opacity var(--el-transition-duration);justify-content:center;align-items:center;display:none;position:absolute;top:0;right:5px}.el-upload-list__item-delete{color:var(--el-text-color-regular);font-size:12px;display:none;position:absolute;top:0;right:10px}.el-upload-list__item-delete:hover{color:var(--el-color-primary)}.el-upload-list--picture-card{flex-wrap:wrap;margin:0;display:inline-flex}.el-upload-list--picture-card .el-upload-list__item{background-color:var(--el-fill-color-blank);border:1px solid var(--el-border-color);box-sizing:border-box;width:var(--el-upload-list-picture-card-size);height:var(--el-upload-list-picture-card-size);border-radius:6px;margin:0 8px 8px 0;padding:0;display:inline-flex;overflow:hidden}.el-upload-list--picture-card .el-upload-list__item .el-icon--check,.el-upload-list--picture-card .el-upload-list__item .el-icon--circle-check{color:#fff}.el-upload-list--picture-card .el-upload-list__item .el-icon--close{display:none}.el-upload-list--picture-card .el-upload-list__item:hover .el-upload-list__item-status-label{opacity:0;display:block}.el-upload-list--picture-card .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture-card .el-upload-list__item .el-upload-list__item-name{display:none}.el-upload-list--picture-card .el-upload-list__item-thumbnail{object-fit:contain;width:100%;height:100%}.el-upload-list--picture-card .el-upload-list__item-status-label{background:var(--el-color-success);text-align:center;width:40px;height:24px;top:-6px;right:-15px;transform:rotate(45deg)}.el-upload-list--picture-card .el-upload-list__item-status-label i{margin-top:11px;font-size:12px;transform:rotate(-45deg)}.el-upload-list--picture-card .el-upload-list__item-actions{cursor:default;color:#fff;opacity:0;background-color:var(--el-overlay-color-lighter);width:100%;height:100%;transition:opacity var(--el-transition-duration);justify-content:center;align-items:center;font-size:20px;display:inline-flex;position:absolute;top:0;left:0}.el-upload-list--picture-card .el-upload-list__item-actions span{cursor:pointer;display:none}.el-upload-list--picture-card .el-upload-list__item-actions span+span{margin-left:16px}.el-upload-list--picture-card .el-upload-list__item-actions .el-upload-list__item-delete{font-size:inherit;color:inherit;position:static}.el-upload-list--picture-card .el-upload-list__item-actions:hover{opacity:1}.el-upload-list--picture-card .el-upload-list__item-actions:hover span{display:inline-flex}.el-upload-list--picture-card .el-progress{width:126px;top:50%;bottom:auto;left:50%;transform:translate(-50%,-50%)}.el-upload-list--picture-card .el-progress .el-progress__text{top:50%}.el-upload-list--picture .el-upload-list__item{z-index:0;background-color:var(--el-fill-color-blank);border:1px solid var(--el-border-color);box-sizing:border-box;border-radius:6px;align-items:center;margin-top:10px;padding:10px;display:flex;overflow:hidden}.el-upload-list--picture .el-upload-list__item .el-icon--check,.el-upload-list--picture .el-upload-list__item .el-icon--circle-check{color:#fff}.el-upload-list--picture .el-upload-list__item:hover .el-upload-list__item-status-label{opacity:0;display:inline-flex}.el-upload-list--picture .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name i{display:none}.el-upload-list--picture .el-upload-list__item .el-icon--close{top:5px;transform:translateY(0)}.el-upload-list--picture .el-upload-list__item-thumbnail{object-fit:contain;z-index:1;background-color:var(--el-color-white);justify-content:center;align-items:center;width:70px;height:70px;display:inline-flex;position:relative}.el-upload-list--picture .el-upload-list__item-status-label{background:var(--el-color-success);text-align:center;width:46px;height:26px;position:absolute;top:-7px;right:-17px;transform:rotate(45deg)}.el-upload-list--picture .el-upload-list__item-status-label i{margin-top:12px;font-size:12px;transform:rotate(-45deg)}.el-upload-list--picture .el-progress{position:relative;top:-7px}.el-upload-cover{z-index:10;cursor:default;width:100%;height:100%;position:absolute;top:0;left:0;overflow:hidden}.el-upload-cover:after{content:"";vertical-align:middle;height:100%;display:inline-block}.el-upload-cover img{width:100%;height:100%;display:block}.el-upload-cover__label{background:var(--el-color-success);text-align:center;width:40px;height:24px;top:-6px;right:-15px;transform:rotate(45deg)}.el-upload-cover__label i{color:#fff;margin-top:11px;font-size:12px;transform:rotate(-45deg)}.el-upload-cover__progress{vertical-align:middle;width:243px;display:inline-block;position:static}.el-upload-cover__progress+.el-upload__inner{opacity:0}.el-upload-cover__content{width:100%;height:100%;position:absolute;top:0;left:0}.el-upload-cover__interact{background-color:var(--el-overlay-color-light);text-align:center;width:100%;height:100%;position:absolute;bottom:0;left:0}.el-upload-cover__interact .btn{color:#fff;cursor:pointer;vertical-align:middle;transition:var(--el-transition-md-fade);margin-top:60px;font-size:14px;display:inline-block}.el-upload-cover__interact .btn i{margin-top:0}.el-upload-cover__interact .btn span{opacity:0;transition:opacity .15s linear}.el-upload-cover__interact .btn:not(:first-child){margin-left:35px}.el-upload-cover__interact .btn:hover{transform:translateY(-13px)}.el-upload-cover__interact .btn:hover span{opacity:1}.el-upload-cover__interact .btn i{color:#fff;font-size:24px;line-height:inherit;margin:0 auto 5px;display:block}.el-upload-cover__title{text-overflow:ellipsis;white-space:nowrap;text-align:left;width:100%;height:36px;color:var(--el-text-color-primary);background-color:#fff;margin:0;padding:0 10px;font-size:14px;font-weight:400;line-height:36px;position:absolute;bottom:0;left:0;overflow:hidden}.el-upload-cover+.el-upload__inner{opacity:0;z-index:1;position:relative}.el-vl__wrapper{position:relative}.el-vl__wrapper:hover .el-virtual-scrollbar,.el-vl__wrapper.always-on .el-virtual-scrollbar{opacity:1}.el-vl__window{scrollbar-width:none}.el-vl__window::-webkit-scrollbar{display:none}.el-virtual-scrollbar{opacity:0;transition:opacity .34s ease-out}.el-virtual-scrollbar.always-on{opacity:1}.el-vg__wrapper{position:relative}.el-popper{--el-popper-border-radius:var(--el-popover-border-radius,4px);--el-popper-bg-color-light:var(--el-bg-color-overlay);--el-popper-bg-color-dark:var(--el-text-color-primary);border-radius:var(--el-popper-border-radius);z-index:2000;overflow-wrap:break-word;word-break:normal;visibility:visible;min-width:10px;padding:5px 11px;font-size:12px;line-height:20px;position:absolute}.el-popper.is-dark{--el-fill-color-blank:var(--el-popper-bg-color-dark);color:var(--el-bg-color);background:var(--el-popper-bg-color-dark);border:1px solid var(--el-text-color-primary)}.el-popper.is-dark>.el-popper__arrow:before{border:1px solid var(--el-text-color-primary);background:var(--el-popper-bg-color-dark);right:0}.el-popper.is-light{--el-fill-color-blank:var(--el-popper-bg-color-light);background:var(--el-popper-bg-color-light);border:1px solid var(--el-border-color-light)}.el-popper.is-light>.el-popper__arrow:before{border:1px solid var(--el-border-color-light);background:var(--el-popper-bg-color-light);right:0}.el-popper.is-pure{padding:0}.el-popper__arrow{z-index:-1;width:10px;height:10px;position:absolute}.el-popper__arrow:before{z-index:-1;content:" ";background:var(--el-text-color-primary);box-sizing:border-box;width:10px;height:10px;position:absolute;transform:rotate(45deg)}.el-popper[data-popper-placement^=top]>.el-popper__arrow{bottom:-5px}.el-popper[data-popper-placement^=top]>.el-popper__arrow:before{border-bottom-right-radius:2px}.el-popper[data-popper-placement^=bottom]>.el-popper__arrow{top:-5px}.el-popper[data-popper-placement^=bottom]>.el-popper__arrow:before{border-top-left-radius:2px}.el-popper[data-popper-placement^=left]>.el-popper__arrow{right:-5px}.el-popper[data-popper-placement^=left]>.el-popper__arrow:before{border-top-right-radius:2px}.el-popper[data-popper-placement^=right]>.el-popper__arrow{left:-5px}.el-popper[data-popper-placement^=right]>.el-popper__arrow:before{border-bottom-left-radius:2px}.el-popper[data-popper-placement^=top]>.el-popper__arrow:before{border-top-color:#0000!important;border-left-color:#0000!important}.el-popper[data-popper-placement^=bottom]>.el-popper__arrow:before{border-bottom-color:#0000!important;border-right-color:#0000!important}.el-popper[data-popper-placement^=left]>.el-popper__arrow:before{border-bottom-color:#0000!important;border-left-color:#0000!important}.el-popper[data-popper-placement^=right]>.el-popper__arrow:before{border-top-color:#0000!important;border-right-color:#0000!important}.el-statistic{--el-statistic-title-font-weight:400;--el-statistic-title-font-size:var(--el-font-size-extra-small);--el-statistic-title-color:var(--el-text-color-regular);--el-statistic-content-font-weight:400;--el-statistic-content-font-size:var(--el-font-size-extra-large);--el-statistic-content-color:var(--el-text-color-primary)}.el-statistic__head{font-weight:var(--el-statistic-title-font-weight);font-size:var(--el-statistic-title-font-size);color:var(--el-statistic-title-color);margin-bottom:4px;line-height:20px}.el-statistic__content{font-weight:var(--el-statistic-content-font-weight);font-size:var(--el-statistic-content-font-size);color:var(--el-statistic-content-color)}.el-statistic__value{display:inline-block}.el-statistic__prefix{margin-right:4px;display:inline-block}.el-statistic__suffix{margin-left:4px;display:inline-block}.el-tour{--el-tour-width:520px;--el-tour-padding-primary:12px;--el-tour-font-line-height:var(--el-font-line-height-primary);--el-tour-title-font-size:16px;--el-tour-title-text-color:var(--el-text-color-primary);--el-tour-title-font-weight:400;--el-tour-close-color:var(--el-color-info);--el-tour-font-size:14px;--el-tour-color:var(--el-text-color-primary);--el-tour-bg-color:var(--el-bg-color);--el-tour-border-radius:4px}.el-tour__hollow{transition:all var(--el-transition-duration) ease}.el-tour__content{border-radius:var(--el-tour-border-radius);width:var(--el-tour-width);padding:var(--el-tour-padding-primary);background:var(--el-tour-bg-color);box-shadow:var(--el-box-shadow-light);box-sizing:border-box;overflow-wrap:break-word;outline:none}.el-tour__arrow{background:var(--el-tour-bg-color);pointer-events:none;box-sizing:border-box;width:10px;height:10px;position:absolute;transform:rotate(45deg)}.el-tour__content[data-side^=top] .el-tour__arrow{border-top-color:#0000;border-left-color:#0000}.el-tour__content[data-side^=bottom] .el-tour__arrow{border-bottom-color:#0000;border-right-color:#0000}.el-tour__content[data-side^=left] .el-tour__arrow{border-bottom-color:#0000;border-left-color:#0000}.el-tour__content[data-side^=right] .el-tour__arrow{border-top-color:#0000;border-right-color:#0000}.el-tour__content[data-side^=top] .el-tour__arrow{bottom:-5px}.el-tour__content[data-side^=bottom] .el-tour__arrow{top:-5px}.el-tour__content[data-side^=left] .el-tour__arrow{right:-5px}.el-tour__content[data-side^=right] .el-tour__arrow{left:-5px}.el-tour__closebtn{cursor:pointer;width:40px;height:40px;font-size:var(--el-message-close-size,16px);background:0 0;border:none;outline:none;padding:0;position:absolute;top:0;right:0}.el-tour__closebtn .el-tour__close{color:var(--el-tour-close-color);font-size:inherit}.el-tour__closebtn:focus .el-tour__close,.el-tour__closebtn:hover .el-tour__close{color:var(--el-color-primary)}.el-tour__header{padding-bottom:var(--el-tour-padding-primary)}.el-tour__header.show-close{padding-right:calc(var(--el-tour-padding-primary) + var(--el-message-close-size,16px))}.el-tour__title{line-height:var(--el-tour-font-line-height);font-size:var(--el-tour-title-font-size);color:var(--el-tour-title-text-color);font-weight:var(--el-tour-title-font-weight)}.el-tour__body{color:var(--el-tour-text-color);font-size:var(--el-tour-font-size)}.el-tour__body img,.el-tour__body video{max-width:100%}.el-tour__footer{padding-top:var(--el-tour-padding-primary);box-sizing:border-box;justify-content:space-between;display:flex}.el-tour__content .el-tour-indicators{flex:1;display:inline-block}.el-tour__content .el-tour-indicator{background:var(--el-color-info-light-9);border-radius:50%;width:6px;height:6px;margin-right:6px;display:inline-block}.el-tour__content .el-tour-indicator.is-active{background:var(--el-color-primary)}.el-tour.el-tour--primary{--el-tour-title-text-color:#fff;--el-tour-text-color:#fff;--el-tour-bg-color:var(--el-color-primary);--el-tour-close-color:#fff}.el-tour.el-tour--primary .el-tour__closebtn:focus .el-tour__close,.el-tour.el-tour--primary .el-tour__closebtn:hover .el-tour__close{color:var(--el-tour-title-text-color)}.el-tour.el-tour--primary .el-button--default{color:var(--el-color-primary);border-color:var(--el-color-primary);background:#fff}.el-tour.el-tour--primary .el-button--primary{border-color:#fff}.el-tour.el-tour--primary .el-tour-indicator{background:#ffffff26}.el-tour.el-tour--primary .el-tour-indicator.is-active{background:#fff}.el-tour-parent--hidden{overflow:hidden}.el-anchor{--el-anchor-bg-color:var(--el-bg-color);--el-anchor-padding-indent:14px;--el-anchor-line-height:22px;--el-anchor-font-size:12px;--el-anchor-color:var(--el-text-color-secondary);--el-anchor-active-color:var(--el-color-primary);--el-anchor-hover-color:var(--el-text-color-regular);--el-anchor-marker-bg-color:var(--el-color-primary);background-color:var(--el-anchor-bg-color);position:relative}.el-anchor__marker{background-color:var(--el-anchor-marker-bg-color);opacity:0;z-index:0;border-radius:4px;position:absolute}.el-anchor.el-anchor--vertical .el-anchor__marker{width:4px;height:14px;transition:top .25s ease-in-out,opacity .25s;top:8px;left:0}.el-anchor.el-anchor--vertical .el-anchor__list{padding-left:var(--el-anchor-padding-indent)}.el-anchor.el-anchor--vertical.el-anchor--underline:before{content:"";background-color:#0505050f;width:2px;height:100%;position:absolute;left:0}.el-anchor.el-anchor--vertical.el-anchor--underline .el-anchor__marker{border-radius:unset;width:2px}.el-anchor.el-anchor--horizontal .el-anchor__marker{width:20px;height:2px;transition:left .25s ease-in-out,opacity .25s,width .25s;bottom:0}.el-anchor.el-anchor--horizontal .el-anchor__list{padding-bottom:4px;display:flex}.el-anchor.el-anchor--horizontal .el-anchor__list .el-anchor__item{padding-left:16px}.el-anchor.el-anchor--horizontal .el-anchor__list .el-anchor__item:first-child{padding-left:0}.el-anchor.el-anchor--horizontal.el-anchor--underline:before{content:"";background-color:#0505050f;width:100%;height:2px;position:absolute;bottom:0}.el-anchor.el-anchor--horizontal.el-anchor--underline .el-anchor__marker{border-radius:unset;height:2px}.el-anchor__item{flex-direction:column;display:flex}.el-anchor__link{font-size:var(--el-anchor-font-size);line-height:var(--el-anchor-line-height);color:var(--el-anchor-color);transition:color var(--el-transition-duration);white-space:nowrap;text-overflow:ellipsis;cursor:pointer;outline:none;max-width:100%;padding:4px 0;text-decoration:none;overflow:hidden}.el-anchor__link:hover,.el-anchor__link:focus{color:var(--el-hover-color)}.el-anchor__link:focus-visible{border-radius:var(--el-border-radius-base);outline:2px solid var(--el-color-primary)}.el-anchor__link.is-active{color:var(--el-anchor-active-color)}.el-anchor .el-anchor__list .el-anchor__item a{display:inline-block}.el-segmented--vertical{flex-direction:column}.el-segmented--vertical .el-segmented__item{padding:11px}.el-segmented{--el-segmented-color:var(--el-text-color-regular);--el-segmented-bg-color:var(--el-fill-color-light);--el-segmented-padding:2px;--el-segmented-item-selected-color:var(--el-color-white);--el-segmented-item-selected-bg-color:var(--el-color-primary);--el-segmented-item-selected-disabled-bg-color:var(--el-color-primary-light-5);--el-segmented-item-hover-color:var(--el-text-color-primary);--el-segmented-item-hover-bg-color:var(--el-fill-color-dark);--el-segmented-item-active-bg-color:var(--el-fill-color-darker);--el-segmented-item-disabled-color:var(--el-text-color-placeholder);background:var(--el-segmented-bg-color);min-height:32px;padding:var(--el-segmented-padding);border-radius:var(--el-border-radius-base);color:var(--el-segmented-color);box-sizing:border-box;align-items:stretch;font-size:14px;display:inline-flex}.el-segmented__group{align-items:stretch;width:100%;display:flex;position:relative}.el-segmented__item-selected{background:var(--el-segmented-item-selected-bg-color);border-radius:calc(var(--el-border-radius-base) - 2px);pointer-events:none;width:10px;height:100%;transition:all .3s;position:absolute;top:0;left:0}.el-segmented__item-selected.is-disabled{background:var(--el-segmented-item-selected-disabled-bg-color)}.el-segmented__item-selected.is-focus-visible:before{content:"";border-radius:inherit;outline:2px solid var(--el-segmented-item-selected-bg-color);outline-offset:1px;position:absolute;inset:0}.el-segmented__item{cursor:pointer;border-radius:calc(var(--el-border-radius-base) - 2px);flex:1;align-items:center;padding:0 11px;display:flex}.el-segmented__item:not(.is-disabled):not(.is-selected):hover{color:var(--el-segmented-item-hover-color);background:var(--el-segmented-item-hover-bg-color)}.el-segmented__item:not(.is-disabled):not(.is-selected):active{background:var(--el-segmented-item-active-bg-color)}.el-segmented__item.is-selected,.el-segmented__item.is-selected.is-disabled{color:var(--el-segmented-item-selected-color)}.el-segmented__item.is-disabled{cursor:not-allowed;color:var(--el-segmented-item-disabled-color)}.el-segmented__item-input{opacity:0;pointer-events:none;width:0;height:0;margin:0;position:absolute}.el-segmented__item-label{text-align:center;text-overflow:ellipsis;white-space:nowrap;z-index:1;flex:1;line-height:normal;transition:color .3s;overflow:hidden}.el-segmented.is-block{display:flex}.el-segmented.is-block .el-segmented__item{min-width:0}.el-segmented--large{border-radius:var(--el-border-radius-base);min-height:40px;font-size:16px}.el-segmented--large .el-segmented__item-selected{border-radius:calc(var(--el-border-radius-base) - 2px)}.el-segmented--large .el-segmented--vertical .el-segmented__item{padding:11px}.el-segmented--large .el-segmented__item{border-radius:calc(var(--el-border-radius-base) - 2px);padding:0 11px}.el-segmented--small{border-radius:calc(var(--el-border-radius-base) - 1px);min-height:24px;font-size:14px}.el-segmented--small .el-segmented__item-selected{border-radius:calc(calc(var(--el-border-radius-base) - 1px) - 2px)}.el-segmented--small .el-segmented--vertical .el-segmented__item{padding:7px}.el-segmented--small .el-segmented__item{border-radius:calc(calc(var(--el-border-radius-base) - 1px) - 2px);padding:0 7px}.el-mention{width:100%;position:relative}.el-mention__popper.el-popper{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light);box-shadow:var(--el-box-shadow-light)}.el-mention__popper.el-popper .el-popper__arrow:before{border:1px solid var(--el-border-color-light)}.el-mention__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-top-color:#0000;border-left-color:#0000}.el-mention__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:#0000;border-right-color:#0000}.el-mention__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-bottom-color:#0000;border-left-color:#0000}.el-mention__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-top-color:#0000;border-right-color:#0000}.el-mention-dropdown{--el-mention-font-size:var(--el-font-size-base);--el-mention-bg-color:var(--el-bg-color-overlay);--el-mention-shadow:var(--el-box-shadow-light);--el-mention-border:1px solid var(--el-border-color-light);--el-mention-option-color:var(--el-text-color-regular);--el-mention-option-height:34px;--el-mention-option-min-width:100px;--el-mention-option-hover-background:var(--el-fill-color-light);--el-mention-option-selected-color:var(--el-color-primary);--el-mention-option-disabled-color:var(--el-text-color-placeholder);--el-mention-option-loading-color:var(--el-text-color-secondary);--el-mention-option-loading-padding:10px 0;--el-mention-max-height:174px;--el-mention-padding:6px 0;--el-mention-header-padding:10px;--el-mention-footer-padding:10px}.el-mention-dropdown__item{font-size:var(--el-mention-font-size);white-space:nowrap;text-overflow:ellipsis;color:var(--el-mention-option-color);height:var(--el-mention-option-height);line-height:var(--el-mention-option-height);box-sizing:border-box;min-width:var(--el-mention-option-min-width);cursor:pointer;padding:0 20px;position:relative;overflow:hidden}.el-mention-dropdown__item.is-hovering{background-color:var(--el-mention-option-hover-background)}.el-mention-dropdown__item.is-selected{color:var(--el-mention-option-selected-color);font-weight:700}.el-mention-dropdown__item.is-disabled{color:var(--el-mention-option-disabled-color);cursor:not-allowed;background-color:unset}.el-mention-dropdown{z-index:calc(var(--el-index-top) + 1);border-radius:var(--el-border-radius-base);box-sizing:border-box}.el-mention-dropdown__loading{text-align:center;color:var(--el-mention-option-loading-color);min-width:var(--el-mention-option-min-width);margin:0;padding:10px 0;font-size:12px}.el-mention-dropdown__wrap{max-height:var(--el-mention-max-height)}.el-mention-dropdown__list{padding:var(--el-mention-padding);box-sizing:border-box;margin:0;list-style:none}.el-mention-dropdown__header{padding:var(--el-mention-header-padding);border-bottom:var(--el-mention-border)}.el-mention-dropdown__footer{padding:var(--el-mention-footer-padding);border-top:var(--el-mention-border)}.el-splitter{width:100%;height:100%;margin:0;padding:0;display:flex;position:relative}.el-splitter__mask{z-index:999;position:absolute;inset:0}.el-splitter__mask-horizontal{cursor:ew-resize}.el-splitter__mask-vertical{cursor:ns-resize}.el-splitter__horizontal{flex-direction:row}.el-splitter__vertical{flex-direction:column}.el-splitter-bar{-webkit-user-select:none;user-select:none;flex:none;position:relative}.el-splitter-bar__dragger{z-index:1;background:0 0;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.el-splitter-bar__dragger:before,.el-splitter-bar__dragger:after{content:"";background-color:var(--el-border-color-light);position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.el-splitter-bar__dragger:not(.is-lazy):after{display:none}.el-splitter-bar__dragger:after{opacity:.4}.el-splitter-bar__dragger:hover:not(.is-disabled):before{background-color:var(--el-color-primary-light-5)}.el-splitter-bar__dragger-horizontal:before,.el-splitter-bar__dragger-horizontal:after{width:2px;height:100%}.el-splitter-bar__dragger-vertical:before,.el-splitter-bar__dragger-vertical:after{width:100%;height:2px}.el-splitter-bar__dragger-active:before,.el-splitter-bar__dragger-active:after{background-color:var(--el-color-primary-light-3)}.el-splitter-bar__dragger-active.el-splitter-bar__dragger-horizontal:after{transform:translate(calc(-50% + var(--el-splitter-bar-offset)),-50%)}.el-splitter-bar__dragger-active.el-splitter-bar__dragger-vertical:after{transform:translate(-50%,calc(-50% + var(--el-splitter-bar-offset)))}.el-splitter-bar:hover .el-splitter-bar__collapse-icon{opacity:1}.el-splitter-bar__collapse-icon{background:var(--el-border-color-light);cursor:pointer;opacity:0;z-index:9;border-radius:2px;justify-content:center;align-items:center;display:flex;position:absolute}.el-splitter-bar__collapse-icon:hover{opacity:1;background-color:var(--el-color-primary-light-5)}.el-splitter-bar__horizontal-collapse-icon-start{width:16px;height:24px;top:50%;left:-12px;transform:translate(-50%,-50%)}.el-splitter-bar__horizontal-collapse-icon-end{width:16px;height:24px;top:50%;left:12px;transform:translate(-50%,-50%)}.el-splitter-bar__vertical-collapse-icon-start{width:24px;height:16px;top:-12px;right:50%;transform:translate(50%,-50%)}.el-splitter-bar__vertical-collapse-icon-end{width:24px;height:16px;top:12px;right:50%;transform:translate(50%,-50%)}.el-splitter-panel{scrollbar-width:thin;box-sizing:border-box;flex-grow:0;overflow:auto}:root{--font-family-base: "Microsoft YaHei", "PingFang SC", "Hiragino Sans GB", sans-serif;--color-primary: #409eff;--color-bg-light: #eef3f8;--color-bg-dark: #0d0d0d;--color-surface-light: rgba(255, 255, 255, .92);--color-surface-dark: #1a1a1a;--color-border-light: #d6e4ef;--color-border-dark: #2a2a2a;--color-text-primary: #303133;--color-text-secondary: #606266;--color-text-dark: #e5eaf3;--shadow-card: 0 10px 30px rgba(0, 0, 0, .08);--radius-lg: 16px;--radius-md: 12px;--radius-sm: 8px}*{box-sizing:border-box}html,body,#app{margin:0;min-height:100%}body{font-family:var(--font-family-base);color:var(--color-text-primary)}a{color:inherit;text-decoration:none}button,input,select,textarea{font:inherit}body{background:var(--color-bg-light)}html{scrollbar-color:rgba(123,135,148,.7) rgba(255,255,255,.04);scrollbar-width:thin}*::-webkit-scrollbar{width:10px;height:10px}*::-webkit-scrollbar-track{background:#ffffff0a}*::-webkit-scrollbar-thumb{background:#7b8794b3;border:2px solid transparent;border-radius:999px;background-clip:padding-box}*::-webkit-scrollbar-thumb:hover{background:#94a3b8e6;border:2px solid transparent;background-clip:padding-box}*::-webkit-scrollbar-corner{background:transparent}.page-shell{min-height:100vh}.theme-light{background:var(--color-bg-light);color:var(--color-text-primary)}.theme-dark{background:var(--color-bg-dark);color:var(--color-text-dark)} diff --git a/app/assets/query-asin-CECO5lUB.css b/app/assets/query-asin-CECO5lUB.css deleted file mode 100644 index f9143b1..0000000 --- a/app/assets/query-asin-CECO5lUB.css +++ /dev/null @@ -1 +0,0 @@ -.module-page[data-v-c2e27ea1]{min-height:100vh;background:#1a1a1a}.main-content[data-v-c2e27ea1]{display:flex;min-height:calc(100vh - 56px);height:calc(100vh - 56px)}.left-panel[data-v-c2e27ea1]{width:400px;background:#1e1e1e;padding:20px;overflow-y:auto;border-right:1px solid #2a2a2a}.right-panel[data-v-c2e27ea1]{flex:1;display:flex;flex-direction:column;min-width:0;background:#1a1a1a}.section-title[data-v-c2e27ea1]{font-size:13px;color:#bbb;margin-bottom:10px}.input-zone[data-v-c2e27ea1]{border:1px dashed #3a3a3a;border-radius:10px;padding:16px;background:#252525;margin-bottom:20px}.hint[data-v-c2e27ea1]{color:#888;font-size:12px;margin-bottom:12px;line-height:1.5;text-align:left}.input-row[data-v-c2e27ea1]{display:flex;gap:10px;align-items:center}.input-row[data-v-c2e27ea1] .el-input{flex:1}.opt-btn[data-v-c2e27ea1]{padding:8px 12px;font-size:12px;color:#ccc;background:#2a2a2a;border:1px solid #3a3a3a;border-radius:6px;cursor:pointer;white-space:nowrap}.opt-btn[data-v-c2e27ea1]:hover:not(:disabled){color:#3498db;border-color:#3498db}.opt-btn[data-v-c2e27ea1]:disabled{opacity:.6;cursor:not-allowed}.empty-candidates[data-v-c2e27ea1]{color:#666;font-size:13px;padding:16px;border:1px dashed #333;border-radius:8px;margin-bottom:16px}.candidate-table-scroll[data-v-c2e27ea1]{max-height:320px;overflow:auto;margin-bottom:18px;border-radius:8px;border:1px solid #2a2a2a}.candidate-table[data-v-c2e27ea1]{--el-table-bg-color: #252525;--el-table-tr-bg-color: #252525;--el-table-header-bg-color: #2a2a2a;--el-table-text-color: #ccc;--el-table-border-color: #333}.link-danger[data-v-c2e27ea1]{background:none;border:none;color:#e74c3c;cursor:pointer;font-size:12px;padding:0}.link-danger[data-v-c2e27ea1]:hover{text-decoration:underline}.run-row[data-v-c2e27ea1]{display:flex;flex-wrap:wrap;gap:10px;margin-top:8px}.btn-run[data-v-c2e27ea1]{padding:10px 18px;font-size:14px;font-weight:600;color:#fff;background:#3498db;border:none;border-radius:8px;cursor:pointer}.btn-run[data-v-c2e27ea1]:hover:not(:disabled){background:#2980b9}.btn-run[data-v-c2e27ea1]:disabled{opacity:.55;cursor:not-allowed}.btn-queue[data-v-c2e27ea1]{background:#27ae60}.btn-queue[data-v-c2e27ea1]:hover:not(:disabled){background:#219a52}.loading-msg[data-v-c2e27ea1]{margin-top:12px;font-size:12px;color:#777;line-height:1.5}.queue-debug-card[data-v-c2e27ea1]{margin-top:18px;padding:14px;border:1px solid #2a2a2a;border-radius:10px;background:#202020}.queue-debug-title[data-v-c2e27ea1]{margin-bottom:8px}.queue-debug-line[data-v-c2e27ea1]{color:#b8c1cc;font-size:12px;line-height:1.6;margin-bottom:8px}.queue-debug-payload[data-v-c2e27ea1]{margin:0;max-height:220px;overflow:auto;padding:10px;border-radius:8px;background:#141414;color:#8fd3ff;font-size:11px;line-height:1.5;white-space:pre-wrap;word-break:break-all}.panel-header[data-v-c2e27ea1]{padding:16px 20px;font-size:15px;font-weight:600;color:#e0e0e0;border-bottom:1px solid #2a2a2a}.task-list-wrap[data-v-c2e27ea1]{flex:1;padding:16px 20px;overflow:auto}.clean-result-summary[data-v-c2e27ea1]{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-bottom:16px}.summary-card[data-v-c2e27ea1]{padding:14px 16px;border:1px solid #2a2a2a;border-radius:10px;background:#1e1e1e}.summary-card strong[data-v-c2e27ea1]{display:block;margin-top:8px;font-size:22px;color:#eaf4ff}.summary-label[data-v-c2e27ea1]{font-size:12px;color:#8d8d8d}.subsection-title[data-v-c2e27ea1]{font-size:13px;color:#999;margin:8px 0 10px}.empty-tasks[data-v-c2e27ea1]{color:#666;font-size:13px;padding:16px;text-align:center}.empty-tasks.narrow[data-v-c2e27ea1]{padding:12px 8px}.match-table[data-v-c2e27ea1]{margin-bottom:18px}.match-table[data-v-c2e27ea1] .el-table__body tr:hover>td.el-table__cell,.match-table[data-v-c2e27ea1] .el-table__body tr.hover-row>td.el-table__cell,.match-table[data-v-c2e27ea1] .el-table__body tr.current-row>td.el-table__cell{background-color:var(--el-table-tr-bg-color, #222)!important}.result-table[data-v-c2e27ea1]{--el-table-bg-color: #222;--el-table-tr-bg-color: #222;--el-table-header-bg-color: #2a2a2a;--el-table-text-color: #ccc;--el-table-border-color: #333}.ok[data-v-c2e27ea1]{color:#27ae60}.fail[data-v-c2e27ea1]{color:#e67e22}.result-list-wrap[data-v-c2e27ea1]{border:1px solid #2a2a2a;border-radius:10px;background:#1e1e1e;min-height:220px;margin-top:8px}.result-list-header[data-v-c2e27ea1]{padding:12px 16px;border-bottom:1px solid #2a2a2a;font-size:14px;color:#ddd}.result-subsection[data-v-c2e27ea1]{padding:12px 12px 4px}.result-subsection-title[data-v-c2e27ea1]{font-size:12px;color:#888;margin-bottom:8px}.task-list[data-v-c2e27ea1]{list-style:none;margin:0;padding:0}.task-item[data-v-c2e27ea1]{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:12px 14px;border:1px solid #2a2a2a;border-radius:8px;margin-bottom:8px;background:#222}.left[data-v-c2e27ea1]{flex:1;min-width:0}.split-result-main[data-v-c2e27ea1]{display:flex;flex-direction:column;gap:4px}.id[data-v-c2e27ea1]{font-weight:600;color:#e0e0e0;font-size:13px}.files[data-v-c2e27ea1]{font-size:12px;color:#888}.task-right[data-v-c2e27ea1]{display:flex;align-items:center;gap:8px;flex-wrap:wrap;justify-content:flex-end}.status[data-v-c2e27ea1]{padding:4px 10px;border-radius:6px;font-size:12px;white-space:nowrap}.status.success[data-v-c2e27ea1]{background:#2ecc712e;color:#2ecc71}.status.failed[data-v-c2e27ea1]{background:#e74c3c2e;color:#ff6b6b}.status.running[data-v-c2e27ea1]{background:#3498db2e;color:#3498db}.archive[data-v-c2e27ea1]{padding:6px 10px;border-radius:6px;font-size:12px;background:#3498db2e;color:#69b6ff;border:none;cursor:pointer}.archive[data-v-c2e27ea1]:hover{background:#3498db47}.btn-delete[data-v-c2e27ea1]{padding:6px 10px;border-radius:6px;font-size:12px;background:#e74c3c1f;color:#ff8f8f;border:none;cursor:pointer}.btn-delete[data-v-c2e27ea1]:hover{background:#e74c3c38}@media(max-width:1100px){.main-content[data-v-c2e27ea1]{flex-direction:column;height:auto}.left-panel[data-v-c2e27ea1]{width:100%;border-right:none;border-bottom:1px solid #2a2a2a}.clean-result-summary[data-v-c2e27ea1]{grid-template-columns:repeat(2,minmax(0,1fr))}} diff --git a/app/assets/query-asin.js b/app/assets/query-asin.js deleted file mode 100644 index b03abc8..0000000 --- a/app/assets/query-asin.js +++ /dev/null @@ -1 +0,0 @@ -import{d as nt,o as ot,q as lt,a as u,c as i,b as v,e as o,x as rt,y as ut,t as r,z as b,A as it,B as ct,f as p,G as dt,n as re,m as $e,F as ue,r as Ee,g as d,h as Q,E as f,i as ft,_ as ht,K as vt,j as pt,k as yt}from"./pywebview-B8lwamDf.js";import{z as mt}from"./zh-cn-CqyuNHRW.js";import{B as gt,aN as wt,aO as _t,aP as kt,aQ as It,aR as St,aS as bt,aT as Tt,aU as Ct,aV as At,s as Nt,aW as $t,aX as Et,v as X,aY as Qt}from"./java-modules-B9jblDzU.js";/* empty css */import{c as qt}from"./categorized-timers-JPA-olTr.js";const Dt={class:"page-shell module-page"},Mt={class:"main-content"},Pt={class:"left-panel"},Rt={class:"input-zone"},Ft={class:"input-row"},Ot=["disabled"],Bt={key:0,class:"empty-candidates"},xt={key:1,class:"candidate-table-scroll"},Lt=["onClick"],Ut={class:"run-row"},Ht=["disabled"],Vt=["disabled"],jt={key:2,class:"queue-debug-card"},zt={class:"queue-debug-line"},Kt={key:0,class:"queue-debug-payload"},Jt={class:"right-panel"},Wt={class:"task-list-wrap"},Xt={class:"clean-result-summary"},Gt={class:"summary-card"},Yt={class:"summary-card"},Zt={class:"summary-card"},es={class:"summary-card"},ts={key:0,class:"empty-tasks narrow"},ss=["onClick"],as={class:"result-list-wrap"},ns={key:0,class:"empty-tasks"},os={key:0,class:"result-subsection"},ls={class:"task-list"},rs={class:"left split-result-main"},us=["title"],is={class:"files"},cs={key:0,class:"files"},ds={key:1,class:"files"},fs={key:2,class:"files"},hs={class:"files"},vs={class:"files"},ps={class:"files"},ys={key:3,class:"files"},ms={class:"task-right"},gs=["onClick"],ws={key:1,class:"result-subsection"},_s={class:"task-list"},ks={class:"left split-result-main"},Is=["title"],Ss={class:"files"},bs={key:0,class:"files"},Ts={key:1,class:"files"},Cs={key:2,class:"files"},As={class:"files"},Ns={class:"files"},$s={key:3,class:"files"},Es={class:"files"},Qs={key:4,class:"files"},qs={class:"task-right"},Ds=["onClick"],Ms=["onClick"],Qe=30,Ps=nt({__name:"BrandQueryAsinTab",setup(Fs){const O=d(""),G=d([]),B=d([]),m=d([]),k=d([]),q=d({candidateCount:0,processedTaskCount:0,successTaskCount:0,failedTaskCount:0}),x=d(!1),L=d(!1),Y=d(!1),y=d(""),Z=d(""),h=d([]),c=d(null),T=d(null),C=d(!1),ee=d(!1),w=d({});let A=null;const N=qt("query-asin"),ie=Q(()=>m.value.filter(e=>e.matched&&(e.queryAsins||[]).some(t=>t.asins?.length))),U=Q(()=>k.value.filter(e=>!ge(e.taskStatus))),te=Q(()=>k.value.filter(e=>ge(e.taskStatus))),se=Q(()=>!!c.value||h.value.length>0),H=Q(()=>C.value||se.value),ce=Q(()=>C.value&&se.value);function V(){return typeof window<"u"&&window.localStorage.getItem("uid")||"0"}function de(){return`query-asin:matched:${V()}`}function fe(){return`query-asin:queue-state:${V()}`}function ae(){return`query-asin:start-times:${V()}`}function S(e){return`${(e.shopName||"").trim()}::${e.shopId||""}`}function j(e){return`${e.taskId??0}:${e.resultId??0}`}let _=!1;function he(e){return _?Promise.resolve():N.sleep("queue-wait",e)}function qe(){N.clearCategory("queue-wait")}function ve(e){const t=e instanceof Error?e.message.toLowerCase():String(e||"").toLowerCase();return t.includes("network error")||t.includes("failed to fetch")||t.includes("timeout")||t.includes("503")||t.includes("502")||t.includes("504")||t.includes("500")||t.includes("load failed")}async function De(e,t,n=20){let a=0;for(;;){if(_)throw new Error("component disposed");try{return await e()}catch(l){if(!ve(l)||a>=n-1)throw l;a+=1,t?.(a,n),await he(X())}}}function pe(e,t){return`query-asin:${e}:${t||"shop"}:${Date.now()}`}function D(e){if(!e)return"-";const t=new Date(e);if(Number.isNaN(t.getTime()))return e;const n=t.getFullYear(),a=String(t.getMonth()+1).padStart(2,"0"),l=String(t.getDate()).padStart(2,"0"),s=String(t.getHours()).padStart(2,"0"),g=String(t.getMinutes()).padStart(2,"0"),le=String(t.getSeconds()).padStart(2,"0");return`${n}-${a}-${l} ${s}:${g}:${le}`}function Me(e){const t=(e||"").trim();return{MATCHED:"已匹配",PENDING:"待匹配",CONFLICT:"需人工确认",INDEX_STALE:"索引过期"}[t]||t||"-"}function Pe(e){const t=(e.matchMessage||"").trim();return t||(e.matched&&e.matchStatus==="MATCHED"?"索引已命中,可推送到 Python 队列":e.matched?"已命中索引,请结合状态列确认":"未命中或未就绪,请检查店铺名")}function Re(e){const t=I(e),n=Math.max(...t.map(a=>a.asins?.length||0),1);return Array.from({length:n},(a,l)=>({shopName:l===0?e.shopName:"",countries:t.map(s=>({country:s.country,asin:s.asins?.[l]||""}))}))}function ye(e){const t=I(e),n=t.reduce((l,s)=>l+(s.asins?.length||0),0);return`${t.filter(l=>l.asins?.length).map(l=>l.country).join("、")||"无国家"},共 ${n} 个 ASIN`}function z(e){return(e||[]).map(t=>({country:(t.country||"").trim().toUpperCase(),asins:Array.from(new Set((t.asins||[]).map(n=>(n||"").trim().toUpperCase()).filter(Boolean)))})).filter(t=>t.country&&t.asins.length)}function I(e){return z(e?.queryAsins?.length?e.queryAsins:e?.query_asins)}function K(e){return I(e).some(t=>t.asins.length)}function me(e){const t=(e||"").trim(),n=[T.value,...h.value,...m.value],a=n.find(s=>(s?.shopName||"").trim()===t&&K(s)),l=n.find(s=>K(s));return I(a||l)}function $(e,t){const n=K(e)?I(e):I(t||void 0);return{...e,queryAsins:n.length?n:me(e.shopName)}}function ge(e){return e==="SUCCESS"||e==="FAILED"||e==="COMPLETED"}function we(e){return e==="SUCCESS"||e==="COMPLETED"?"已完成":e==="FAILED"?"失败":"执行中"}function _e(e){return e==="SUCCESS"||e==="COMPLETED"?"success":e==="FAILED"?"failed":"running"}function Fe(e){return!!(e.resultId&&(e.fileReady||e.downloadUrl))}function ke(){typeof window>"u"||window.localStorage.setItem(de(),JSON.stringify(m.value))}function Oe(){try{const e=typeof window<"u"?window.localStorage.getItem(de()):null;m.value=e?JSON.parse(e):[]}catch{m.value=[]}}function E(){if(typeof window>"u")return;const e={pendingQueue:h.value,activeTaskId:c.value,activeQueueItem:T.value};window.localStorage.setItem(fe(),JSON.stringify(e))}function Ie(){if(!(typeof window>"u")){if(!Object.keys(w.value).length){window.localStorage.removeItem(ae());return}window.localStorage.setItem(ae(),JSON.stringify(w.value))}}function Be(){try{const e=typeof window<"u"?window.localStorage.getItem(fe()):null;if(!e)return;const t=JSON.parse(e);h.value=t.pendingQueue||[],c.value=t.activeTaskId??null,T.value=t.activeQueueItem??null}catch{h.value=[],c.value=null,T.value=null}}function xe(){try{const e=typeof window<"u"?window.localStorage.getItem(ae()):null,t=e?JSON.parse(e):{},n={};for(const[a,l]of Object.entries(t||{})){const s=Number(a);!Number.isFinite(s)||s<=0||typeof l!="string"||!l.trim()||(n[s]=l)}w.value=n}catch{w.value={}}}function Le(e,t=new Date().toISOString()){!Number.isFinite(e)||e<=0||(w.value={...w.value,[e]:t},Ie())}function ne(e){if(!e||!(e in w.value))return;const t={...w.value};delete t[e],w.value=t,Ie()}function Se(e){return e&&w.value[e]||""}function M(){c.value=null,T.value=null,E()}function P(){se.value||(C.value=!1,Y.value=!1,ee.value=!1,W(),E())}function Ue(e){const t=e instanceof Error?e.message:String(e||"");return/记录不存在|任务不存在|不存在|已删除|not\s*found|404/i.test(t)}function He(e){k.value=k.value.filter(t=>!(e.resultId!=null&&t.resultId===e.resultId||e.taskId!=null&&t.taskId===e.taskId))}function Ve(e,t){const n=new Map;for(const a of e)n.set(S(a),a);for(const a of t)n.set(S(a),a);return Array.from(n.values())}async function R(){G.value=await wt()}async function J(){q.value=await _t()}async function oe(){const e=await kt();k.value=(e.items||[]).map(t=>$(t))}async function F(){await Promise.all([J(),oe()])}function be(){if(!c.value){P();return}if(k.value.some(n=>n.taskId===c.value))return;const t=c.value;M(),y.value=h.value.length?`任务 ${t} 已不存在,已跳过并继续剩余队列`:"当前任务已不存在,已释放本地队列状态",P()}function je(e){if(!e.length)return;const t=new Map(e.map(a=>[j(a),$(a)])),n=k.value.map(a=>{const l=t.get(j(a));if(!l)return $(a);const s=K(l)?I(l):I(a).length?I(a):me(l.shopName||a.shopName);return{...a,...l,queryAsins:s}});for(const a of e){const l=j(a);n.some(s=>j(s)===l)||n.push($(a))}k.value=n}async function Te(e){const t=Array.from(new Set((e&&e.length?e:U.value.map(a=>a.taskId??0)).filter(a=>Number.isFinite(a)&&a>0)));if(!t.length)return;const n=await Qt(t);je(n.items||[]),(n.missingTaskIds||[]).length&&(await oe(),be())}function ze(){if(W(),_||!H.value)return;const e=async()=>{A=null,!(_||!H.value)&&(await Te(),!_&&H.value&&(A=N.setTimeout("history-poll",e,X()*2)))};A=N.setTimeout("history-poll",e,X()*2)}function W(){A&&(N.clearTimer("history-poll",A),A=null)}function Ke(e){B.value=e}async function Ce(){const e=O.value.trim();if(!e){f.warning("请输入店铺名");return}x.value=!0;try{await It(e),O.value="",await Promise.all([R(),J()]),f.success("已加入备选区")}catch(t){f.error(t instanceof Error?t.message:"添加失败")}finally{x.value=!1}}async function Je(e){try{await St(e),B.value=B.value.filter(t=>t.id!==e),await Promise.all([R(),J()]),f.success("已删除")}catch(t){f.error(t instanceof Error?t.message:"删除失败")}}function We(e,t){const n=new Map;for(const a of e)n.set(S(a),a);for(const a of t)n.set(S(a),a);return Array.from(n.values())}async function Xe(){const e=B.value.map(t=>t.shop_name).filter(Boolean);if(!e.length){f.warning("请先勾选备选区店铺");return}L.value=!0;try{const t=await bt(e);m.value=We(m.value,t.items||[]),ke(),f.success(`本次返回 ${t.items?.length||0} 条匹配结果`)}catch(t){f.error(t instanceof Error?t.message:"匹配失败")}finally{L.value=!1}}function Ge(e){if(H.value){f.warning("队列执行中,请等待当前串行任务结束后再调整");return}m.value=m.value.filter(t=>S(t)!==S(e)),ke()}function Ye(e){return{shopName:e.shopName,matched:e.matched,shopId:e.shopId,platform:e.platform,companyName:e.companyName,matchStatus:e.matchStatus,matchMessage:e.matchMessage,queryAsins:z(e.queryAsins)}}function Ze(e,t){const n=pe(e,t.shopName);return{type:"query-asin-run",ts:Date.now(),data:{taskId:e,user_id:Number(V())||0,source:"frontend-vue-query-asin",submissionId:n,items:[{shopName:t.shopName,submissionId:n,shopId:t.shopId,platform:t.platform,companyName:t.companyName,matched:t.matched,matchStatus:t.matchStatus,matchMessage:t.matchMessage,queryAsins:z(t.queryAsins)}],query_asins:z(t.queryAsins),query_asin_rows:Re(t)}}}function et(e){return k.value.find(t=>t.taskId===e)}async function tt(e){let t=0;for(;;){if(_)return"STOPPED";try{if(await Te([e]),c.value!==e)return"FAILED";t>0&&(y.value=`任务 ${e} 后端已恢复,继续等待执行结果...`),t=0;const a=et(e)?.taskStatus||"";if(a==="SUCCESS"||a==="FAILED"||a==="COMPLETED")return a}catch(n){if(!ve(n))throw n;if(t+=1,t>=Qe)throw new Error(`任务 ${e} 等待后端恢复超时,请稍后刷新查看状态`);y.value=`任务 ${e} 执行中,正在等待后端服务恢复(${t}/${Qe})...`}await he(X())}}async function Ae(){if(!(_||C.value)){C.value=!0,Y.value=!0,ze();try{const e=ft();if(!e?.enqueue_json)throw new Error("当前客户端未提供 enqueue_json");for(;!_&&(c.value||h.value.length);){if(c.value){const g=await tt(c.value);y.value=h.value.length>0?`任务 ${c.value} ${g==="SUCCESS"?"已完成":"执行失败"},自动继续下一个(剩余 ${h.value.length} 条)`:`任务 ${c.value} ${g==="SUCCESS"?"已完成":"执行失败"}`,M();continue}const t=h.value.shift();if(E(),!t)break;const n=await De(()=>Tt([Ye(t)]),(g,le)=>{y.value=`后端服务暂时不可用,正在重试创建任务(${g}/${le})...`}),a=n.items?.[0]?$(n.items[0],t):void 0;if(!a?.taskId||!a.resultId)throw new Error("后端未返回有效任务标识");c.value=n.taskId,T.value=$(t,a),E(),await F();const l=Ze(n.taskId,a);Z.value=JSON.stringify(l,null,2);const s=await e.enqueue_json(l);if(!s?.success){await Ct(n.taskId,{shops:[{shopName:a.shopName||t.shopName||"",error:s?.error||`任务 ${n.taskId} 推送失败`,shopDone:!0,submissionId:pe(n.taskId,a.shopName||t.shopName)}]}),await F(),y.value=`任务 ${n.taskId} 推送失败,已自动继续下一个任务`,M();continue}Le(n.taskId),y.value=h.value.length>0?`任务 ${n.taskId} 已入队,等待完成后自动继续下一个(剩余 ${h.value.length} 条)`:`任务 ${n.taskId} 已入队,等待执行完成`}y.value="串行队列已执行完成",await F(),f.success("查询ASIN队列已按顺序执行完成")}catch(e){if(_)return;const t=e instanceof Error?e.message:"队列执行失败";y.value=t,f.error(t),await F()}finally{C.value=!1,Y.value=!1,W(),E()}}}async function st(){ee.value=!0,P();const e=ie.value;if(!e.length){f.warning("请先匹配可用店铺");return}h.value=Ve(h.value,e),E(),y.value=`已加入 ${e.length} 条店铺,开始串行执行`,await Ae()}async function at(e){if(!e.resultId)return;const t=At(e.resultId),n=e.outputFilename||`${e.shopName||"result"}.xlsx`,a=await Nt(t,n,`query-asin:${e.resultId}`);a.success?f.success(`已保存: ${a.path||n}`):a.error&&a.error!=="用户取消"&&f.error(a.error)}async function Ne(e){try{if(e.taskId)await $t(e.taskId),c.value===e.taskId&&M(),ne(e.taskId);else if(e.resultId)await Et(e.resultId),ne(e.taskId);else throw new Error("缺少可删除的任务标识");await Promise.all([R(),F()]),P(),f.success("已删除")}catch(t){if(Ue(t)){e.taskId&&c.value===e.taskId&&M(),ne(e.taskId),He(e),await R(),P(),f.success("后端记录已不存在,已同步移除本地记录");return}f.error(t instanceof Error?t.message:"删除失败")}}return ot(async()=>{Oe(),Be(),xe(),await Promise.all([R(),J(),oe()]),be(),(c.value||h.value.length)&&(ee.value=!0,y.value=c.value!=null?`检测到未完成队列,继续等待任务 ${c.value} 完成并自动接续后续店铺`:`检测到未完成队列,继续执行剩余 ${h.value.length} 条店铺`,Ae())}),lt(()=>{_=!0,W(),qe(),N.clearScope()}),(e,t)=>{const n=ut,a=it,l=ct;return u(),i("div",Dt,[v(gt,{active:"query-asin"}),o("div",Mt,[o("aside",Pt,[t[3]||(t[3]=o("div",{class:"section-title"},"店铺输入",-1)),o("div",Rt,[t[1]||(t[1]=o("div",{class:"hint"}," 左侧负责录入店铺并加入备选区,确认命中后推送到 Python 队列。查询ASIN按店铺串行执行:上一个任务完成后会自动开始下一个,失败也会继续下一个。 ",-1)),o("div",Ft,[v(n,{modelValue:O.value,"onUpdate:modelValue":t[0]||(t[0]=s=>O.value=s),clearable:"",placeholder:"请输入店铺名后回车或点击添加",onKeyup:rt(Ce,["enter"])},null,8,["modelValue"]),o("button",{type:"button",class:"opt-btn",disabled:x.value,onClick:Ce},r(x.value?"添加中...":"添加"),9,Ot)])]),t[4]||(t[4]=o("div",{class:"section-title"},"备选区",-1)),G.value.length?(u(),i("div",xt,[v(l,{data:G.value,"row-key":"id",height:"260",class:"candidate-table",onSelectionChange:Ke},{default:b(()=>[v(a,{type:"selection",width:"42"}),v(a,{prop:"shop_name",label:"店铺名","min-width":"140","show-overflow-tooltip":""}),v(a,{label:"操作",width:"72",align:"center"},{default:b(({row:s})=>[o("button",{type:"button",class:"link-danger",onClick:g=>Je(s.id)}," 删除 ",8,Lt)]),_:1})]),_:1},8,["data"])])):(u(),i("div",Bt," 暂无备选店铺,请先输入并添加 ")),o("div",Ut,[o("button",{type:"button",class:"btn-run",disabled:L.value,onClick:Xe},r(L.value?"匹配中...":"匹配店铺"),9,Ht),o("button",{type:"button",class:"btn-run btn-queue",disabled:ce.value||!ie.value.length,onClick:st},r(ce.value?"串行执行中...":"推送到 Python 队列"),9,Vt)]),t[5]||(t[5]=o("p",{class:"loading-msg"}," 当前页面会按店铺串行推送任务,并在任务成功或失败后自动接续下一个任务。服务端临时重启时会自动重试查询状态,恢复后继续后续店铺。 ",-1)),y.value?(u(),i("div",jt,[t[2]||(t[2]=o("div",{class:"section-title queue-debug-title"},"队列状态",-1)),o("div",zt,r(y.value),1),Z.value?(u(),i("pre",Kt,r(Z.value),1)):p("",!0)])):p("",!0)]),o("section",Jt,[t[14]||(t[14]=o("div",{class:"panel-header"},"匹配与任务",-1)),o("div",Wt,[o("div",Xt,[o("div",Gt,[t[6]||(t[6]=o("span",{class:"summary-label"},"备选店铺",-1)),o("strong",null,r(q.value.candidateCount),1)]),o("div",Yt,[t[7]||(t[7]=o("span",{class:"summary-label"},"已处理任务",-1)),o("strong",null,r(q.value.processedTaskCount),1)]),o("div",Zt,[t[8]||(t[8]=o("span",{class:"summary-label"},"成功任务",-1)),o("strong",null,r(q.value.successTaskCount),1)]),o("div",es,[t[9]||(t[9]=o("span",{class:"summary-label"},"失败任务",-1)),o("strong",null,r(q.value.failedTaskCount),1)])]),t[13]||(t[13]=o("div",{class:"subsection-title"},"匹配结果",-1)),m.value.length?(u(),dt(l,{key:1,data:m.value,"row-key":S,"highlight-current-row":!1,class:"result-table match-table"},{default:b(()=>[v(a,{prop:"shopName",label:"店铺名","min-width":"120"}),v(a,{label:"匹配",width:"72",align:"center"},{default:b(({row:s})=>[o("span",{class:re(s.matched?"ok":"fail")},r(s.matched?"是":"否"),3)]),_:1}),v(a,{prop:"shopId",label:"店铺 ID","min-width":"120","show-overflow-tooltip":""}),v(a,{prop:"platform",label:"平台",width:"88","show-overflow-tooltip":""}),v(a,{prop:"companyName",label:"公司","min-width":"120","show-overflow-tooltip":""}),v(a,{label:"状态",width:"110","show-overflow-tooltip":""},{default:b(({row:s})=>[$e(r(Me(s.matchStatus)),1)]),_:1}),v(a,{label:"说明","min-width":"180","show-overflow-tooltip":""},{default:b(({row:s})=>[$e(r(Pe(s)),1)]),_:1}),v(a,{label:"操作",width:"72",align:"center"},{default:b(({row:s})=>[o("button",{type:"button",class:"link-danger",onClick:g=>Ge(s)}," 删除 ",8,ss)]),_:1})]),_:1},8,["data"])):(u(),i("div",ts," 完成“匹配店铺”后,这里会展示匹配结果。 ")),o("div",as,[t[12]||(t[12]=o("div",{class:"result-list-header"},[o("span",null,"任务记录")],-1)),!U.value.length&&!te.value.length?(u(),i("div",ns," 暂无任务记录。推送到 Python 队列后,这里会展示当前任务和历史任务。 ")):(u(),i(ue,{key:1},[U.value.length?(u(),i("div",os,[t[10]||(t[10]=o("div",{class:"result-subsection-title"},"当前任务",-1)),o("ul",ls,[(u(!0),i(ue,null,Ee(U.value,s=>(u(),i("li",{key:`${s.resultId}-${s.taskId}`,class:"task-item"},[o("div",rs,[o("span",{class:"id",title:s.shopName||""},r(s.shopName||"-"),9,us),o("div",is,"任务 ID: "+r(s.taskId??"-"),1),s.resultId?(u(),i("div",cs," 结果 ID: "+r(s.resultId),1)):p("",!0),s.shopId?(u(),i("div",ds," 店铺 ID: "+r(s.shopId),1)):p("",!0),s.platform?(u(),i("div",fs," 平台: "+r(s.platform),1)):p("",!0),o("div",hs," 开始时间: "+r(D(Se(s.taskId))),1),o("div",vs," 创建时间: "+r(D(s.createdAt)),1),o("div",ps," ASIN结构: "+r(ye(s)),1),s.error?(u(),i("div",ys," 错误: "+r(s.error),1)):p("",!0)]),o("div",ms,[o("span",{class:re(["status",_e(s.taskStatus)])},r(we(s.taskStatus)),3),o("button",{type:"button",class:"btn-delete",onClick:g=>Ne(s)}," 删除 ",8,gs)])]))),128))])])):p("",!0),te.value.length?(u(),i("div",ws,[t[11]||(t[11]=o("div",{class:"result-subsection-title"},"历史任务",-1)),o("ul",_s,[(u(!0),i(ue,null,Ee(te.value,s=>(u(),i("li",{key:`${s.resultId}-${s.taskId}`,class:"task-item"},[o("div",ks,[o("span",{class:"id",title:s.shopName||""},r(s.shopName||"-"),9,Is),o("div",Ss,"任务 ID: "+r(s.taskId??"-"),1),s.resultId?(u(),i("div",bs," 结果 ID: "+r(s.resultId),1)):p("",!0),s.shopId?(u(),i("div",Ts," 店铺 ID: "+r(s.shopId),1)):p("",!0),s.platform?(u(),i("div",Cs," 平台: "+r(s.platform),1)):p("",!0),o("div",As," 开始时间: "+r(D(Se(s.taskId))),1),o("div",Ns," 创建时间: "+r(D(s.createdAt)),1),s.finishedAt?(u(),i("div",$s," 完成时间: "+r(D(s.finishedAt)),1)):p("",!0),o("div",Es," ASIN结构: "+r(ye(s)),1),s.error?(u(),i("div",Qs," 错误: "+r(s.error),1)):p("",!0)]),o("div",qs,[o("span",{class:re(["status",_e(s.taskStatus)])},r(we(s.taskStatus)),3),Fe(s)?(u(),i("button",{key:0,type:"button",class:"archive",onClick:g=>at(s)}," 下载结果 ",8,Ds)):p("",!0),o("button",{type:"button",class:"btn-delete",onClick:g=>Ne(s)}," 删除 ",8,Ms)])]))),128))])])):p("",!0)],64))])])])])])}}}),Rs=ht(Ps,[["__scopeId","data-v-c2e27ea1"]]);vt.locale("zh-cn");pt(Rs).use(yt,{locale:mt}).mount("#app"); diff --git a/app/assets/shop-match-DCW4m_j8.css b/app/assets/shop-match-DCW4m_j8.css deleted file mode 100644 index 87b40fd..0000000 --- a/app/assets/shop-match-DCW4m_j8.css +++ /dev/null @@ -1 +0,0 @@ -.el-button{--el-button-font-weight:var(--el-font-weight-primary);--el-button-border-color:var(--el-border-color);--el-button-bg-color:var(--el-fill-color-blank);--el-button-text-color:var(--el-text-color-regular);--el-button-disabled-text-color:var(--el-disabled-text-color);--el-button-disabled-bg-color:var(--el-fill-color-blank);--el-button-disabled-border-color:var(--el-border-color-light);--el-button-divide-border-color:#ffffff80;--el-button-hover-text-color:var(--el-color-primary);--el-button-hover-bg-color:var(--el-color-primary-light-9);--el-button-hover-border-color:var(--el-color-primary-light-7);--el-button-active-text-color:var(--el-button-hover-text-color);--el-button-active-border-color:var(--el-color-primary);--el-button-active-bg-color:var(--el-button-hover-bg-color);--el-button-outline-color:var(--el-color-primary-light-5);--el-button-hover-link-text-color:var(--el-text-color-secondary);--el-button-active-color:var(--el-text-color-primary);white-space:nowrap;cursor:pointer;height:32px;color:var(--el-button-text-color);text-align:center;box-sizing:border-box;line-height:1;font-weight:var(--el-button-font-weight);-webkit-user-select:none;user-select:none;vertical-align:middle;-webkit-appearance:none;background-color:var(--el-button-bg-color);border:var(--el-border);border-color:var(--el-button-border-color);outline:none;justify-content:center;align-items:center;transition:all .1s;display:inline-flex}.el-button:hover{color:var(--el-button-hover-text-color);border-color:var(--el-button-hover-border-color);background-color:var(--el-button-hover-bg-color);outline:none}.el-button:active{color:var(--el-button-active-text-color);border-color:var(--el-button-active-border-color);background-color:var(--el-button-active-bg-color);outline:none}.el-button:focus-visible{outline:2px solid var(--el-button-outline-color);outline-offset:1px;transition:outline-offset,outline}.el-button>span{align-items:center;display:inline-flex}.el-button+.el-button{margin-left:12px}.el-button{font-size:var(--el-font-size-base);border-radius:var(--el-border-radius-base);padding:8px 15px}.el-button.is-round{padding:8px 15px}.el-button::-moz-focus-inner{border:0}.el-button [class*=el-icon]+span{margin-left:6px}.el-button [class*=el-icon] svg{vertical-align:bottom}.el-button.is-plain{--el-button-hover-text-color:var(--el-color-primary);--el-button-hover-bg-color:var(--el-fill-color-blank);--el-button-hover-border-color:var(--el-color-primary)}.el-button.is-active{color:var(--el-button-active-text-color);border-color:var(--el-button-active-border-color);background-color:var(--el-button-active-bg-color);outline:none}.el-button.is-disabled,.el-button.is-disabled:hover{color:var(--el-button-disabled-text-color);cursor:not-allowed;background-image:none;background-color:var(--el-button-disabled-bg-color);border-color:var(--el-button-disabled-border-color)}.el-button.is-loading{pointer-events:none;position:relative}.el-button.is-loading:before{z-index:1;pointer-events:none;content:"";border-radius:inherit;background-color:var(--el-mask-color-extra-light);position:absolute;inset:-1px}.el-button.is-round{border-radius:var(--el-border-radius-round)}.el-button.is-dashed{--el-button-hover-text-color:var(--el-color-primary);--el-button-hover-bg-color:var(--el-fill-color-blank);--el-button-hover-border-color:var(--el-color-primary);border-style:dashed}.el-button.is-circle{border-radius:50%;width:32px;padding:8px}.el-button.is-text{color:var(--el-button-text-color);background-color:#0000;border:0 solid #0000}.el-button.is-text.is-disabled{color:var(--el-button-disabled-text-color);background-color:#0000!important}.el-button.is-text:not(.is-disabled):hover{background-color:var(--el-fill-color-light)}.el-button.is-text:not(.is-disabled):focus-visible{outline:2px solid var(--el-button-outline-color);outline-offset:1px;transition:outline-offset,outline}.el-button.is-text:not(.is-disabled):active{background-color:var(--el-fill-color)}.el-button.is-text:not(.is-disabled).is-has-bg{background-color:var(--el-fill-color-light)}.el-button.is-text:not(.is-disabled).is-has-bg:hover{background-color:var(--el-fill-color)}.el-button.is-text:not(.is-disabled).is-has-bg:active{background-color:var(--el-fill-color-dark)}.el-button__text--expand{letter-spacing:.3em;margin-right:-.3em}.el-button.is-link{color:var(--el-button-text-color);background:0 0;border-color:#0000;height:auto;padding:2px}.el-button.is-link:hover{color:var(--el-button-hover-link-text-color)}.el-button.is-link.is-disabled{color:var(--el-button-disabled-text-color);background-color:#0000!important;border-color:#0000!important}.el-button.is-link:not(.is-disabled):hover{background-color:#0000;border-color:#0000}.el-button.is-link:not(.is-disabled):active{color:var(--el-button-active-color);background-color:#0000;border-color:#0000}.el-button--text{color:var(--el-color-primary);background:0 0;border-color:#0000;padding-left:0;padding-right:0}.el-button--text.is-disabled{color:var(--el-button-disabled-text-color);background-color:#0000!important;border-color:#0000!important}.el-button--text:not(.is-disabled):hover{color:var(--el-color-primary-light-3);background-color:#0000;border-color:#0000}.el-button--text:not(.is-disabled):active{color:var(--el-color-primary-dark-2);background-color:#0000;border-color:#0000}.el-button__link--expand{letter-spacing:.3em;margin-right:-.3em}.el-button--primary{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-primary);--el-button-border-color:var(--el-color-primary);--el-button-outline-color:var(--el-color-primary-light-5);--el-button-active-color:var(--el-color-primary-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-primary-light-5);--el-button-hover-bg-color:var(--el-color-primary-light-3);--el-button-hover-border-color:var(--el-color-primary-light-3);--el-button-active-bg-color:var(--el-color-primary-dark-2);--el-button-active-border-color:var(--el-color-primary-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-primary-light-5);--el-button-disabled-border-color:var(--el-color-primary-light-5)}.el-button--primary.is-plain,.el-button--primary.is-text,.el-button--primary.is-link{--el-button-text-color:var(--el-color-primary);--el-button-bg-color:var(--el-color-primary-light-9);--el-button-border-color:var(--el-color-primary-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-primary);--el-button-hover-border-color:var(--el-color-primary);--el-button-active-text-color:var(--el-color-white)}.el-button--primary.is-plain.is-disabled,.el-button--primary.is-plain.is-disabled:hover,.el-button--primary.is-plain.is-disabled:focus,.el-button--primary.is-plain.is-disabled:active,.el-button--primary.is-text.is-disabled,.el-button--primary.is-text.is-disabled:hover,.el-button--primary.is-text.is-disabled:focus,.el-button--primary.is-text.is-disabled:active,.el-button--primary.is-link.is-disabled,.el-button--primary.is-link.is-disabled:hover,.el-button--primary.is-link.is-disabled:focus,.el-button--primary.is-link.is-disabled:active{color:var(--el-color-primary-light-5);background-color:var(--el-color-primary-light-9);border-color:var(--el-color-primary-light-8)}.el-button--primary.is-dashed{--el-button-text-color:var(--el-color-primary);--el-button-bg-color:var(--el-color-primary-light-9);--el-button-border-color:var(--el-color-primary-light-5);--el-button-hover-text-color:var(--el-color-primary);--el-button-hover-bg-color:var(--el-color-primary-light-9);--el-button-hover-border-color:var(--el-color-primary-light-3);--el-button-active-text-color:var(--el-color-primary-dark-2);--el-button-active-bg-color:var(--el-color-primary-light-9);--el-button-active-border-color:var(--el-color-primary-dark-2)}.el-button--primary.is-dashed.is-disabled,.el-button--primary.is-dashed.is-disabled:hover,.el-button--primary.is-dashed.is-disabled:focus,.el-button--primary.is-dashed.is-disabled:active{color:var(--el-color-primary-light-5);background-color:var(--el-color-primary-light-9);border-color:var(--el-color-primary-light-8)}.el-button--success{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-success);--el-button-border-color:var(--el-color-success);--el-button-outline-color:var(--el-color-success-light-5);--el-button-active-color:var(--el-color-success-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-success-light-5);--el-button-hover-bg-color:var(--el-color-success-light-3);--el-button-hover-border-color:var(--el-color-success-light-3);--el-button-active-bg-color:var(--el-color-success-dark-2);--el-button-active-border-color:var(--el-color-success-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-success-light-5);--el-button-disabled-border-color:var(--el-color-success-light-5)}.el-button--success.is-plain,.el-button--success.is-text,.el-button--success.is-link{--el-button-text-color:var(--el-color-success);--el-button-bg-color:var(--el-color-success-light-9);--el-button-border-color:var(--el-color-success-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-success);--el-button-hover-border-color:var(--el-color-success);--el-button-active-text-color:var(--el-color-white)}.el-button--success.is-plain.is-disabled,.el-button--success.is-plain.is-disabled:hover,.el-button--success.is-plain.is-disabled:focus,.el-button--success.is-plain.is-disabled:active,.el-button--success.is-text.is-disabled,.el-button--success.is-text.is-disabled:hover,.el-button--success.is-text.is-disabled:focus,.el-button--success.is-text.is-disabled:active,.el-button--success.is-link.is-disabled,.el-button--success.is-link.is-disabled:hover,.el-button--success.is-link.is-disabled:focus,.el-button--success.is-link.is-disabled:active{color:var(--el-color-success-light-5);background-color:var(--el-color-success-light-9);border-color:var(--el-color-success-light-8)}.el-button--success.is-dashed{--el-button-text-color:var(--el-color-success);--el-button-bg-color:var(--el-color-success-light-9);--el-button-border-color:var(--el-color-success-light-5);--el-button-hover-text-color:var(--el-color-success);--el-button-hover-bg-color:var(--el-color-success-light-9);--el-button-hover-border-color:var(--el-color-success-light-3);--el-button-active-text-color:var(--el-color-success-dark-2);--el-button-active-bg-color:var(--el-color-success-light-9);--el-button-active-border-color:var(--el-color-success-dark-2)}.el-button--success.is-dashed.is-disabled,.el-button--success.is-dashed.is-disabled:hover,.el-button--success.is-dashed.is-disabled:focus,.el-button--success.is-dashed.is-disabled:active{color:var(--el-color-success-light-5);background-color:var(--el-color-success-light-9);border-color:var(--el-color-success-light-8)}.el-button--warning{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-warning);--el-button-border-color:var(--el-color-warning);--el-button-outline-color:var(--el-color-warning-light-5);--el-button-active-color:var(--el-color-warning-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-warning-light-5);--el-button-hover-bg-color:var(--el-color-warning-light-3);--el-button-hover-border-color:var(--el-color-warning-light-3);--el-button-active-bg-color:var(--el-color-warning-dark-2);--el-button-active-border-color:var(--el-color-warning-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-warning-light-5);--el-button-disabled-border-color:var(--el-color-warning-light-5)}.el-button--warning.is-plain,.el-button--warning.is-text,.el-button--warning.is-link{--el-button-text-color:var(--el-color-warning);--el-button-bg-color:var(--el-color-warning-light-9);--el-button-border-color:var(--el-color-warning-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-warning);--el-button-hover-border-color:var(--el-color-warning);--el-button-active-text-color:var(--el-color-white)}.el-button--warning.is-plain.is-disabled,.el-button--warning.is-plain.is-disabled:hover,.el-button--warning.is-plain.is-disabled:focus,.el-button--warning.is-plain.is-disabled:active,.el-button--warning.is-text.is-disabled,.el-button--warning.is-text.is-disabled:hover,.el-button--warning.is-text.is-disabled:focus,.el-button--warning.is-text.is-disabled:active,.el-button--warning.is-link.is-disabled,.el-button--warning.is-link.is-disabled:hover,.el-button--warning.is-link.is-disabled:focus,.el-button--warning.is-link.is-disabled:active{color:var(--el-color-warning-light-5);background-color:var(--el-color-warning-light-9);border-color:var(--el-color-warning-light-8)}.el-button--warning.is-dashed{--el-button-text-color:var(--el-color-warning);--el-button-bg-color:var(--el-color-warning-light-9);--el-button-border-color:var(--el-color-warning-light-5);--el-button-hover-text-color:var(--el-color-warning);--el-button-hover-bg-color:var(--el-color-warning-light-9);--el-button-hover-border-color:var(--el-color-warning-light-3);--el-button-active-text-color:var(--el-color-warning-dark-2);--el-button-active-bg-color:var(--el-color-warning-light-9);--el-button-active-border-color:var(--el-color-warning-dark-2)}.el-button--warning.is-dashed.is-disabled,.el-button--warning.is-dashed.is-disabled:hover,.el-button--warning.is-dashed.is-disabled:focus,.el-button--warning.is-dashed.is-disabled:active{color:var(--el-color-warning-light-5);background-color:var(--el-color-warning-light-9);border-color:var(--el-color-warning-light-8)}.el-button--danger{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-danger);--el-button-border-color:var(--el-color-danger);--el-button-outline-color:var(--el-color-danger-light-5);--el-button-active-color:var(--el-color-danger-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-danger-light-5);--el-button-hover-bg-color:var(--el-color-danger-light-3);--el-button-hover-border-color:var(--el-color-danger-light-3);--el-button-active-bg-color:var(--el-color-danger-dark-2);--el-button-active-border-color:var(--el-color-danger-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-danger-light-5);--el-button-disabled-border-color:var(--el-color-danger-light-5)}.el-button--danger.is-plain,.el-button--danger.is-text,.el-button--danger.is-link{--el-button-text-color:var(--el-color-danger);--el-button-bg-color:var(--el-color-danger-light-9);--el-button-border-color:var(--el-color-danger-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-danger);--el-button-hover-border-color:var(--el-color-danger);--el-button-active-text-color:var(--el-color-white)}.el-button--danger.is-plain.is-disabled,.el-button--danger.is-plain.is-disabled:hover,.el-button--danger.is-plain.is-disabled:focus,.el-button--danger.is-plain.is-disabled:active,.el-button--danger.is-text.is-disabled,.el-button--danger.is-text.is-disabled:hover,.el-button--danger.is-text.is-disabled:focus,.el-button--danger.is-text.is-disabled:active,.el-button--danger.is-link.is-disabled,.el-button--danger.is-link.is-disabled:hover,.el-button--danger.is-link.is-disabled:focus,.el-button--danger.is-link.is-disabled:active{color:var(--el-color-danger-light-5);background-color:var(--el-color-danger-light-9);border-color:var(--el-color-danger-light-8)}.el-button--danger.is-dashed{--el-button-text-color:var(--el-color-danger);--el-button-bg-color:var(--el-color-danger-light-9);--el-button-border-color:var(--el-color-danger-light-5);--el-button-hover-text-color:var(--el-color-danger);--el-button-hover-bg-color:var(--el-color-danger-light-9);--el-button-hover-border-color:var(--el-color-danger-light-3);--el-button-active-text-color:var(--el-color-danger-dark-2);--el-button-active-bg-color:var(--el-color-danger-light-9);--el-button-active-border-color:var(--el-color-danger-dark-2)}.el-button--danger.is-dashed.is-disabled,.el-button--danger.is-dashed.is-disabled:hover,.el-button--danger.is-dashed.is-disabled:focus,.el-button--danger.is-dashed.is-disabled:active{color:var(--el-color-danger-light-5);background-color:var(--el-color-danger-light-9);border-color:var(--el-color-danger-light-8)}.el-button--info{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-info);--el-button-border-color:var(--el-color-info);--el-button-outline-color:var(--el-color-info-light-5);--el-button-active-color:var(--el-color-info-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-info-light-5);--el-button-hover-bg-color:var(--el-color-info-light-3);--el-button-hover-border-color:var(--el-color-info-light-3);--el-button-active-bg-color:var(--el-color-info-dark-2);--el-button-active-border-color:var(--el-color-info-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-info-light-5);--el-button-disabled-border-color:var(--el-color-info-light-5)}.el-button--info.is-plain,.el-button--info.is-text,.el-button--info.is-link{--el-button-text-color:var(--el-color-info);--el-button-bg-color:var(--el-color-info-light-9);--el-button-border-color:var(--el-color-info-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-info);--el-button-hover-border-color:var(--el-color-info);--el-button-active-text-color:var(--el-color-white)}.el-button--info.is-plain.is-disabled,.el-button--info.is-plain.is-disabled:hover,.el-button--info.is-plain.is-disabled:focus,.el-button--info.is-plain.is-disabled:active,.el-button--info.is-text.is-disabled,.el-button--info.is-text.is-disabled:hover,.el-button--info.is-text.is-disabled:focus,.el-button--info.is-text.is-disabled:active,.el-button--info.is-link.is-disabled,.el-button--info.is-link.is-disabled:hover,.el-button--info.is-link.is-disabled:focus,.el-button--info.is-link.is-disabled:active{color:var(--el-color-info-light-5);background-color:var(--el-color-info-light-9);border-color:var(--el-color-info-light-8)}.el-button--info.is-dashed{--el-button-text-color:var(--el-color-info);--el-button-bg-color:var(--el-color-info-light-9);--el-button-border-color:var(--el-color-info-light-5);--el-button-hover-text-color:var(--el-color-info);--el-button-hover-bg-color:var(--el-color-info-light-9);--el-button-hover-border-color:var(--el-color-info-light-3);--el-button-active-text-color:var(--el-color-info-dark-2);--el-button-active-bg-color:var(--el-color-info-light-9);--el-button-active-border-color:var(--el-color-info-dark-2)}.el-button--info.is-dashed.is-disabled,.el-button--info.is-dashed.is-disabled:hover,.el-button--info.is-dashed.is-disabled:focus,.el-button--info.is-dashed.is-disabled:active{color:var(--el-color-info-light-5);background-color:var(--el-color-info-light-9);border-color:var(--el-color-info-light-8)}.el-button--large{--el-button-size:40px;height:var(--el-button-size)}.el-button--large [class*=el-icon]+span{margin-left:8px}.el-button--large{font-size:var(--el-font-size-base);border-radius:var(--el-border-radius-base);padding:12px 19px}.el-button--large.is-round{padding:12px 19px}.el-button--large.is-circle{width:var(--el-button-size);padding:12px}.el-button--small{--el-button-size:24px;height:var(--el-button-size)}.el-button--small [class*=el-icon]+span{margin-left:4px}.el-button--small{border-radius:calc(var(--el-border-radius-base) - 1px);padding:5px 11px;font-size:12px}.el-button--small.is-round{padding:5px 11px}.el-button--small.is-circle{width:var(--el-button-size);padding:5px}.el-date-table{-webkit-user-select:none;user-select:none;font-size:12px}.el-date-table.is-week-mode .el-date-table__row:hover .el-date-table-cell{background-color:var(--el-datepicker-inrange-bg-color)}.el-date-table.is-week-mode .el-date-table__row:hover td.available:hover{color:var(--el-datepicker-text-color)}.el-date-table.is-week-mode .el-date-table__row:hover td:first-child .el-date-table-cell{border-top-left-radius:15px;border-bottom-left-radius:15px;margin-left:5px}.el-date-table.is-week-mode .el-date-table__row:hover td:last-child .el-date-table-cell{border-top-right-radius:15px;border-bottom-right-radius:15px;margin-right:5px}.el-date-table.is-week-mode .el-date-table__row.current .el-date-table-cell{background-color:var(--el-datepicker-inrange-bg-color)}.el-date-table td{box-sizing:border-box;text-align:center;cursor:pointer;width:32px;height:30px;padding:4px 0;position:relative}.el-date-table td .el-date-table-cell{box-sizing:border-box;height:30px;padding:3px 0}.el-date-table td .el-date-table-cell .el-date-table-cell__text{border-radius:50%;width:24px;height:24px;margin:0 auto;line-height:24px;display:block;position:absolute;left:50%;transform:translate(-50%)}.el-date-table td.next-month,.el-date-table td.prev-month{color:var(--el-datepicker-off-text-color)}.el-date-table td.today{position:relative}.el-date-table td.today .el-date-table-cell__text{color:var(--el-color-primary);font-weight:700}.el-date-table td.today.start-date .el-date-table-cell__text,.el-date-table td.today.end-date .el-date-table-cell__text{color:#fff}.el-date-table td.available:hover{color:var(--el-datepicker-hover-text-color)}.el-date-table td.in-range .el-date-table-cell{background-color:var(--el-datepicker-inrange-bg-color)}.el-date-table td.in-range .el-date-table-cell:hover{background-color:var(--el-datepicker-inrange-hover-bg-color)}.el-date-table td.current:not(.disabled) .el-date-table-cell__text{color:#fff;background-color:var(--el-datepicker-active-color)}.el-date-table td.current:not(.disabled):focus-visible .el-date-table-cell__text{outline:2px solid var(--el-datepicker-active-color);outline-offset:1px}.el-date-table td.start-date .el-date-table-cell,.el-date-table td.end-date .el-date-table-cell{color:#fff}.el-date-table td.start-date .el-date-table-cell__text,.el-date-table td.end-date .el-date-table-cell__text{background-color:var(--el-datepicker-active-color)}.el-date-table td.start-date .el-date-table-cell{border-top-left-radius:15px;border-bottom-left-radius:15px;margin-left:5px}.el-date-table td.end-date .el-date-table-cell{border-top-right-radius:15px;border-bottom-right-radius:15px;margin-right:5px}.el-date-table td.disabled .el-date-table-cell{background-color:var(--el-fill-color-light);opacity:1;cursor:not-allowed;color:var(--el-text-color-placeholder)}.el-date-table td.selected .el-date-table-cell{border-radius:15px;margin-left:5px;margin-right:5px}.el-date-table td.selected .el-date-table-cell__text{background-color:var(--el-datepicker-active-color);color:#fff;border-radius:15px}.el-date-table td.week{color:var(--el-datepicker-off-text-color);cursor:default;font-size:80%}.el-date-table td:focus{outline:none}.el-date-table th{color:var(--el-datepicker-header-text-color);border-bottom:solid 1px var(--el-border-color-lighter);padding:5px;font-weight:400}.el-date-table th.el-date-table__week-header{width:24px;padding:0}.el-month-table{border-collapse:collapse;margin:-1px;font-size:12px}.el-month-table td{text-align:center;cursor:pointer;width:68px;padding:8px 0;position:relative}.el-month-table td .el-date-table-cell{box-sizing:border-box;height:48px;padding:6px 0}.el-month-table td.today .el-date-table-cell__text{color:var(--el-color-primary);font-weight:700}.el-month-table td.today.start-date .el-date-table-cell__text,.el-month-table td.today.end-date .el-date-table-cell__text{color:#fff}.el-month-table td.disabled .el-date-table-cell__text{background-color:var(--el-fill-color-light);cursor:not-allowed;color:var(--el-text-color-placeholder)}.el-month-table td.disabled .el-date-table-cell__text:hover{color:var(--el-text-color-placeholder)}.el-month-table td .el-date-table-cell__text{width:54px;height:36px;color:var(--el-datepicker-text-color);border-radius:18px;margin:0 auto;line-height:36px;display:block;position:absolute;left:50%;transform:translate(-50%)}.el-month-table td .el-date-table-cell__text:hover{color:var(--el-datepicker-hover-text-color)}.el-month-table td.in-range .el-date-table-cell{background-color:var(--el-datepicker-inrange-bg-color)}.el-month-table td.in-range .el-date-table-cell:hover{background-color:var(--el-datepicker-inrange-hover-bg-color)}.el-month-table td.start-date .el-date-table-cell,.el-month-table td.end-date .el-date-table-cell{color:#fff}.el-month-table td.start-date .el-date-table-cell__text,.el-month-table td.end-date .el-date-table-cell__text{color:#fff;background-color:var(--el-datepicker-active-color)}.el-month-table td.start-date .el-date-table-cell{border-top-left-radius:24px;border-bottom-left-radius:24px;margin-left:3px}.el-month-table td.end-date .el-date-table-cell{border-top-right-radius:24px;border-bottom-right-radius:24px;margin-right:3px}.el-month-table td.current:not(.disabled) .el-date-table-cell{border-radius:24px;margin-left:3px;margin-right:3px}.el-month-table td.current:not(.disabled) .el-date-table-cell__text{color:#fff;background-color:var(--el-datepicker-active-color)}.el-month-table td:focus-visible{outline:none}.el-month-table td:focus-visible .el-date-table-cell__text{outline:2px solid var(--el-datepicker-active-color);outline-offset:1px}.el-year-table{border-collapse:collapse;margin:-1px;font-size:12px}.el-year-table .el-icon{color:var(--el-datepicker-icon-color)}.el-year-table td{text-align:center;cursor:pointer;width:68px;padding:8px 0;position:relative}.el-year-table td .el-date-table-cell{box-sizing:border-box;height:48px;padding:6px 0}.el-year-table td.today .el-date-table-cell__text{color:var(--el-color-primary);font-weight:700}.el-year-table td.today.start-date .el-date-table-cell__text,.el-year-table td.today.end-date .el-date-table-cell__text{color:#fff}.el-year-table td.disabled .el-date-table-cell__text{background-color:var(--el-fill-color-light);cursor:not-allowed;color:var(--el-text-color-placeholder)}.el-year-table td.disabled .el-date-table-cell__text:hover{color:var(--el-text-color-placeholder)}.el-year-table td .el-date-table-cell__text{width:60px;height:36px;color:var(--el-datepicker-text-color);border-radius:18px;margin:0 auto;line-height:36px;display:block;position:absolute;left:50%;transform:translate(-50%)}.el-year-table td .el-date-table-cell__text:hover{color:var(--el-datepicker-hover-text-color)}.el-year-table td.in-range .el-date-table-cell{background-color:var(--el-datepicker-inrange-bg-color)}.el-year-table td.in-range .el-date-table-cell:hover{background-color:var(--el-datepicker-inrange-hover-bg-color)}.el-year-table td.start-date .el-date-table-cell,.el-year-table td.end-date .el-date-table-cell{color:#fff}.el-year-table td.start-date .el-date-table-cell__text,.el-year-table td.end-date .el-date-table-cell__text{color:#fff;background-color:var(--el-datepicker-active-color)}.el-year-table td.start-date .el-date-table-cell{border-top-left-radius:24px;border-bottom-left-radius:24px}.el-year-table td.end-date .el-date-table-cell{border-top-right-radius:24px;border-bottom-right-radius:24px}.el-year-table td.current:not(.disabled) .el-date-table-cell__text{color:#fff;background-color:var(--el-datepicker-active-color)}.el-year-table td:focus-visible{outline:none}.el-year-table td:focus-visible .el-date-table-cell__text{outline:2px solid var(--el-datepicker-active-color);outline-offset:1px}.el-time-spinner.has-seconds .el-time-spinner__wrapper{width:33.3%}.el-time-spinner__wrapper{vertical-align:top;width:50%;max-height:192px;display:inline-block;position:relative;overflow:auto}.el-time-spinner__wrapper.el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default){padding-bottom:15px}.el-time-spinner__wrapper.is-arrow{box-sizing:border-box;text-align:center;overflow:hidden}.el-time-spinner__wrapper.is-arrow .el-time-spinner__list{transform:translateY(-32px)}.el-time-spinner__wrapper.is-arrow .el-time-spinner__item:hover:not(.is-disabled):not(.is-active){background:var(--el-fill-color-light);cursor:default}.el-time-spinner__arrow{color:var(--el-text-color-secondary);width:100%;z-index:var(--el-index-normal);text-align:center;cursor:pointer;height:30px;font-size:12px;line-height:30px;position:absolute;left:0}.el-time-spinner__arrow:hover{color:var(--el-color-primary)}.el-time-spinner__arrow.arrow-up{top:10px}.el-time-spinner__arrow.arrow-down{bottom:10px}.el-time-spinner__input.el-input{width:70%}.el-time-spinner__input.el-input .el-input__inner{text-align:center;padding:0}.el-time-spinner__list{text-align:center;margin:0;padding:0;list-style:none}.el-time-spinner__list:after,.el-time-spinner__list:before{content:"";width:100%;height:80px;display:block}.el-time-spinner__item{height:32px;color:var(--el-text-color-regular);font-size:12px;line-height:32px}.el-time-spinner__item:hover:not(.is-disabled):not(.is-active){background:var(--el-fill-color-light);cursor:pointer}.el-time-spinner__item.is-active:not(.is-disabled){color:var(--el-text-color-primary);font-weight:700}.el-time-spinner__item.is-disabled{color:var(--el-text-color-placeholder);cursor:not-allowed}.fade-in-linear-enter-active,.fade-in-linear-leave-active{transition:var(--el-transition-fade-linear)}.fade-in-linear-enter-from,.fade-in-linear-leave-to{opacity:0}.el-fade-in-linear-enter-active,.el-fade-in-linear-leave-active{transition:var(--el-transition-fade-linear)}.el-fade-in-linear-enter-from,.el-fade-in-linear-leave-to{opacity:0}.el-fade-in-enter-active,.el-fade-in-leave-active{transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-fade-in-enter-from,.el-fade-in-leave-active{opacity:0}.el-zoom-in-center-enter-active,.el-zoom-in-center-leave-active{transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-zoom-in-center-enter-from,.el-zoom-in-center-leave-active{opacity:0;transform:scaleX(0)}.el-zoom-in-top-enter-active,.el-zoom-in-top-leave-active{opacity:1;transition:var(--el-transition-md-fade);transform-origin:top;transform:scaleY(1)}.el-zoom-in-top-enter-active[data-popper-placement^=top],.el-zoom-in-top-leave-active[data-popper-placement^=top]{transform-origin:bottom}.el-zoom-in-top-enter-from,.el-zoom-in-top-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-bottom-enter-active,.el-zoom-in-bottom-leave-active{opacity:1;transition:var(--el-transition-md-fade);transform-origin:bottom;transform:scaleY(1)}.el-zoom-in-bottom-enter-from,.el-zoom-in-bottom-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-left-enter-active,.el-zoom-in-left-leave-active{opacity:1;transition:var(--el-transition-md-fade);transform-origin:0 0;transform:scale(1)}.el-zoom-in-left-enter-from,.el-zoom-in-left-leave-active{opacity:0;transform:scale(.45)}.collapse-transition{transition:var(--el-transition-duration) height ease-in-out,var(--el-transition-duration) padding-top ease-in-out,var(--el-transition-duration) padding-bottom ease-in-out}.el-collapse-transition-leave-active,.el-collapse-transition-enter-active{transition:var(--el-transition-duration) max-height ease-in-out,var(--el-transition-duration) padding-top ease-in-out,var(--el-transition-duration) padding-bottom ease-in-out}.horizontal-collapse-transition{transition:var(--el-transition-duration) width ease-in-out,var(--el-transition-duration) padding-left ease-in-out,var(--el-transition-duration) padding-right ease-in-out}.el-list-enter-active,.el-list-leave-active{transition:all 1s}.el-list-enter-from,.el-list-leave-to{opacity:0;transform:translateY(-30px)}.el-list-leave-active{position:absolute!important}.el-opacity-transition{transition:opacity var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-picker__popper{--el-datepicker-border-color:var(--el-disabled-border-color)}.el-picker__popper.el-popper{background:var(--el-bg-color-overlay);border:1px solid var(--el-datepicker-border-color);box-shadow:var(--el-box-shadow-light)}.el-picker__popper.el-popper .el-popper__arrow:before{border:1px solid var(--el-datepicker-border-color)}.el-picker__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-top-color:#0000;border-left-color:#0000}.el-picker__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:#0000;border-right-color:#0000}.el-picker__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-bottom-color:#0000;border-left-color:#0000}.el-picker__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-top-color:#0000;border-right-color:#0000}.el-date-editor{--el-date-editor-width:220px;--el-date-editor-monthrange-width:300px;--el-date-editor-daterange-width:350px;--el-date-editor-datetimerange-width:400px;--el-input-text-color:var(--el-text-color-regular);--el-input-border:var(--el-border);--el-input-hover-border:var(--el-border-color-hover);--el-input-focus-border:var(--el-color-primary);--el-input-transparent-border:0 0 0 1px transparent inset;--el-input-border-color:var(--el-border-color);--el-input-border-radius:var(--el-border-radius-base);--el-input-bg-color:var(--el-fill-color-blank);--el-input-icon-color:var(--el-text-color-placeholder);--el-input-placeholder-color:var(--el-text-color-placeholder);--el-input-hover-border-color:var(--el-border-color-hover);--el-input-clear-hover-color:var(--el-text-color-secondary);--el-input-focus-border-color:var(--el-color-primary);--el-input-width:100%;text-align:left;vertical-align:middle;position:relative}.el-date-editor.el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-border-color,var(--el-border-color)) inset}.el-date-editor.el-input__wrapper:hover{box-shadow:0 0 0 1px var(--el-input-hover-border-color) inset}.el-date-editor.is-focus .el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset}.el-date-editor.el-input,.el-date-editor.el-input__wrapper{width:var(--el-date-editor-width);height:var(--el-input-height,var(--el-component-size))}.el-date-editor--monthrange{--el-date-editor-width:var(--el-date-editor-monthrange-width)}.el-date-editor--daterange,.el-date-editor--timerange{--el-date-editor-width:var(--el-date-editor-daterange-width)}.el-date-editor--datetimerange{--el-date-editor-width:var(--el-date-editor-datetimerange-width)}.el-date-editor--dates .el-input__wrapper{text-overflow:ellipsis;white-space:nowrap}.el-date-editor .close-icon,.el-date-editor .clear-icon{cursor:pointer}.el-date-editor .clear-icon:hover{color:var(--el-input-clear-hover-color)}.el-date-editor .el-range__icon{height:inherit;color:var(--el-text-color-placeholder);float:left;font-size:14px}.el-date-editor .el-range__icon svg{vertical-align:middle}.el-date-editor .el-range-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;text-align:center;width:39%;height:30px;line-height:30px;font-size:var(--el-font-size-base);color:var(--el-text-color-regular);background-color:#0000;border:none;outline:none;margin:0;padding:0;display:inline-block}.el-date-editor .el-range-input::placeholder{color:var(--el-text-color-placeholder)}.el-date-editor .el-range-separator{overflow-wrap:break-word;height:100%;color:var(--el-text-color-primary);flex:1;justify-content:center;align-items:center;margin:0;padding:0 5px;font-size:14px;display:inline-flex}.el-date-editor .el-range__close-icon{color:var(--el-text-color-placeholder);height:inherit;width:unset;cursor:pointer;font-size:14px}.el-date-editor .el-range__close-icon:hover{color:var(--el-input-clear-hover-color)}.el-date-editor .el-range__close-icon svg{vertical-align:middle}.el-date-editor .el-range__close-icon--hidden{opacity:0;visibility:hidden}.el-range-editor.el-input__wrapper{vertical-align:middle;align-items:center;padding:0 10px;display:inline-flex}.el-range-editor.is-active,.el-range-editor.is-active:hover{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset}.el-range-editor--large{line-height:var(--el-component-size-large)}.el-range-editor--large.el-input__wrapper{height:var(--el-component-size-large)}.el-range-editor--large .el-range-separator{font-size:14px;line-height:40px}.el-range-editor--large .el-range-input{height:38px;font-size:14px;line-height:38px}.el-range-editor--small{line-height:var(--el-component-size-small)}.el-range-editor--small.el-input__wrapper{height:var(--el-component-size-small)}.el-range-editor--small .el-range-separator{font-size:12px;line-height:24px}.el-range-editor--small .el-range-input{height:22px;font-size:12px;line-height:22px}.el-range-editor.is-disabled{background-color:var(--el-disabled-bg-color);border-color:var(--el-disabled-border-color);color:var(--el-disabled-text-color);cursor:not-allowed}.el-range-editor.is-disabled:hover,.el-range-editor.is-disabled:focus{border-color:var(--el-disabled-border-color)}.el-range-editor.is-disabled input{background-color:var(--el-disabled-bg-color);color:var(--el-disabled-text-color);cursor:not-allowed}.el-range-editor.is-disabled input::placeholder{color:var(--el-text-color-placeholder)}.el-range-editor.is-disabled .el-range-separator{color:var(--el-disabled-text-color)}.el-picker-panel{color:var(--el-text-color-regular);background:var(--el-datepicker-bg-color);border-radius:var(--el-popper-border-radius,var(--el-border-radius-base));line-height:30px}.el-picker-panel .el-time-panel{border:solid 1px var(--el-datepicker-border-color);background-color:var(--el-datepicker-bg-color);box-shadow:var(--el-box-shadow-light);margin:5px 0}.el-picker-panel__body:after,.el-picker-panel__body-wrapper:after{content:"";clear:both;display:table}.el-picker-panel__content{margin:15px;position:relative}.el-picker-panel__footer{border-top:1px solid var(--el-datepicker-inner-border-color);text-align:right;background-color:var(--el-datepicker-bg-color);padding:4px 12px;font-size:0;position:relative}.el-picker-panel__shortcut{width:100%;color:var(--el-datepicker-text-color);text-align:left;cursor:pointer;background-color:#0000;border:0;outline:none;padding-left:12px;font-size:14px;line-height:28px;display:block}.el-picker-panel__shortcut:hover{color:var(--el-datepicker-hover-text-color)}.el-picker-panel__shortcut.active{color:var(--el-datepicker-active-color);background-color:#e6f1fe}.el-picker-panel__btn{border:1px solid var(--el-fill-color-darker);color:var(--el-text-color-primary);cursor:pointer;background-color:#0000;border-radius:2px;outline:none;padding:0 20px;font-size:12px;line-height:24px}.el-picker-panel__btn[disabled]{color:var(--el-text-color-disabled);cursor:not-allowed}.el-picker-panel__icon-btn{color:var(--el-datepicker-icon-color);cursor:pointer;background:0 0;border:0;outline:none;margin-top:8px;padding:1px 6px;font-size:12px;line-height:1}.el-picker-panel__icon-btn:hover{color:var(--el-datepicker-hover-text-color)}.el-picker-panel__icon-btn:focus-visible{color:var(--el-datepicker-hover-text-color)}.el-picker-panel__icon-btn.is-disabled{color:var(--el-text-color-disabled)}.el-picker-panel__icon-btn.is-disabled:hover{cursor:not-allowed}.el-picker-panel__icon-btn.is-disabled .el-icon{cursor:inherit}.el-picker-panel__icon-btn .el-icon{cursor:pointer;font-size:inherit}.el-picker-panel__link-btn{vertical-align:middle}.el-picker-panel.is-disabled .el-picker-panel__prev-btn{color:var(--el-text-color-disabled)}.el-picker-panel.is-disabled .el-picker-panel__prev-btn:hover{cursor:not-allowed}.el-picker-panel.is-disabled .el-picker-panel__prev-btn .el-icon{cursor:inherit}.el-picker-panel.is-disabled .el-picker-panel__next-btn{color:var(--el-text-color-disabled)}.el-picker-panel.is-disabled .el-picker-panel__next-btn:hover{cursor:not-allowed}.el-picker-panel.is-disabled .el-picker-panel__next-btn .el-icon{cursor:inherit}.el-picker-panel.is-disabled .el-picker-panel__icon-btn{color:var(--el-text-color-disabled)}.el-picker-panel.is-disabled .el-picker-panel__icon-btn:hover{cursor:not-allowed}.el-picker-panel.is-disabled .el-picker-panel__icon-btn .el-icon{cursor:inherit}.el-picker-panel.is-disabled .el-picker-panel__shortcut{color:var(--el-text-color-disabled)}.el-picker-panel.is-disabled .el-picker-panel__shortcut:hover{cursor:not-allowed}.el-picker-panel.is-disabled .el-picker-panel__shortcut .el-icon{cursor:inherit}.el-picker-panel [slot=sidebar],.el-picker-panel__sidebar{border-right:1px solid var(--el-datepicker-inner-border-color);box-sizing:border-box;width:110px;padding-top:6px;position:absolute;top:0;bottom:0;overflow:auto}.el-picker-panel [slot=sidebar]+.el-picker-panel__body,.el-picker-panel__sidebar+.el-picker-panel__body{margin-left:110px}.el-date-picker{--el-datepicker-text-color:var(--el-text-color-regular);--el-datepicker-off-text-color:var(--el-text-color-placeholder);--el-datepicker-header-text-color:var(--el-text-color-regular);--el-datepicker-icon-color:var(--el-text-color-primary);--el-datepicker-border-color:var(--el-disabled-border-color);--el-datepicker-inner-border-color:var(--el-border-color-light);--el-datepicker-inrange-bg-color:var(--el-border-color-extra-light);--el-datepicker-inrange-hover-bg-color:var(--el-border-color-extra-light);--el-datepicker-active-color:var(--el-color-primary);--el-datepicker-hover-text-color:var(--el-color-primary);--el-datepicker-bg-color:var(--el-bg-color-overlay);--el-fill-color-blank:var(--el-datepicker-bg-color);width:322px}.el-date-picker.has-sidebar.has-time{width:434px}.el-date-picker.has-sidebar{width:438px}.el-date-picker.has-time .el-picker-panel__body-wrapper{position:relative}.el-date-picker .el-picker-panel__content{width:292px}.el-date-picker table{table-layout:fixed;width:100%}.el-date-picker__editor-wrap{padding:0 5px;display:table-cell;position:relative}.el-date-picker__time-header{border-bottom:1px solid var(--el-datepicker-inner-border-color);box-sizing:border-box;width:100%;padding:8px 5px 5px;font-size:12px;display:table;position:relative}.el-date-picker__header{text-align:center;padding:12px 12px 0}.el-date-picker__header--bordered{border-bottom:solid 1px var(--el-border-color-lighter);margin-bottom:0;padding-bottom:12px}.el-date-picker__header--bordered+.el-picker-panel__content{margin-top:0}.el-date-picker__header-label{text-align:center;cursor:pointer;color:var(--el-text-color-regular);padding:0 5px;font-size:16px;font-weight:500;line-height:22px}.el-date-picker__header-label:hover{color:var(--el-datepicker-hover-text-color)}.el-date-picker__header-label:focus-visible{color:var(--el-datepicker-hover-text-color);outline:none}.el-date-picker__header-label.active{color:var(--el-datepicker-active-color)}.el-date-picker__prev-btn{float:left}.el-date-picker__next-btn{float:right}.el-date-picker__time-wrap{text-align:center;padding:10px}.el-date-picker__time-label{float:left;cursor:pointer;margin-left:10px;line-height:30px}.el-date-picker .el-time-panel{position:absolute}.el-date-picker.is-disabled .el-date-picker__header-label{color:var(--el-text-color-disabled)}.el-date-picker.is-disabled .el-date-picker__header-label:hover{cursor:not-allowed}.el-date-picker.is-disabled .el-date-picker__header-label .el-icon{cursor:inherit}.el-date-range-picker{--el-datepicker-text-color:var(--el-text-color-regular);--el-datepicker-off-text-color:var(--el-text-color-placeholder);--el-datepicker-header-text-color:var(--el-text-color-regular);--el-datepicker-icon-color:var(--el-text-color-primary);--el-datepicker-border-color:var(--el-disabled-border-color);--el-datepicker-inner-border-color:var(--el-border-color-light);--el-datepicker-inrange-bg-color:var(--el-border-color-extra-light);--el-datepicker-inrange-hover-bg-color:var(--el-border-color-extra-light);--el-datepicker-active-color:var(--el-color-primary);--el-datepicker-hover-text-color:var(--el-color-primary);--el-datepicker-bg-color:var(--el-bg-color-overlay);width:646px}.el-date-range-picker.has-sidebar{width:756px}.el-date-range-picker.has-time .el-picker-panel__body-wrapper{position:relative}.el-date-range-picker table{table-layout:fixed;width:100%}.el-date-range-picker .el-picker-panel__body{min-width:513px}.el-date-range-picker .el-picker-panel__content{margin:0}.el-date-range-picker__header{text-align:center;height:28px;position:relative}.el-date-range-picker__header [class*=arrow-left]{float:left}.el-date-range-picker__header [class*=arrow-right]{float:right}.el-date-range-picker__header div{margin-right:50px;font-size:16px;font-weight:500}.el-date-range-picker__header-label{text-align:center;cursor:pointer;color:var(--el-text-color-regular);padding:0 5px;font-size:16px;font-weight:500;line-height:22px}.el-date-range-picker__header-label:hover{color:var(--el-datepicker-hover-text-color)}.el-date-range-picker__header-label:focus-visible{color:var(--el-datepicker-hover-text-color);outline:none}.el-date-range-picker__header-label.active{color:var(--el-datepicker-active-color)}.el-date-range-picker__content{box-sizing:border-box;width:50%;margin:0;padding:16px;display:table-cell}.el-date-range-picker__content.is-left{border-right:1px solid var(--el-datepicker-inner-border-color)}.el-date-range-picker__content .el-date-range-picker__header div{margin-left:50px;margin-right:50px}.el-date-range-picker__editors-wrap{box-sizing:border-box;display:table-cell}.el-date-range-picker__editors-wrap.is-right{text-align:right}.el-date-range-picker__time-header{border-bottom:1px solid var(--el-datepicker-inner-border-color);box-sizing:border-box;width:100%;padding:8px 5px 5px;font-size:12px;display:table;position:relative}.el-date-range-picker__time-header>.el-icon-arrow-right{vertical-align:middle;color:var(--el-datepicker-icon-color);font-size:20px;display:table-cell}.el-date-range-picker__time-picker-wrap{padding:0 5px;display:table-cell;position:relative}.el-date-range-picker__time-picker-wrap .el-picker-panel{z-index:1;background:#fff;position:absolute;top:13px;right:0}.el-date-range-picker__time-picker-wrap .el-time-panel{position:absolute}.el-date-range-picker.is-disabled .el-date-range-picker__header-label{color:var(--el-text-color-disabled)}.el-date-range-picker.is-disabled .el-date-range-picker__header-label:hover{cursor:not-allowed}.el-date-range-picker.is-disabled .el-date-range-picker__header-label .el-icon{cursor:inherit}.el-time-range-picker{width:354px;overflow:visible}.el-time-range-picker__content{text-align:center;z-index:1;padding:10px;position:relative}.el-time-range-picker__cell{box-sizing:border-box;width:50%;margin:0;padding:4px 7px 7px;display:inline-block}.el-time-range-picker__header{text-align:center;margin-bottom:5px;font-size:14px}.el-time-range-picker__body{border:1px solid var(--el-datepicker-border-color);border-radius:2px}.el-time-panel{width:180px;z-index:var(--el-index-top);-webkit-user-select:none;user-select:none;box-sizing:content-box;border-radius:2px;position:relative;left:0}.el-time-panel__content{font-size:0;position:relative;overflow:hidden}.el-time-panel__content:after,.el-time-panel__content:before{content:"";z-index:-1;box-sizing:border-box;text-align:left;height:32px;margin-top:-16px;padding-top:6px;position:absolute;top:50%;left:0;right:0}.el-time-panel__content:after{margin-left:12%;margin-right:12%;left:50%}.el-time-panel__content:before{border-top:1px solid var(--el-border-color-light);border-bottom:1px solid var(--el-border-color-light);margin-left:12%;margin-right:12%;padding-left:50%}.el-time-panel__content.has-seconds:after{left:66.6667%}.el-time-panel__content.has-seconds:before{padding-left:33.3333%}.el-time-panel__footer{border-top:1px solid var(--el-timepicker-inner-border-color,var(--el-border-color-light));text-align:right;box-sizing:border-box;height:36px;padding:4px;line-height:25px}.el-time-panel__btn{cursor:pointer;color:var(--el-text-color-primary);background-color:#0000;border:none;outline:none;margin:0 5px;padding:0 5px;font-size:12px;line-height:28px}.el-time-panel__btn.confirm{color:var(--el-timepicker-active-color,var(--el-color-primary));font-weight:800}.el-picker-panel.is-border{border:solid 1px var(--el-border-color-lighter)}.el-picker-panel.is-border .el-picker-panel__body-wrapper{position:relative}.el-picker-panel.is-border.el-picker-panel [slot=sidebar],.el-picker-panel.is-border.el-picker-panel__sidebar{border-right:1px solid var(--el-datepicker-inner-border-color);box-sizing:border-box;width:110px;height:100%;padding-top:6px;position:absolute;top:0;overflow:auto}.module-page[data-v-9e4d7259]{min-height:100vh;background:#1a1a1a}.main-content[data-v-9e4d7259]{display:flex;min-height:calc(100vh - 56px);height:calc(100vh - 56px)}.left-panel[data-v-9e4d7259]{width:400px;background:#1e1e1e;padding:20px;overflow-y:auto;border-right:1px solid #2a2a2a}.right-panel[data-v-9e4d7259]{flex:1;display:flex;flex-direction:column;min-width:0;background:#1a1a1a}.section-title[data-v-9e4d7259]{font-size:13px;color:#bbb;margin-bottom:10px}.input-zone[data-v-9e4d7259]{border:1px dashed #3a3a3a;border-radius:10px;padding:16px;background:#252525;margin-bottom:20px}.hint[data-v-9e4d7259]{color:#888;font-size:12px;margin-bottom:12px;line-height:1.5;text-align:left}.country-pref-hint[data-v-9e4d7259]{margin-top:-4px}.country-pref-checks[data-v-9e4d7259]{display:flex;flex-wrap:wrap;gap:10px 16px;margin-bottom:12px}.country-check-row[data-v-9e4d7259]{display:inline-flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none;font-size:12px;color:#ccc}.country-check-input[data-v-9e4d7259]{width:16px;height:16px;accent-color:#409eff;cursor:pointer;flex-shrink:0}.country-check-text[data-v-9e4d7259]{line-height:1.3}.country-order-panel[data-v-9e4d7259]{border:1px solid #333;border-radius:8px;padding:10px 12px;background:#252525;margin-bottom:14px}.country-order-caption[data-v-9e4d7259]{font-size:11px;color:#777;margin-bottom:8px}.country-order-list[data-v-9e4d7259]{display:flex;flex-direction:column;gap:6px}.country-drag-row[data-v-9e4d7259]{display:flex;align-items:center;gap:10px;padding:8px 10px;background:#2c2c2c;border-radius:6px;border:1px solid #3a3a3a;cursor:grab;-webkit-user-select:none;user-select:none}.country-drag-row.dragging[data-v-9e4d7259]{opacity:.55;border-color:#3498db}.drag-handle[data-v-9e4d7259]{color:#666;font-size:12px;letter-spacing:-2px}.country-drag-label[data-v-9e4d7259]{font-size:12px;color:#ccc}.country-pref-status[data-v-9e4d7259]{font-size:11px;color:#888;margin-bottom:10px}.input-row[data-v-9e4d7259]{display:flex;gap:10px;align-items:center}.input-row[data-v-9e4d7259] .el-input{flex:1}.opt-btn[data-v-9e4d7259],.schedule-remove[data-v-9e4d7259],.schedule-add[data-v-9e4d7259]{padding:8px 12px;font-size:12px;color:#ccc;background:#2a2a2a;border:1px solid #3a3a3a;border-radius:6px;cursor:pointer;white-space:nowrap}.opt-btn[data-v-9e4d7259]:hover:not(:disabled),.schedule-remove[data-v-9e4d7259]:hover:not(:disabled),.schedule-add[data-v-9e4d7259]:hover:not(:disabled){color:#3498db;border-color:#3498db}.opt-btn[data-v-9e4d7259]:disabled,.schedule-remove[data-v-9e4d7259]:disabled,.schedule-add[data-v-9e4d7259]:disabled{opacity:.6;cursor:not-allowed}.empty-candidates[data-v-9e4d7259]{color:#666;font-size:13px;padding:16px;border:1px dashed #333;border-radius:8px;margin-bottom:16px}.candidate-table-scroll[data-v-9e4d7259]{max-height:280px;overflow:auto;margin-bottom:16px;border-radius:8px;border:1px solid #2a2a2a}.candidate-table[data-v-9e4d7259]{--el-table-bg-color: #252525;--el-table-tr-bg-color: #252525;--el-table-header-bg-color: #2a2a2a;--el-table-text-color: #ccc;--el-table-border-color: #333}.schedule-switch[data-v-9e4d7259]{display:flex;align-items:center;gap:8px;color:#ccc;font-size:12px;margin-bottom:12px}.schedule-config[data-v-9e4d7259]{border:1px solid #333;border-radius:8px;padding:12px;background:#252525;margin-bottom:16px}.schedule-row[data-v-9e4d7259]{display:flex;align-items:center;gap:10px;margin-bottom:10px}.schedule-picker[data-v-9e4d7259]{flex:1}.schedule-picker[data-v-9e4d7259] .el-input__wrapper{background-color:#2a2a2a;box-shadow:0 0 0 1px #3a3a3a inset}.schedule-picker[data-v-9e4d7259] .el-input__inner{color:#ccc}.schedule-add[data-v-9e4d7259]{margin-top:2px}.schedule-hint[data-v-9e4d7259]{margin-top:10px;margin-bottom:0}.link-danger[data-v-9e4d7259]{background:none;border:none;color:#e74c3c;cursor:pointer;font-size:12px;padding:0}.link-danger[data-v-9e4d7259]:hover{text-decoration:underline}.run-row[data-v-9e4d7259]{display:flex;flex-wrap:wrap;gap:10px;margin-top:8px}.btn-run[data-v-9e4d7259]{padding:10px 18px;font-size:14px;font-weight:600;color:#fff;background:#3498db;border:none;border-radius:8px;cursor:pointer}.btn-run[data-v-9e4d7259]:hover:not(:disabled){background:#2980b9}.btn-run[data-v-9e4d7259]:disabled{opacity:.55;cursor:not-allowed}.btn-queue[data-v-9e4d7259]{background:#27ae60}.btn-queue[data-v-9e4d7259]:hover:not(:disabled){background:#219a52}.loading-msg[data-v-9e4d7259]{margin-top:12px;font-size:12px;color:#777;line-height:1.5}.loading-msg code[data-v-9e4d7259]{font-size:11px;color:#8fd3ff}.queue-debug-card[data-v-9e4d7259]{margin-top:18px;padding:14px;border:1px solid #2a2a2a;border-radius:10px;background:#202020}.queue-debug-title[data-v-9e4d7259]{margin-bottom:8px}.queue-debug-line[data-v-9e4d7259]{color:#b8c1cc;font-size:12px;line-height:1.6;margin-bottom:8px}.queue-debug-payload[data-v-9e4d7259]{margin:0;max-height:220px;overflow:auto;padding:10px;border-radius:8px;background:#141414;color:#8fd3ff;font-size:11px;line-height:1.5;white-space:pre-wrap;word-break:break-all}.panel-header[data-v-9e4d7259]{padding:16px 20px;font-size:15px;font-weight:600;color:#e0e0e0;border-bottom:1px solid #2a2a2a}.task-list-wrap[data-v-9e4d7259]{flex:1;padding:16px 20px;overflow:auto}.clean-result-summary[data-v-9e4d7259]{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-bottom:16px}.summary-card[data-v-9e4d7259]{padding:14px 16px;border:1px solid #2a2a2a;border-radius:10px;background:#1e1e1e}.summary-card strong[data-v-9e4d7259]{display:block;margin-top:8px;font-size:22px;color:#eaf4ff}.summary-label[data-v-9e4d7259]{font-size:12px;color:#8d8d8d}.subsection-title[data-v-9e4d7259]{font-size:13px;color:#999;margin:8px 0 10px}.empty-tasks[data-v-9e4d7259]{color:#666;font-size:13px;padding:16px;text-align:center}.empty-tasks.narrow[data-v-9e4d7259]{padding:12px 8px}.match-table[data-v-9e4d7259]{margin-bottom:18px}.match-table[data-v-9e4d7259] .el-table__body tr:hover>td.el-table__cell,.match-table[data-v-9e4d7259] .el-table__body tr.hover-row>td.el-table__cell,.match-table[data-v-9e4d7259] .el-table__body tr.current-row>td.el-table__cell{background-color:var(--el-table-tr-bg-color, #222)!important}.result-table[data-v-9e4d7259]{--el-table-bg-color: #222;--el-table-tr-bg-color: #222;--el-table-header-bg-color: #2a2a2a;--el-table-text-color: #ccc;--el-table-border-color: #333}.ok[data-v-9e4d7259]{color:#27ae60}.fail[data-v-9e4d7259]{color:#e67e22}.result-list-wrap[data-v-9e4d7259]{border:1px solid #2a2a2a;border-radius:10px;background:#1e1e1e;min-height:200px;margin-top:8px}.result-list-header[data-v-9e4d7259]{padding:12px 16px;border-bottom:1px solid #2a2a2a;font-size:14px;color:#ddd}.result-subsection[data-v-9e4d7259]{padding:12px 12px 4px}.result-subsection-title[data-v-9e4d7259]{font-size:12px;color:#888;margin-bottom:8px}.task-list[data-v-9e4d7259]{list-style:none;margin:0;padding:0}.task-item[data-v-9e4d7259]{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:12px 14px;border:1px solid #2a2a2a;border-radius:8px;margin-bottom:8px;background:#222}.left[data-v-9e4d7259]{flex:1;min-width:0}.split-result-main[data-v-9e4d7259]{display:flex;flex-direction:column;gap:4px}.id[data-v-9e4d7259]{font-weight:600;color:#e0e0e0;font-size:13px}.files[data-v-9e4d7259]{font-size:12px;color:#888}.task-right[data-v-9e4d7259]{display:flex;align-items:center;gap:8px;flex-wrap:wrap;justify-content:flex-end}.status[data-v-9e4d7259]{padding:4px 10px;border-radius:6px;font-size:12px;white-space:nowrap}.status.success[data-v-9e4d7259]{background:#2ecc712e;color:#2ecc71}.status.failed[data-v-9e4d7259]{background:#e74c3c2e;color:#ff6b6b}.status.running[data-v-9e4d7259]{background:#3498db2e;color:#3498db}.download[data-v-9e4d7259]{padding:6px 10px;border-radius:6px;font-size:12px;background:#3498db2e;color:#69b6ff;border:none;cursor:pointer}.download[data-v-9e4d7259]:hover{background:#3498db47}.btn-delete[data-v-9e4d7259]{padding:6px 10px;border-radius:6px;font-size:12px;background:#e74c3c1f;color:#ff8f8f;border:none;cursor:pointer}.btn-delete[data-v-9e4d7259]:hover{background:#e74c3c38}@media(max-width:1100px){.main-content[data-v-9e4d7259]{flex-direction:column;height:auto}.left-panel[data-v-9e4d7259]{width:100%;border-right:none;border-bottom:1px solid #2a2a2a}.clean-result-summary[data-v-9e4d7259]{grid-template-columns:repeat(2,minmax(0,1fr))}.schedule-row[data-v-9e4d7259]{flex-direction:column;align-items:stretch}} diff --git a/app/assets/shop-match.js b/app/assets/shop-match.js deleted file mode 100644 index 8fa1547..0000000 --- a/app/assets/shop-match.js +++ /dev/null @@ -1 +0,0 @@ -import{d as ds,g as m,o as fs,q as hs,a as i,c,b,e as l,x as vs,y as ps,t as v,z as A,A as ms,B as gs,F as B,r as j,C as St,n as pe,f as E,D as ys,G as kt,H as Ss,I as ks,w as ws,v as _s,J as bs,m as me,h as ge,E as p,i as wt,_ as Ts,K as Cs,j as Es,k as Is}from"./pywebview-B8lwamDf.js";import{z as Ds}from"./zh-cn-CqyuNHRW.js";import{B as $s,a1 as Ns,a2 as Ms,a3 as Ps,a4 as xs,a5 as As,a6 as Ls,a7 as Fs,a8 as Us,s as Rs,a9 as Os,aa as Bs,ab as Hs,ac as Vs,ad as Ue,ae as qs,v as zs}from"./java-modules-B9jblDzU.js";/* empty css */import{L as js}from"./listingFilters-BpGOU_pJ.js";import{c as Ks}from"./categorized-timers-JPA-olTr.js";const Gs={class:"page-shell module-page"},Js={class:"main-content"},Ys={class:"left-panel"},Qs={class:"input-zone"},Ws={class:"input-row"},Xs=["disabled"],Zs={key:0,class:"empty-candidates"},ea={key:1,class:"candidate-table-scroll"},ta=["onClick"],sa={class:"country-pref-checks"},aa=["checked","disabled","onChange"],na={class:"country-check-text"},oa={key:2,class:"country-order-panel"},la={class:"country-order-list"},ra=["onDragstart","onDrop"],ua={class:"country-drag-label"},ia={key:3,class:"country-pref-status"},ca={class:"listing-filter-row"},da={class:"schedule-switch"},fa=["disabled"],ha={key:4,class:"schedule-config"},va=["disabled","onClick"],pa=["disabled"],ma={class:"run-row"},ga=["disabled"],ya=["disabled"],Sa={key:5,class:"queue-debug-card"},ka={class:"queue-debug-line"},wa={key:0,class:"queue-debug-payload"},_a={class:"right-panel"},ba={class:"task-list-wrap"},Ta={class:"clean-result-summary"},Ca={class:"summary-card"},Ea={class:"summary-card"},Ia={class:"summary-card"},Da={class:"summary-card"},$a={key:0,class:"empty-tasks narrow"},Na=["onClick"],Ma={class:"result-list-wrap"},Pa={key:0,class:"empty-tasks"},xa={key:0,class:"result-subsection"},Aa={class:"task-list"},La={class:"left split-result-main"},Fa=["title"],Ua={class:"files"},Ra={key:0,class:"files"},Oa={key:1,class:"files"},Ba={key:2,class:"files"},Ha={key:3,class:"files"},Va={class:"task-right"},qa=["onClick"],za=["onClick"],ja={key:1,class:"result-subsection"},Ka={class:"task-list"},Ga={class:"left split-result-main"},Ja=["title"],Ya={class:"files"},Qa={key:0,class:"files"},Wa={key:1,class:"files"},Xa={class:"task-right"},Za=["onClick"],en=["onClick"],tn=ds({__name:"BrandShopMatchTab",setup(an){const ye=[{code:"DE",label:"德国"},{code:"UK",label:"英国"},{code:"FR",label:"法国"},{code:"IT",label:"意大利"},{code:"ES",label:"西班牙"}],ae=m(""),Se=m([]),Re=m([]),T=m([]),ke=m("Active"),ne=m(!1),oe=m(!1),P=m(!1),we=m(!1),_e=m(!1),S=m(""),K=m(""),g=m(["DE","UK","FR","IT","ES"]),G=m(null),be=m(!1),Te=m(!1);let H=null;const x=m(!0),k=m([$e()]),J=m({candidateCount:0,processedTaskCount:0,successTaskCount:0,failedTaskCount:0}),D=m([]),y=m([]),w=m({}),d=m({}),M=m(null),Ce=m(!1),N=new Map,Ee=m(!1);let Y=null,Oe=0,Be="",_=!1;const C=Ks("shop-match"),Ie=ge(()=>Je(D.value.filter(e=>!!I(e.taskId)&&!Xe(e)),d.value,"current")),De=ge(()=>Je(D.value.filter(e=>!I(e.taskId)||Xe(e)),d.value,"history")),_t=ge(()=>Ie.value.length>0||De.value.length>0),bt=ge(()=>{const e=new Set(g.value);return[...g.value.map(t=>({code:t,label:Ke(t)})),...ye.filter(t=>!e.has(t.code)).map(t=>({code:t.code,label:t.label}))]});function Q(){return typeof window<"u"&&window.localStorage.getItem("uid")||"0"}function Tt(){const e=Number(Q());return Number.isFinite(e)&&e>0?e:0}function I(e){const t=Number(e);return Number.isFinite(t)&&t>0?t:0}function He(){return`shop-match:tasks:${Q()}`}function Ve(){return`shop-match:task-status:${Q()}`}function qe(){return`shop-match:task-snapshots:${Q()}`}function ze(){return`shop-match:matched-items:${Q()}`}function le(e,t,s){s?window.localStorage.removeItem(e):window.localStorage.setItem(e,JSON.stringify(t))}function L(e){return`${(e.shopName||"").trim()}::${e.shopId||""}`}function je(e){return`${I(e.taskId)}-${e.resultId||0}-${e.shopName||""}`}function Ke(e){return ye.find(t=>t.code===e)?.label||e}function Ct(e){const t=e.getFullYear(),s=String(e.getMonth()+1).padStart(2,"0"),a=String(e.getDate()).padStart(2,"0"),n=String(e.getHours()).padStart(2,"0"),u=String(e.getMinutes()).padStart(2,"0"),r=String(e.getSeconds()).padStart(2,"0");return`${t}-${s}-${a}T${n}:${u}:${r}`}function re(e){const t=e.getFullYear(),s=String(e.getMonth()+1).padStart(2,"0"),a=String(e.getDate()).padStart(2,"0"),n=String(e.getHours()).padStart(2,"0"),u=String(e.getMinutes()).padStart(2,"0");return`${t}-${s}-${a} ${n}:${u}:00`}function $e(){const e=new Date;return e.setSeconds(0,0),e.setMinutes(e.getMinutes()+5),re(e)}function W(e){if(!e)return null;const s=e.trim().replace("T"," ").match(/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2})(?::(\d{2}))?$/);if(!s)return null;const a=Number(s[1]),n=Number(s[2]),u=Number(s[3]),r=Number(s[4]),f=Number(s[5]),o=Number(s[6]||"0"),h=new Date(a,n-1,u,r,f,o,0);return Number.isNaN(h.getTime())||h.getFullYear()!==a||h.getMonth()!==n-1||h.getDate()!==u?null:h}function Et(e,t){const s=W(e)||new Date;return s.setSeconds(0,0),s.setMinutes(s.getMinutes()+t),re(s)}function Ge(e){const t=W(e);if(!t)return"-";const s=String(t.getMonth()+1).padStart(2,"0"),a=String(t.getDate()).padStart(2,"0"),n=String(t.getHours()).padStart(2,"0"),u=String(t.getMinutes()).padStart(2,"0");return`${s}-${a} ${n}:${u}`}function Je(e,t,s){const a=new Map;for(const n of e)a.set(je(n),n);for(const[n,u]of Object.entries(t)){const r=I(n),f=u.items?.[0];if(!f||!r)continue;const o=We(r);if(s==="current"&&o||s==="history"&&!o)continue;const h=je({...f,taskId:r});a.has(h)||a.set(h,{...f,taskId:r})}return Array.from(a.values())}function It(){try{const e=window.localStorage.getItem(He()),t=e?JSON.parse(e):[];y.value=Array.isArray(t)?t.filter(s=>typeof s=="number"&&s>0):[]}catch{y.value=[]}}function ue(){le(He(),y.value,y.value.length===0)}function Dt(){try{const e=window.localStorage.getItem(Ve());w.value=e?JSON.parse(e):{}}catch{w.value={}}}function F(){le(Ve(),w.value,Object.keys(w.value).length===0)}function $t(){try{const e=window.localStorage.getItem(qe());d.value=e?JSON.parse(e):{}}catch{d.value={}}}function V(){le(qe(),d.value,Object.keys(d.value).length===0)}function Nt(){try{const e=window.localStorage.getItem(ze());T.value=e?JSON.parse(e):[]}catch{T.value=[]}}function Ne(){le(ze(),T.value,T.value.length===0)}function Mt(e){const t=e instanceof Error?e.message:String(e||"");return/记录不存在|任务不存在|不存在|已删除|not\s*found|404/i.test(t)}function Pt(){const e=y.value.filter(t=>(w.value[t]||d.value[t]?.task?.status)==="RUNNING");e.length!==y.value.length&&(y.value=e,ue())}function Ye(e){y.value.includes(e)||(y.value=[...y.value,e],ue())}function ie(e){const t=N.get(e);t&&(C.clearTimer("scheduled-dispatch",t),N.delete(e),N.size||fe())}function ce(e){if(ie(e),y.value=y.value.filter(t=>t!==e),delete w.value[e],d.value[e]){const t={...d.value};delete t[e],d.value=t,V()}ue(),F()}function X(e){ce(e),D.value=D.value.filter(t=>I(t.taskId)!==e)}function Qe(e,t=!0){y.value=y.value.filter(s=>s!==e),t||delete w.value[e],ue(),F()}function Z(e){return e==="SUCCESS"||e==="FAILED"||e==="COMPLETED"}function We(e){if(!e)return!1;const t=w.value[e]||d.value[e]?.task?.status;return Z(t)}function Xe(e){const t=I(e.taskId);return t&&We(t)||Z(e.taskStatus)?!0:!!e.success}async function ee(){Se.value=await Ns()}async function U(){J.value=await Ms()}async function q(){const e=await Ps();D.value=e.items||[]}async function xt(){try{const e=await xs();if(Te.value)return;const t=(e.country_codes||[]).filter(s=>ye.some(a=>a.code===s));t.length&&(g.value=t)}catch{}}async function de(){await Promise.allSettled([q(),U()])}function Ze(){H&&C.clearTimer("preference-save",H),H=C.setTimeout("preference-save",()=>{H=null,At()},450)}async function At(){if(g.value.length){be.value=!0;try{await Vs(g.value)}catch(e){p.error(e instanceof Error?e.message:"保存国家配置失败")}finally{be.value=!1}}}function Lt(e){Re.value=e}async function et(){const e=ae.value.trim();if(!e){p.warning("请输入店铺名");return}ne.value=!0;try{await As(e),ae.value="",await ee(),await U()}catch(t){p.error(t instanceof Error?t.message:"添加失败")}finally{ne.value=!1}}async function Ft(e){try{await Ls(e.id),await ee(),await U()}catch(t){p.error(t instanceof Error?t.message:"删除失败")}}function Ut(e){return g.value.includes(e)}function tt(e){return g.value.length===1&&g.value[0]===e}function Rt(e,t){const s=t.target;if(s){if(!s.checked&&tt(e)){s.checked=!0,p.warning("至少保留 1 个国家");return}Ot(e,s.checked)}}function Ot(e,t){if(Te.value=!0,t)g.value.includes(e)||(g.value=[...g.value,e]);else{if(g.value.length<=1){p.warning("至少保留 1 个国家");return}g.value=g.value.filter(s=>s!==e)}Ze()}function Bt(e){G.value=e}function Ht(){G.value=null}function Vt(e){const t=G.value;if(G.value=null,t==null||t===e)return;Te.value=!0;const s=[...g.value],[a]=s.splice(t,1);s.splice(e,0,a),g.value=s,Ze()}function qt(){x.value&&(k.value=Me(k.value,!0)),x.value||(k.value=[])}function zt(){const e=k.value[k.value.length-1],t=e?Et(e,60):$e();k.value=[...k.value,t]}function jt(e){k.value.length<=1||(k.value=k.value.filter((t,s)=>s!==e))}function Kt(e,t){const s=[...k.value];s[e]=t||"",k.value=Me(s,!1)}function Gt(e,t){const s=new Map;for(const a of e)s.set(L(a),a);for(const a of t)s.set(L(a),a);return Array.from(s.values())}async function Jt(){const e=Re.value.map(t=>t.shop_name).filter(Boolean);if(!e.length){p.warning("请先选择候选店铺");return}oe.value=!0;try{const t=await Fs(e);T.value=Gt(T.value,t.items||[]),Ne(),_e.value&&mt(),p.success(`本次返回 ${t.items?.length||0} 条匹配结果`)}catch(t){p.error(t instanceof Error?t.message:"匹配失败")}finally{oe.value=!1}}function Yt(e){T.value=T.value.filter(t=>L(t)!==L(e)),Ne()}function R(e){const t=new Set(e.map(s=>L(s)));T.value=T.value.filter(s=>!t.has(L(s))),Ne()}function Qt(){if(!x.value)return;const e=Date.now(),t=k.value.map(n=>n.trim()).filter(Boolean);if(!t.length)throw new Error("请至少选择一个执行时间");const s=t.map(n=>{const u=W(n);if(!u)throw new Error(`时间格式无效: ${n}`);return{raw:Ct(u),picker:re(u),time:u.getTime()}}).sort((n,u)=>n.time-u.time);for(let n=1;nn.time>e);if(!a.length)throw new Error("执行时间必须晚于当前时间,请重新选择");return a.length!==s.length&&(k.value=a.map(n=>n.picker),p.warning("已自动移除早于当前时间的执行时间")),a.map(n=>n.raw)}function Me(e,t){const s=Date.now(),a=e.map(r=>r.trim()).filter(Boolean).map(r=>{const f=W(r);return f?{value:re(f),time:f.getTime()}:null}).filter(r=>!!r).filter(r=>r.time>s).sort((r,f)=>r.time-f.time),n=[],u=new Set;for(const r of a)u.has(r.value)||(u.add(r.value),n.push(r.value));return!n.length&&t?[$e()]:n}function Wt(e){return e.skipAsinsByCountry||e.skip_asins_by_country||{}}function Xt(e){return e.skipAsinDetailsByCountry||e.skip_asin_details_by_country||{}}function st(e,t,s,a,n=!0){const u=Wt(t),r=Xt(t);return{type:"shop-match-run",ts:Date.now(),data:{taskId:e,user_id:Tt(),items:[{shopName:t.shopName,shopId:t.shopId,platform:t.platform,companyName:t.companyName,matched:!0,matchStatus:t.matchStatus,matchMessage:t.matchMessage,skip_asins_by_country:u,skipAsinsByCountry:u,skip_asin_details_by_country:r,skipAsinDetailsByCountry:r}],country_codes:[...s],skip_asins_by_country:u,skipAsinsByCountry:u,skip_asin_details_by_country:r,skipAsinDetailsByCountry:r,risk_listing_filter:ke.value,stage_index:a,final_stage:n}}}function Pe(e){const t=d.value[e]?.task,s=t?.scheduleStages||[],a=t?.currentStageIndex;if(typeof a!="number")return null;const n=s.find(u=>u.stageIndex===a);return n?.scheduledAt?{stageIndex:a,scheduledAt:n.scheduledAt,finalStage:a===s.length-1}:null}async function Zt(e,t){const s=wt();if(!s?.enqueue_json)throw new Error("当前客户端未提供 enqueue_json");const a=Pe(e),n=d.value[e],u=n?.task?.countryCodes||g.value;if(!a)throw new Error(`任务 ${e} 缺少待执行阶段`);ie(e),await ot(()=>qs(e,a.stageIndex),(o,h)=>{S.value=`任务 ${e} 等待后端恢复后再激活执行(${o}/${h})...`}),w.value={...w.value,[e]:"RUNNING"},n?.task&&(d.value={...d.value,[e]:{...n,task:{...n.task,status:"RUNNING",activeStageIndex:a.stageIndex}}}),V(),F();const r=st(e,t,u,a.stageIndex,a.finalStage);K.value=JSON.stringify(r,null,2);const f=await s.enqueue_json(r);if(!f?.success)throw new Error(f?.error||`任务 ${e} 推送失败`);Ye(e),S.value=`任务 ${e} 已推送第 ${a.stageIndex+1} 轮`,se(!0)}function at(e){const t=W(e);return t?t.getTime():Number.NaN}function es(){const e=new Set(y.value);for(const s of Object.keys(d.value)){const a=I(s);a>0&&e.add(a)}for(const s of D.value){const a=I(s.taskId);a>0&&e.add(a)}const t=Array.from(e).map(s=>{const a=d.value[s],n=w.value[s]||a?.task?.status,u=a?.items?.[0]||D.value.find(o=>I(o.taskId)===s),r=Pe(s);if(n!=="SCHEDULED"||!u||!r?.scheduledAt)return null;const f=at(r.scheduledAt);return!Number.isFinite(f)||f>Date.now()?null:{taskId:s,item:u,scheduledTime:f}}).filter(s=>!!s);return t.sort((s,a)=>s.scheduledTime-a.scheduledTime||s.taskId-a.taskId),t}async function xe(){if(Ee.value)return;const e=es();if(e.length){Ee.value=!0;try{const t=e[0];try{await Zt(t.taskId,t.item),await ls(t.taskId)}catch(s){const a=s instanceof Error?s.message:`任务 ${t.taskId} 调度失败`,n=`${t.taskId}:${a}`,u=Date.now();S.value=a,(Be!==n||u-Oe>1e4)&&(Be=n,Oe=u,p.error(a)),await Promise.allSettled([q(),lt()])}}finally{Ee.value=!1,$()}}}function ts(e,t){if(_||!t)return;ie(e);const s=at(t);if(!Number.isFinite(s))return;const a=Math.max(0,s-Date.now()),n=C.setTimeout("scheduled-dispatch",()=>{N.delete(e),N.size||fe(),_||xe()},a);N.set(e,n),nt()}function $(){if(_)return;const e=new Set(y.value);for(const t of Object.keys(d.value)){const s=I(t);s>0&&e.add(s)}for(const t of D.value){const s=I(t.taskId);s>0&&e.add(s)}for(const t of e){const a=d.value[t]?.task?.status||w.value[t],n=Pe(t);a==="SCHEDULED"&&n?.scheduledAt?ts(t,n.scheduledAt):ie(t)}N.size?nt():fe(),xe()}function nt(){_||Y||!N.size||(Y=C.setInterval("schedule-heartbeat",()=>{_||xe()},3e4))}function fe(){Y&&(C.clearTimer("schedule-heartbeat",Y),Y=null)}function he(){$(),y.value.length&&se(!0)}const ss=["无法连接到后端服务","bad gateway","gateway timeout","network error","timeout","502","503","504"];function te(e){return _?Promise.resolve():C.sleep("queue-wait",e)}function as(){C.clearCategory("queue-wait")}function Ae(e){const t=(e instanceof Error?e.message:String(e||"")).toLowerCase();return ss.some(s=>t.includes(s.toLowerCase()))}async function ot(e,t,s=10){let a=0;for(;;){if(_)throw new Error("component disposed");try{return await e()}catch(n){if(a+=1,!Ae(n)||a>=s)throw n;t(a,s),await te(O())}}}async function lt(){if(!y.value.length)return{settledTaskIds:[]};try{const e=await Ue(y.value),t={...d.value},s=new Set;for(const a of e.missingTaskIds||[])X(a),delete t[a],s.add(a);for(const a of e.items||[]){const n=a.task?.id;if(!n)continue;const u=t[n];t[n]=u?{...u,task:{...u.task||{},...a.task||{}}}:a;const r=a.task?.status||"";if(r){if(w.value[n]=r,Z(r)){ce(n),s.add(n);continue}r==="SCHEDULED"&&(Qe(n),s.add(n))}}return d.value=t,V(),F(),$(),{settledTaskIds:Array.from(s)}}catch{return{settledTaskIds:[]}}}function O(){return zs()}function rt(e=!1){if(_)return;if(M.value){if(!e)return;C.clearTimer("task-poll",M.value),M.value=null}const t=async()=>{if(M.value=null,!_){if(Ce.value||!y.value.length){y.value.length&&rt();return}Ce.value=!0;try{const{settledTaskIds:s}=await lt();s.length&&await Promise.allSettled([q(),U()])}finally{Ce.value=!1}!_&&y.value.length&&(M.value=C.setTimeout("task-poll",t,O()))}};e?t():M.value=C.setTimeout("task-poll",t,O())}function se(e=!1){rt(e)}function ns(){M.value&&(C.clearTimer("task-poll",M.value),M.value=null)}async function os(e){let t=0;const s=30;for(;;){if(_)return"STOPPED";try{const a=await Ue([e]);if(t>0&&(S.value=`任务 ${e} 后端已恢复,继续等待执行结果...`),t=0,(a.missingTaskIds||[]).includes(e))return X(e),await de(),$(),"FAILED";const n=(a.items||[]).find(r=>r.task?.id===e),u=n?.task?.status||"";if(n){const r=d.value[e];d.value={...d.value,[e]:r?{...r,task:{...r.task||{},...n.task||{}}}:n},V()}if(u&&(w.value[e]=u,F()),Z(u))return ce(e),await de(),$(),u}catch(a){if(!Ae(a))throw a;if(t+=1,t>=s)throw new Error(`任务 ${e} 等待后端恢复超时,请稍后手动刷新查看状态`);S.value=`任务 ${e} 运行中,正在等待后端服务恢复(${t}/${s})...`,(t===1||t%5===0)&&p.warning(`任务 ${e} 运行中,后端服务暂时不可用,正在自动重试`),await te(O());continue}await te(O())}}async function ls(e){let t=0;const s=30;for(;;){if(_)return"STOPPED";try{const a=await Ue([e]);if(t>0&&(S.value=`任务 ${e} 后端已恢复,继续等待当前轮次结束...`),t=0,(a.missingTaskIds||[]).includes(e))return X(e),await de(),$(),"FAILED";const n=(a.items||[]).find(r=>r.task?.id===e),u=n?.task?.status||"";if(n){const r=d.value[e];d.value={...d.value,[e]:r?{...r,task:{...r.task||{},...n.task||{}}}:n},V()}if(u&&(w.value[e]=u,F()),!u||u==="RUNNING"){await te(O());continue}return Z(u)?(ce(e),await de(),$(),u):(u==="SCHEDULED"&&(Qe(e),$()),u)}catch(a){if(!Ae(a))throw a;if(t+=1,t>=s)throw new Error(`任务 ${e} 等待当前轮次结束超时,请稍后手动刷新查看状态`);S.value=`任务 ${e} 运行中,正在等待当前轮次结束(${t}/${s})...`,(t===1||t%5===0)&&p.warning(`任务 ${e} 运行中,后端服务暂时不可用,正在自动重试`),await te(O())}}}function Le(e){const t=I(e.taskId);return t?w.value[t]||d.value[t]?.task?.status||e.taskStatus||"":e.taskStatus||""}function ut(e){const t=I(e.taskId);return t?d.value[t]:void 0}function it(e){const s=ut(e)?.task,a=s?.scheduleStages||[];if(!a.length)return"";const n=a.length,u=typeof s?.activeStageIndex=="number"?s.activeStageIndex:void 0,r=typeof s?.currentStageIndex=="number"?s.currentStageIndex:void 0;return typeof u=="number"?`执行进度: 第 ${u+1}/${n} 次执行中`:typeof r=="number"?`执行进度: 等待第 ${r+1}/${n} 次`:`执行进度: 共 ${n} 次`}function ct(e){const s=ut(e)?.task,a=s?.scheduleStages||[];if(typeof s?.currentStageIndex=="number"){const n=a.find(u=>u.stageIndex===s.currentStageIndex);if(n?.scheduledAt)return Ge(n.scheduledAt)}return e.scheduledAt?Ge(e.scheduledAt):""}function dt(e){const t=Le(e);return t==="SCHEDULED"?"待执行":t==="RUNNING"?"执行中":t==="SUCCESS"||t==="COMPLETED"?"已完成":t==="FAILED"?"失败":e.success?"已完成":"未知"}function ft(e){const t=Le(e);return t==="SUCCESS"||t==="COMPLETED"?"success":t==="FAILED"?"failed":"running"}function ht(e){const t=Le(e);return!!e.resultId&&(!!e.fileReady||!!e.downloadUrl)&&(t==="SUCCESS"||t==="COMPLETED")}async function vt(e){if(!e.resultId)return;const t=Us(e.resultId),s=e.outputFilename||`${e.shopName||"result"}.xlsx`,a=await Rs(t,s,`shop-match:${e.resultId}`);a.success?p.success(`已保存: ${a.path||s}`):a.error&&a.error!=="用户取消"&&p.error(a.error)}async function pt(e){const t=I(e.taskId),s=Number(e.resultId||0);try{if(t>0)await Os(t),X(t);else if(s>0)await Bs(s),D.value=D.value.filter(a=>Number(a.resultId||0)!==s),R([e]);else throw new Error("缺少可删除的任务标识");await Promise.allSettled([q(),ee(),U()]),p.success("删除成功")}catch(a){if(Mt(a)){t>0?X(t):s>0&&(D.value=D.value.filter(n=>Number(n.resultId||0)!==s)),R([e]),await Promise.allSettled([q(),ee(),U()]),p.success("后端记录已不存在,本地记录已同步清理");return}p.error(a instanceof Error?a.message:"删除失败")}}function rs(e){const t=(e||"").trim();return{MATCHED:"已匹配",PENDING:"待匹配",CONFLICT:"需人工确认",INDEX_STALE:"索引过期"}[t]||t||"—"}function us(e){const t=(e.matchMessage||"").trim();return t||(e.matched&&e.matchStatus==="MATCHED"?"紫鸟索引已命中,可推送队列":e.matched?"已关联索引,请结合状态列查看是否可推送":"未命中或未就绪,请检查店铺名与索引刷新")}async function is(){_e.value=!0,await mt()}function cs(){return T.value.find(e=>e.matched)}async function mt(){if(_||we.value)return;const e=wt();if(!e?.enqueue_json){p.error("当前客户端未提供 enqueue_json");return}if(!T.value.filter(r=>r.matched).length){p.warning("请先匹配可用店铺");return}if(!g.value.length){p.warning("请至少勾选一个国家");return}let s;try{s=Qt()}catch(r){p.error(r instanceof Error?r.message:"定时配置无效");return}we.value=!0,P.value=!0,K.value="";let a=0,n=0,u=0;try{for(;!_&&_e.value;){const r=cs();if(!r)break;u+=1;try{const f=await ot(()=>Hs([r],g.value,s),(Fe,ve)=>{S.value=`后端服务暂时不可用,正在重试创建任务(${Fe}/${ve})...`}),o=f.taskId,h=s?.length?"SCHEDULED":"RUNNING",z={task:{id:o,status:h,scheduledAt:s?.[0],countryCodes:[...g.value],currentStageIndex:s?.length?0:void 0,activeStageIndex:void 0,scheduleStages:(s||[]).map((Fe,ve)=>({stageIndex:ve,scheduledAt:Fe,status:ve===0?"SCHEDULED":"PENDING"}))},items:f.items};if(d.value={...d.value,[o]:z},w.value={...w.value,[o]:h},V(),F(),!f.items?.[0]){R([r]);continue}if(s?.length){a+=1,$(),S.value=`任务 ${o} 已创建,共 ${s.length} 个执行时间点`,R([r]);continue}const gt=st(o,r,g.value);K.value=JSON.stringify(gt,null,2);const yt=await e.enqueue_json(gt);if(!yt?.success){n+=1,S.value=`任务 ${o} 推送失败,已自动继续下一条:${yt?.error||"未知错误"}`,p.error(S.value),R([r]);continue}if(Ye(o),se(!0),R([r]),S.value=`任务 ${o} 已入队,等待执行完成`,await os(o)!=="SUCCESS"){n+=1,S.value=`任务 ${o} 执行失败,已自动继续下一条`,p.error(S.value);continue}a+=1,S.value=`任务 ${o} 已完成`}catch(f){if(_)break;n+=1,S.value=`第 ${u} 条任务处理失败,已自动继续下一条:${f instanceof Error?f.message:"未知错误"}`,p.error(S.value),R([r]);continue}}$(),s?.length||se(!0),!_&&(a>0||n>0)&&p.success(s?.length?`定时任务已创建:成功 ${a} 条,失败 ${n} 条`:`店铺推送已完成:成功 ${a} 条,失败 ${n} 条`)}catch(r){if(_)return;const f=r instanceof Error?r.message:"推送失败";S.value=f,p.error(f)}finally{we.value=!1,P.value=!1}}return fs(async()=>{It(),Dt(),$t(),Nt(),k.value=Me(k.value,x.value),Pt(),await Promise.allSettled([ee(),xt(),q(),U()]),window.addEventListener("focus",he),document.addEventListener("visibilitychange",he),$(),y.value.length&&se(!0)}),hs(()=>{_=!0,ns(),fe(),as(),window.removeEventListener("focus",he),document.removeEventListener("visibilitychange",he),H&&C.clearTimer("preference-save",H);for(const e of N.values())C.clearTimer("scheduled-dispatch",e);N.clear(),C.clearScope()}),(e,t)=>{const s=ps,a=ms,n=gs,u=Ss,r=ks,f=bs;return i(),c("div",Gs,[b($s,{active:"shop-match"}),l("div",Js,[l("aside",Ys,[t[10]||(t[10]=l("div",{class:"section-title"},"店铺候选",-1)),l("div",Qs,[t[4]||(t[4]=l("div",{class:"hint"},"输入店铺名后点“添加”加入下方备选区。勾选备选店铺后先做“匹配店铺”,确认命中紫鸟索引后再推送到 Python 队列。",-1)),l("div",Ws,[b(s,{modelValue:ae.value,"onUpdate:modelValue":t[0]||(t[0]=o=>ae.value=o),clearable:"",placeholder:"请输入店铺名后回车或点击添加",onKeyup:vs(et,["enter"])},null,8,["modelValue"]),l("button",{type:"button",class:"opt-btn",disabled:ne.value,onClick:et},v(ne.value?"添加中...":"添加"),9,Xs)])]),t[11]||(t[11]=l("div",{class:"section-title"},"备选店铺",-1)),Se.value.length?(i(),c("div",ea,[b(n,{data:Se.value,"row-key":"id",height:"240",class:"candidate-table",onSelectionChange:Lt},{default:A(()=>[b(a,{type:"selection",width:"42"}),b(a,{prop:"shop_name",label:"店铺名","min-width":"120","show-overflow-tooltip":""}),b(a,{label:"操作",width:"72",align:"center"},{default:A(({row:o})=>[l("button",{type:"button",class:"link-danger",onClick:h=>Ft(o)},"删除",8,ta)]),_:1})]),_:1},8,["data"])])):(i(),c("div",Zs,"暂无备选店铺,请先输入并添加")),t[12]||(t[12]=l("div",{class:"section-title"},"国家配置",-1)),t[13]||(t[13]=l("p",{class:"hint country-pref-hint"},"勾选的国家会在每一个执行时间点都执行一遍。勾选区会按照已选顺序排在前面,下方支持拖拽排序,和商品风险页保持一致。",-1)),l("div",sa,[(i(!0),c(B,null,j(bt.value,o=>(i(),c("label",{key:o.code,class:"country-check-row"},[l("input",{type:"checkbox",class:"country-check-input",checked:Ut(o.code),disabled:tt(o.code),onChange:h=>Rt(o.code,h)},null,40,aa),l("span",na,v(o.label)+" ("+v(o.code)+")",1)]))),128))]),g.value.length?(i(),c("div",oa,[t[6]||(t[6]=l("div",{class:"country-order-caption"},"已选顺序(拖拽 ⋮⋮ 调整)",-1)),l("div",la,[(i(!0),c(B,null,j(g.value,(o,h)=>(i(),c("div",{key:o,class:pe(["country-drag-row",{dragging:G.value===h}]),draggable:"true",onDragstart:z=>Bt(h),onDragend:Ht,onDragover:t[1]||(t[1]=St(()=>{},["prevent"])),onDrop:St(z=>Vt(h),["prevent"])},[t[5]||(t[5]=l("span",{class:"drag-handle",title:"拖动排序"},"⋮⋮",-1)),l("span",ua,v(Ke(o))+" ("+v(o)+")",1)],42,ra))),128))])])):E("",!0),be.value?(i(),c("div",ia,"保存中...")):E("",!0),t[14]||(t[14]=l("div",{class:"section-title"},"商品列表筛选",-1)),t[15]||(t[15]=l("p",{class:"hint listing-filter-hint"},"与“推送到 Python 队列”一并下发,供 Python 区分处理场景。",-1)),l("div",ca,[b(r,{modelValue:ke.value,"onUpdate:modelValue":t[2]||(t[2]=o=>ke.value=o),class:"listing-filter-select",teleported:"",placeholder:"选择筛选类型"},{default:A(()=>[(i(!0),c(B,null,j(ys(js),o=>(i(),kt(u,{key:o.value,label:o.label,value:o.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),t[16]||(t[16]=l("div",{class:"section-title"},"定时执行",-1)),l("label",da,[ws(l("input",{"onUpdate:modelValue":t[3]||(t[3]=o=>x.value=o),type:"checkbox",disabled:P.value,onChange:qt},null,40,fa),[[_s,x.value]]),t[7]||(t[7]=l("span",null,"启用多时间点调度",-1))]),x.value?(i(),c("div",ha,[(i(!0),c(B,null,j(k.value,(o,h)=>(i(),c("div",{key:`schedule-${h}`,class:"schedule-row"},[b(f,{"model-value":o,type:"datetime","value-format":"YYYY-MM-DD HH:mm:ss",format:"MM-DD HH:mm",placeholder:"选择执行时间",disabled:P.value,class:"schedule-picker","onUpdate:modelValue":z=>Kt(h,z)},null,8,["model-value","disabled","onUpdate:modelValue"]),l("button",{type:"button",class:"schedule-remove",disabled:P.value||k.value.length<=1,onClick:z=>jt(h)},"删除",8,va)]))),128)),l("button",{type:"button",class:"schedule-add",disabled:P.value,onClick:zt},"添加时间点",8,pa),t[8]||(t[8]=l("p",{class:"hint schedule-hint"},"默认开启定时;支持按 `MM-DD HH:mm` 配置多个时间点,前端不再限制选择更早时间,实际是否可执行以后端校验为准。",-1))])):E("",!0),l("div",ma,[l("button",{type:"button",class:"btn-run",disabled:oe.value,onClick:Jt},v(oe.value?"匹配中...":"匹配店铺"),9,ga),l("button",{type:"button",class:"btn-run btn-queue",disabled:P.value||!T.value.length,onClick:is},v(P.value?"推送中...":x.value?"创建定时任务":"推送到 Python 队列"),9,ya)]),t[17]||(t[17]=l("p",{class:"loading-msg"},[me("已支持多阶段定时执行;Python 每处理完一店可回传 "),l("code",null,"/api/shop-match/tasks/{taskId}/result"),me(",后端会按阶段汇总并在超时场景自动收尾。")],-1)),S.value?(i(),c("div",Sa,[t[9]||(t[9]=l("div",{class:"section-title queue-debug-title"},"推送结果",-1)),l("div",ka,v(S.value),1),K.value?(i(),c("pre",wa,v(K.value),1)):E("",!0)])):E("",!0)]),l("section",_a,[t[26]||(t[26]=l("div",{class:"panel-header"},"匹配与任务",-1)),l("div",ba,[l("div",Ta,[l("div",Ca,[t[18]||(t[18]=l("span",{class:"summary-label"},"候选店铺",-1)),l("strong",null,v(J.value.candidateCount),1)]),l("div",Ea,[t[19]||(t[19]=l("span",{class:"summary-label"},"已结束任务",-1)),l("strong",null,v(J.value.processedTaskCount),1)]),l("div",Ia,[t[20]||(t[20]=l("span",{class:"summary-label"},"成功",-1)),l("strong",null,v(J.value.successTaskCount),1)]),l("div",Da,[t[21]||(t[21]=l("span",{class:"summary-label"},"失败",-1)),l("strong",null,v(J.value.failedTaskCount),1)])]),t[25]||(t[25]=l("div",{class:"subsection-title"},"匹配结果",-1)),T.value.length?(i(),kt(n,{key:1,data:T.value,"row-key":L,"highlight-current-row":!1,class:"result-table match-table"},{default:A(()=>[b(a,{prop:"shopName",label:"店铺名","min-width":"100"}),b(a,{label:"匹配",width:"72",align:"center"},{default:A(({row:o})=>[l("span",{class:pe(o.matched?"ok":"fail")},v(o.matched?"是":"否"),3)]),_:1}),b(a,{prop:"shopId",label:"店铺ID","min-width":"120","show-overflow-tooltip":""}),b(a,{prop:"platform",label:"平台",width:"88","show-overflow-tooltip":""}),b(a,{prop:"companyName",label:"公司","min-width":"100","show-overflow-tooltip":""}),b(a,{label:"状态",width:"100","show-overflow-tooltip":""},{default:A(({row:o})=>[me(v(rs(o.matchStatus)),1)]),_:1}),b(a,{label:"说明","min-width":"140","show-overflow-tooltip":""},{default:A(({row:o})=>[me(v(us(o)),1)]),_:1}),b(a,{label:"操作",width:"72",align:"center"},{default:A(({row:o})=>[l("button",{type:"button",class:"link-danger",onClick:h=>Yt(o)},"删除",8,Na)]),_:1})]),_:1},8,["data"])):(i(),c("div",$a,"完成“匹配店铺”后,在此展示紫鸟索引匹配结果,供核对后再推送队列。")),l("div",Ma,[t[24]||(t[24]=l("div",{class:"result-list-header"},[l("span",null,"处理记录")],-1)),_t.value?(i(),c(B,{key:1},[Ie.value.length?(i(),c("div",xa,[t[22]||(t[22]=l("div",{class:"result-subsection-title"},"当前任务",-1)),l("ul",Aa,[(i(!0),c(B,null,j(Ie.value,o=>(i(),c("li",{key:`cur-${o.resultId}-${o.taskId}`,class:"task-item"},[l("div",La,[l("span",{class:"id",title:o.shopName||""},v(o.shopName||"-"),9,Fa),l("div",Ua,"任务 ID: "+v(o.taskId??"-"),1),o.platform?(i(),c("div",Ra,"平台: "+v(o.platform),1)):E("",!0),it(o)?(i(),c("div",Oa,v(it(o)),1)):E("",!0),ct(o)?(i(),c("div",Ba,"下一次: "+v(ct(o)),1)):E("",!0),o.error?(i(),c("div",Ha,"错误: "+v(o.error),1)):E("",!0)]),l("div",Va,[l("span",{class:pe(["status",ft(o)])},v(dt(o)),3),ht(o)?(i(),c("button",{key:0,type:"button",class:"download",onClick:h=>vt(o)},"下载",8,qa)):E("",!0),l("button",{type:"button",class:"btn-delete",onClick:h=>pt(o)},"删除",8,za)])]))),128))])])):E("",!0),De.value.length?(i(),c("div",ja,[t[23]||(t[23]=l("div",{class:"result-subsection-title"},"历史任务",-1)),l("ul",Ka,[(i(!0),c(B,null,j(De.value,o=>(i(),c("li",{key:`his-${o.resultId}-${o.taskId}`,class:"task-item"},[l("div",Ga,[l("span",{class:"id",title:o.shopName||""},v(o.shopName||"-"),9,Ja),l("div",Ya,"任务 ID: "+v(o.taskId??"-"),1),o.outputFilename?(i(),c("div",Qa,"文件: "+v(o.outputFilename),1)):E("",!0),o.error?(i(),c("div",Wa,"错误: "+v(o.error),1)):E("",!0)]),l("div",Xa,[l("span",{class:pe(["status",ft(o)])},v(dt(o)),3),ht(o)?(i(),c("button",{key:0,type:"button",class:"download",onClick:h=>vt(o)},"下载",8,Za)):E("",!0),l("button",{type:"button",class:"btn-delete",onClick:h=>pt(o)},"删除",8,en)])]))),128))])])):E("",!0)],64)):(i(),c("div",Pa,"暂无处理记录。推送队列并等待 Python 回传后,将在此显示下载链接。"))])])])])])}}}),sn=Ts(tn,[["__scopeId","data-v-9e4d7259"]]);Cs.locale("zh-cn");Es(sn).use(Is,{locale:Ds}).mount("#app"); diff --git a/app/assets/similar-asin-CJxBjrIf.css b/app/assets/similar-asin-CJxBjrIf.css deleted file mode 100644 index 1ad28ef..0000000 --- a/app/assets/similar-asin-CJxBjrIf.css +++ /dev/null @@ -1 +0,0 @@ -.module-page[data-v-b77550eb]{min-height:100vh;background:#1a1a1a}.main-content[data-v-b77550eb]{display:flex;height:calc(100vh - 56px);min-height:calc(100vh - 56px)}.left-panel[data-v-b77550eb]{width:400px;background:#1e1e1e;padding:20px;overflow-y:auto;border-right:1px solid #2a2a2a}.right-panel[data-v-b77550eb]{flex:1;min-width:0;background:#1a1a1a;display:flex;flex-direction:column}.section-title[data-v-b77550eb],.subsection-title[data-v-b77550eb]{font-size:13px;color:#bbb;margin-bottom:10px}.upload-zone[data-v-b77550eb]{border:1px dashed #3a3a3a;border-radius:10px;padding:18px;background:#252525;margin-bottom:18px}.condition-card[data-v-b77550eb]{margin-bottom:18px;padding:14px 16px;border:1px solid #2f3a34;border-radius:10px;background:linear-gradient(135deg,#222a25,#202020)}.switch-row[data-v-b77550eb]{display:flex;align-items:center;justify-content:space-between;gap:14px;color:#d8e4dc;cursor:pointer;-webkit-user-select:none;user-select:none}.switch-row span[data-v-b77550eb]{display:flex;flex-direction:column;gap:4px;min-width:0}.switch-row strong[data-v-b77550eb]{font-size:13px;font-weight:600}.switch-row em[data-v-b77550eb]{color:#8d9a91;font-size:12px;font-style:normal;line-height:1.4}.switch-row input[data-v-b77550eb]{position:absolute;opacity:0;pointer-events:none}.switch-row i[data-v-b77550eb]{position:relative;width:46px;height:24px;flex:0 0 auto;border-radius:999px;background:#3a3a3a;box-shadow:inset 0 0 0 1px #4b4b4b;transition:background .2s ease,box-shadow .2s ease}.switch-row i[data-v-b77550eb]:after{content:"";position:absolute;top:3px;left:3px;width:18px;height:18px;border-radius:50%;background:#c7c7c7;transition:transform .2s ease,background .2s ease}.switch-row input:checked+i[data-v-b77550eb]{background:#27ae60;box-shadow:inset 0 0 0 1px #42d17a}.switch-row input:checked+i[data-v-b77550eb]:after{transform:translate(22px);background:#fff}.hint[data-v-b77550eb],.loading-msg[data-v-b77550eb],.files[data-v-b77550eb],.muted[data-v-b77550eb]{color:#888;font-size:12px;line-height:1.5}.link[data-v-b77550eb]{color:#6ea8fe;text-decoration:none}.link[data-v-b77550eb]:hover{color:#9fc5ff}.btns[data-v-b77550eb],.run-row[data-v-b77550eb]{display:flex;gap:10px;flex-wrap:wrap}.opt-btn[data-v-b77550eb],.btn-run[data-v-b77550eb],.btn-delete[data-v-b77550eb],.download[data-v-b77550eb]{border:none;cursor:pointer;border-radius:7px}.opt-btn[data-v-b77550eb]{padding:8px 14px;color:#ccc;background:#2a2a2a;border:1px solid #3a3a3a}.btn-run[data-v-b77550eb]{padding:10px 18px;color:#fff;background:#3498db;font-weight:600}.btn-queue[data-v-b77550eb]{background:#27ae60}.btn-run[data-v-b77550eb]:disabled{opacity:.55;cursor:not-allowed}.selected-files[data-v-b77550eb]{margin-top:14px;color:#999;font-size:12px;word-break:break-all}.selected-files span[data-v-b77550eb]{display:block;margin:4px 0}.parse-card[data-v-b77550eb],.queue-payload[data-v-b77550eb]{margin-top:14px;padding:12px;border:1px solid #2a2a2a;border-radius:8px;background:#202020;color:#b8c1cc;font-size:12px}.queue-payload[data-v-b77550eb]{max-height:220px;overflow:auto;color:#8fd3ff;white-space:pre-wrap}.panel-header[data-v-b77550eb]{padding:16px 20px;border-bottom:1px solid #2a2a2a;font-size:15px;font-weight:600;color:#ddd}.task-list-wrap[data-v-b77550eb]{flex:1;padding:16px 20px;overflow:auto}.clean-result-summary[data-v-b77550eb]{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-bottom:16px}.summary-card[data-v-b77550eb]{padding:14px 16px;border:1px solid #2a2a2a;border-radius:8px;background:#1e1e1e}.summary-card strong[data-v-b77550eb]{display:block;margin-top:8px;color:#eaf4ff;font-size:22px}.summary-label[data-v-b77550eb]{color:#8d8d8d;font-size:12px}.result-list-wrap[data-v-b77550eb]{border:1px solid #2a2a2a;border-radius:8px;background:#1e1e1e;min-height:180px;margin:0 0 16px}.result-list-header[data-v-b77550eb]{display:flex;justify-content:space-between;padding:12px 16px;border-bottom:1px solid #2a2a2a;color:#ddd;font-size:14px}.empty-tasks[data-v-b77550eb]{color:#666;font-size:13px;padding:18px;text-align:center}.task-list[data-v-b77550eb]{list-style:none;margin:0;padding:12px}.task-item[data-v-b77550eb]{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:12px 14px;border:1px solid #2a2a2a;border-radius:8px;margin-bottom:8px;background:#222}.left[data-v-b77550eb]{flex:1;min-width:0}.id[data-v-b77550eb]{color:#e0e0e0;font-size:13px;font-weight:600}.task-right[data-v-b77550eb]{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.status[data-v-b77550eb]{padding:4px 10px;border-radius:6px;font-size:12px}.status.success[data-v-b77550eb]{background:#2ecc712e;color:#2ecc71}.status.failed[data-v-b77550eb]{background:#e74c3c2e;color:#ff6b6b}.status.running[data-v-b77550eb]{background:#3498db2e;color:#3498db}.status.pending[data-v-b77550eb]{background:#95a5a62e;color:#bdc3c7}.result-hint[data-v-b77550eb]{margin-top:6px;color:#e0b96d}.file-progress[data-v-b77550eb]{margin-top:8px;max-width:520px}.file-progress-meta[data-v-b77550eb]{display:flex;justify-content:space-between;gap:12px;color:#d8c278;font-size:12px}.file-progress-track[data-v-b77550eb]{margin-top:5px;height:8px;border-radius:999px;overflow:hidden;background:#303030;border:1px solid #3b3b3b}.file-progress-bar[data-v-b77550eb]{height:100%;border-radius:inherit;background:linear-gradient(90deg,#4aa3ff,#f0c75e);transition:width .25s ease}.file-progress-count[data-v-b77550eb]{margin-top:4px;color:#858585;font-size:11px}.download[data-v-b77550eb]{padding:6px 10px;color:#d6ecff;background:#3498db2e}.btn-delete[data-v-b77550eb]{padding:6px 10px;color:#ff8f8f;background:#e74c3c1f}@media(max-width:1100px){.main-content[data-v-b77550eb]{flex-direction:column;height:auto}.left-panel[data-v-b77550eb]{width:100%;border-right:none;border-bottom:1px solid #2a2a2a}.clean-result-summary[data-v-b77550eb]{grid-template-columns:repeat(2,minmax(0,1fr))}} diff --git a/app/assets/similar-asin.js b/app/assets/similar-asin.js deleted file mode 100644 index 58fa41b..0000000 --- a/app/assets/similar-asin.js +++ /dev/null @@ -1 +0,0 @@ -import{d as je,o as qe,q as Oe,a as u,c as i,b as Ke,e as a,F as se,r as te,t as r,w as Ve,v as Ye,f as h,u as _e,n as Qe,g as p,h as j,i as q,E as v,_ as We,j as Xe,k as Ze}from"./pywebview-B8lwamDf.js";import{B as es,H as ss,I as ts,v as ye,J as as,K as ls,L as ns,s as rs,M as os,N as us,F as is,O as cs}from"./java-modules-B9jblDzU.js";import{e as ds}from"./brand-DE-sObfq.js";import{c as fs}from"./categorized-timers-JPA-olTr.js";const vs={class:"page-shell module-page"},gs={class:"main-content"},ps={class:"left-panel"},hs={class:"upload-zone"},ks={class:"selected-files"},_s={key:0},ys={class:"condition-card"},Is={class:"switch-row"},ws={class:"run-row"},Ss=["disabled"],Ps=["disabled"],Cs={key:0,class:"parse-card"},bs={key:1,class:"queue-payload"},ms={class:"right-panel"},Ns={class:"task-list-wrap"},Fs={class:"clean-result-summary"},Ts={class:"summary-card"},Es={class:"summary-card"},Rs={class:"summary-card"},As={class:"summary-card"},Ds={class:"result-list-wrap"},Us={key:0,class:"empty-tasks"},xs={key:1,class:"task-list clean-result-list"},$s={class:"left"},Ms={class:"id"},Gs={class:"files"},zs={class:"files"},Ls={class:"files"},Bs={class:"files"},Hs={key:0,class:"files result-hint"},Js={key:1,class:"file-progress"},js={class:"file-progress-meta"},qs={class:"file-progress-track"},Os={key:0,class:"file-progress-count"},Ks={class:"task-right"},Vs={class:"status running"},Ys=["onClick"],Qs={class:"result-list-wrap"},Ws={key:0,class:"empty-tasks"},Xs={key:1,class:"task-list clean-result-list"},Zs={class:"left"},et={class:"id"},st={class:"files"},tt={class:"files"},at={class:"files"},lt={key:0,class:"files"},nt={key:1,class:"files result-hint"},rt={key:2,class:"file-progress"},ot={class:"file-progress-meta"},ut={class:"file-progress-track"},it={key:0,class:"file-progress-count"},ct={key:3,class:"files"},dt={class:"task-right"},ft=["onClick"],vt=["onClick"],gt=3e3,pt=je({__name:"BrandSimilarAsinTab",setup(kt){const D=p([]),m=p([]),I=p(null),w=p(null),U=p(!1),x=p(!1),O=p(!1),S=p(""),d=p([]),c=p([]),k=p(null),K=p(!1);let N=null,ae=0,F=!1;const T=fs("similar-asin"),E=p({pendingTaskCount:0,processedTaskCount:0,successTaskCount:0,failedTaskCount:0}),f=p([]),_=p({}),R=j(()=>I.value||w.value),V=j(()=>{const e=I.value;return!e?.taskId||f.value.some(t=>t.taskId===e.taskId)?null:{taskId:e.taskId,sourceFilename:e.sourceFilename,rowCount:e.acceptedRows,taskStatus:"PENDING",success:!1}}),le=j(()=>{const e=new Set([...d.value,...c.value]),s=f.value.filter(l=>{const n=y(l);return l.taskId!=null&&(e.has(l.taskId)||n==="RUNNING"||n==="PENDING")}).map(l=>re(l));for(const[l,n]of Object.entries(_.value)){const o=Number(l);!Number.isFinite(o)||o<=0||!e.has(o)&&y(n)!=="RUNNING"&&y(n)!=="PENDING"||s.some(g=>g.taskId===o)||s.push(re(n))}return V.value?s.some(l=>l.taskId===V.value?.taskId)?s:[V.value,...s]:s}),ne=j(()=>f.value.filter(e=>{const s=y(e);return s!=="RUNNING"&&s!=="PENDING"}));function re(e){if(e.taskId==null)return e;const s=_.value[e.taskId];return s?{...e,...s,sourceFilename:s.sourceFilename||e.sourceFilename,resultFilename:s.resultFilename||e.resultFilename,rowCount:s.rowCount??e.rowCount,createdAt:s.createdAt||e.createdAt}:e}function $(){return is("similar-asin").trim()}function M(e){if(!e)return"-";const s=new Date(e);if(Number.isNaN(s.getTime()))return e;const t=s.getFullYear(),l=String(s.getMonth()+1).padStart(2,"0"),n=String(s.getDate()).padStart(2,"0"),o=String(s.getHours()).padStart(2,"0"),g=String(s.getMinutes()).padStart(2,"0"),J=String(s.getSeconds()).padStart(2,"0");return`${t}-${l}-${n} ${o}:${g}:${J}`}function Ie(e){return e?e.length<=10?"***":`${e.slice(0,6)}***${e.slice(-4)}`:""}function we(e){return{...e,data:e.data?{...e.data,api_key:Ie(String(e.data.api_key||""))}:e.data}}function oe(){return typeof window<"u"&&window.localStorage.getItem("uid")||"0"}function Se(){return Number(oe())||0}function Y(){return`similar-asin:tasks:${oe()}`}function Pe(e){return{taskId:e.taskId,totalRows:e.totalRows,acceptedRows:e.acceptedRows,groupCount:e.groupCount,droppedRows:e.droppedRows}}function P(){if(typeof window>"u")return;const e=Array.from(new Set([...d.value,...c.value]));e.length?window.localStorage.setItem(Y(),JSON.stringify(e)):window.localStorage.removeItem(Y())}function Ce(){if(!(typeof window>"u"))try{const e=window.localStorage.getItem(Y()),s=e?JSON.parse(e):[];d.value=Array.isArray(s)?s.filter(t=>typeof t=="number"&&t>0):[]}catch{d.value=[]}}async function ue(e){const s=q();if(!s?.upload_file_to_java)throw new Error("当前桌面端未提供文件上传能力");const t=[];for(const l of e){const n=typeof l=="string"?l:l.absolutePath,o=typeof l=="string"?void 0:l.relativePath,g=await s.upload_file_to_java(n,o);if(!g?.success||!g.data)throw new Error(g?.error||g?.message||`上传失败:${n}`);t.push(g.data)}return t}async function be(){const e=q();if(!e?.select_brand_xlsx_files||!e.upload_file_to_java){v.warning("当前桌面端未提供文件选择或上传能力");return}const s=await e.select_brand_xlsx_files();if(!s?.length)return;const t=await ue(s);m.value=t,D.value=t.map(l=>l.relativePath||l.originalFilename||l.fileKey),I.value=null,w.value=null,S.value=""}async function me(){const e=q();if(!e?.select_brand_folder||!e.upload_file_to_java){v.warning("当前桌面端未提供文件夹选择或上传能力");return}try{const s=await e.select_brand_folder();if(!s)return;const t=await ds(s);if(!t.success||!t.items?.length){v.warning(t.error||"该文件夹下没有可用的 xlsx 文件");return}const l=await ue(t.items);m.value=l,D.value=t.items.map(n=>n.relativePath||n.absolutePath),I.value=null,w.value=null,S.value="",v.success(`已选择文件夹内 ${t.items.length} 个 Excel 文件`)}catch(s){v.error(s instanceof Error?s.message:"选择失败")}}async function Ne(){if(!m.value.length){v.warning("请先选择 Excel");return}if(!$()){v.warning("请先在左上角设置中填写货源查询密钥");return}U.value=!0;try{const e=m.value.map(t=>({fileKey:t.fileKey,originalFilename:t.originalFilename,relativePath:t.relativePath})),s=await ss(e,$(),O.value);I.value=s,w.value=null,S.value="",v.success(`解析完成,共 ${s.acceptedRows} 条`)}catch(e){v.error(e instanceof Error?e.message:"解析失败")}finally{U.value=!1}}async function Fe(){const e=q(),s=I.value,t=s?.taskId;if(!t){v.warning("请先解析文件");return}if(!e?.enqueue_json){v.error("当前环境未启用 pywebview enqueue_json");return}if(!$()){v.warning("请先在左上角设置中填写货源查询密钥");return}x.value=!0;try{const l={type:"similar-asin-run",ts:Date.now(),data:{taskId:t,user_id:Se(),api_key:$(),sourceFileCount:s.sourceFileCount||0,totalRows:s.totalRows||0,acceptedRows:s.acceptedRows||0,groupCount:s.groupCount||0}};S.value=JSON.stringify(we(l),null,2),await ts(t);const n=await e.enqueue_json(l);if(!n?.success){v.error(n?.error||"推送失败");return}w.value=Pe(s),Te(t),ie(),await z(),await L({force:!0}),v.success("已推送到 Python 队列")}finally{x.value=!1}}function ie(){I.value=null,S.value=""}function Te(e){d.value.includes(e)||(d.value=[...d.value,e],P()),C()}function Q(e){if(d.value=d.value.filter(s=>s!==e),!c.value.includes(e)){const s={..._.value};delete s[e],_.value=s}P()}function Ee(e){c.value.includes(e)||(c.value=[...c.value,e],P()),C()}function G(e){if(c.value=c.value.filter(s=>s!==e),!d.value.includes(e)){const s={..._.value};delete s[e],_.value=s}P()}function Re(e){if(e&&(Q(e),G(e),I.value?.taskId===e&&ie(),w.value?.taskId===e&&(w.value=null),f.value=f.value.filter(s=>s.taskId!==e),_.value[e])){const s={..._.value};delete s[e],_.value=s}}function C(){F||k.value==null&&Ae(!0)}function ce(){k.value!=null&&(T.clearTimer("task-poll",k.value),k.value=null)}function Ae(e=!1){if(F)return;if(k.value!=null){if(!e)return;T.clearTimer("task-poll",k.value),k.value=null}const s=async()=>{k.value=null,!F&&(!d.value.length&&!c.value.length||(await De(),!F&&k.value==null&&(d.value.length||c.value.length)&&(k.value=T.setTimeout("task-poll",s,ye()))))};e?s():k.value=T.setTimeout("task-poll",s,ye())}async function De(){if(K.value||!d.value.length&&!c.value.length){!d.value.length&&!c.value.length&&ce();return}K.value=!0;try{let e=!1,s=!1;const t=Array.from(new Set([...d.value,...c.value]));if(t.length){const l=await cs(t,{force:c.value.length>0});for(const n of l.items||[]){const o=n.task;if(!o?.id)continue;const g=n.items?.[0];if(g&&(_.value={..._.value,[o.id]:g},Ue(g)),(o.status==="SUCCESS"||o.status==="FAILED")&&(Q(o.id),e=!0,o.status==="SUCCESS"?Ee(o.id):G(o.id)),g&&o.status==="SUCCESS"&&c.value.includes(o.id)){const J=(g.fileStatus||"").toUpperCase();(g.fileReady||J==="SUCCESS"||J==="FAILED")&&(G(o.id),e=!0,s=!0)}}l.missingTaskIds?.length&&(l.missingTaskIds.forEach(n=>{Q(n),G(n)}),s=!0,e=!0)}e&&await z(),s&&await L(),xe()}finally{K.value=!1}}function Ue(e){if(!e.taskId&&!e.resultId)return;const s=f.value.findIndex(t=>e.resultId!=null&&t.resultId===e.resultId||e.taskId!=null&&t.taskId===e.taskId);s>=0?f.value[s]={...f.value[s],...e}:f.value=[e,...f.value]}function xe(){if(!c.value.length)return;const e=[];for(const s of c.value){const t=f.value.find(o=>o.taskId===s);if(!t){e.push(s);continue}const l=(t.taskStatus||"").toUpperCase(),n=(t.fileStatus||"").toUpperCase();l==="FAILED"||t.fileReady||n==="SUCCESS"||n==="FAILED"||l==="SUCCESS"&&e.push(s)}c.value=e,P(),c.value.length&&C()}function $e(){const e=f.value.filter(s=>s.taskId!=null&&b(s)).map(s=>s.taskId);c.value=Array.from(new Set(e)),P(),c.value.length&&C()}function Me(){const e=f.value.filter(s=>s.taskId!=null&&y(s)==="RUNNING").map(s=>s.taskId);e.length&&(d.value=Array.from(new Set([...d.value,...e])),P(),C())}async function z(){E.value=await as()}async function L(e={}){const s=Date.now();if(!(!e.force&&f.value.length&&s-ae{f.value=Ge(f.value,t.items||[]),ae=Date.now()}).finally(()=>{N=null}),N)}function Ge(e,s){const t=new Map,l=new Map;for(const n of e||[])n.taskId!=null&&t.set(n.taskId,n),n.resultId!=null&&l.set(n.resultId,n);return(s||[]).map(n=>{const o=n.resultId!=null?l.get(n.resultId):n.taskId!=null?t.get(n.taskId):void 0;return ze(o,n)})}function ze(e,s){return!e||!((y(e)==="RUNNING"||b(e)||A(e))&&!A(s)&&!Z(s))?s:{...s,fileJobId:s.fileJobId??e.fileJobId,fileStatus:s.fileStatus||e.fileStatus,fileError:s.fileError||e.fileError,fileReady:s.fileReady||e.fileReady,fileProgressPercent:W(s.fileProgressPercent)?s.fileProgressPercent:e.fileProgressPercent,fileProgressCurrent:W(s.fileProgressCurrent)?s.fileProgressCurrent:e.fileProgressCurrent,fileProgressTotal:W(s.fileProgressTotal)?s.fileProgressTotal:e.fileProgressTotal,fileProgressMessage:(s.fileProgressMessage||"").trim()?s.fileProgressMessage:e.fileProgressMessage}}function W(e){const s=Number(e);return Number.isFinite(s)&&s>0}function de(e){const s=y(e);return s==="RUNNING"?"执行中":s==="PENDING"?"已解析待推送":b(e)?"结果生成中":X(e)?"结果生成失败":s==="SUCCESS"||e.success?"已完成":s==="FAILED"?"失败":"等待中"}function Le(e){const s=y(e);return s==="RUNNING"||b(e)?"running":X(e)||s==="FAILED"?"failed":s==="SUCCESS"||e.success?"success":"pending"}function b(e){const s=y(e),t=(e.fileStatus||"").toUpperCase();return!(s!=="SUCCESS"||Z(e)||t==="FAILED"||t==="SUCCESS")}function y(e){return(e.taskStatus||"").toUpperCase()}function X(e){return(e.fileStatus||"").toUpperCase()==="FAILED"}function B(e){if(X(e))return e.fileError||"结果文件生成失败,请稍后重试或检查后端日志";if(A(e)||!b(e))return"";const s=(e.fileStatus||"").toUpperCase();return s==="RUNNING"?"任务已完成,正在等待 Coze 回流并组装结果文件,下载按钮稍后出现":s==="PENDING"?"任务已完成,结果文件已入队,正在等待后端开始处理":"任务已完成,正在生成结果文件,下载按钮稍后出现"}function Z(e){return!!(e.resultId&&(e.fileReady||e.downloadUrl))}function H(e){const s=Number(e.fileProgressPercent||0);return Number.isFinite(s)&&s>0?Math.max(0,Math.min(100,Math.round(s))):he(e)?pe(e)==="PENDING"?6:10:0}function fe(e,s){const t=(e.fileProgressMessage||"").trim();return t?/coze/i.test(t)||/Coze|回流/.test(t)?/submitting/i.test(t)||/提交/.test(t)?"正在提交 Coze 批次":/生成结果|结果文件|组装/i.test(t)?"Coze 已回流,正在生成结果文件":/waiting/i.test(t)||/等待/.test(t)||/\d+\s*\/\s*\d+/.test(t)?"Coze 回流中,等待结果回传":"Coze 处理中":/assembling|xlsx|组装|生成结果/i.test(t)?"正在组装结果文件":t:s}function ve(e){const s=(e.fileProgressMessage||"").trim(),t=Be(s),l=t?.current??e.fileProgressCurrent??0,n=t?.total??e.fileProgressTotal??0;return/coze/i.test(s)||/Coze|回流/.test(s)?/submitting/i.test(s)||/提交/.test(s)?`Coze 提交批次 ${l}/${n}`:`Coze 回流批次 ${l}/${n}`:`当前阶段 ${l}/${n}`}function Be(e){const s=e.match(/(\d+)\s*\/\s*(\d+)/);if(!s)return null;const t=Number(s[1]),l=Number(s[2]);return!Number.isFinite(t)||!Number.isFinite(l)?null:{current:t,total:l}}function A(e){return(y(e)==="RUNNING"||b(e))&&(ge(e)||he(e))}function ge(e){return ee(e)||Number(e.fileProgressPercent||0)>0||!!(e.fileProgressMessage||"").trim()}function ee(e){return(e.fileProgressTotal||0)>0}function pe(e){return(e.fileStatus||"").toUpperCase()}function He(e){const s=pe(e);return e.fileJobId!=null||s==="PENDING"||s==="RUNNING"}function he(e){return He(e)&&!ge(e)}async function Je(e){if(!e.resultId)return;const s=e.downloadUrl||ns(e.resultId),t=e.resultFilename||`${e.sourceFilename||"similar-asin"}.xlsx`,l=await rs(s,t,`similar-asin:${e.resultId}`);l.success?v.success(`已保存: ${l.path||t}`):l.error&&l.error!=="用户取消"&&v.error(l.error)}async function ke(e){try{const s=y(e),t=e.taskId;t!=null&&(s==="RUNNING"||s==="PENDING"||!e.resultId)?(await os(t),Re(t)):e.resultId&&(await us(e.resultId),e.taskId&&(f.value=f.value.filter(n=>n.taskId!==e.taskId))),await z(),await L({force:!0}),v.success("已删除")}catch(s){v.error(s instanceof Error?s.message:"删除失败")}}return qe(async()=>{Ce(),await Promise.all([z().catch(()=>{}),L().catch(()=>{})]),$e(),Me(),(d.value.length||c.value.length)&&C()}),Oe(()=>{F=!0,ce(),T.clearScope()}),(e,s)=>(u(),i("div",vs,[Ke(es,{active:"similar-asin"}),a("div",gs,[a("aside",ps,[s[5]||(s[5]=a("div",{class:"section-title"},"上传文件",-1)),a("div",hs,[s[1]||(s[1]=a("div",{class:"hint"},"选择 Excel 后点击解析,后端会提取 id、ASIN、国家、价格,每一行都会独立送检。",-1)),a("div",{class:"btns"},[a("button",{type:"button",class:"opt-btn",onClick:be},"选择 Excel"),a("button",{type:"button",class:"opt-btn",onClick:me},"选择文件夹")]),a("div",ks,[D.value.length?(u(!0),i(se,{key:1},te(D.value,t=>(u(),i("span",{key:t},r(t),1))),128)):(u(),i("span",_s,"暂未选择文件"))])]),a("div",ys,[s[4]||(s[4]=a("div",{class:"section-title"},"检测条件",-1)),a("label",Is,[s[2]||(s[2]=a("span",null,[a("strong",null,"图片检测"),a("em",null,"开启后请求 Coze 时携带 img_switch=true")],-1)),Ve(a("input",{"onUpdate:modelValue":s[0]||(s[0]=t=>O.value=t),type:"checkbox"},null,512),[[Ye,O.value]]),s[3]||(s[3]=a("i",null,null,-1))])]),a("div",ws,[a("button",{type:"button",class:"btn-run",disabled:U.value||!m.value.length,onClick:Ne},r(U.value?"解析中...":"解析并创建任务"),9,Ss),a("button",{type:"button",class:"btn-run btn-queue",disabled:x.value||!I.value?.taskId,onClick:Fe},r(x.value?"推送中...":"推送到 Python 队列"),9,Ps)]),s[6]||(s[6]=a("p",{class:"loading-msg"},"Python 回传字段按 id、asin、国家、价格、标题、图片链接数组提交;后端接收分片后按 10 条一批送检,结果区展示真实 Coze 批次进度。",-1)),R.value?(u(),i("div",Cs,[a("div",null,"任务 ID:"+r(R.value.taskId),1),a("div",null,"总行数:"+r(R.value.totalRows)+",有效:"+r(R.value.acceptedRows)+",过滤:"+r(R.value.droppedRows),1)])):h("",!0),S.value?(u(),i("pre",bs,r(S.value),1)):h("",!0)]),a("section",ms,[s[14]||(s[14]=a("div",{class:"panel-header"},"货源查询",-1)),a("div",Ns,[a("div",Fs,[a("div",Ts,[s[7]||(s[7]=a("span",{class:"summary-label"},"运行中任务",-1)),a("strong",null,r(E.value.pendingTaskCount),1)]),a("div",Es,[s[8]||(s[8]=a("span",{class:"summary-label"},"已结束任务",-1)),a("strong",null,r(E.value.processedTaskCount),1)]),a("div",Rs,[s[9]||(s[9]=a("span",{class:"summary-label"},"成功任务",-1)),a("strong",null,r(E.value.successTaskCount),1)]),a("div",As,[s[10]||(s[10]=a("span",{class:"summary-label"},"失败任务",-1)),a("strong",null,r(E.value.failedTaskCount),1)])]),s[13]||(s[13]=a("div",{class:"subsection-title"},"匹配任务",-1)),a("div",Ds,[s[11]||(s[11]=a("div",{class:"result-list-header"},[a("span",null,"当前任务")],-1)),le.value.length?(u(),i("ul",xs,[(u(!0),i(se,null,te(le.value,t=>(u(),i("li",{key:`cur-${t.taskId}`,class:"task-item"},[a("div",$s,[a("span",Ms,r(t.sourceFilename||"货源查询"),1),a("div",Gs,"任务 ID:"+r(t.taskId),1),a("div",zs,"开始时间:"+r(M(t.startedAt||t.createdAt)),1),a("div",Ls,"结束时间:"+r(M(t.finishedAt)),1),a("div",Bs,"行数:"+r(t.rowCount??"-"),1),B(t)?(u(),i("div",Hs,r(B(t)),1)):h("",!0),A(t)?(u(),i("div",Js,[a("div",js,[a("span",null,r(fe(t,"处理中")),1),a("span",null,"总进度 "+r(H(t))+"%",1)]),a("div",qs,[a("div",{class:"file-progress-bar",style:_e({width:`${H(t)}%`})},null,4)]),ee(t)?(u(),i("div",Os,r(ve(t)),1)):h("",!0)])):h("",!0)]),a("div",Ks,[a("span",Vs,r(de(t)),1),a("button",{type:"button",class:"btn-delete",onClick:l=>ke(t)},"删除",8,Ys)])]))),128))])):(u(),i("div",Us,"暂无当前任务"))]),a("div",Qs,[s[12]||(s[12]=a("div",{class:"result-list-header"},[a("span",null,"历史记录")],-1)),ne.value.length?(u(),i("ul",Xs,[(u(!0),i(se,null,te(ne.value,t=>(u(),i("li",{key:`his-${t.resultId}-${t.taskId}`,class:"task-item"},[a("div",Zs,[a("span",et,r(t.sourceFilename||"货源查询"),1),a("div",st,"任务 ID:"+r(t.taskId??"-"),1),a("div",tt,"开始时间:"+r(M(t.startedAt||t.createdAt)),1),a("div",at,"结束时间:"+r(M(t.finishedAt)),1),t.resultFilename?(u(),i("div",lt,r(t.resultFilename||"下载结果"),1)):h("",!0),B(t)?(u(),i("div",nt,r(B(t)),1)):h("",!0),A(t)?(u(),i("div",rt,[a("div",ot,[a("span",null,r(fe(t,"结果生成中")),1),a("span",null,"总进度 "+r(H(t))+"%",1)]),a("div",ut,[a("div",{class:"file-progress-bar",style:_e({width:`${H(t)}%`})},null,4)]),ee(t)?(u(),i("div",it,r(ve(t)),1)):h("",!0)])):h("",!0),t.error?(u(),i("div",ct,"错误:"+r(t.error),1)):h("",!0)]),a("div",dt,[a("span",{class:Qe(["status",Le(t)])},r(de(t)),3),Z(t)?(u(),i("button",{key:0,type:"button",class:"download",onClick:l=>Je(t)},"下载",8,ft)):h("",!0),t.resultId?(u(),i("button",{key:1,type:"button",class:"btn-delete",onClick:l=>ke(t)},"删除",8,vt)):h("",!0)])]))),128))])):(u(),i("div",Ws,"暂无历史记录"))])])])])]))}}),ht=We(pt,[["__scopeId","data-v-b77550eb"]]);Xe(ht).use(Ze).mount("#app"); diff --git a/app/assets/split-CR1PtDQE.css b/app/assets/split-CR1PtDQE.css deleted file mode 100644 index 9b7031a..0000000 --- a/app/assets/split-CR1PtDQE.css +++ /dev/null @@ -1 +0,0 @@ -.module-page[data-v-77886e3c]{min-height:100vh;background:#1a1a1a}.main-content[data-v-77886e3c]{display:flex;min-height:calc(100vh - 56px);height:calc(100vh - 56px)}.left-panel[data-v-77886e3c]{width:380px;background:#1e1e1e;padding:20px;overflow-y:auto;border-right:1px solid #2a2a2a}.right-panel[data-v-77886e3c]{flex:1;display:flex;flex-direction:column;min-width:0;background:#1a1a1a}.section-title[data-v-77886e3c]{font-size:13px;color:#bbb;margin-bottom:10px}.upload-zone[data-v-77886e3c]{border:1px dashed #3a3a3a;border-radius:10px;padding:24px;text-align:center;background:#252525;margin-bottom:20px;transition:all .2s ease}.upload-zone[data-v-77886e3c]:hover{border-color:#3498db;background:#2a2a2a}.hint[data-v-77886e3c]{color:#888;font-size:13px;margin-bottom:12px;line-height:1.5}.btns[data-v-77886e3c]{display:flex;gap:10px;justify-content:center;flex-wrap:wrap}.opt-btn[data-v-77886e3c],.btn-run[data-v-77886e3c],.download[data-v-77886e3c],.btn-delete[data-v-77886e3c]{border:none;cursor:pointer;transition:all .2s ease}.opt-btn[data-v-77886e3c]{padding:8px 16px;font-size:13px;color:#ccc;background:#2a2a2a;border:1px solid #3a3a3a;border-radius:6px}.opt-btn.small[data-v-77886e3c]{padding:6px 10px;font-size:12px}.opt-btn[data-v-77886e3c]:hover{color:#3498db;background:#333;border-color:#3498db}.selected-files[data-v-77886e3c]{margin-top:14px;font-size:12px;color:#888;max-height:112px;overflow-y:auto;text-align:left}.selected-files span[data-v-77886e3c]{display:block;margin:4px 0;word-break:break-all}.more-line[data-v-77886e3c]{color:#b8c1cc}.split-selected-files[data-v-77886e3c]{max-height:120px;min-height:72px;padding-right:4px}.option-group[data-v-77886e3c]{margin-bottom:20px}.column-option-group[data-v-77886e3c]{padding:14px;border-radius:10px;background:#252525;border:1px solid #2a2a2a}.column-toolbar[data-v-77886e3c]{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:14px}.column-count[data-v-77886e3c]{font-size:12px;color:#a9b4bf}.column-actions[data-v-77886e3c]{display:flex;gap:8px}.column-grid[data-v-77886e3c]{display:grid;grid-template-columns:1fr;gap:8px;max-height:280px;overflow-y:auto}.empty-column-state[data-v-77886e3c]{padding:16px 12px;border-radius:8px;border:1px dashed #3a3a3a;background:#202020;color:#7f8790;font-size:12px;line-height:1.6}.column-item[data-v-77886e3c]{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:8px;border:1px solid #2f2f2f;background:#202020;cursor:pointer;transition:all .2s ease;font-size:13px;color:#d7d7d7}.column-item[data-v-77886e3c]:hover,.column-item.active[data-v-77886e3c]{border-color:#3b6f98;background:#26313a}.column-item input[data-v-77886e3c]{margin:0}.column-item span[data-v-77886e3c]{word-break:break-all}.radio-item[data-v-77886e3c]{display:flex;align-items:flex-start;gap:10px;cursor:pointer;padding:10px 12px;border-radius:8px;background:#252525;border:1px solid #2a2a2a;margin-bottom:8px;transition:all .2s ease}.radio-item[data-v-77886e3c]:hover,.radio-item.active[data-v-77886e3c]{background:#2a2a2a;border-color:#3a3a3a}.radio-item input[data-v-77886e3c]{margin-top:3px}.label[data-v-77886e3c]{font-weight:500;color:#e0e0e0;font-size:13px}.desc[data-v-77886e3c]{font-size:12px;color:#888;margin-top:2px;line-height:1.5;font-weight:400}.split-input-card[data-v-77886e3c]{display:flex;flex-direction:column;gap:10px;padding:14px 16px;border-radius:10px;border:1px solid #2f2f2f;background:#252525}.split-number-input[data-v-77886e3c]{width:100%;padding:12px 14px;border-radius:8px;border:1px solid #3a3a3a;background:#1b1b1b;color:#eaf4ff;font-size:22px;font-weight:700;line-height:1.2;outline:none;transition:border-color .2s ease,box-shadow .2s ease,background .2s ease}.split-number-input[data-v-77886e3c]:focus{border-color:#3498db;box-shadow:0 0 0 3px #3498db2e;background:#20252b}.split-number-input[data-v-77886e3c]::placeholder{color:#708090;font-size:14px;font-weight:400}.run-row[data-v-77886e3c]{display:flex;align-items:center;flex-wrap:wrap;gap:10px 12px;margin-top:16px}.btn-run[data-v-77886e3c]{padding:10px 22px;background:#3498db;color:#fff;border-radius:8px;font-size:14px}.btn-run[data-v-77886e3c]:hover{background:#2980b9}.btn-run[data-v-77886e3c]:disabled{background:#555;color:#999;cursor:not-allowed}.loading-msg[data-v-77886e3c]{color:#3498db;font-size:13px}.panel-header[data-v-77886e3c]{padding:16px 20px;border-bottom:1px solid #2a2a2a;font-size:15px;font-weight:600;color:#ddd}.task-list-wrap[data-v-77886e3c]{flex:1;overflow-y:auto;padding:16px}.task-list[data-v-77886e3c]{list-style:none;margin:0;padding:0}.task-item[data-v-77886e3c]{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 16px;border:1px solid #2a2a2a;border-radius:8px;margin-bottom:10px;background:#1e1e1e}.split-result-item[data-v-77886e3c]{align-items:flex-start}.left[data-v-77886e3c]{flex:1;min-width:0}.split-result-main[data-v-77886e3c]{display:flex;flex-direction:column;gap:4px}.id[data-v-77886e3c]{display:inline-block;font-weight:600;color:#e0e0e0;font-size:13px}.files[data-v-77886e3c]{font-size:12px;color:#888;margin-top:4px}.time[data-v-77886e3c]{font-size:12px;color:#666;margin-top:2px}.split-entry-list[data-v-77886e3c]{line-height:1.6;word-break:break-all;max-width:100%}.task-right[data-v-77886e3c]{display:flex;align-items:center;gap:12px;flex-wrap:wrap;justify-content:flex-end}.split-result-actions[data-v-77886e3c]{flex-shrink:0;min-width:180px;justify-content:flex-end;align-self:center}.status[data-v-77886e3c]{padding:4px 10px;border-radius:6px;font-size:12px;white-space:nowrap}.status.success[data-v-77886e3c]{background:#2ecc712e;color:#2ecc71}.status.failed[data-v-77886e3c]{background:#e74c3c2e;color:#ff6b6b}.download[data-v-77886e3c]{padding:6px 10px;border-radius:6px;font-size:12px;background:#3498db2e;color:#69b6ff}.download[data-v-77886e3c]:hover{background:#3498db47}.btn-delete[data-v-77886e3c]{padding:6px 10px;border-radius:6px;font-size:12px;background:#e74c3c1f;color:#ff8f8f}.btn-delete[data-v-77886e3c]:hover{background:#e74c3c38}.empty-tasks[data-v-77886e3c]{color:#666;font-size:13px;padding:24px 8px}.clean-placeholder[data-v-77886e3c]{max-height:112px}.clean-result-summary[data-v-77886e3c]{display:grid;grid-template-columns:repeat(3,minmax(0,220px));gap:16px;margin-bottom:18px}.summary-card[data-v-77886e3c]{padding:16px 18px;border:1px solid #2a2a2a;border-radius:10px;background:#1e1e1e}.summary-card strong[data-v-77886e3c]{display:block;margin-top:8px;font-size:24px;color:#eaf4ff}.summary-label[data-v-77886e3c]{font-size:12px;color:#8d8d8d}.result-list-wrap[data-v-77886e3c]{border:1px solid #2a2a2a;border-radius:10px;background:#1e1e1e;min-height:260px}.result-list-header[data-v-77886e3c]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px;border-bottom:1px solid #2a2a2a;font-size:14px;color:#ddd}@media(max-width:1100px){.main-content[data-v-77886e3c]{flex-direction:column;height:auto}.left-panel[data-v-77886e3c]{width:100%;border-right:none;border-bottom:1px solid #2a2a2a}.right-panel[data-v-77886e3c]{min-height:420px}.task-item[data-v-77886e3c]{flex-direction:column;align-items:flex-start}.task-right[data-v-77886e3c]{width:100%;justify-content:flex-start}.split-result-actions[data-v-77886e3c]{min-width:0;align-self:flex-start}.clean-result-summary[data-v-77886e3c]{grid-template-columns:1fr}} diff --git a/app/assets/split.js b/app/assets/split.js deleted file mode 100644 index 88c2572..0000000 --- a/app/assets/split.js +++ /dev/null @@ -1 +0,0 @@ -import{d as L,o as O,a,c as n,b as W,e,F as S,r as E,t as i,f as v,n as x,w as k,l as V,p as M,g as d,h as q,i as $,E as r,v as G,_ as Q,j as X,k as Y}from"./pywebview-B8lwamDf.js";import{B as Z,j as ss,k as es,b as ts,l as ls,m as as,s as ns}from"./java-modules-B9jblDzU.js";import{e as os}from"./brand-DE-sObfq.js";const is={class:"page-shell module-page"},rs={class:"main-content"},us={class:"left-panel"},ds={class:"upload-zone"},cs={class:"selected-files clean-placeholder split-selected-files"},ps={key:0,class:"more-line"},vs={key:1},fs={class:"option-group column-option-group"},_s={class:"column-toolbar"},ms={class:"column-count"},ys={class:"column-actions"},gs={key:0,class:"column-grid"},hs=["value"],bs={key:1,class:"empty-column-state"},ws={class:"option-group"},ks={class:"radio-item active"},Cs={class:"desc"},Ss={class:"option-group"},xs={class:"option-group"},Fs={key:0,class:"split-input-card"},Ps={key:1,class:"split-input-card"},Es={class:"run-row"},$s=["disabled"],Is={class:"loading-msg"},Rs={class:"right-panel"},Bs={class:"task-list-wrap"},Us={class:"clean-result-summary"},Vs={class:"summary-card"},Ms={class:"summary-card"},js={class:"summary-card"},Ts={class:"result-list-wrap"},Ds={key:0,class:"empty-tasks"},Ns={key:1,class:"task-list clean-result-list"},As={class:"left split-result-main"},Hs=["title"],Ks={key:0,class:"files"},zs={key:1,class:"time"},Js={key:2,class:"files"},Ls={key:3,class:"files split-entry-list"},Os={key:4,class:"files"},Ws={class:"task-right split-result-actions"},qs=["onClick"],Gs=["onClick"],Qs=L({__name:"BrandSplitTab",setup(Ys){const f=d([]),C=d(""),c=d([]),_=d([]),p=d([]),I=d(0),u=d("rows_per_file"),m=d(2e3),y=d(5),g=d(!1),h=d([]),b=d({total:0,successCount:0,failedCount:0,items:[]}),F=q(()=>f.value.slice(0,8));function j(l){b.value={total:l.length,successCount:l.filter(s=>s.success).length,failedCount:l.filter(s=>!s.success).length,items:l}}async function R(l){const s=$();if(!s?.upload_file_to_java)throw new Error("当前桌面端未提供文件上传桥接能力");const t=[];for(const o of l){const U=typeof o=="string"?o:o.absolutePath,J=typeof o=="string"?void 0:o.relativePath,w=await s.upload_file_to_java(U,J);if(!w?.success||!w.data)throw new Error(w?.error||w?.message||`上传失败:${U}`);t.push(w.data)}return t}async function B(l){const s=await ts(l);_.value=s.headers||[],p.value=[...s.headers||[]],I.value=s.totalRows||0}async function T(l,s){f.value=l,C.value="",c.value=await R(l),c.value.length>0&&await B(c.value[0].fileKey),r.success(s)}async function D(){const l=$();if(!l?.select_brand_xlsx_files){r.warning("当前环境不支持文件选择,请在本机客户端中打开");return}try{const s=await l.select_brand_xlsx_files();if(!s?.length)return;await T(s,`已选择 ${s.length} 个待拆分文件`)}catch(s){r.error(s instanceof Error?s.message:"选择失败")}}async function N(){const l=$();if(!l?.select_brand_folder){r.warning("当前环境不支持文件夹选择,请在本机客户端中打开");return}try{const s=await l.select_brand_folder();if(!s)return;C.value=s.split(/[/\\]/).filter(Boolean).pop()||"";const t=await os(s);if(t.success&&t.items?.length){f.value=t.items.map(o=>o.relativePath),c.value=await R(t.items),c.value.length>0&&await B(c.value[0].fileKey),r.success(`已选择文件夹内 ${t.items.length} 个 xlsx 文件`);return}r.warning(t.error||"该文件夹下没有 xlsx 文件")}catch(s){r.error(s instanceof Error?s.message:"选择失败")}}async function A(){if(!c.value.length){r.warning("请先选择待拆分 Excel 文件或文件夹");return}if(!p.value.length){r.warning("请至少选择一列保留列");return}if(u.value==="rows_per_file"&&(!m.value||m.value<=0)){r.warning("请输入有效的每份条数");return}if(u.value==="parts"&&(!y.value||y.value<=0)){r.warning("请输入有效的拆分份数");return}try{g.value=!0;const l=await ss({files:c.value.map(s=>({fileKey:s.fileKey,originalFilename:s.originalFilename,relativePath:s.relativePath})),selectedColumns:p.value,splitMode:u.value,rowsPerFile:u.value==="rows_per_file"&&m.value||void 0,parts:u.value==="parts"&&y.value||void 0,archiveName:c.value.some(s=>!!s.relativePath)&&C.value?C.value:void 0});b.value=l,h.value=l.items||[],await P(),r.success("数据拆分完成")}catch(l){r.error(l instanceof Error?l.message:"数据拆分失败")}finally{g.value=!1}}async function P(){try{const l=await es();h.value=l.items||[],j(h.value)}catch{}}async function H(l){try{await ls(l),await P(),r.success("已删除")}catch(s){r.error(s instanceof Error?s.message:"删除失败")}}function K(l){const s=l.slice(0,4).map(o=>o.rowCount!==void 0?`${o.filename}(${o.rowCount}条)`:o.filename);return l.length-s.length>0?`${s.join("、")} 等 ${l.length} 个文件`:s.join("、")}async function z(l){const s=l.downloadUrl||(l.resultId?as(l.resultId):"");if(!s){r.warning("当前结果没有下载地址");return}const t=l.outputFilename||`${new Date().toISOString().slice(0,10).replace(/-/g,"")}.zip`,o=await ns(s,t,l.resultId?`split:${l.resultId}`:void 0);o.success?r.success(`已保存:${o.path||t}`):o.error&&o.error!=="用户取消"&&r.error(o.error)}return O(()=>{P().catch(()=>{})}),(l,s)=>(a(),n("div",is,[W(Z,{active:"split"}),e("div",rs,[e("aside",us,[s[14]||(s[14]=e("div",{class:"section-title"},"选择文件",-1)),e("div",ds,[s[7]||(s[7]=e("div",{class:"hint"},"选择需要拆分的 Excel 文件或文件夹,按规则拆成多个 Excel 文件。",-1)),e("div",{class:"btns"},[e("button",{type:"button",class:"opt-btn",onClick:D},"选择 Excel 文件"),e("button",{type:"button",class:"opt-btn",onClick:N},"选择文件夹")]),e("div",cs,[f.value.length?(a(),n(S,{key:0},[(a(!0),n(S,null,E(F.value,t=>(a(),n("span",{key:t},i(t),1))),128)),f.value.length>F.value.length?(a(),n("span",ps," 还有 "+i(f.value.length-F.value.length)+" 个文件未展开显示 ",1)):v("",!0)],64)):(a(),n("span",vs,"暂未选择待拆分文件"))])]),s[15]||(s[15]=e("div",{class:"section-title"},"保留列设置",-1)),e("div",fs,[e("div",_s,[e("span",ms,"已选择 "+i(p.value.length)+" / "+i(_.value.length)+" 列",1),e("div",ys,[e("button",{type:"button",class:"opt-btn small",onClick:s[0]||(s[0]=t=>p.value=[..._.value])},"全选"),e("button",{type:"button",class:"opt-btn small",onClick:s[1]||(s[1]=t=>p.value=[])},"清空")])]),_.value.length?(a(),n("div",gs,[(a(!0),n(S,null,E(_.value,t=>(a(),n("label",{key:t,class:x(["column-item",{active:p.value.includes(t)}])},[k(e("input",{"onUpdate:modelValue":s[2]||(s[2]=o=>p.value=o),type:"checkbox",value:t},null,8,hs),[[G,p.value]]),e("span",null,i(t),1)],2))),128))])):(a(),n("div",bs,"请选择 Excel 文件后读取表头并填充可保留列"))]),s[16]||(s[16]=e("div",{class:"section-title"},"总条数",-1)),e("div",ws,[e("label",ks,[s[9]||(s[9]=e("input",{type:"checkbox",checked:"",disabled:""},null,-1)),e("div",null,[s[8]||(s[8]=e("span",{class:"label"},"当前数据总条数",-1)),e("div",Cs,i(I.value)+" 条(不含表头)",1)])])]),s[17]||(s[17]=e("div",{class:"section-title"},"拆分模式",-1)),e("div",Ss,[e("label",{class:x(["radio-item",{active:u.value==="rows_per_file"}])},[k(e("input",{"onUpdate:modelValue":s[3]||(s[3]=t=>u.value=t),type:"radio",value:"rows_per_file",name:"split-mode"},null,512),[[V,u.value]]),s[10]||(s[10]=e("div",null,[e("span",{class:"label"},"按每份条数"),e("div",{class:"desc"},"例如每份 2000 条,最后一份放剩余数据")],-1))],2),e("label",{class:x(["radio-item",{active:u.value==="parts"}])},[k(e("input",{"onUpdate:modelValue":s[4]||(s[4]=t=>u.value=t),type:"radio",value:"parts",name:"split-mode"},null,512),[[V,u.value]]),s[11]||(s[11]=e("div",null,[e("span",{class:"label"},"按份数平均拆分"),e("div",{class:"desc"},"例如拆 5 份,按总条数尽量平均分配")],-1))],2)]),s[18]||(s[18]=e("div",{class:"section-title"},"拆分参数",-1)),e("div",xs,[u.value==="rows_per_file"?(a(),n("label",Fs,[s[12]||(s[12]=e("span",{class:"label"},"每份条数",-1)),k(e("input",{"onUpdate:modelValue":s[5]||(s[5]=t=>m.value=t),class:"split-number-input",type:"number",min:"1",placeholder:"例如 2000"},null,512),[[M,m.value,void 0,{number:!0}]])])):(a(),n("label",Ps,[s[13]||(s[13]=e("span",{class:"label"},"拆分份数",-1)),k(e("input",{"onUpdate:modelValue":s[6]||(s[6]=t=>y.value=t),class:"split-number-input",type:"number",min:"1",placeholder:"例如 5"},null,512),[[M,y.value,void 0,{number:!0}]])]))]),e("div",Es,[e("button",{type:"button",class:"btn-run",disabled:g.value,onClick:A},i(g.value?"拆分中...":"开始拆分"),9,$s),e("span",Is,i(g.value?"正在拆分并上传结果,请稍候…":"选择文件、保留列和拆分规则后即可执行拆分,结果会显示在右侧供下载"),1)])]),e("section",Rs,[s[23]||(s[23]=e("div",{class:"panel-header"},"拆分结果",-1)),e("div",Bs,[e("div",Us,[e("div",Vs,[s[19]||(s[19]=e("span",{class:"summary-label"},"已处理文件",-1)),e("strong",null,i(b.value.total),1)]),e("div",Ms,[s[20]||(s[20]=e("span",{class:"summary-label"},"成功结果",-1)),e("strong",null,i(b.value.successCount),1)]),e("div",js,[s[21]||(s[21]=e("span",{class:"summary-label"},"失败文件",-1)),e("strong",null,i(b.value.failedCount),1)])]),e("div",Ts,[s[22]||(s[22]=e("div",{class:"result-list-header"},[e("span",null,"拆分结果压缩包列表")],-1)),h.value.length===0?(a(),n("div",Ds," 暂无拆分结果,完成数据拆分后会在这里展示压缩包文件 ")):(a(),n("ul",Ns,[(a(!0),n(S,null,E(h.value,t=>(a(),n("li",{key:`${t.resultId||t.outputFilename||t.sourceFilename}-${t.rowCount||0}`,class:"task-item split-result-item"},[e("div",As,[e("span",{class:"id",title:t.sourceFilename},i(t.sourceFilename||"-"),9,Hs),t.outputFilename?(a(),n("div",Ks,"压缩包文件:"+i(t.outputFilename),1)):v("",!0),t.rowCount!==void 0?(a(),n("div",zs,"压缩包共包含 "+i(t.rowCount)+" 条数据",1)):v("",!0),t.entryCount&&t.entryCount>0?(a(),n("div",Js,"压缩包内共 "+i(t.entryCount)+" 个拆分文件 ",1)):v("",!0),t.entries&&t.entries.length?(a(),n("div",Ls," 压缩包内容:"+i(K(t.entries)),1)):v("",!0),t.error?(a(),n("div",Os,"错误信息:"+i(t.error),1)):v("",!0)]),e("div",Ws,[e("span",{class:x(["status",t.success?"success":"failed"])},i(t.success?"已完成":"失败"),3),t.success&&(t.downloadUrl||t.resultId)?(a(),n("button",{key:0,type:"button",class:"download",onClick:o=>z(t)}," 下载压缩包 ",8,qs)):v("",!0),t.resultId?(a(),n("button",{key:1,type:"button",class:"btn-delete",onClick:o=>H(t.resultId)}," 删除 ",8,Gs)):v("",!0)])]))),128))]))])])])])]))}}),Xs=Q(Qs,[["__scopeId","data-v-77886e3c"]]);X(Xs).use(Y).mount("#app"); diff --git a/app/assets/zh-cn-CqyuNHRW.js b/app/assets/zh-cn-CqyuNHRW.js deleted file mode 100644 index 61c0aaa..0000000 --- a/app/assets/zh-cn-CqyuNHRW.js +++ /dev/null @@ -1 +0,0 @@ -import{M as m}from"./pywebview-B8lwamDf.js";var _={name:"zh-cn",el:{breadcrumb:{label:"面包屑"},colorpicker:{confirm:"确定",clear:"清空",defaultLabel:"颜色选择器",description:"当前颜色 {color},按 Enter 键选择新颜色",alphaLabel:"选择透明度的值",alphaDescription:"透明度 {alpha}, 当前颜色 {color}",hueLabel:"选择色相值",hueDescription:"色相 {hue}, 当前颜色 {color}",svLabel:"选择饱和度与明度的值",svDescription:"饱和度 {saturation}, 明度 {brightness}, 当前颜色 {color}",predefineDescription:"选择 {value} 作为颜色"},datepicker:{now:"此刻",today:"今天",cancel:"取消",clear:"清空",confirm:"确定",dateTablePrompt:"使用方向键与 Enter 键可选择日期",monthTablePrompt:"使用方向键与 Enter 键可选择月份",yearTablePrompt:"使用方向键与 Enter 键可选择年份",selectedDate:"已选日期",selectDate:"选择日期",selectTime:"选择时间",startDate:"开始日期",startTime:"开始时间",endDate:"结束日期",endTime:"结束时间",prevYear:"前一年",nextYear:"后一年",prevMonth:"上个月",nextMonth:"下个月",year:"年",month1:"1 月",month2:"2 月",month3:"3 月",month4:"4 月",month5:"5 月",month6:"6 月",month7:"7 月",month8:"8 月",month9:"9 月",month10:"10 月",month11:"11 月",month12:"12 月",weeks:{sun:"日",mon:"一",tue:"二",wed:"三",thu:"四",fri:"五",sat:"六"},weeksFull:{sun:"星期日",mon:"星期一",tue:"星期二",wed:"星期三",thu:"星期四",fri:"星期五",sat:"星期六"},months:{jan:"一月",feb:"二月",mar:"三月",apr:"四月",may:"五月",jun:"六月",jul:"七月",aug:"八月",sep:"九月",oct:"十月",nov:"十一月",dec:"十二月"}},inputNumber:{decrease:"减少数值",increase:"增加数值"},select:{loading:"加载中",noMatch:"无匹配数据",noData:"无数据",placeholder:"请选择"},mention:{loading:"加载中"},dropdown:{toggleDropdown:"切换下拉选项"},cascader:{noMatch:"无匹配数据",loading:"加载中",placeholder:"请选择",noData:"暂无数据"},pagination:{goto:"前往",pagesize:"条/页",total:"共 {total} 条",pageClassifier:"页",page:"页",prev:"上一页",next:"下一页",currentPage:"第 {pager} 页",prevPages:"向前 {pager} 页",nextPages:"向后 {pager} 页",deprecationWarning:"你使用了一些已被废弃的用法,请参考 el-pagination 的官方文档"},dialog:{close:"关闭此对话框"},drawer:{close:"关闭此对话框"},messagebox:{title:"提示",confirm:"确定",cancel:"取消",error:"输入的数据不合法!",close:"关闭此对话框"},upload:{deleteTip:"按 Delete 键可删除",delete:"删除",preview:"查看图片",continue:"继续上传"},slider:{defaultLabel:"滑块介于 {min} 至 {max}",defaultRangeStartLabel:"选择起始值",defaultRangeEndLabel:"选择结束值"},table:{emptyText:"暂无数据",confirmFilter:"筛选",resetFilter:"重置",clearFilter:"全部",sumText:"合计",selectAllLabel:"选择所有行",selectRowLabel:"选择当前行",expandRowLabel:"展开当前行",collapseRowLabel:"收起当前行",sortLabel:"按 {column} 排序",filterLabel:"按 {column} 过滤"},tag:{close:"关闭此标签"},tour:{next:"下一步",previous:"上一步",finish:"结束导览",close:"关闭此对话框"},tree:{emptyText:"暂无数据"},transfer:{noMatch:"无匹配数据",noData:"无数据",titles:["列表 1","列表 2"],filterPlaceholder:"请输入搜索内容",noCheckedFormat:"共 {total} 项",hasCheckedFormat:"已选 {checked}/{total} 项"},image:{error:"加载失败"},pageHeader:{title:"返回"},popconfirm:{confirmButtonText:"确定",cancelButtonText:"取消"},carousel:{leftArrow:"上一张幻灯片",rightArrow:"下一张幻灯片",indicator:"幻灯片切换至索引 {index}"}}},a={exports:{}},d=a.exports,i;function p(){return i||(i=1,(function(s,u){(function(n,r){s.exports=r(m())})(d,(function(n){function r(e){return e&&typeof e=="object"&&"default"in e?e:{default:e}}var c=r(n),l={name:"zh-cn",weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),ordinal:function(e,o){return o==="W"?e+"周":e+"日"},weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日Ah点mm分",LLLL:"YYYY年M月D日ddddAh点mm分",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},relativeTime:{future:"%s内",past:"%s前",s:"几秒",m:"1 分钟",mm:"%d 分钟",h:"1 小时",hh:"%d 小时",d:"1 天",dd:"%d 天",M:"1 个月",MM:"%d 个月",y:"1 年",yy:"%d 年"},meridiem:function(e,o){var t=100*e+o;return t<600?"凌晨":t<900?"早上":t<1100?"上午":t<1300?"中午":t<1800?"下午":"晚上"}};return c.default.locale(l,null,!0),l}))})(a)),a.exports}p();export{_ as z}; diff --git a/app/blueprints/__init__.py b/app/blueprints/__init__.py deleted file mode 100644 index 283385b..0000000 --- a/app/blueprints/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# 蓝图包 diff --git a/app/blueprints/admin.py b/app/blueprints/admin.py deleted file mode 100644 index 1492881..0000000 --- a/app/blueprints/admin.py +++ /dev/null @@ -1,17 +0,0 @@ -""" -管理员蓝图:仅保留 /admin 页面渲染。 -用户管理、栏目权限、生成历史等接口已全部迁移至 Java 端。 -""" -from flask import Blueprint - -from app_common import _render_html, admin_required, login_required -from config import JAVA_API_BASE - -admin_bp = Blueprint('admin', __name__) - - -@admin_bp.route('/admin') -@login_required -@admin_required -def admin_page(): - return _render_html('admin.html', java_api_base=JAVA_API_BASE) diff --git a/app/blueprints/auth.py b/app/blueprints/auth.py deleted file mode 100644 index f4fa1dd..0000000 --- a/app/blueprints/auth.py +++ /dev/null @@ -1,56 +0,0 @@ -""" -认证蓝图:登录页(仅 GET 渲染模板)+ 登出(清 JWT cookie)+ token 同步 -登录表单提交已经直连 Java 后端 /login,Python 这边只负责: -1. 渲染登录页模板 -2. 把 Java 签发的 JWT 从前端写到 Python 同源 cookie,供后续页面跳转携带 -3. 登出:清 cookie 跳回登录页 -""" -import sys - -from flask import Blueprint, redirect, url_for, make_response, request, jsonify - -from app_common import _render_html, current_user_id -from config import JAVA_API_BASE -from jwt_util import COOKIE_NAME, parse_token_with_reason - -auth_bp = Blueprint('auth', __name__) - - -@auth_bp.route('/login', methods=['GET']) -def login(): - if current_user_id(): - return redirect(url_for('main.home')) - return _render_html('login.html', java_api_base=JAVA_API_BASE) - - -@auth_bp.route('/api/auth/sync', methods=['POST']) -def api_auth_sync(): - """前端拿到 Java 返回的 JWT 后调用,把 token 写进 Python 同源 cookie。""" - data = request.get_json(silent=True) or {} - token = (data.get('token') or '').strip() - - if not token: - return jsonify({'success': False, 'error': '缺少 token'}), 400 - payload, reason = parse_token_with_reason(token) - if not payload: - # 把根因打到服务端日志,并回传给前端,便于现场排查 - print(f"[auth] /api/auth/sync 校验失败: {reason}", file=sys.stderr) - return jsonify({'success': False, 'error': f'token 无效: {reason}'}), 401 - resp = make_response(jsonify({'success': True})) - resp.set_cookie( - COOKIE_NAME, - token, - max_age=7 * 24 * 3600, - path='/', - httponly=True, - samesite='Lax', - ) - return resp - - -@auth_bp.route('/logout') -def logout(): - resp = make_response(redirect(url_for('auth.login'))) - resp.delete_cookie(COOKIE_NAME, path='/') - return resp - diff --git a/app/blueprints/brand.py b/app/blueprints/brand.py deleted file mode 100644 index fadc2c2..0000000 --- a/app/blueprints/brand.py +++ /dev/null @@ -1,728 +0,0 @@ -""" -品牌爬虫蓝图:展开文件夹、运行任务、任务列表/详情、下载结果 -""" -import os -import json -import threading -import traceback -import zipfile -import io -import time -import requests -from queue import Queue, Empty -from concurrent.futures import ThreadPoolExecutor, as_completed -from urllib.parse import urlparse - -from flask import Blueprint, request, jsonify, send_file, redirect, Response - -from app_common import get_db, login_required, current_user_id, BASE_DIR -from config import bucket_path,JAVA_API_BASE -from brand_spider.main import single_file_handle, TaskCancelledError - -brand_bp = Blueprint('brand', __name__) -BRAND_OUTPUT_DIR = os.path.join(BASE_DIR, 'brand_output') -OSS_PREFIX = "brand_results" - -# 任务完成时推送给前端的 SSE 队列:task_id -> [Queue, ...] -_task_event_queues = {} -_task_event_lock = threading.Lock() - -# 任务行级进度(当前处理文件的行数/总行数),仅存内存,不落库: -# task_id -> { -# 'file_index': int, # 当前处理第几个文件 -# 'file_total': int, # 总文件数 -# 'file_path': str, # 当前文件路径 -# 'current_line': int, # 当前行号(或当前品牌序号) -# 'total_lines': int, # 总行数(或总品牌数) -# } -_task_line_progress = {} -_task_line_progress_lock = threading.Lock() -_cancelled_brand_tasks = set() -_cancelled_brand_tasks_lock = threading.Lock() - - -def _mark_task_cancelled(task_id): - with _cancelled_brand_tasks_lock: - _cancelled_brand_tasks.add(task_id) - - -def _is_task_cancelled(task_id): - with _cancelled_brand_tasks_lock: - return task_id in _cancelled_brand_tasks - - -def _get_uid_from_request_headers(): - """ - 从请求头读取 uid。 - 前端会在 headers 里携带 uid,用于确定本次请求的归属用户。 - """ - uid = request.headers.get('uid') - if uid is None: - return None - uid = str(uid).strip() - if not uid: - return None - try: - return int(uid) - except Exception: - return None - - -def _resolve_user_id(): - """ - 优先使用请求头 uid;没有请求头 uid 时回退到 JWT 解析的当前用户。 - 若二者同时存在但不一致,则视为无效请求并返回 None。 - """ - req_uid = _get_uid_from_request_headers() - if req_uid is not None: - sess_uid = current_user_id() - if sess_uid is not None: - try: - if int(sess_uid) != int(req_uid): - return None - except Exception: - if str(sess_uid) != str(req_uid): - return None - return req_uid - return current_user_id() - - -def _get_user_id_or_error(): - user_id = _resolve_user_id() - if not user_id: - return None, (jsonify({'success': False, 'error': '未登录或缺少uid'}), 401) - try: - return int(user_id), None - except Exception: - return None, (jsonify({'success': False, 'error': 'uid无效'}), 400) - - -def _push_task_event(task_id, event): - """向订阅了该任务的所有 SSE 连接推送事件,并移除该任务的队列列表。 - 同时清理内存中的行级进度,不通过数据库中转行级进度。""" - with _task_event_lock: - queues = _task_event_queues.pop(task_id, []) - for q in queues: - try: - q.put_nowait(event) - except Exception: - pass - # 任务进入终态时,顺便清理行级进度缓存 - with _task_line_progress_lock: - _task_line_progress.pop(task_id, None) - status = (event or {}).get('status') if isinstance(event, dict) else None - if status in ('success', 'failed', 'cancelled'): - with _cancelled_brand_tasks_lock: - _cancelled_brand_tasks.discard(task_id) - - -def _expand_folder_xlsx(folder_path): - """返回文件夹下所有 .xlsx 文件的绝对路径列表""" - if not folder_path or not os.path.isdir(folder_path): - return [] - paths = [] - for name in os.listdir(folder_path): - if name.endswith('.xlsx') or name.endswith('.XLSX'): - paths.append(os.path.normpath(os.path.join(folder_path, name))) - return paths - - -def _upload_local_xlsx_to_oss(local_path, user_id): - """将本地 xlsx 文件上传到 OSS,返回 (url, None) 或 (None, error_message)。""" - if not local_path or not os.path.isfile(local_path): - return None, "文件不存在" - try: - from ali_oss import upload_file as oss_upload_file - except ImportError: - return None, "OSS 模块未配置" - base = os.path.basename(local_path) - safe_base = "".join(c if c.isalnum() or c in '-_.' else '_' for c in base) - if not safe_base.endswith('.xlsx'): - safe_base = safe_base + '.xlsx' - key = f"{bucket_path}brand_input/{user_id}/{int(time.time() * 1000)}/{safe_base}" - try: - with open(local_path, "rb") as f: - content = f.read() - url = oss_upload_file(content, key) - return url, None - except Exception as e: - return None, str(e) - - -def _run_brand_single(taskid,brand_ls, fileUrl,strategy,totalLines,chunkTotal,chunkIndex): - """""" - invalidBrands = [] # 不符合品牌的数据 - queryFailedBrands = [] # 查询失败的数据 - keptRows = [] - for brand in brand_ls: - if _is_task_cancelled(taskid): - raise TaskCancelledError("任务已取消") - faild_data,query_faild_data = single_file_handle(brand,strategy) - invalidBrands.extend(faild_data) - queryFailedBrands.extend(query_faild_data) - if len(faild_data) == 0 and len(query_faild_data) == 0: - keptRows.append(brand) - - data = { "strategy": strategy , - "files": [ - { - "fileUrl": fileUrl, - "originalFilename": "", - "relativePath": "", - "mainSheetName": "", - "chunkIndex": chunkIndex, - "chunkTotal": chunkTotal, - "totalLines": totalLines, - "keptRows": keptRows, - "invalidBrands": invalidBrands, - "queryFailedBrands": queryFailedBrands - } - ] - } - resp = requests.post(f"{JAVA_API_BASE}/api/brand/tasks/{taskid}/result",headers={"accept":"application/json"}, - # json={ "strategy": strategy , - # "files": [ - # { "fileUrl": fileUrl,"originalFilename": "","relativePath": "", - # "mainSheetName": "","columns": [],"keptRows": [], - # "invalidBrands": invalidBrands,"queryFailedBrands": queryFailedBrands - # }]}) - json=data) - # print(data) - # print(taskid,brand_ls, fileUrl) - print("提交结果",data,"\n-->",resp.text) - return True - - - -def _background_brand_task(task_id,data): - """ - 后台执行爬虫任务 - 参数示例: - data : { - "taskId": 348, - "strategy": "Terms", - "files": [ - { - "fileIndex": 1, - "fileUrl": "ab8cce4878754bfd89b4cd3ed20e1395", - "originalFilename": "品牌样例.xlsx", - "relativePath": "店铺A/品牌样例.xlsx", - "sheetName": "Sheet1", - "columns": [ - "品牌", - "ASIH", - "状态", - "时间" - ], - "rows": [ - { - "品牌": "YQAUTEC", - "ASIH": "B0F28NZ752", - "状态": "", - "时间": "", - "__rowIndex": 2 - } - ], - "uniqueBrands": [ - "YQAUTEC" - ] - } - ] - } - """ - try: - file_ls = data.get("files") - strategy = data.get("strategy") - if not isinstance(file_ls, list): - file_ls = [] - tasks = [] - for file_data in file_ls: - rows = file_data.get("rows") or [] - brand_ls = [i.get("品牌") for i in rows if i.get("品牌")] - fileUrl = file_data.get("fileUrl") - if not brand_ls: - continue - file_chunks = [brand_ls[i:i + 5] for i in range(0, len(brand_ls), 5)] - chunk_total = len(file_chunks) - total_lines = len(brand_ls) - for chunk_index, chunk in enumerate(file_chunks, start=1): - tasks.append((chunk, fileUrl, total_lines, chunk_total, chunk_index)) - - if tasks: - max_workers = min(8, len(tasks)) - with ThreadPoolExecutor(max_workers=max_workers) as executor: - if _is_task_cancelled(task_id): - _push_task_event(task_id, {'status': 'cancelled'}) - return - futures = [ - executor.submit(_run_brand_single, task_id, chunk, file_url, strategy, total_lines, chunk_total, chunk_index) - for chunk, file_url, total_lines, chunk_total, chunk_index in tasks - ] - for future in as_completed(futures): - if _is_task_cancelled(task_id): - for f in futures: - f.cancel() - _push_task_event(task_id, {'status': 'cancelled'}) - return - future.result() - _push_task_event(task_id, {'status': 'success'}) - except Exception as e: - print("执行出错",traceback.format_exc()) - _push_task_event(task_id, {'status': 'failed', 'error_message': str(e)}) - print("执行完成") - - -def _parse_json(val, default=None): - if val is None: - return default if default is not None else [] - if isinstance(val, (list, dict)): - return val - try: - return json.loads(val) - except Exception: - return default if default is not None else [] - - -def _is_url(s): - if not isinstance(s, str) or not s.strip(): - return False - return s.strip().startswith('http://') or s.strip().startswith('https://') - - -def _normalize_result_paths(raw): - """ - 将 result_paths 规范化为 (url_list, zip_url)。 - 支持旧格式 list 或新格式 dict {"urls": [...], "zip_url": "..."}。 - """ - if not raw: - return [], None - if isinstance(raw, dict): - urls = raw.get('urls') or [] - if not isinstance(urls, list): - urls = [] - zip_url = raw.get('zip_url') - if zip_url and not isinstance(zip_url, str): - zip_url = None - return urls, zip_url - if isinstance(raw, list): - return raw, None - return [], None - - -@brand_bp.route('/api/brand/expand-folder', methods=['POST']) -@login_required -def api_brand_expand_folder(): - """展开文件夹,返回其下所有 .xlsx 文件路径列表""" - try: - _, err = _get_user_id_or_error() - if err: - return err - data = request.get_json() or {} - folder = (data.get('folder') or '').strip() - if not folder: - return jsonify({'success': False, 'error': '请提供 folder 路径'}), 400 - paths = _expand_folder_xlsx(folder) - return jsonify({'success': True, 'paths': paths}) - except Exception as e: - return jsonify({'success': False, 'error': str(e)}), 500 - -def _expand_folder_xlsx_recursive_items(folder_path): - """返回文件夹下所有 .xlsx 文件的绝对路径和相对路径列表(递归)""" - if not folder_path or not os.path.isdir(folder_path): - return [] - items = [] - root = os.path.normpath(folder_path) - for current_root, _, filenames in os.walk(root): - for name in filenames: - if not (name.endswith('.xlsx') or name.endswith('.XLSX')): - continue - absolute_path = os.path.normpath(os.path.join(current_root, name)) - relative_path = os.path.relpath(absolute_path, root).replace('\\', '/') - items.append({ - 'absolutePath': absolute_path, - 'relativePath': relative_path, - }) - items.sort(key=lambda item: item['relativePath']) - return items - -@brand_bp.route('/api/brand/expand-folder-recursive', methods=['POST']) -@login_required -def api_brand_expand_folder_recursive(): - """递归展开文件夹,返回 .xlsx 文件绝对路径及相对路径列表""" - try: - _, err = _get_user_id_or_error() - if err: - return err - data = request.get_json() or {} - folder = (data.get('folder') or '').strip() - if not folder: - return jsonify({'success': False, 'error': '请提供 folder 路径'}), 400 - items = _expand_folder_xlsx_recursive_items(folder) - return jsonify({'success': True, 'items': items}) - except Exception as e: - return jsonify({'success': False, 'error': str(e)}), 500 - - -@brand_bp.route('/api/brand/run', methods=['POST']) -# @login_required -def api_brand_run(): - """立即运行:创建任务并后台执行,立即返回 task_id,前端可轮询进度与取消""" - try: - data = request.get_json() or {} - paths = data.get('paths') or [] - # task_type: 1=立即执行,2=添加任务;此接口默认 1 - try: - task_type = int(data.get('task_type') or 1) - except Exception: - task_type = 1 - if task_type not in (1, 2): - task_type = 1 - strategy = (data.get('strategy') or 'Terms').strip() - if strategy not in ('Terms', 'Simple'): - strategy = 'Terms' - if not isinstance(paths, list): - paths = [] - paths = [p.strip() for p in paths if p and isinstance(p, str) and os.path.isfile(p.strip())] - if not paths: - return jsonify({'success': False, 'error': '没有有效的 xlsx 文件路径'}), 400 - # 先上传到 OSS,获取链接再入库 - user_id, err = _get_user_id_or_error() - if err: - return err - urls = [] - for p in paths: - url, err = _upload_local_xlsx_to_oss(p, user_id) - if err: - return jsonify({'success': False, 'error': f'上传文件失败: {os.path.basename(p)} - {err}'}), 500 - base_name = os.path.basename(p) - urls.append({"fileUrl": url,"originalFilename": base_name,"relativePath": p }) - - # 请求提交 - resp = requests.post(f"{JAVA_API_BASE}/api/brand/tasks?userId={user_id}",headers={ - "content-type":"application/json", - },data=json.dumps({ "files": urls, "strategy": strategy,"taskType": 1,"archiveName": ""})) - print({ "files": urls, "strategy": strategy,"taskType": 1,"archiveName": ""}) - print(f"{JAVA_API_BASE}/api/brand/tasks?userId={user_id}") - resp_data = resp.json() - # print(f"{JAVA_API_BASE}/api/brand/tasks?userId={user_id} 返回:",resp_data,"状态:",resp.status_code) - if resp_data.get("success"): - task_id = resp_data.get("data").get("taskId") - data = resp_data.get("data") - threading.Thread(target=_background_brand_task, args=(task_id,data), daemon=True).start() - return jsonify({'success': True, 'task_id': task_id}) - else: - print(resp_data) - return jsonify({'success': False, 'error': "请求接口失败"}), 500 - - except Exception as e: - traceback.print_exc() - return jsonify({'success': False, 'error': str(e)}), 500 - - -@brand_bp.route('/api/brand/tasks', methods=['GET', 'POST']) -# @login_required -def api_brand_tasks(): - """GET: 获取当前用户的任务列表;POST: 添加任务(后台执行)""" - if request.method == 'GET': - try: - user_id, err = _get_user_id_or_error() - if err: - return err - resp = requests.get(f"{JAVA_API_BASE}/api/brand/tasks", params={ - "userId": user_id - }) - resp_data = resp.json() - print("获取列表",resp.text) - if resp_data.get("success"): - items = resp_data.get("data").get("items") - return jsonify({'success': True, 'items': items}) - return jsonify({'success': True, 'items': []}) - except Exception as e: - traceback.print_exc() - print("获取列表失败",e) - return jsonify({'success': False, 'error': str(e)}), 500 - # POST - try: - data = request.get_json() or {} - paths = data.get('paths') or [] - # task_type: 1=立即执行,2=添加任务;此接口默认 2 - try: - task_type = int(data.get('task_type') or 2) - except Exception: - task_type = 2 - if task_type not in (1, 2): - task_type = 2 - strategy = (data.get('strategy') or 'Terms').strip() - if strategy not in ('Terms', 'Simple'): - strategy = 'Terms' - if not isinstance(paths, list): - paths = [] - paths = [p.strip() for p in paths if p and isinstance(p, str)] - if not paths: - return jsonify({'success': False, 'error': '请提供至少一个文件路径或链接'}), 400 - user_id, err = _get_user_id_or_error() - if err: - return err - urls = [] - for p in paths: - url, err = _upload_local_xlsx_to_oss(p, user_id) - if err: - return jsonify({'success': False, 'error': f'上传文件失败: {os.path.basename(p)} - {err}'}), 500 - base_name = os.path.basename(p) - urls.append({"fileUrl": url, "originalFilename": base_name, "relativePath": p}) - params = { - "userId": user_id - } - # resp = requests.post(f"{JAVA_API_BASE}/api/brand/tasks?userId={user_id}",headers={ - # "content-type":"application/json", - # },data=json.dumps({ "files": urls, "strategy": strategy,"taskType": 1,"archiveName": ""})) - req_data = {"files": urls, "strategy": strategy, "taskType": 2, "archiveName": ""} - resp = requests.post(f"{JAVA_API_BASE}/api/brand/tasks?userId={user_id}", headers={"content-type": "application/json"}, - data=json.dumps(req_data)) - print(req_data) - # print(f"{JAVA_API_BASE}/api/brand/tasks?userId={user_id},返回", resp.text) - resp_data = resp.json() - if resp_data.get("success"): - task_id = resp_data.get("data").get("taskId") - data = resp_data.get("data") - return jsonify({'success': True, 'task_id': task_id}) - return jsonify({'success': False, 'task_id': "请求异常"}) - except Exception as e: - return jsonify({'success': False, 'error': str(e)}), 500 - - -@brand_bp.route('/api/brand/tasks/') -# @login_required -def api_brand_task_detail(task_id): - """获取单个任务详情(用于轮询状态)""" - try: - resp = requests.get(f"{JAVA_API_BASE}/api/brand/tasks/{task_id}") - resp_data = resp.json() - if resp_data.get("success"): - task = resp_data["data"]["task"] - return jsonify({ - 'success': True, - 'task': task - }) - except Exception as e: - return jsonify({'success': False, 'error': str(e)}), 500 - - -@brand_bp.route('/api/brand/tasks//line-progress') -# @login_required -def api_brand_task_line_progress(task_id): - """ - 获取任务的“当前文件行级进度”(当前行数/总行数)。 - 该信息仅存放在内存字典 _task_line_progress 中,不写入数据库。 - """ - try: - resp = requests.get(f"{JAVA_API_BASE}/api/brand/tasks/{task_id}") - resp_data = resp.json() - if resp_data.get("success"): - if resp_data["data"]["line_progress"]["has_progress"]: - info = resp_data["data"]["line_progress"]["info"] - resp = { - 'file_index': int(info.get('file_index') or 0), - 'file_total': int(info.get('file_total') or 0), - 'file_name': info.get("file_name",""), - 'current_line': int(info.get('current_line') or 0), - 'total_lines': int(info.get('total_lines') or 0), - } - return jsonify({'success': True, 'has_progress': True, 'info': resp}) - raise RuntimeError("获取进度失败") - except Exception as e: - return jsonify({'success': False, 'error': str(e)}), 500 - - -@brand_bp.route('/api/brand/tasks//events') -# @login_required -def api_brand_task_events(task_id): - """SSE:任务完成时后端主动推送事件,前端监听后隐藏进度条与取消按钮""" - user_id, err = _get_user_id_or_error() - if err: - return err - - def _task_status_event(): - conn = get_db() - try: - with conn.cursor() as cur: - cur.execute( - "SELECT status, error_message FROM brand_crawl_tasks WHERE id = %s AND user_id = %s", - (task_id, user_id) - ) - row = cur.fetchone() - finally: - conn.close() - if not row: - return None - st = (row.get('status') or '').lower() - if st in ('success', 'failed', 'cancelled'): - return {'status': st, 'error_message': (row.get('error_message') or '').strip() or None} - return None - - # 若任务已处于终态,直接返回一条事件后结束 - ev = _task_status_event() - if ev is not None: - def _one_shot(): - yield "data: " + json.dumps(ev, ensure_ascii=False) + "\n\n" - return Response( - _one_shot(), - mimetype='text/event-stream', - headers={'Cache-Control': 'no-cache', 'X-Accel-Buffering': 'no'} - ) - - # 否则注册队列,等待后台任务完成时推送 - q = Queue() - with _task_event_lock: - _task_event_queues.setdefault(task_id, []).append(q) - - def _stream(): - try: - while True: - try: - event = q.get(timeout=20) - yield "data: " + json.dumps(event, ensure_ascii=False) + "\n\n" - return - except Empty: - yield ": keepalive\n\n" - finally: - with _task_event_lock: - lst = _task_event_queues.get(task_id, []) - if q in lst: - lst.remove(q) - if not lst: - _task_event_queues.pop(task_id, None) - - return Response( - _stream(), - mimetype='text/event-stream', - headers={'Cache-Control': 'no-cache', 'X-Accel-Buffering': 'no'} - ) - - -@brand_bp.route('/api/brand/tasks//cancel', methods=['POST']) -# @login_required -def api_brand_task_cancel(task_id): - """取消正在执行或等待中的任务(pending/running 均可取消)""" - try: - user_id, err = _get_user_id_or_error() - if err: - return err - - - resp = requests.post( - f"{JAVA_API_BASE}/api/brand/tasks/{task_id}/cancel", - headers={"accept": "application/json"}, - timeout=20 - ) - try: - resp_data = resp.json() - except Exception: - return jsonify({'success': False, 'error': '取消接口返回非 JSON'}), 500 - if not resp_data.get('success'): - return jsonify({'success': False, 'error': '第三方取消任务失败'}), 400 - - _mark_task_cancelled(task_id) - _push_task_event(task_id, {'status': 'cancelled'}) - return jsonify({'success': True}) - except Exception as e: - return jsonify({'success': False, 'error': str(e)}), 500 - - -@brand_bp.route('/api/brand/tasks/', methods=['DELETE']) -@login_required -def api_brand_task_delete(task_id): - """删除任务(仅限非 running 状态)""" - try: - user_id, err = _get_user_id_or_error() - if err: - return err - - resp = requests.delete( - f"{JAVA_API_BASE}/api/brand/tasks/{task_id}", - headers={"accept": "application/json"}, - timeout=20 - ) - try: - resp_data = resp.json() - except Exception: - return jsonify({'success': False, 'error': '取消接口返回非 JSON'}), 500 - if not resp_data.get('success'): - return jsonify({'success': False, 'error': '第三方取消任务失败'}), 400 - return jsonify({'success': True}) - except Exception as e: - return jsonify({'success': False, 'error': str(e)}), 500 - - -@brand_bp.route('/api/brand/download/') -@login_required -def api_brand_download(task_id): - """下载任务结果:优先使用 OSS zip_url 重定向;否则本地/单链接/多链接按原逻辑处理""" - try: - user_id, err = _get_user_id_or_error() - if err: - return err - - conn = get_db() - with conn.cursor() as cur: - cur.execute( - "SELECT result_paths FROM brand_crawl_tasks WHERE id = %s AND user_id = %s", - (task_id, user_id) - ) - row = cur.fetchone() - conn.close() - if not row or not row.get('result_paths'): - return jsonify({'success': False, 'error': '无结果可下载'}), 404 - raw = row['result_paths'] - if isinstance(raw, str): - raw = _parse_json(raw) - url_list, zip_url = _normalize_result_paths(raw) - # 新格式:有 zip_url 直接重定向到 OSS - if zip_url and _is_url(zip_url): - return redirect(zip_url, code=302) - - # 兼容旧格式:result_paths 可能为 list(本地路径或 url) - if not url_list and isinstance(raw, list): - url_list = raw - local_paths = [p for p in url_list if isinstance(p, str) and not _is_url(p) and os.path.isfile(p)] - url_paths = [p.strip() for p in url_list if isinstance(p, str) and _is_url(p)] - - if len(url_paths) == 1 and not local_paths: - return redirect(url_paths[0], code=302) - - if len(local_paths) == 1 and not url_paths: - return send_file( - local_paths[0], - as_attachment=True, - download_name=os.path.basename(local_paths[0]) - ) - - if local_paths or url_paths: - buf = io.BytesIO() - with zipfile.ZipFile(buf, 'w', zipfile.ZIP_DEFLATED) as zf: - for p in local_paths: - zf.write(p, os.path.basename(p)) - for url in url_paths: - try: - import requests as req - r = req.get(url, timeout=30, stream=True) - r.raise_for_status() - name = os.path.basename(urlparse(url).path) or ('file_%s' % (url_paths.index(url))) - if not name or name == 'file_%s' % url_paths.index(url): - name = 'download_%s' % url_paths.index(url) - zf.writestr(name, r.content) - except Exception: - pass - buf.seek(0) - return send_file( - buf, - mimetype='application/zip', - as_attachment=True, - download_name='brand_task_%s.zip' % task_id - ) - - return jsonify({'success': False, 'error': '结果文件不存在或链接不可用'}), 404 - except Exception as e: - return jsonify({'success': False, 'error': str(e)}), 500 - - diff --git a/app/blueprints/communication.py b/app/blueprints/communication.py deleted file mode 100644 index ed391f4..0000000 --- a/app/blueprints/communication.py +++ /dev/null @@ -1,82 +0,0 @@ -import threading -import time -from queue import Empty, Full - -from flask import Blueprint, jsonify, request - -from config import JSON_TASK_QUEUE,runing_task - - -communication_bp = Blueprint('communication', __name__) - -_del_brand_cache = {} -_del_brand_cache_lock = threading.Lock() -_latest_del_brand_item = None -_latest_del_brand_ts = 0.0 - - -def _resolve_request_id(): - rid = request.args.get('id') - if rid is not None and str(rid).strip() != '': - return str(rid) - if request.method == 'POST': - body = request.get_json(silent=True) or {} - rid = body.get('id') - if rid is not None and str(rid).strip() != '': - return str(rid) - return None - - -@communication_bp.route('/api/amazon/del_brand', methods=['GET', 'POST']) -def del_brand(): - """返回队列中的一个元素;同一 id 重复请求返回已缓存的同一元素;2分钟内不同 id 也返回最近元素。""" - global _latest_del_brand_item, _latest_del_brand_ts - request_id = _resolve_request_id() - if not request_id: - return jsonify({'success': False, 'message': '缺少参数 id', 'data': None}), 400 - - with _del_brand_cache_lock: - if request_id in _del_brand_cache: - item = _del_brand_cache[request_id] - print("【删除品牌】缓存命中", request_id, item) - return jsonify({'success': True, 'data': item}) - if _latest_del_brand_item is not None and (time.time() - _latest_del_brand_ts) <= 120: - _del_brand_cache[request_id] = _latest_del_brand_item - print("【删除品牌】2分钟窗口命中", request_id, _latest_del_brand_item) - return jsonify({'success': True, 'data': _latest_del_brand_item}) - - try: - item = JSON_TASK_QUEUE.get_nowait() - except Empty: - print("队列为空") - return jsonify({'success': False, 'message': '队列为空', 'data': None}) - - with _del_brand_cache_lock: - if request_id in _del_brand_cache: - try: - JSON_TASK_QUEUE.put_nowait(item) - except Full: - print("【删除品牌】队列已满,无法归还重复拉取的任务") - item = _del_brand_cache[request_id] - print("【删除品牌】并发归并", request_id, item) - return jsonify({'success': True, 'data': item}) - _del_brand_cache[request_id] = item - _latest_del_brand_item = item - _latest_del_brand_ts = time.time() - print("【删除品牌】返回任务数据", item) - return jsonify({'success': True, 'data': item}) - - -@communication_bp.route('/api/amazon/get_all_detail', methods=['GET', 'POST']) -def get_all_detail(): - """获取正在执行的删除品牌任务详情""" - request_id = _resolve_request_id() - if not request_id: #如果没有提供 id 参数,直接返回所有正在执行的任务详情 - return jsonify({'success': True, 'data': runing_task}) - task_info = runing_task.get(request_id) - if not task_info: - return jsonify({'success': False, 'message': '任务不存在', 'data': None}) - return jsonify({'success': True, 'data': task_info}) - - - diff --git a/app/blueprints/image.py b/app/blueprints/image.py deleted file mode 100644 index 6ba3ffe..0000000 --- a/app/blueprints/image.py +++ /dev/null @@ -1,412 +0,0 @@ -""" -图片生成蓝图:生成、历史、下载、拼接、版本 -""" -import os -import sys -import json -import re -import io -import base64 -import tempfile -import threading -import subprocess -import requests -from urllib.parse import urlparse, quote - -from flask import Blueprint, request, jsonify, Response, send_file -from PIL import Image - -from app_common import get_db, login_required, current_user_id, BASE_DIR -from config import STITCH_WORKFLOW_ID,client_name - -image_bp = Blueprint('image', __name__) - - -def _load_image_from_url_or_data(url_or_data): - """从 http(s) URL 或 data URL 加载为 PIL Image,失败返回 None""" - if not url_or_data or not isinstance(url_or_data, str): - return None - try: - if url_or_data.startswith('data:'): - m = re.match(r'data:image/[^;]+;base64,(.+)', url_or_data, re.DOTALL) - if not m: - return None - raw = base64.b64decode(m.group(1).strip()) - img = Image.open(io.BytesIO(raw)) - elif url_or_data.startswith(('http://', 'https://')): - resp = requests.get(url_or_data, timeout=15) - resp.raise_for_status() - img = Image.open(io.BytesIO(resp.content)) - else: - return None - if img.mode != 'RGB': - img = img.convert('RGB') - return img - except Exception: - return None - - -def _stitch_and_upload_long_image(urls): - """将多张图片 URL 先上传获取 file_id,再调用 workflow_run 拼接长图,返回 data.merged_image_url;失败返回 None。""" - if not urls or not isinstance(urls, (list, tuple)): - return None - from coze import upload_file as coze_upload_file, workflow_run - file_ids = [] - temp_paths = [] - try: - for u in urls: - img = _load_image_from_url_or_data(u) - if img is None: - continue - fd, path = tempfile.mkstemp(suffix='.png') - try: - os.close(fd) - img.save(path) - temp_paths.append(path) - resp = coze_upload_file(path) - if resp.get('code') == 0 and resp.get('data', {}).get('id'): - file_ids.append(resp['data']['id']) - except Exception: - pass - if not file_ids: - return None - parameters = {"images": [{"file_id": fid} for fid in file_ids]} - resp = workflow_run(STITCH_WORKFLOW_ID, parameters, is_async=False) - if resp.get('code') != 0: - return None - data = resp.get('data') or {} - data = json.loads(data) - merged_image_url = data.get('merged_image_url') - if merged_image_url: - return merged_image_url - output_str = data.get('output') or '' - if output_str: - try: - outer = json.loads(output_str) - inner_str = outer.get('Output', '{}') - inner = json.loads(inner_str) - data_str = inner.get('data', '[]') - inner_data = json.loads(data_str) - merged_image_url = inner_data.get('merged_image_url') - return merged_image_url - except Exception: - pass - return None - except Exception: - return None - finally: - for p in temp_paths: - try: - os.unlink(p) - except Exception: - pass - - -def _sanitize_params_for_history(params): - """移除 base64 大字段及敏感字段,仅保留可存储的请求参数""" - exclude = ('ref_images', 'proc_images', 'layout_image') - out = {} - for k, v in (params or {}).items(): - if k == 'api_key': - continue - if k in exclude: - if isinstance(v, list): - out[f'{k}_count'] = len(v) - else: - out[f'{k}_count'] = 1 if v else 0 - elif isinstance(v, (str, int, float, bool, type(None))): - out[k] = v - elif isinstance(v, list) and not v: - out[k] = [] - elif isinstance(v, list) and isinstance(v[0], (str, int, float, bool)): - out[k] = v - else: - out[k] = str(v)[:200] if v else None - return out - - -@image_bp.route('/api/generate', methods=['POST']) -@login_required -def api_generate(): - """生成图片:调用 generate_api,上传原图到 OSS,保存历史记录""" - try: - params = request.get_json() or {} - from generate_api import generate - result = generate(params) - if result.get('success') and result.get('urls'): - long_image_url = result.get("long_image_url") - result["long_image_url"] = long_image_url - import json as _json - history_id = None - try: - hid = params.get('history_id') - if hid is not None: - try: - hid = int(hid) - except (TypeError, ValueError): - hid = None - conn = get_db() - _uid = current_user_id() - with conn.cursor() as cur: - if hid is not None and hid > 0: - cur.execute( - "SELECT result_urls FROM image_history WHERE id=%s AND user_id=%s", - (hid, _uid), - ) - row = cur.fetchone() - existing_urls = [] - if row and row.get('result_urls'): - try: - existing_urls = _json.loads(row['result_urls']) - except Exception: - existing_urls = [] - new_urls = result.get('urls') or [] - new_url = new_urls[0] if new_urls else None - idx = params.get('history_index', 0) - try: - idx = int(idx) - except (TypeError, ValueError): - idx = 0 - if new_url: - if not isinstance(existing_urls, list): - existing_urls = [] - while len(existing_urls) <= idx: - existing_urls.append(existing_urls[-1] if existing_urls else new_url) - existing_urls[idx] = new_url - merged_result_urls = existing_urls or new_urls - cur.execute( - """UPDATE image_history SET panel_type=%s, original_urls=%s, params=%s, result_urls=%s - WHERE id=%s AND user_id=%s""", - ( - params.get('panel_type', ''), - _json.dumps(result.get('original_urls') or []), - _json.dumps(_sanitize_params_for_history(params)), - _json.dumps(merged_result_urls), - hid, - _uid, - ), - ) - if cur.rowcount > 0: - history_id = hid - else: - cur.execute( - """INSERT INTO image_history (user_id, panel_type, original_urls, params, result_urls, long_image_url) - VALUES (%s, %s, %s, %s, %s, %s)""", - ( - _uid, - params.get('panel_type', ''), - _json.dumps(result.get('original_urls') or []), - _json.dumps(_sanitize_params_for_history(params)), - _json.dumps(result.get('urls') or []), - long_image_url, - ), - ) - history_id = cur.lastrowid - conn.commit() - conn.close() - except Exception: - pass - if history_id is not None: - result['history_id'] = history_id - return jsonify(result) - except Exception as e: - import traceback - traceback.print_exc() - return jsonify({'success': False, 'urls': [], 'error': str(e)}) - - -@image_bp.route('/api/version') -def api_version(): - """检测更新:请求 APP_UPDATE_URL 获取最新版本信息,与当前版本比较""" - current_version = (os.environ.get('APP_VERSION', '1.0.0') or '1.0.0').strip() - update_url = (os.environ.get('APP_UPDATE_URL', '') or '').strip() - result = { - 'version': current_version, - 'desc': '', - 'url': '', - 'has_update': False, - 'latest_version': current_version, - 'file_url': '', - } - if not update_url: - return jsonify(result) - try: - resp = requests.get(update_url, timeout=10) - resp.raise_for_status() - data = resp.json() or {} - latest_version = (data.get('version') or '').strip() - file_url = (data.get('file_url') or '').strip() - result['latest_version'] = latest_version - result['file_url'] = file_url - result['url'] = file_url - # 版本不一致则视为有更新 - if latest_version and latest_version != current_version: - result['has_update'] = True - except Exception: - pass - return jsonify(result) - - -def _run_update_and_exit(zip_path, target_dir): - """在后台延迟后启动 update.exe(脱离当前进程),然后退出当前程序""" - def _do(): - import time - time.sleep(1.5) # 确保 HTTP 响应已发送 - # exe_dir = target_dir - # exe_dir = "D:\\pack\\nanri\\update_exe\\main.dist" - exe_dir = os.path.join(BASE_DIR,"update") - update_exe = os.path.join(exe_dir, 'update.exe') - if not os.path.isfile(update_exe): - return - try: - creationflags = 0 - if sys.platform == 'win32': - creationflags = subprocess.DETACHED_PROCESS | subprocess.CREATE_NEW_PROCESS_GROUP - subprocess.Popen( - [update_exe, '--zip', zip_path, '--target', target_dir, '--process',client_name], - cwd=exe_dir, - creationflags=creationflags, - stdin=subprocess.DEVNULL, - stdout=subprocess.DEVNULL, - stderr=subprocess.DEVNULL, - close_fds=True, - ) - except Exception: - pass - os._exit(0) - t = threading.Thread(target=_do, daemon=False) - t.start() - - -@image_bp.route('/api/update/do', methods=['POST']) -def api_update_do(): - """执行更新:下载 zip 到 tmp,启动 update.exe 后退出程序""" - data = request.get_json() or {} - file_url = (data.get('file_url') or '').strip() - if not file_url: - return jsonify({'success': False, 'error': '缺少 file_url'}), 400 - parsed = urlparse(file_url) - if parsed.scheme not in ('http', 'https'): - return jsonify({'success': False, 'error': '无效的下载地址'}), 400 - tmp_dir = os.path.join(BASE_DIR, 'tmp') - try: - os.makedirs(tmp_dir, exist_ok=True) - except Exception as e: - return jsonify({'success': False, 'error': f'创建 tmp 目录失败: {e}'}), 500 - # 使用 URL 中的文件名或默认版本名 - filename = os.path.basename(parsed.path) or 'update.zip' - zip_path = os.path.join(tmp_dir, filename) - try: - resp = requests.get(file_url, timeout=300, stream=True) - resp.raise_for_status() - with open(zip_path, 'wb') as f: - for chunk in resp.iter_content(chunk_size=65536): - if chunk: - f.write(chunk) - except requests.RequestException as e: - return jsonify({'success': False, 'error': f'下载失败: {e}'}), 502 - _run_update_and_exit(zip_path, BASE_DIR) - return jsonify({'success': True, 'message': '更新已启动,程序即将退出'}) - - -@image_bp.route('/api/download') -@login_required -def api_download(): - """代理下载图片,解决跨域 fetch 无法下载的问题""" - url = request.args.get('url', '').strip() - filename = request.args.get('filename', 'image.png') - if not url: - return jsonify({'success': False, 'error': '缺少 url 参数'}), 400 - parsed = urlparse(url) - if parsed.scheme not in ('http', 'https'): - return jsonify({'success': False, 'error': '仅支持 http/https 链接'}), 400 - try: - resp = requests.get(url, timeout=30, stream=True) - resp.raise_for_status() - content_type = resp.headers.get('Content-Type', 'image/png') - encoded = quote(filename, safe='') - disposition = f"attachment; filename*=UTF-8''{encoded}" - return Response( - resp.iter_content(chunk_size=8192), - mimetype=content_type, - headers={'Content-Disposition': disposition} - ) - except requests.RequestException as e: - return jsonify({'success': False, 'error': str(e)}), 502 - - -@image_bp.route('/api/stitch/save', methods=['POST']) -@login_required -def api_stitch_save(): - """手动拼接:接收图片 URL 列表(支持 http 或 data URL),拼接并上传,返回长图 URL""" - try: - data = request.get_json() or {} - urls = data.get('urls') - if not urls or not isinstance(urls, list): - return jsonify({'success': False, 'error': '请提供 urls 数组'}), 400 - urls = [u for u in urls if u and isinstance(u, str)] - if not urls: - return jsonify({'success': False, 'error': '没有有效的图片'}), 400 - long_image_url = _stitch_and_upload_long_image(urls) - if not long_image_url: - return jsonify({'success': False, 'error': '拼接或上传失败'}), 500 - return jsonify({'success': True, 'long_image_url': long_image_url}) - except Exception as e: - return jsonify({'success': False, 'error': str(e)}), 500 - - -@image_bp.route('/api/history') -@login_required -def api_history(): - """分页获取当前用户的历史图库,支持按 panel_type 栏目筛选""" - page = max(1, int(request.args.get('page', 1))) - page_size = min(50, max(10, int(request.args.get('page_size', 20)))) - panel_type = (request.args.get('panel_type') or '').strip() - offset = (page - 1) * page_size - try: - conn = get_db() - with conn.cursor() as cur: - where_user = "user_id = %s" - params_where = [current_user_id()] - if panel_type: - where_user += " AND panel_type = %s" - params_where.append(panel_type) - cur.execute( - """SELECT id, created_at, panel_type, original_urls, params, result_urls, long_image_url - FROM image_history WHERE """ + where_user + """ ORDER BY created_at DESC LIMIT %s OFFSET %s""", - params_where + [page_size, offset], - ) - rows = cur.fetchall() - cur.execute("SELECT COUNT(*) as total FROM image_history WHERE " + where_user, params_where) - total = cur.fetchone()['total'] - conn.close() - - def _parse_json(val, default=None): - if val is None: - return default if default is not None else [] - if isinstance(val, (list, dict)): - return val - try: - return json.loads(val) - except Exception: - return default if default is not None else [] - - items = [] - for r in rows: - items.append({ - 'id': r['id'], - 'created_at': r['created_at'].strftime('%Y-%m-%d %H:%M') if r['created_at'] else '', - 'panel_type': r['panel_type'] or '', - 'original_urls': _parse_json(r['original_urls'], []), - 'params': _parse_json(r['params'], {}), - 'result_urls': _parse_json(r['result_urls'], []), - 'long_image_url': (r.get('long_image_url') or '').strip() or None, - }) - return jsonify({'success': True, 'items': items, 'total': total, 'page': page, 'page_size': page_size}) - except Exception as e: - return jsonify({'success': False, 'error': str(e)}) - - - - - diff --git a/app/blueprints/main.py b/app/blueprints/main.py deleted file mode 100644 index 432ce9a..0000000 --- a/app/blueprints/main.py +++ /dev/null @@ -1,272 +0,0 @@ -""" -主页面蓝图:首页、home、图片工作台、品牌页、静态文件、Logo -""" -import os -from flask import Blueprint, send_file, render_template_string - -from app_common import ( - get_db, - _render_html, - login_required, - admin_required, - current_user_id, - current_username, - STATIC_DIR, - BASE_DIR, - ASSETS_DIR -) -from flask import redirect, url_for -from flask import Flask, request, Response, stream_with_context -import requests - -from config import base_url,version,JAVA_API_BASE - -main_bp = Blueprint('main', __name__) - - -def _resolve_asset_filename(filename): - """Resolve hashed Vite assets without maintaining hardcoded alias tables.""" - safe_name = os.path.basename(filename) - asset_dirs = [ - ASSETS_DIR, - os.path.abspath(os.path.join(BASE_DIR, 'new_web_source', 'assets')), - os.path.abspath(os.path.join(BASE_DIR, '..', 'new_web_source', 'assets')), - ] - for asset_dir in asset_dirs: - exact_path = os.path.join(asset_dir, safe_name) - if os.path.isfile(exact_path): - return safe_name - - base_name, ext = os.path.splitext(safe_name) - if not base_name or not ext: - return safe_name - - parts = base_name.split('-') - if len(parts) < 2: - return safe_name - - asset_names = [] - for asset_dir in asset_dirs: - try: - asset_names.extend(os.listdir(asset_dir)) - except OSError: - continue - if not asset_names: - return safe_name - - for prefix_length in range(len(parts) - 1, 0, -1): - prefix = '-'.join(parts[:prefix_length]) - matches = [ - asset_name for asset_name in asset_names - if asset_name.endswith(ext) and asset_name.startswith(prefix) - ] - if len(matches) == 1: - return matches[0] - - return safe_name - - -@main_bp.route('/') -def index(): - if current_user_id(): - return redirect(url_for('main.home')) - return redirect(url_for('auth.login')) - - -@main_bp.route('/home') -@login_required -def home(): - uid = current_user_id() - try: - conn = get_db() - with conn.cursor() as cur: - cur.execute("SELECT username, is_admin FROM users WHERE id = %s", (uid,)) - row = cur.fetchone() - conn.close() - return _render_html('home.html', username=row.get('username', ''), is_admin=bool(row.get('is_admin')), user_id=uid, baseUrl=base_url, version=version, java_api_base=JAVA_API_BASE) - except Exception: - return _render_html('home.html', username=current_username(), is_admin=False, user_id=uid, baseUrl=base_url, version=version, java_api_base=JAVA_API_BASE) - - -@main_bp.route('/image') -@login_required -def wb(): - return _render_html('index.html') - - -@main_bp.route('/brand') -@login_required -def brand_page(): - candidate_paths = [ - os.path.join(BASE_DIR, 'web_source', 'brand.html'), - os.path.abspath(os.path.join(BASE_DIR, '..', 'web_source', 'brand.html')), - ] - for candidate_path in candidate_paths: - if not os.path.isfile(candidate_path): - continue - try: - with open(candidate_path, 'rb') as f: - raw = f.read() - try: - from html_crypto import decrypt - content = decrypt(raw).decode('utf-8') - except Exception: - if raw[:7] == b'gAAAAAB': - raise - content = raw.decode('utf-8', errors='replace') - return render_template_string(content, user_id=current_user_id(), java_api_base=JAVA_API_BASE) - except Exception: - continue - return _render_html('brand.html', user_id=current_user_id(), java_api_base=JAVA_API_BASE) - - -@main_bp.route('/brand/legacy') -@login_required -def brand_page_legacy(): - legacy_path = os.path.join(BASE_DIR, 'web_source', 'templates_backup', 'brand.html') - if not os.path.isfile(legacy_path): - return '', 404 - with open(legacy_path, 'rb') as f: - content = f.read().decode('utf-8', errors='replace') - content = content.replace( - '
', - '
', - 1, - ) - content = content.replace('height: calc(100vh - 56px);', 'height: 100vh;', 1) - return render_template_string(content, user_id=current_user_id()) - - - - -@main_bp.route('/static/') -def serve_static(filename): - """提供 static 目录及子目录下的静态文件访问。""" - filepath = os.path.normpath(os.path.join(STATIC_DIR, filename)) - static_abs = os.path.abspath(STATIC_DIR) - file_abs = os.path.abspath(filepath) - if not file_abs.startswith(static_abs) or not os.path.isfile(file_abs): - return '', 404 - return send_file(file_abs, as_attachment=False) - - -@main_bp.route('/assets/') -def serve_assets(filename): - """提供 static 目录及子目录下的静态文件访问。""" - filename = _resolve_asset_filename(filename) - candidate_dirs = [ - os.path.abspath(ASSETS_DIR), - os.path.abspath(os.path.join(BASE_DIR, 'new_web_source', 'assets')), - os.path.abspath(os.path.join(BASE_DIR, '..', 'new_web_source', 'assets')), - ] - for static_abs in candidate_dirs: - filepath = os.path.normpath(os.path.join(static_abs, filename)) - file_abs = os.path.abspath(filepath) - if not file_abs.startswith(static_abs): - continue - if os.path.isfile(file_abs): - return send_file(file_abs, as_attachment=False) - return '', 404 - - -@main_bp.route('/new_web_source/') -@login_required -def serve_new_web_source(filename): - """提供 static 目录及子目录下的静态文件访问。""" - filepath = os.path.normpath(os.path.join("new_web_source", filename)) - static_abs = os.path.abspath("new_web_source") - file_abs = os.path.abspath(filepath) - if not file_abs.startswith(static_abs) or not os.path.isfile(file_abs): - return '', 404 - if filename.lower().endswith('.html'): - with open(file_abs, 'rb') as f: - content = f.read().decode('utf-8', errors='replace') - raw_uid = current_user_id() - uid_value = str(int(raw_uid)) if str(raw_uid or '').isdigit() else '""' - uid_script = ( - "\n\n" - ) - if '' in content: - content = content.replace('', uid_script + '', 1) - else: - content = uid_script + content - return render_template_string(content) - return send_file(file_abs, as_attachment=False) - -@main_bp.route('/logo.jpg', methods=['GET']) -def get_logo_image(): - return send_file(os.path.join(BASE_DIR, "logo.jpg"), mimetype='image/jpeg') - - -@main_bp.route('/newApi/', methods=['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS']) -def proxy(path): - target_url = f"{JAVA_API_BASE}/{path}" - - # 复制请求参数 - params = request.args.to_dict() - - # 处理请求头 - headers = {} - for key, value in request.headers: - if key.lower() in ['host', 'content-length', 'connection']: - continue - headers[key] = value - ignore_url = [f"{JAVA_API_BASE}/api/delete-brand/tasks/batch", - f"{JAVA_API_BASE}/api/delete-brand/tasks/progress/batch", - f"{JAVA_API_BASE}/api/delete-brand/history", - f"{JAVA_API_BASE}/api/product-risk-resolve/tasks/batch", - f"{JAVA_API_BASE}/api/product-risk-resolve/tasks/progress/batch", - ] - proxy_timeout = 180 if target_url.endswith("/api/delete-brand/run") else 30 - if target_url not in ignore_url: - try: - print("=============================") - print("target_url:", target_url) - print("params:", params) - print("data:", request.get_data()) - print("method:", request.method) - print("timeout:", proxy_timeout) - print("=============================") - except Exception as e: - print("打印失败", e) - - try: - # 使用流式请求 - req = requests.request( - method=request.method, - url=target_url, - params=params, - headers=headers, - data=request.get_data() if request.get_data() else None, - cookies=request.cookies, - stream=True, # 启用流式传输 - timeout=proxy_timeout - ) - - # 流式响应 - def generate(): - for chunk in req.iter_content(chunk_size=8192): - if chunk: - yield chunk - - # 构建响应 - response = Response(stream_with_context(generate()), status=req.status_code) - - # 复制响应头 - for key, value in req.headers.items(): - if key.lower() not in ['content-encoding', 'content-length', 'transfer-encoding', 'connection']: - response.headers[key] = value - - return response - - except requests.exceptions.Timeout: - print(f"后端服务超时:target_url={target_url}, timeout={proxy_timeout}") - return Response("后端服务超时", status=504) - except requests.exceptions.ConnectionError as e: - print(f"无法连接到后端服务:target_url={target_url}, error={e}") - return Response("无法连接到后端服务", status=502) - except Exception as e: - print(f"代理请求失败:target_url={target_url}, error={e}") - return Response(f"代理错误: {str(e)}", status=500) diff --git a/app/brand_spider/main.py b/app/brand_spider/main.py deleted file mode 100644 index d134aa1..0000000 --- a/app/brand_spider/main.py +++ /dev/null @@ -1,604 +0,0 @@ -import json -import re -import random -import requests -import time -import unicodedata - -from brand_spider.web_dec import decrypt_via_service, get_guid - -try: - from config import proxy_url as CONFIG_PROXY_URL, proxy_mode as CONFIG_PROXY_MODE -except ImportError: - CONFIG_PROXY_URL = None - CONFIG_PROXY_MODE = 1 - -# Forbidden 后 3 分钟内统一使用代理:记录代理生效截止时间与当前代理 -_FORBIDDEN_PROXY_UNTIL = 0.0 -_FORBIDDEN_PROXY_DICT = None -_FORBIDDEN_PROXY_MINUTES = 0.5 - - -special_char_pattern = re.compile(r'[^\w\s]') - -def remove_accents(input_str): - # 将字符分解为基础字符和重音符号 - nksel = unicodedata.normalize('NFKD', input_str) - # 过滤掉非间距重音符号,并重新编码 - return "".join([c for c in nksel if not unicodedata.combining(c)]) - - -def clean_text(text): - text = remove_accents(text) - return special_char_pattern.sub(' ', text).replace(" ","") - - -def create_code_generator(): - counter = random.randint(0, 0xFFFFFF) - def get_code(): - nonlocal counter - counter = (counter + 1) % 0xFFFFFF - low_16_bits = counter & 0xFFFF - return f"{low_16_bits:04x}" - return get_code() - - -def search(hashsearch, data, proxies=None): - global _FORBIDDEN_PROXY_UNTIL, _FORBIDDEN_PROXY_DICT - - url = "https://api.branddb.wipo.int/search" - headers = { - "accept": "application/json, text/plain, */*", - "accept-language": "zh-CN,zh;q=0.9,en;q=0.8", - "cache-control": "no-cache", - "content-type": "application/json", - "hashsearch": hashsearch, - "origin": "https://branddb.wipo.int", - "pragma": "no-cache", - "priority": "u=1, i", - "referer": "https://branddb.wipo.int/", - "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36" - } - - - - # 若 3 分钟内曾出现 Forbidden,则直接使用当时保存的代理 - now = time.time() - if now < _FORBIDDEN_PROXY_UNTIL and _FORBIDDEN_PROXY_DICT: - proxies = _FORBIDDEN_PROXY_DICT - print("处于 Forbidden 代理窗口内,直接使用代理",proxies) - - # 发送 POST 请求 - response = requests.post(url, headers=headers, json=data, proxies=proxies) - enc_text = response.text - # print("原始结果", enc_text) - - # 若返回 Forbidden,则从 config 的 proxy_url 获取代理 IP 后重试,并开启 3 分钟代理窗口 - if (enc_text.strip() == '{"message":"Forbidden"}' or "Too Many Requests" in enc_text) and CONFIG_PROXY_URL: - try: - proxy_resp = requests.get(CONFIG_PROXY_URL, timeout=10) - print("代理请求结果->:", proxy_resp.text) - # 模式 2:账号密码代理,接口返回 JSON - if CONFIG_PROXY_MODE == 2: - resp_json = proxy_resp.json() - proxy_list = resp_json.get("data", {}).get("list") or [] - first_item = proxy_list[0] if proxy_list else None - if first_item: - ip = first_item.get("ip") - port = first_item.get("port") - account = first_item.get("account") - password = first_item.get("password") - if ip and port and account and password: - auth_proxy = f"{account}:{password}@{ip}:{port}" - print("获取到账号密码代理:", auth_proxy) - proxies = { - "http": f"http://{auth_proxy}", - "https": f"http://{auth_proxy}", - } - # 默认模式 1:普通 IP:port 文本 - if CONFIG_PROXY_MODE != 2: - proxy_ip = (proxy_resp.text or "").strip() - if proxy_ip: - proxies = { - "http": f"http://{proxy_ip}", - "https": f"http://{proxy_ip}", - } - - if proxies: - response = requests.post(url, headers=headers, json=data, proxies=proxies) - enc_text = response.text - print("代理重试结果", enc_text) - # 记录 3 分钟内都使用该代理 - _FORBIDDEN_PROXY_UNTIL = now + _FORBIDDEN_PROXY_MINUTES * 60 - _FORBIDDEN_PROXY_DICT = proxies - except Exception as e: - print("获取代理或重试失败:", e) - - return enc_text - - -class TaskCancelledError(Exception): - """用户取消任务时抛出,供上层捕获并中止""" - pass - - -def single_file_handle(brand, strategy="Terms"): - status_info = { - "Ended": "已结束", - "Expired": "已过期的", - "Pending": "待决", - "Registered": "已注册", - "RegisteredMadrid": "国际注册有效", - "Unknown": "未知" - } - country_info = { - "AB": "ARABPAT", - "AD": "安道尔", - "AE": "UAE", - "AF": "阿富汗", - "AFR": "非洲", - "AG": "安提瓜和巴布达", - "AI": "安圭拉", - "AL": "阿尔巴尼亚", - "AM": "亚美尼亚", - "AN": "荷属安的列斯", - "ANT": "南极洲", - "AO": "安哥拉", - "AP": "非洲地区知识产权组织 ", - "AQ": "南极洲", - "AR": "阿根廷", - "AS": "美属萨摩亚", - "ASI": "亚洲", - "AT": "奥地利", - "AU": "澳大利亚", - "AW": "阿鲁巴", - "AX": "奥兰群岛", - "AZ": "阿塞拜疆", - "BA": "波斯尼亚和黑塞哥维纳", - "BB": "巴巴多斯", - "BD": "孟加拉国", - "BE": "比利时", - "BF": "布基纳法索", - "BG": "保加利亚", - "BH": "巴林", - "BI": "布隆迪", - "BJ": "贝宁", - "BL": "圣巴泰勒米", - "BM": "百慕大", - "BN": "文莱达鲁萨兰国", - "BO": "多民族玻利维亚国", - "BQ": "博纳尔、圣俄斯塔休斯和萨巴", - "BR": "巴西", - "BS": "巴哈马", - "BT": "不丹", - "BV": "布韦岛", - "BW": "博茨瓦纳", - "BX": "比荷卢知识产权局", - "BY": "白俄罗斯", - "BZ": "伯利兹", - "CA": "加拿大", - "CC": "科科斯群岛(基灵群岛)", - "CD": "刚果民主共和国", - "CF": "中非共和国", - "CG": "刚果", - "CH": "瑞士", - "CI": "科特迪瓦", - "CK": "库克群岛", - "CL": "智利", - "CM": "喀麦隆", - "CN": "中国", - "CO": "哥伦比亚", - "CR": "哥斯达黎加", - "CS": "捷克斯洛伐克", - "CU": "古巴", - "CV": "佛得角", - "CW": "库拉索", - "CX": "圣诞岛", - "CY": "塞浦路斯", - "CZ": "捷克共和国", - "DD": "德意志民主共和国", - "DE": "德国", - "DJ": "吉布提", - "DK": "丹麦", - "DM": "多米尼克", - "DO": "多米尼加", - "DT": "西德", - "DZ": "阿尔及利亚", - "EA": "欧亚专利组织", - "EC": "厄瓜多尔", - "EE": "爱沙尼亚", - "EG": "埃及", - "EH": "西撒哈拉", - "EM": "欧洲联盟", - "EP": "欧洲专利局", - "ER": "厄立特里亚", - "ES": "西班牙", - "ET": "埃塞俄比亚", - "EUR": "欧洲", - "FI": "芬兰", - "FJ": "斐济", - "FK": "福克兰群岛(马尔维纳斯群岛)", - "FM": "密克罗尼西亚联邦", - "FO": "法罗群岛", - "FR": "法国", - "GA": "加蓬", - "GB": "英国", - "GC": "海湾阿拉伯国家合作委员会专利局", - "GD": "格林纳达", - "GE": "格鲁吉亚", - "GF": "法属圭亚那", - "GG": "格恩西岛", - "GH": "加纳", - "GI": "直布罗陀", - "GL": "格陵兰", - "GM": "冈比亚", - "GN": "几内亚", - "GP": "瓜德罗普", - "GQ": "赤道几内亚", - "GR": "希腊", - "GS": "南乔治亚和南桑威奇群岛", - "GT": "危地马拉", - "GU": "关岛", - "GW": "几内亚比绍", - "GY": "圭亚那", - "HK": "香港", - "HM": "赫德岛和麦克唐纳群岛", - "HN": "洪都拉斯", - "HR": "克罗地亚", - "HT": "海地", - "HU": "匈牙利", - "IB": "世界知识产权组织国际局", - "ID": "印度尼西亚", - "IE": "爱尔兰", - "IL": "以色列", - "IM": "马恩岛", - "IN": "印度", - "INN": "世界卫生组织", - "IO": "英属印度洋领地", - "IQ": "伊拉克", - "IR": "伊朗伊斯兰共和国", - "IS": "冰岛", - "IT": "意大利", - "JE": "泽西岛", - "JM": "牙买加", - "JO": "约旦", - "JP": "日本", - "KE": "肯尼亚", - "KG": "吉尔吉斯斯坦", - "KH": "柬埔寨", - "KI": "基里巴斯", - "KM": "科摩罗", - "KN": "圣基茨和尼维斯", - "KP": "朝鲜民主主义人民共和国", - "KR": "大韩民国", - "KW": "科威特", - "KY": "开曼群岛", - "KZ": "哈萨克斯坦", - "LA": "老挝人民民主共和国", - "LB": "黎巴嫩", - "LC": "圣卢西亚", - "LI": "列支敦士登", - "LISBON": "WIPO", - "LK": "斯里兰卡", - "LP": "LATIPAT", - "LR": "利比里亚", - "LS": "莱索托", - "LT": "立陶宛", - "LU": "卢森堡", - "LV": "拉脱维亚", - "LY": "利比亚", - "MA": "摩洛哥", - "MC": "摩纳哥", - "MD": "摩尔多瓦共和国", - "ME": "黑山", - "MF": "圣马丁(法国部分)", - "MG": "马达加斯加", - "MH": "马绍尔群岛", - "MK": "北马其顿共和国", - "ML": "马里", - "MM": "缅甸", - "MN": "蒙古", - "MO": "澳门", - "MP": "北马里亚纳群岛", - "MQ": "马提尼克", - "MR": "毛里塔尼亚", - "MS": "蒙特塞拉特", - "MT": "马耳他", - "MU": "毛里求斯", - "MV": "马尔代夫", - "MW": "马拉维", - "MX": "墨西哥", - "MY": "马来西亚", - "MZ": "莫桑比克", - "NA": "纳米比亚", - "NAM": "北美洲", - "NC": "新喀里多尼亚", - "NE": "尼日尔", - "NF": "诺福克岛", - "NG": "尼日利亚", - "NI": "尼加拉瓜", - "NL": "荷兰", - "NO": "挪威", - "NP": "尼泊尔", - "NR": "瑙鲁", - "NU": "纽埃", - "NZ": "新西兰", - "OA": "非洲知识产权组织", - "OCE": "大洋洲", - "OM": "阿曼", - "PA": "巴拿马", - "PE": "秘鲁", - "PF": "法属波利尼西亚", - "PG": "巴布亚新几内亚", - "PH": "菲律宾", - "PK": "巴基斯坦", - "PL": "波兰", - "PM": "圣皮埃尔和密克隆", - "PN": "皮特凯恩", - "PR": "波多黎各", - "PS": "巴勒斯坦", - "PT": "葡萄牙", - "PW": "帕劳", - "PY": "巴拉圭", - "QA": "卡塔尔", - "QO": "没有ST.3代码的组织", - "QZ": "欧洲联盟", - "RE": "留尼汪", - "RO": "罗马尼亚", - "RS": "塞尔维亚", - "RU": "俄罗斯联邦", - "RW": "卢旺达", - "SA": "沙特阿拉伯", - "SAM": "南美洲", - "SB": "所罗门群岛", - "SC": "塞舌尔", - "SD": "苏丹", - "SE": "瑞典", - "SG": "新加坡", - "SH": "圣赫勒拿、阿森松和特里斯坦-达库尼亚", - "SI": "斯洛文尼亚", - "SIXTER": "WIPO", - "SJ": "斯瓦尔巴和扬马延", - "SK": "斯洛伐克", - "SL": "塞拉里昂", - "SM": "圣马力诺", - "SN": "塞内加尔", - "SO": "索马里", - "SR": "苏里南", - "SS": "南苏丹", - "ST": "圣多美和普林西比", - "SU": "苏联", - "SV": "萨尔瓦多", - "SX": "圣马丁(荷兰部分)", - "SY": "阿拉伯叙利亚共和国", - "SZ": "斯威士兰", - "TC": "特克斯和凯科斯群岛", - "TD": "乍得", - "TF": "法属南部领地", - "TG": "多哥", - "TH": "泰国", - "TJ": "塔吉克斯坦", - "TK": "托克劳", - "TL": "东帝汶", - "TM": "土库曼斯坦", - "TN": "突尼斯", - "TO": "汤加", - "TR": "土耳其", - "TT": "特立尼达和多巴哥", - "TV": "图瓦卢", - "TW": "台湾(中国的省)", - "TZ": "坦桑尼亚联合共和国", - "UA": "乌克兰", - "UG": "乌干达", - "UK": "UK", - "UM": "美国本土外小岛屿", - "US": "USA", - "UY": "乌拉圭", - "UZ": "乌兹别克斯坦", - "VA": "罗马教廷", - "VC": "圣文森特和格林纳丁斯", - "VE": "委内瑞拉玻利瓦尔共和国", - "VG": "英属维尔京群岛", - "VI": "美属维尔京群岛", - "VN": "越南", - "VU": "瓦努阿图", - "WF": "瓦利斯和富图纳", - "WHO": "世界卫生组织", - "WO": "WIPO", - "WS": "萨摩亚", - "XK": "科索沃共和国", - "XN": "北欧专利局", - "XX": "国际", - "XXX": "跨国和国际局", - "YD": "民主也门", - "YE": "也门", - "YT": "马约特岛", - "YU": "塞尔维亚和黑山", - "ZA": "南非", - "ZM": "赞比亚", - "ZW": "津巴布韦" - } - - check_value = [ - "瑞典", - "芬兰", - "丹麦", - "挪威", - "冰岛", - "法国", - "爱尔兰", - "荷兰", - "比利时", - "卢森堡", - "英国", - "摩纳哥", - "德国", - "波兰", - "捷克", - "斯洛伐克", - "匈牙利", - "奥地利", - "瑞士", - "列支敦士登", - "爱沙尼亚", - "拉脱维亚", - "立陶宛", - "俄罗斯", - "白俄罗斯", - "乌克兰", - "摩尔多瓦", - "西班牙", - "葡萄牙", - "意大利", - "希腊", - "斯洛文尼亚", - "克罗地亚", - "罗马尼亚", - "保加利亚", - "塞尔维亚", - "阿尔巴尼亚", - "黑山", - "马耳他", - "塞浦路斯", - "北马其顿", - "梵蒂冈", - "圣马力诺", - "安道尔", - "波黑", - "欧洲联盟" - ] - check_staus = ["已过期的","已结束"] - - # 5. 初始化不符合品牌的数据列表 - faild_data = [] - # 初始化查询失败的品牌的数据列表 - query_faild_data = [] - - - # Simple 策略下最多翻 3 页(0,30,60),直到命中 554 行判断 - max_pages = 3 if strategy == "Simple" else 1 - page = 0 - matched = False - - while page < max_pages and not matched: - try: - as_structure_dict = { - "_id": create_code_generator(), - "boolean": "AND", - "bricks": [ - { - "_id": create_code_generator(), - "key": "brandName", - "value": brand, - "strategy": strategy - } - ] - } - # 构造 asStructure 内部 JSON 对象 - as_structure_dict = as_structure_dict - # print(as_structure_dict) - - # 将内部对象转为 JSON 字符串(作为 asStructure 字段的值) - as_structure_str = json.dumps(as_structure_dict, ensure_ascii=False) - data = { - "sort": "score desc", - "rows": "30", - "asStructure": as_structure_str, - "fg": "_void_" - } - - # 翻页:第二页 start=30,第三页 start=60(仅 Simple 策略) - if strategy == "Simple" and page > 0: - data["start"] = str(30 * page) - - # print("请求参数", as_structure_dict, "页码:", page) - hashsearch = get_guid() - enc_text = search(hashsearch, data) - print(f"【{hashsearch}】待解密-->", enc_text) - dec_text = decrypt_via_service(hashsearch, enc_text) - # print(type(dec_text)) - dec_text = str(dec_text) - # print(f"解密之后的结果-->", dec_text) - data = json.loads(dec_text) - except Exception as e: - # 仅第一页请求失败时记录为查询失败品牌 - if page == 0: - import traceback - traceback.print_exc() - safe_brand = brand.encode('gbk', errors='replace').decode('gbk') - print(f"品牌:{safe_brand},处理失败:{e}") - # query_faild_data.append({"brand": brand, "time": datetime.datetime.now().strftime("%y-%m-%d %H:%M:%S")}) - query_faild_data.append(brand) - break - - # print(data) - - if data.get("response", {}).get("numFound", 0) > 0: - if strategy == "Simple": - new_brand_name = clean_text(brand) - _brand = new_brand_name.lower() - else: - _brand = brand - - docs = data["response"]["docs"] - for d in docs: - office = d.get("office") - status = d.get("status") - registrationDate = d.get("registrationDate") - status_name = status_info.get(status, status) - brand_name = d.get("brandName") - if isinstance(brand_name, list): - brand_name = "|".join(brand_name) - - if strategy == "Simple": - new_brand_name = clean_text(brand_name) - new_brand_name = new_brand_name.lower() - if _brand != new_brand_name: - continue - - check_office = d.get("designation") - - check_office.append(office) - for i in set(check_office): - office_name = country_info.get(i, i) - # print(office_name,office_name in check_value and status_name not in check_staus) - if office_name in check_value and status_name not in check_staus: - # 命中 554 行判断,记录并结束当前品牌后续翻页 - # data_rows = [row for row in data_rows if row.get("品牌") != brand] - # print(office_name, office in ["EM","QZ"] and i not in ["EM","QZ"]) - if office in ["EM","QZ"] and i not in ["EM","QZ"]: - continue - - if strategy == "Simple": - faild_data.append({"brand": brand, "country": office_name, "status": status_name}) # "reason":"|".join(d.get("brandName","") - matched = True - else: - # print("添加",brand,office_name) - faild_data.append({"brand": brand, "country": office_name, "status": status_name}) - # break - if matched: - break - - # 如果 Simple 策略下本页未命中,则翻下一页;其他策略不翻页 - if not matched: - page += 1 - - - return faild_data,query_faild_data - - -if __name__ == '__main__': - file_path = r"D:\\私单交付\\maixiang_AI\\测试图片数据\\品牌采集测试\\brand_task_73\\源文件\\brand_task_75\\源文件\\3.10.xlsx" - res = single_file_handle(file_path,"结果.xlsx") - print(res) - - - - - - - - - - - diff --git a/app/brand_spider/web_dec.py b/app/brand_spider/web_dec.py deleted file mode 100644 index 7610c86..0000000 --- a/app/brand_spider/web_dec.py +++ /dev/null @@ -1,126 +0,0 @@ -""" -通过 pywebview 加载本地 HTML,执行 JS 实现解密与 GUID 生成。 -""" -import json -import threading -import traceback - -import webview - -# 内嵌 HTML:加载 CryptoJS 并定义 decryptWithHashSearches、guid -_DECRYPT_HTML = """ - - - - - - - - - - -""" - -_window = None -_window_ready = threading.Event() -_init_lock = threading.Lock() - - -def _ensure_window(): - """首次调用时在后台线程启动 pywebview 并等待页面加载完成。""" - global _window - with _init_lock: - if _window is not None: - return - _window = webview.create_window( - "", - html=_DECRYPT_HTML, - width=1, - height=1, - hidden=True, - ) - - def run(): - webview.start(debug=False) - - t = threading.Thread(target=run, daemon=True) - t.start() - _window.events.loaded.wait() - _window_ready.set() - _window_ready.wait() - - -def decrypt_via_service(hash_searches, ciphertext): - """ - 通过 pywebview 执行 JS decryptWithHashSearches 进行 AES-ECB 解密。 - - :param hash_searches: 对应 JS 的 hashSearches(密钥后缀,可为空串) - :param ciphertext: Base64 密文 - :return: 解密后的 UTF-8 字符串,失败返回空串 - """ - _ensure_window() - # 将参数安全注入 JS(避免注入与引号问题) - ciphertext_js = json.dumps(ciphertext) - hash_searches_js = json.dumps(hash_searches or "") - js = f"(function(){{ return decryptWithHashSearches({ciphertext_js}, {hash_searches_js}); }})();" - try: - result = _window.evaluate_js(js) - return result if result is not None else "" - except Exception as e: - raise RuntimeError(f"解密失败: {e}") from e - - -def get_guid(): - """通过 pywebview 执行 JS guid() 生成 UUID 格式字符串。""" - _ensure_window() - try: - result = _window.evaluate_js("(function(){ return guid(); })();") - if result is None: - raise RuntimeError("guid() 返回为空") - return result - except Exception as e: - raise RuntimeError(f"获取 GUID 失败: {e}") from e - - -# 使用示例 -if __name__ == "__main__": - # 参数含义:hash_searches 对应原 key,ciphertext 对应原 data - hash_searches = "a6efb809-b714-7efd-4b64-8c650b9030f0" - ciphertext = "SEsfpOGa8B+sWk0ncknTNh/HNHbGiEVi/RNKxBvyHmAE5VjHonPi202c6VicC/GKfA8mLsIC5mGEpSaH2DdCaEJKeOTWD9SBHHbgtyS1O60VqjgAaptYe9LivvWKc/BU8sZOqhxPMzGUHDcKUts7d0p+hCc80XCXyM2ZT80smM1twndcDfpGkLDk2kJbzl2bGzIc60sl9MzKWfZA2sE0ztFjQ9wD2uhn5LrwoN8NnpiPLNbviMMGtHh4N6Dc0xtPzkzgfkiuxBfWnN1SeM9XVgujHvAGea/dqUWIJqLo26fZIOEFJ0MYL4c8CGLYIeP/70cT2IqJdf+IPBWsCiP29zSyAiQd3yLNvd8+xBLky7lR4ng3MZizn/vhW/5BSg1FtVglbAmNbKgHOIbtpP197Lv+uahx2IpsSPqpy4j2O2VV25YzBk9JpJ4WGG/SvF3f2ZYKKepEQ+kGmBxAfG/5Z8DTNIwnOpXhyjFpJb+fUdPV6LTCK/yFc8g31bNFAJkLW7y/VjewjFravZ3VfQjNAHCvifnrIxGG22MZ3TLVnlbh6ye6vTnd+v9GzqXu+ISR7vQGL/ZSM/bJIjuVkP2XnNUPf+NFdt75gyDmTylFmmbpg7WHaBjinPcyVjeZ38+quJhT8yEk66BOjBM47mVdfU8JLK3ToghxQ54dKWGUbc9HRzYIAQ0rIBBExcOcPM4J9DpufvajmEygoDaws4CxOQDlFoFLwNBYorJsKzAoDe1Cu8oFtk4x190Vd+leRKq6DQSNJwEmyrVkWyFpiuywSMaixFlSqve0lRs50FclXfV7gkBAAvz/DJp90i9yCJdMaihP5ZCvbhKxFGMowkU+tx5Ptnxd9hq6tUxHmuiwDI1eyY8EyjB+3MbrC3H/GY39Z5Qhkj5tkSBm4oGA/h6YjeunBlfMU/QGP3hyZIYALh/YmBlZxAcglWwcqlISUhcx1L3Dbw6ZQbpAmYHmA421xIlRJkdJuPmGoopcoFEVdIO0Ov3uP2JL5ybvUgCBMnbwcYRK9qRmvn2b8jHKch55YXerHBDCEMHz88rfgNIEL8DIAp+wMuIyJ0VrV0BwAXioLYNvMcggBp06gghq2NykGiXRZ/dz8nffFqPVkDNjzcPSGrml9fpKdO8x/GannMNBsA+oHlO2/d4dyo+Q2dZCarQ5UB/N1p+UsTW90kvITKwCbZfV/YY2NRm7HrXq+wLS1vY4mChY82Ybc3cYQT653Q==" - - try: - decrypted_text = decrypt_via_service(hash_searches, ciphertext) - print("解密结果:", decrypted_text) - except Exception as e: - print("错误:", e) - - try: - g = get_guid() - print("GUID:", g) - except Exception as e: - print("GUID 错误:", e) diff --git a/app/config.py b/app/config.py deleted file mode 100644 index 182b87e..0000000 --- a/app/config.py +++ /dev/null @@ -1,103 +0,0 @@ -base_url = "https://api.coze.cn/v1" -coze_token = "sat_12nW40INoJxArrDXbY4lSCoudbqkOYTcphC99BP2efWyzxmsk4q81WDX3ezWgqZ5" -workflow_id = "7608812635877900322" -STITCH_WORKFLOW_ID = "7608813873483300907" - -import os -from dotenv import load_dotenv -from queue import Queue - -base_dir = os.path.dirname(os.path.abspath(__file__)) -dotenv_path = os.path.join(base_dir, ".env") -load_dotenv(dotenv_path=dotenv_path, override=True) - -_base_url = os.getenv("base_url","http://159.75.121.33:15124") - -# MySQL 配置 -mysql_host = os.getenv("mysql_host") -mysql_user = os.getenv("mysql_user") -mysql_password = os.getenv("mysql_password","WTFrb5y6hNLz6hNy") -mysql_database = os.getenv("mysql_database","aiimage") -proxy_url = os.getenv("proxy_url") -proxy_mode = int(os.getenv("proxy_mode",1)) - -client_name=os.getenv("client_name") + ".exe" -JAVA_API_BASE = os.getenv("java_api_base", "http://api.aishufu.top:18080/").rstrip("/") - -# 紫鸟浏览器配置 -from urllib.parse import unquote -ZN_COMPANY = os.getenv("zn_company", "") -ZN_USERNAME = os.getenv("zn_username", "") -ZN_USERNAME = unquote(ZN_USERNAME) -ZN_PASSWORD = os.getenv("zn_password", "#20zsg25") - -# 删除品牌API配置 -DELETE_BRAND_API_BASE = os.getenv("DELETE_BRAND_API_BASE", JAVA_API_BASE).rstrip("/") - - -cache_path = "./user_data" - -region = "cn-hangzhou" -endpoint = "oss-cn-hangzhou.aliyuncs.com" -bucket = "nanri-ai-images" -accessKeyId = "LTAI5tNpyvzMNz9f2dHarsm8" -accessKeySecret = "bQSZnFH455i8tzyOgeahJmUzwmhynz" -bucket_path = "nanri-image/" - -file_url_pre = f"https://{bucket}.oss-cn-hangzhou.aliyuncs.com/" - - - -os.environ['OSS_ACCESS_KEY_ID'] = accessKeyId -os.environ['OSS_ACCESS_KEY_SECRET'] = accessKeySecret - - -debug = False -version = "1.0.13" -APP_UPDATE_URL = f"{_base_url}/api/version/latest" # 检测更新接口地址,返回 { "file_url": "...", "version": "x.x.x" } -os.environ['APP_VERSION'] = version -os.environ['APP_UPDATE_URL'] = APP_UPDATE_URL - - -# 队列 -JSON_TASK_QUEUE = Queue() - - -base_dir = os.getcwd() - -#删除品牌,正在执行中的任务 -runing_task = { - -} -# 正在执行中的店铺 -runing_shop = {} - -# -# runing_task = { -# "497": { -# "status": "running", # running/completed/failed -# "start_time": "2026-04-01 10:00:00", -# "stop_requested": False, -# "current_shop": "魏振峰", -# "current_country": "德国", -# "current_asin": "B0D451RQRG", -# "total_shops": 1, -# "processed_shops": 0, -# "total_asins": 14, -# "processed_asins": 3, -# "success_count": 2, -# "failed_count": 1 -# } -# } - - - - - - - - - - - - diff --git a/app/coze.py b/app/coze.py deleted file mode 100644 index ea8e95a..0000000 --- a/app/coze.py +++ /dev/null @@ -1,92 +0,0 @@ -import requests -import time - -from config import base_url, coze_token - - - - - -def upload_file(file_path,_coze_token =coze_token): - url = f"{base_url}/files/upload" - headers = { - "Authorization": f"Bearer {_coze_token}" - } - print(file_path) - with open(file_path, 'rb') as f: - files = { - 'file': f - } - # with open(f"{time.time()".replace(".","_")+".png","wb") as file: - # file.write(f.read()) - # allow_redirects=True 模拟 curl 的 --location,默认即为 True - response = requests.post(url, headers=headers, files=files, allow_redirects=True) - data = response.json() - print("上传图片->>",data) - return data - -def workflow_run(workflow_id, parameters,_coze_token = coze_token,is_async=True): - url = f"{base_url}/workflow/run" - headers = { - "Authorization": f"Bearer {_coze_token}", - "Content-Type": "application/json" - } - - # 请求体(JSON 格式) - payload = { - "parameters": parameters, - # "parameters": { - # "name": "包包", - # "ratio": "3:4", - # "menu": 3, - # "resolution": "2K", - # "count": 1, - # "desc": "1、一个中国美女手上挎着这个包,2、站在商场内", - # "language": "中文", - # "style": "极简高级" - # }, - "workflow_id": workflow_id, - "is_async" : is_async, - } - # 发送 POST 请求(使用 json 参数自动序列化并设置 Content-Type) - response = requests.post(url, headers=headers, json=payload) - data = response.json() - - print("图片生成参数->>",payload) - print("图片生成->>",data) - return data - - -def query_result(workflow_id, execute_id,_coze_token=coze_token): - url = f"{base_url}/workflows/{workflow_id}/run_histories/{execute_id}" - headers = { - "Authorization": f"Bearer {_coze_token}", - "Content-Type": "application/json" - } - response = requests.get(url, headers=headers) - data = response.json() - print(f"【{execute_id}】结果查询->>",data) - return data - -if __name__ == '__main__': - from config import workflow_id - - parameters = { - "images": [ - { - "file_id": "7612667079497613350", - - },{ - "file_id": "7612667042990768174", - },{ - "file_id": "7612667111332577332", - } - ] - } - # resp = workflow_run("7607680760402100258",parameters,_coze_token="sat_ZVNLR9Om54A3iMlJWAasHF9kbtDZnR3BjwjAxRwe8x7igEW446y5ROyVlW1UlpVX") - # print(resp) - - # resp = query_result("7607680760402100258","7612668958797447187",_coze_token="sat_ZVNLR9Om54A3iMlJWAasHF9kbtDZnR3BjwjAxRwe8x7igEW446y5ROyVlW1UlpVX") - # print(resp) - resp = upload_file("D:\私单交付\maixiang_AI\测试图片数据\IMG_2686.JPG",_coze_token="sat_ZVNLR9Om54A3iMlJWAasHF9kbtDZnR3BjwjAxRwe8x7igEW446y5ROyVlW1UlpVX") - print(resp) \ No newline at end of file diff --git a/app/generate_api.py b/app/generate_api.py deleted file mode 100644 index ce92eff..0000000 --- a/app/generate_api.py +++ /dev/null @@ -1,261 +0,0 @@ -""" -生成图片 API - 供 pywebview 前端调用 -流程:上传图片 -> workflow_run -> 轮询 query_result -> 解析返回图片 URL -""" - -import base64 -import json -import os -import tempfile -import time -import re -import traceback - -import requests - -from coze import upload_file, workflow_run, query_result -from config import workflow_id -from ali_oss import upload_data_urls as oss_upload_data_urls - - -def _data_url_to_temp_file(data_url: str, allow_video: bool = False) -> str: - """将 base64 data URL 转为临时文件路径""" - # data:image/png;base64,xxxx 或 data:video/mp4;base64,xxxx - if allow_video: - match = re.match(r'data:(?:image|video)/(\w+);base64,(.+)', data_url) - else: - match = re.match(r'data:image/(\w+);base64,(.+)', data_url) - if not match: - raise ValueError('无效的 data URL 格式') - mime = match.group(1).lower() - ext_map = {'png': 'png', 'webp': 'png', 'jpeg': 'jpg', 'jpg': 'jpg', 'mp4': 'mp4', 'webm': 'webm'} - ext = ext_map.get(mime, 'jpg') - data = base64.b64decode(match.group(2)) - fd, path = tempfile.mkstemp(suffix=f'.{ext}') - try: - os.write(fd, data) - finally: - os.close(fd) - return path - - -def _upload_video(video_data_url: str) -> str: - """上传视频,返回 file_id""" - if not video_data_url or not isinstance(video_data_url, str): - raise ValueError('无效的视频数据') - path = _data_url_to_temp_file(video_data_url, allow_video=True) - try: - resp = upload_file(path) - if resp.get('code') == 0 and resp.get('data', {}).get('id'): - return resp['data']['id'] - raise RuntimeError(f'视频上传失败: {resp.get("msg", resp)}') - finally: - try: - os.unlink(path) - except Exception: - pass - - -def _upload_images(image_data_urls: list) -> list: - """上传多张图片,返回 file_id 列表""" - file_ids = [] - temp_paths = [] - try: - for data_url in (image_data_urls or []): - if not data_url or not isinstance(data_url, str): - continue - if data_url.startswith("http"): - fd, path = tempfile.mkstemp(suffix=f'.png') - data_content = requests.get(data_url).content - os.write(fd, data_content) - else: - path = _data_url_to_temp_file(data_url) - temp_paths.append(path) - resp = upload_file(path) - if resp.get('code') == 0 and resp.get('data', {}).get('id'): - file_ids.append(resp['data']['id']) - else: - raise RuntimeError(f'上传失败: {resp.get("msg", resp)}') - return file_ids - finally: - for p in temp_paths: - try: - os.unlink(p) - except Exception: - pass - - -def _parse_output(output_str: str) -> list: - """解析 query_result 中的 output,提取图片 URL 列表""" - try: - outer = json.loads(output_str) - inner_str = outer.get('Output', '{}') - inner = json.loads(inner_str) - data_str = inner.get('data', '[]') - data = json.loads(data_str) - urls = data.get("images") - long_image_url = data.get("merged_image_url") - return urls if isinstance(urls, list) else [],long_image_url - except Exception: - return [],None - - -def _parse_output_text(output_str: str) -> list: - """解析 query_result 中的 output,提取图片 URL 列表""" - try: - outer = json.loads(output_str) - inner_str = outer.get('Output', '{}') - inner = json.loads(inner_str) - data_str = inner.get('data', '') - if isinstance(data_str,str): - data = json.loads(data_str).get("reverse_prompt") - return [data] - pattern = r'【?图像 \d+】.*?(?=【?图像 \d+】|$)' - segments = re.findall(pattern, data_str, re.DOTALL) - return segments - except Exception: - return "" - - -def _poll_until_done(wf_id: str, execute_id: str, interval: float =10, timeout: int = 600*2, is_text: bool = False) -> list: - """轮询直到成功或超时,返回图片 URL 列表""" - start = time.time() - while time.time() - start < timeout: - resp = query_result(wf_id, execute_id) - if resp.get('code') != 0: - raise RuntimeError(f'查询失败: {resp.get("msg", resp)}') - items = resp.get('data') or [] - if not items: - time.sleep(interval) - continue - item = items[0] - status = item.get('execute_status', '') - if status == 'Success': - output = item.get('output', '{}') - if is_text: - return _parse_output_text(output) - return _parse_output(output) - if status and status not in ('Running', 'Pending', ''): - raise RuntimeError(f'执行失败: {status}') - time.sleep(interval) - raise RuntimeError('生成超时') - - -def _res_to_2k(res: str) -> str: - """统一分辨率为 2K/4K""" - r = (res or '2k').strip().upper() - return '4K' if r == '4K' else '2K' - - -def generate(params: dict) -> dict: - """ - 生成图片 - params: { - menu: int, # 1=图片反推 2=图片编辑 3=随机海报 4=克隆海报 5=服饰穿搭 - prompt: str, # 用户自定义指令 (menu=1 必填) - ref_images: list, # base64 data URLs - 参考图 - video: str, # base64 data URL - 视频 (menu=1 可选,仅支持1个) - model_images: list, # base64 data URLs - 多模特图 (menu!=1,最多5张) - name: str, desc: str, ratio: str, resolution: str, count: int, - language: str, style: str, batch_prompt: list, brand_name: str, - Ingredients: str, activity: str, mode: str, texts: list, - proc_images: list, layout_image: str, - } - 返回: { success: bool, urls: list, prompts: list, error: str } - """ - original_urls = [] - api_key = (params.get('api_key') or '').strip() - try: - menu = int(params.get('menu', 2)) - ref_data = params.get('ref_images') or [] - proc_data = params.get('proc_images') or [] - layout_data = params.get('layout_image') - video_data = params.get('video') - model_data = params.get('model_images') or [] - - # menu 1: 反推词,简化参数 - if menu == 1: - base_params = {'menu': 1, 'prompt': str(params.get('prompt', '')).strip() or ''} - - ref_ids = _upload_images(ref_data) if ref_data else [] - if ref_ids: - base_params['ref_images'] = [{'file_id': fid} for fid in ref_ids] - if video_data: - try: - vid = _upload_video(video_data) - base_params['video'] = {'file_id': vid} - except Exception as ve: - return {'success': False, 'urls': [], 'prompts': [], 'error': f'视频上传失败: {ve}'} - base_params = {k: v for k, v in base_params.items() if v is not None and v != ''} - base_params["api_key"] = api_key - resp = workflow_run(workflow_id, base_params) - if resp.get('code') != 0: - return {'success': False, 'urls': [], 'prompts': [], 'error': resp.get('msg', str(resp))} - execute_id = resp.get('execute_id') - if not execute_id: - return {'success': False, 'urls': [], 'prompts': [], 'error': '未返回 execute_id'} - prompts = _poll_until_done(workflow_id, str(execute_id), is_text=True) - # menu 1 返回提示词列表,统一转为字符串 - # prompts = [str(x) for x in result_list] if result_list else [] - # prompts = [prompts] - return {'success': True, 'urls': [], 'prompts': prompts, 'error': ''} - - # menu != 1: 原有逻辑 - all_ref = list(ref_data) - if layout_data: - all_ref = [layout_data] + list(ref_data) - all_originals = list(all_ref) + list(proc_data) + list(model_data) - - if all_originals: - try: - original_urls = oss_upload_data_urls(all_originals, prefix="originals") - except Exception: - traceback.print_exc() - pass - - ref_ids = _upload_images(all_ref) if all_ref else [] - proc_ids = _upload_images(proc_data) if proc_data else [] - model_ids = _upload_images(model_data) if model_data else [] - - res = _res_to_2k(params.get('resolution', '2K')) - - base_params = { - 'name': str(params.get('name', '')).strip(), - 'ratio': str(params.get('ratio', '')).strip(), - 'menu': menu, - 'resolution': res, - 'count': int(params.get('count', 1)), - 'desc': str(params.get('desc', '')).strip(), - 'language': str(params.get('language', '中文')).strip() or '中文', - 'style': str(params.get('style', '')).strip(), - 'prompt': str(params.get('prompt', '')).strip(), - 'batch_prompt': params.get('batch_prompt') or [], - 'brand_name': str(params.get('brand_name', '')).strip(), - 'Ingredients': str(params.get('Ingredients', '')).strip(), - 'activity': str(params.get('activity', '')).strip(), - 'mode': str(params.get('mode', '1')).strip() or '1', - 'texts': params.get('text') or [], - "api_key" : api_key - } - - if ref_ids: - base_params['ref_images'] = [{'file_id': fid} for fid in ref_ids] - if proc_ids: - base_params['proc_images'] = [{'file_id': fid} for fid in proc_ids] - if model_ids: - base_params['model_images'] = [{'file_id': fid} for fid in model_ids] - base_params = {k: v for k, v in base_params.items() if v is not None and v != ''} - - resp = workflow_run(workflow_id, base_params) - if resp.get('code') != 0: - return {'success': False, 'urls': [], 'error': resp.get('msg', str(resp))} - execute_id = resp.get('execute_id') - if not execute_id: - return {'success': False, 'urls': [], 'error': '未返回 execute_id'} - - urls,long_image_url = _poll_until_done(workflow_id, str(execute_id)) - return {'success': True, 'urls': urls, 'original_urls': original_urls, 'error': '',"long_image_url":long_image_url} - except Exception as e: - return {'success': False, 'urls': [], 'prompts': [], 'original_urls': [], 'error': str(e),"long_image_url":""} - - diff --git a/app/html_crypto.py b/app/html_crypto.py deleted file mode 100644 index cb089d9..0000000 --- a/app/html_crypto.py +++ /dev/null @@ -1,68 +0,0 @@ -""" -HTML 模板加密/解密模块 -使用 AES (Fernet) 对 HTML 资源进行加密存储,运行时解密后渲染 -""" - -import base64 -import os - -from cryptography.fernet import Fernet -from cryptography.hazmat.primitives import hashes -from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC - - -def _get_fernet_key() -> bytes: - """从环境变量 HTML_ENCRYPT_KEY 派生 Fernet 密钥,若未设置则使用默认开发密钥""" - raw = os.environ.get( - "HTML_ENCRYPT_KEY", - "maixiang_html_encrypt_default_key_change_in_production", - ) - # 使用 PBKDF2 派生 32 字节密钥,再转为 Fernet 所需的 base64url - kdf = PBKDF2HMAC( - algorithm=hashes.SHA256(), - length=32, - salt=b"maixiang_html_salt", - iterations=100000, - ) - key_bytes = kdf.derive(raw.encode("utf-8")) - return base64.urlsafe_b64encode(key_bytes) - - -def encrypt(plain_data: bytes) -> bytes: - """加密原始数据,返回密文(bytes)""" - key = _get_fernet_key() - f = Fernet(key) - return f.encrypt(plain_data) - - -def decrypt(encrypted_data: bytes) -> bytes: - """解密数据,返回明文(bytes)""" - key = _get_fernet_key() - f = Fernet(key) - return f.decrypt(encrypted_data) - - -def encrypt_file(path: str) -> None: - """就地加密文件:读取 UTF-8 内容,加密后写回同一路径""" - with open(path, "rb") as f: - plain = f.read() - encrypted = encrypt(plain) - with open(path, "wb") as f: - f.write(encrypted) - - -def decrypt_file(path: str) -> None: - """就地解密文件:读取密文,解密后以 UTF-8 写回同一路径""" - with open(path, "rb") as f: - encrypted = f.read() - plain = decrypt(encrypted) - with open(path, "wb") as f: - f.write(plain) - - -def is_encrypted(data: bytes) -> bool: - """简单启发式:Fernet 密文以 b'gAAAAA' 开头(base64 编码后)""" - try: - return data[:7] == b"gAAAAAB" - except Exception: - return False diff --git a/app/jwt_util.py b/app/jwt_util.py deleted file mode 100644 index 186ab7e..0000000 --- a/app/jwt_util.py +++ /dev/null @@ -1,119 +0,0 @@ -""" -JWT 工具:解析 Java 端签发的 token、从请求中提取 token。 -与 Java 端 JwtService 共用同一个 HS256 密钥(AIIMAGE_JWT_SECRET)。 -""" -import os -import sys -import time -from typing import Optional, Tuple - -from flask import request - -try: - import jwt as pyjwt - _PYJWT_IMPORT_ERROR = None -except ImportError as _e: - pyjwt = None - _PYJWT_IMPORT_ERROR = _e - # 启动时立刻给出醒目提示,避免上线后才发现一直 401 - print( - "[auth] WARNING: PyJWT 未安装,所有依赖 JWT 的接口都会返回 401。" - " 请执行 `pip install PyJWT==2.10.1` 或 `pip install -r requirements.txt`。", - file=sys.stderr, - ) - - -_DEFAULT_SECRET = "please-change-this-secret-please-rotate-at-least-32-bytes" -COOKIE_NAME = os.getenv("AIIMAGE_AUTH_COOKIE_NAME", "aiimage_token") - -# 桌面端与 Java 服务器时钟可能漂移(笔记本休眠、用户手动改时间、跨时区等), -# 给 JWT exp/nbf 校验留出容差,避免 /api/auth/sync 因为时间不同步而 401。 -# 默认 5 分钟,可通过 AIIMAGE_JWT_LEEWAY_SECONDS 覆盖。 -try: - _JWT_LEEWAY_SECONDS = int(os.getenv("AIIMAGE_JWT_LEEWAY_SECONDS", "300")) -except ValueError: - _JWT_LEEWAY_SECONDS = 300 - - -def _signing_key() -> bytes: - """与 Java JwtService.signingKey 保持一致:UTF-8 字节,不足 32 字节右侧补 0。""" - secret = os.getenv("AIIMAGE_JWT_SECRET", _DEFAULT_SECRET) - key_bytes = secret.encode("utf-8") - if len(key_bytes) < 32: - key_bytes = key_bytes + b"\x00" * (32 - len(key_bytes)) - return key_bytes - - -def _describe_clock_skew(token: str) -> str: - """解析 token 里的 iat/exp,与本地时钟比较,返回 ' iat=.. exp=.. now=.. skew=..s' 字符串。 - 仅供日志使用,不做安全决策;解析失败返回空串,不影响主流程。""" - if pyjwt is None: - return "" - try: - unverified = pyjwt.decode(token, options={"verify_signature": False, "verify_exp": False, "verify_iat": False, "verify_nbf": False}) - except Exception: - return "" - iat = unverified.get("iat") - exp = unverified.get("exp") - now = int(time.time()) - parts = [f"now={now}"] - if isinstance(iat, (int, float)): - parts.append(f"iat={int(iat)} skew_iat={now - int(iat)}s") - if isinstance(exp, (int, float)): - parts.append(f"exp={int(exp)} skew_exp={now - int(exp)}s") - return ", " + " ".join(parts) - - -def parse_token_with_reason(token: str) -> Tuple[Optional[dict], Optional[str]]: - """解析 JWT,返回 (payload, error_reason)。 - payload 命中时 error_reason 为 None;失败时 payload 为 None,error_reason 描述根因。""" - if not token: - return None, "token 为空" - if pyjwt is None: - return None, f"PyJWT 未安装({_PYJWT_IMPORT_ERROR})" - # 打印 token 头,便于发现 alg 不是 HS256 等情况(不验签,仅 base64 解码 header) - try: - header = pyjwt.get_unverified_header(token) - except Exception as e: - return None, f"无法解析 token header: {type(e).__name__}: {e}" - alg = header.get("alg") or "?" - try: - payload = pyjwt.decode( - token, - _signing_key(), - algorithms=["HS256", "HS384", "HS512"], - leeway=_JWT_LEEWAY_SECONDS, - ) - except Exception as e: - # 常见:ExpiredSignatureError / InvalidSignatureError / DecodeError / InvalidAlgorithmError - # 把 token 内 exp/iat 与本地时钟一起打出来,定位"时间漂移"类失败更直接 - skew_info = _describe_clock_skew(token) - return None, f"{type(e).__name__}: {e} (token alg={alg}{skew_info})" - sub = payload.get("sub") - try: - user_id = int(sub) if sub is not None else None - except (TypeError, ValueError): - return None, f"sub 字段非法: {sub!r}" - if user_id is None: - return None, "payload 缺少 sub 字段" - return { - "user_id": user_id, - "username": payload.get("username") or "", - "device_id": payload.get("deviceId") or "", - }, None - - -def parse_token(token: str) -> Optional[dict]: - """解析 JWT,返回 {user_id, username, device_id};失败返回 None。""" - payload, _ = parse_token_with_reason(token) - return payload - - -def get_token_from_request() -> str: - """优先从 Authorization: Bearer 取,其次从 cookie 取。""" - auth = request.headers.get("Authorization", "") - if auth.startswith("Bearer "): - token = auth[len("Bearer "):].strip() - if token: - return token - return (request.cookies.get(COOKIE_NAME) or "").strip() diff --git a/app/main.py b/app/main.py deleted file mode 100644 index 677dc09..0000000 --- a/app/main.py +++ /dev/null @@ -1,618 +0,0 @@ -from config import cache_path,debug,version,JAVA_API_BASE,JSON_TASK_QUEUE,runing_task,runing_shop -import datetime -import json -import sys -import shutil -import os -import uuid -import ctypes -os.makedirs(cache_path,exist_ok=True) -if not debug: - today = datetime.datetime.now().strftime("%Y_%m_%d") - sys.stdout = open(os.path.join(cache_path,f'{today}.log'), 'a',buffering=1,encoding='utf-8') - sys.stderr = sys.stdout - -from amazon.main import TaskMonitor -import webview -import threading -import time -import requests -import subprocess - -from amazon.del_brand import kill_process -from app import run_app -from generate_api import generate -from tool.devices import DeviceIDGenerator - - -with open("version.txt","w",encoding="utf-8") as file: - file.write(json.dumps({"version":version})) - -print(f""" -======================================================== -版本: {version} -======================================================== -""") - - -# 获取当前脚本所在目录 -BASE_DIR = os.path.dirname(os.path.abspath(__file__)) -APP_URL = "http://127.0.0.1:5123" -PORT = 5123 - - -def generate_images(params): - """供前端调用的生成图片接口""" - return generate(params) - - -class WindowAPI: - """暴露给 JavaScript 的窗口控制 API""" - - def __init__(self, window): - self._window = window - self._is_maximized = False - window.events.maximized += lambda _: setattr(self, '_is_maximized', True) - window.events.restored += lambda _: setattr(self, '_is_maximized', False) - - def close(self): - """关闭窗口,异步执行清理逻辑""" - def cleanup_and_exit(): - """后台清理线程""" - try: - kill_process('v6') - except Exception as e: - print(f"【退出前】关闭紫鸟浏览器进程异常: {str(e)}") - finally: - time.sleep(0.5) - os._exit(0) - - print("===============程序退出================") - # 先销毁窗口,让用户看到立即响应 - try: - self._window.destroy() - except: - pass - - # 在后台线程执行清理,不阻塞 - cleanup_thread = threading.Thread(target=cleanup_and_exit, daemon=True) - cleanup_thread.start() - - def minimize(self): - self._window.minimize() - - def maximize(self): - self._window.maximize() - - def toggle_maximize(self): - if self._is_maximized: - self._window.restore() - else: - self._window.maximize() - - def save_image(self, url_or_data, filename='image.png'): - """弹窗选择保存位置并下载图片。url_or_data 可为 http(s) 链接或 data: base64""" - import base64 - import re - result = self._window.create_file_dialog( - webview.SAVE_DIALOG, - save_filename=filename, - file_types=('图片文件 (*.png;*.jpg;*.jpeg)', '所有文件 (*.*)') - ) - if not result: - return {'success': False, 'error': '用户取消'} - path = result[0] if isinstance(result, (list, tuple)) else result - try: - if url_or_data.startswith('data:'): - match = re.match(r'data:image/\w+;base64,(.+)', url_or_data) - if not match: - print(url_or_data) - print('无效的 data URL') - return {'success': False, 'error': '无效的 data URL'} - data = base64.b64decode(match.group(1)) - else: - import requests - resp = requests.get(url_or_data, timeout=30) - resp.raise_for_status() - data = resp.content - with open(path, 'wb') as f: - f.write(data) - return {'success': True, 'path': path} - except Exception as e: - return {'success': False, 'error': str(e)} - - def save_image_to_folder(self, url_or_data, dir_path, filename='image.png'): - """将图片保存到指定文件夹。url_or_data 可为 http(s) 链接或 data: base64""" - import base64 - import re - path = os.path.join(dir_path, filename) - try: - if url_or_data.startswith('data:'): - match = re.match(r'data:image/\w+;base64,(.+)', url_or_data) - if not match: - return {'success': False, 'error': '无效的 data URL'} - data = base64.b64decode(match.group(1)) - else: - import requests - resp = requests.get(url_or_data, timeout=30) - resp.raise_for_status() - data = resp.content - os.makedirs(dir_path, exist_ok=True) - with open(path, 'wb') as f: - f.write(data) - return {'success': True, 'path': path} - except Exception as e: - return {'success': False, 'error': str(e)} - - def select_folder(self): - # 此方法会在 JavaScript 中被调用,返回选择的文件夹路径 - result = webview.windows[0].create_file_dialog( - webview.FOLDER_DIALOG, # 指定为文件夹对话框 - allow_multiple=False, # 是否允许多选 - directory='' # 初始目录 - ) - # create_file_dialog 返回的是列表(多选时)或 None - return result[0] if result else '' - - def select_brand_xlsx_files(self): - """品牌爬虫:选择 .xlsx 文件,允许多选,返回路径列表""" - result = webview.windows[0].create_file_dialog( - webview.OPEN_DIALOG, - allow_multiple=True, - file_types=('Excel 文件 (*.xlsx)', '所有文件 (*.*)') - ) - print("选择的excel 文件",result) - if not result: - return [] - return result if isinstance(result, list) or isinstance(result, tuple) else [result] - - def select_brand_folder(self): - """品牌爬虫:选择文件夹,返回文件夹路径(前端再请求后端展开该目录下所有 xlsx)""" - result = webview.windows[0].create_file_dialog( - webview.FOLDER_DIALOG, - allow_multiple=False, - directory='' - ) - return result[0] if result else '' - - def save_file_from_url(self, url, default_filename='download.zip'): - """弹窗选择保存位置,从 url 下载文件并保存。用于品牌任务结果 zip 等。""" - print("调用到save_file_from_url方法") - if not url or not url.strip(): - return {'success': False, 'error': '下载地址为空'} - result = self._window.create_file_dialog( - webview.SAVE_DIALOG, - save_filename=default_filename, - file_types=('ZIP 压缩包 (*.zip)', '所有文件 (*.*)') - ) - if not result: - return {'success': False, 'error': '用户取消'} - path = result[0] if isinstance(result, (list, tuple)) else result - return self._download_url_to_path(url, path) - - def save_file_from_url_new(self, url, default_filename='download.bin'): - """弹窗选择保存位置,从 url 下载文件并保存。根据文件后缀动态设置保存类型。""" - print("调用到save_file_from_url_new方法") - if not url or not url.strip(): - return {'success': False, 'error': '下载地址为空'} - - filename = str(default_filename or 'download.bin').strip() or 'download.bin' - ext = os.path.splitext(filename)[1].lower() - - # 根据默认文件名后缀动态设置文件类型,避免固定为 zip 造成误导 - if ext == '.zip': - file_types = ('ZIP 压缩包 (*.zip)', '所有文件 (*.*)') - elif ext in ('.xlsx', '.xls'): - file_types = ('Excel 文件 (*.xlsx;*.xls)', '所有文件 (*.*)') - elif ext == '.csv': - file_types = ('CSV 文件 (*.csv)', '所有文件 (*.*)') - elif ext == '.txt': - file_types = ('文本文件 (*.txt)', '所有文件 (*.*)') - elif ext == '.json': - file_types = ('JSON 文件 (*.json)', '所有文件 (*.*)') - else: - file_types = ('所有文件 (*.*)',) - - result = self._window.create_file_dialog( - webview.SAVE_DIALOG, - save_filename=filename, - file_types=file_types - ) - if not result: - return {'success': False, 'error': '用户取消'} - - path = result[0] if isinstance(result, (list, tuple)) else result - return self._download_url_to_path(url, path) - - def save_file_from_url_with_progress(self, url, default_filename='download.bin', download_id=''): - """弹窗选择保存位置,从 url 下载文件并通过前端事件上报下载进度。""" - print("调用到save_file_from_url_with_progress方法") - if not url or not url.strip(): - return {'success': False, 'error': '下载地址为空'} - - filename = str(default_filename or 'download.bin').strip() or 'download.bin' - ext = os.path.splitext(filename)[1].lower() - if ext == '.zip': - file_types = ('ZIP 压缩包 (*.zip)', '所有文件 (*.*)') - elif ext in ('.xlsx', '.xls'): - file_types = ('Excel 文件 (*.xlsx;*.xls)', '所有文件 (*.*)') - elif ext == '.csv': - file_types = ('CSV 文件 (*.csv)', '所有文件 (*.*)') - elif ext == '.txt': - file_types = ('文本文件 (*.txt)', '所有文件 (*.*)') - elif ext == '.json': - file_types = ('JSON 文件 (*.json)', '所有文件 (*.*)') - else: - file_types = ('所有文件 (*.*)',) - - result = self._window.create_file_dialog( - webview.SAVE_DIALOG, - save_filename=filename, - file_types=file_types - ) - if not result: - return {'success': False, 'error': '用户取消'} - - path = result[0] if isinstance(result, (list, tuple)) else result - progress_id = str(download_id or uuid.uuid4()) - return self._download_url_to_path(url, path, progress_id) - - def _download_url_to_path(self, url, path, download_id=''): - """先下载到临时文件,完整下载后再替换为最终文件,避免用户打开半成品。""" - final_path = os.path.abspath(path) - final_dir = os.path.dirname(final_path) or os.getcwd() - final_name = os.path.basename(final_path) - temp_path = os.path.join(final_dir, f".{final_name}.crdownload") - last_progress_emit = 0.0 - last_progress_percent = -1 - try: - os.makedirs(final_dir, exist_ok=True) - if os.path.exists(temp_path): - os.remove(temp_path) - resp = requests.get(url.strip(), timeout=120, stream=True) - resp.raise_for_status() - total = int(resp.headers.get('Content-Length') or 0) - downloaded = 0 - self._emit_download_progress(download_id, 'running', final_path, downloaded, total) - with open(temp_path, 'wb') as f: - self._hide_file(temp_path) - for chunk in resp.iter_content(chunk_size=65536): - if chunk: - f.write(chunk) - downloaded += len(chunk) - percent = int(downloaded * 100 / total) if total else 0 - now_time = time.time() - if percent != last_progress_percent or now_time - last_progress_emit >= 0.2: - self._emit_download_progress(download_id, 'running', final_path, downloaded, total) - last_progress_emit = now_time - last_progress_percent = percent - f.flush() - os.fsync(f.fileno()) - self._show_file(temp_path) - os.replace(temp_path, final_path) - self._emit_download_progress(download_id, 'success', final_path, downloaded, total) - return {'success': True, 'path': final_path} - except Exception as e: - try: - if os.path.exists(temp_path): - os.remove(temp_path) - except Exception: - pass - self._emit_download_progress(download_id, 'failed', final_path, 0, 0, str(e)) - return {'success': False, 'error': str(e)} - - def _emit_download_progress(self, download_id, status, path, downloaded, total, error=''): - if not download_id: - return - payload = { - 'id': download_id, - 'status': status, - 'path': path, - 'downloaded': downloaded, - 'total': total, - 'percent': round(downloaded * 100 / total, 1) if total else 0, - 'error': error, - } - script = ( - "window.dispatchEvent(new CustomEvent('pywebview-download-progress', " - f"{{ detail: {json.dumps(payload, ensure_ascii=False)} }}));" - ) - try: - self._window.evaluate_js(script) - except Exception: - pass - - def _hide_file(self, path): - """Windows 下隐藏临时下载文件,减少用户误打开半成品的机会。""" - if os.name != 'nt': - return - try: - ctypes.windll.kernel32.SetFileAttributesW(path, 0x02) - except Exception: - pass - - def _show_file(self, path): - """恢复普通文件属性,避免最终保存文件被隐藏。""" - if os.name != 'nt': - return - try: - ctypes.windll.kernel32.SetFileAttributesW(path, 0x80) - except Exception: - pass - - def save_template_xlsx(self): - """弹窗选择保存位置,将品牌文档格式模板 xlsx 保存到用户选择的位置。""" - template_name = '品牌文档格式_模板.xlsx' - template_path = os.path.join(BASE_DIR, 'static', template_name) - if not os.path.isfile(template_path): - return {'success': False, 'error': '模板文件不存在'} - result = self._window.create_file_dialog( - webview.SAVE_DIALOG, - save_filename=template_name, - file_types=('Excel 文件 (*.xlsx)', '所有文件 (*.*)') - ) - if not result: - return {'success': False, 'error': '用户取消'} - path = result[0] if isinstance(result, (list, tuple)) else result - try: - shutil.copy2(template_path, path) - return {'success': True, 'path': path} - except Exception as e: - return {'success': False, 'error': str(e)} - - def save_template_zip(self): - """弹窗选择保存位置,将品牌文档格式模板 xlsx 保存到用户选择的位置。""" - import shutil - template_name = '模板2-以文件夹方式上传.zip' - template_path = os.path.join(BASE_DIR, 'static', template_name) - if not os.path.isfile(template_path): - return {'success': False, 'error': '模板文件不存在'} - result = self._window.create_file_dialog( - webview.SAVE_DIALOG, - save_filename=template_name, - file_types=('ZIP 文件 (*.zip)', '所有文件 (*.*)') - ) - if not result: - return {'success': False, 'error': '用户取消'} - path = result[0] if isinstance(result, (list, tuple)) else result - try: - shutil.copy2(template_path, path) - return {'success': True, 'path': path} - except Exception as e: - return {'success': False, 'error': str(e)} - - def upload_file_to_java(self, file_path, relative_path=None): - """按本地路径读取文件并上传到 Java 后端临时目录。""" - if not file_path or not str(file_path).strip(): - return {'success': False, 'error': '文件路径为空'} - normalized_path = os.path.abspath(str(file_path).strip()) - if not os.path.isfile(normalized_path): - return {'success': False, 'error': '文件不存在'} - try: - with open(normalized_path, 'rb') as file_obj: - response = requests.post( - f"{JAVA_API_BASE}/api/files/upload", - files={'file': (os.path.basename(normalized_path), file_obj)}, - data={'relativePath': str(relative_path).strip()} if relative_path else None, - timeout=120, - ) - response.raise_for_status() - payload = response.json() - if not isinstance(payload, dict): - return {'success': False, 'error': 'Java 返回格式错误'} - return payload - except Exception as e: - return {'success': False, 'error': str(e)} - - def open_external_url(self, url): - if not url or not str(url).strip(): - return {'success': False, 'error': '链接为空'} - target = str(url).strip() - try: - if sys.platform.startswith('win'): - os.startfile(target) - elif sys.platform == 'darwin': - subprocess.Popen(['open', target]) - else: - subprocess.Popen(['xdg-open', target]) - return {'success': True} - except Exception as e: - return {'success': False, 'error': str(e)} - - def launch_yaoayanui(self): - candidates = [] - env_path = os.getenv('YAOAYANUI_EXE', '').strip() - if env_path: - candidates.append(env_path) - - candidates.extend([ - os.path.join(BASE_DIR, 'resources', 'yaoayanui', 'tauri-app.exe'), - os.path.abspath(os.path.join( - BASE_DIR, - '..', - '..', - 'yaoyaoAI', - 'yaoayanui', - 'src-tauri', - 'target', - 'release', - 'tauri-app.exe', - )), - os.path.abspath(os.path.join( - BASE_DIR, - '..', - '..', - 'yaoyaoAI', - 'yaoayanui', - 'src-tauri', - 'target', - 'release', - 'bundle', - 'nsis', - 'aiclient_0.1.15_x64-setup.exe', - )), - ]) - - exe_path = '' - for candidate in candidates: - if candidate and os.path.isfile(candidate): - exe_path = os.path.abspath(candidate) - break - - if not exe_path: - return { - 'success': False, - 'error': '未找到 yaoayanui 可执行文件,请设置 YAOAYANUI_EXE', - } - - try: - if sys.platform.startswith('win'): - subprocess.Popen( - [exe_path], - cwd=os.path.dirname(exe_path), - stdin=subprocess.DEVNULL, - stdout=subprocess.DEVNULL, - stderr=subprocess.DEVNULL, - creationflags=subprocess.DETACHED_PROCESS | subprocess.CREATE_NEW_PROCESS_GROUP, - ) - else: - subprocess.Popen( - [exe_path], - cwd=os.path.dirname(exe_path), - stdin=subprocess.DEVNULL, - stdout=subprocess.DEVNULL, - stderr=subprocess.DEVNULL, - ) - return {'success': True, 'path': exe_path} - except Exception as e: - return {'success': False, 'error': str(e)} - - def enqueue_json(self, data): - """保存任务到队列""" - try: - print("==============================") - print(datetime.datetime.now().strftime( "%Y-%m-%d %H:%M:%S"),"调用传入",data) - print("==================================") - payload = data - if isinstance(data, str): - payload = json.loads(data) - if not isinstance(payload, (dict, list)): - return {'success': False, 'error': '仅支持 JSON 对象或数组'} - # if payload.get("type") == "delete-brand-run" and payload.get("data").get("taskId") in runing_task: - # return {'success': False, 'error': '已存在正在执行的删除品牌任务'} - # 判断当前店铺是否正在运行中 - if payload.get("data",{}).get("shop_name"): - shop_name = payload.get("data",{}).get("shop_name") - if shop_name in runing_shop: - return {'success': False, 'error': f'当前店铺 {shop_name} 正在执行中,请等待店铺完成之后重试'} - if payload.get("data").get("items"): - shop_name = payload["data"]["items"][0]["shopName"] - if shop_name in runing_shop: - return {'success': False, 'error': f'当前店铺 {shop_name} 正在执行中,请等待店铺完成之后重试'} - JSON_TASK_QUEUE.put(payload) - return {'success': True, 'queue_size': JSON_TASK_QUEUE.qsize()} - except Exception as e: - return {'success': False, 'error': str(e)} - - def get_device_id(self): - """暴露给 HTML 的设备指纹接口:复用桌面端硬件特征生成 64 位 SHA256 ID。""" - try: - return {'success': True, 'device_id': DeviceIDGenerator().get_device_id()} - except Exception as e: - return {'success': False, 'error': str(e)} - - def get_detail_del(self,task_id): - """获取正在执行的删除品牌任务详情""" - task_info = runing_task.get(task_id) - if not task_info: - return {'success': False, 'error': '任务不存在'} - return {'success': True, 'task_info': task_info} - - def stop_task(self,task_id): - """停止正在执行的删除品牌任务""" - task_info = runing_task.get(task_id) - if not task_info: - return {'success': False, 'error': '任务不存在'} - # 这里可以设置一个标志位,实际的删除品牌任务需要定期检查这个标志位来决定是否停止 - task_info['stop_requested'] = True - return {'success': True, 'message': '已请求停止任务'} - - -def start_flask(): - run_app(host='127.0.0.1', port=PORT) - - -def start_task_monitor(): - """启动任务监控器(在独立线程中运行)""" - monitor = TaskMonitor() - try: - print(f"[{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] 任务监控线程已启动") - monitor.start() - except Exception: - import traceback - print(f"[{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] 任务监控线程异常退出: {traceback.format_exc()}") - - -def on_window_closing(): - """窗口关闭事件处理器,异步执行清理逻辑,避免阻塞UI""" - def cleanup_and_exit(): - """后台清理线程""" - try: - kill_process('v6') - except Exception as e: - print(f"【退出前】关闭紫鸟浏览器进程异常: {str(e)}") - finally: - # 给一点时间让清理完成,然后强制退出 - time.sleep(0.5) - os._exit(0) - - print("=================程序退出=====================") - # 立即在后台线程执行清理,不阻塞窗口关闭 - cleanup_thread = threading.Thread(target=cleanup_and_exit, daemon=True) - cleanup_thread.start() - # 立即返回,让窗口快速关闭,用户不会感觉卡顿 - return True - - -def main(): - if not os.path.exists(cache_path): - os.makedirs(cache_path,exist_ok=True) - - # 启动 Flask 服务 - t = threading.Thread(target=start_flask, daemon=True) - t.start() - - # 启动任务监控线程 - monitor_thread = threading.Thread(target=start_task_monitor, daemon=True) - monitor_thread.start() - - # 等待 Flask 启动 - time.sleep(2) - - window = webview.create_window( - title="数富AI", - url=APP_URL, - width=1400, - height=900, - resizable=True, - min_size=(1200, 700), - background_color="#1a1a1a", - frameless=False, - easy_drag=True - ) - - # 为窗口关闭事件添加处理器 - window.events.closing += on_window_closing - - api = WindowAPI(window) - window.expose(api.close, api.minimize, api.maximize, api.toggle_maximize, generate_images, api.save_image, api.save_image_to_folder, api.select_folder, api.select_brand_xlsx_files, api.select_brand_folder, - api.save_file_from_url, api.save_template_xlsx,api.save_template_zip,api.upload_file_to_java,api.open_external_url,api.launch_yaoayanui,api.enqueue_json,api.get_detail_del,api.save_file_from_url_new,api.save_file_from_url_with_progress,api.get_device_id) - webview.start( - debug=True, - storage_path=cache_path, - private_mode=False - ) - - -if __name__ == "__main__": - main() diff --git a/app/new_web_source/convert.html b/app/new_web_source/convert.html deleted file mode 100644 index 96c4cbd..0000000 --- a/app/new_web_source/convert.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - 格式转换 - 数富AI - - - - - - - - - -
- - diff --git a/app/new_web_source/dedupe.html b/app/new_web_source/dedupe.html deleted file mode 100644 index 2847168..0000000 --- a/app/new_web_source/dedupe.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - 数据去重 - 数富AI - - - - - - - - - -
- - diff --git a/app/new_web_source/split.html b/app/new_web_source/split.html deleted file mode 100644 index 7470aea..0000000 --- a/app/new_web_source/split.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - 数据拆分 - 数富AI - - - - - - - - - -
- - diff --git a/app/pyproject.toml b/app/pyproject.toml deleted file mode 100644 index f5f2534..0000000 --- a/app/pyproject.toml +++ /dev/null @@ -1,102 +0,0 @@ -[project] -name = "crawler-desktop-app" -version = "0.1.0" -description = "Desktop crawler app backend and pywebview shell." -requires-python = ">=3.9,<3.10" -dependencies = [ - "alibabacloud-oss-v2==1.2.4", - "altgraph==0.17.5", - "annotated-types==0.7.0", - "anyio==4.12.1", - "Authlib==1.6.8", - "blinker==1.9.0", - "bottle==0.13.4", - "certifi==2026.1.4", - "cffi==2.0.0", - "charset-normalizer==3.4.4", - "click==8.1.8", - "clr_loader==0.2.10", - "colorama==0.4.6", - "cozepy==0.20.0", - "crcmod-plus==2.3.1", - "cryptography==41.0.0", - "cssselect==1.3.0", - "DataRecorder==3.6.2", - "distro==1.9.0", - "DownloadKit==2.0.7", - "DrissionPage==4.1.1.2", - "et_xmlfile==2.0.0", - "exceptiongroup==1.3.1", - "filelock==3.19.1", - "Flask==3.1.3", - "flask-cors==6.0.2", - "h11==0.16.0", - "httpcore==1.0.9", - "httpx==0.28.1", - "idna==3.11", - "importlib_metadata==8.7.1", - "itsdangerous==2.2.0", - "Jinja2==3.1.6", - "loguru>=0.7.3", - "lxml==6.0.2", - "MarkupSafe==3.0.3", - "MouseInfo==0.1.3", - "Nuitka==2.8.6", - "numpy==1.25.2", - "openpyxl==3.1.5", - "ordered-set==4.1.0", - "packaging==26.0", - "pandas==2.3.3", - "pefile==2024.8.26", - "pillow==11.3.0", - "proxy_tools==0.1.0", - "psutil==7.2.2", - "PyAutoGUI==0.9.54", - "pycparser==2.23", - "pycryptodome==3.23.0", - "pydantic==2.12.5", - "pydantic_core==2.41.5", - "PyGetWindow==0.0.9", - "pyinstaller==6.19.0", - "pyinstaller-hooks-contrib==2026.3", - "PyMsgBox==2.0.1", - "PyMySQL==1.1.2", - "pyperclip==1.11.0", - "PyQt5==5.15.11", - "PyQt5-Qt5==5.15.2", - "PyQt5_sip==12.17.1", - "PyRect==0.2.0", - "PyScreeze==1.0.1", - "python-dateutil==2.9.0.post0", - "python-dotenv==1.2.1", - "pythonnet==3.0.5", - "pytweening==1.2.0", - "pytz==2026.1.post1", - "pywebview==6.1", - "pywin32-ctypes==0.2.3", - "requests==2.32.5", - "requests-file==3.0.1", - "six==1.17.0", - "tldextract==5.3.0", - "typing-inspection==0.4.2", - "typing_extensions==4.15.0", - "tzdata==2025.3", - "urllib3==2.6.3", - "websocket-client==1.9.0", - "websockets==14.2", - "Werkzeug==3.1.6", - "zipp==3.23.0", - "zstandard==0.25.0", -] - -[tool.uv] -package = false - -[tool.pytest.ini_options] -pythonpath = ["."] - -[dependency-groups] -dev = [ - "pytest>=8.4.2", - "ruff>=0.14.0", -] diff --git a/app/requirements.txt b/app/requirements.txt deleted file mode 100644 index e4a8a87..0000000 --- a/app/requirements.txt +++ /dev/null @@ -1,83 +0,0 @@ -alibabacloud-oss-v2==1.2.4 -altgraph==0.17.5 -annotated-types==0.7.0 -anyio==4.12.1 -Authlib==1.6.8 -blinker==1.9.0 -bottle==0.13.4 -certifi==2026.1.4 -cffi==2.0.0 -charset-normalizer==3.4.4 -click==8.1.8 -clr_loader==0.2.10 -colorama==0.4.6 -cozepy==0.20.0 -crcmod-plus==2.3.1 -cryptography==41.0.0 -cssselect==1.3.0 -DataRecorder==3.6.2 -distro==1.9.0 -DownloadKit==2.0.7 -DrissionPage==4.1.1.2 -et_xmlfile==2.0.0 -exceptiongroup==1.3.1 -filelock==3.19.1 -Flask==3.1.3 -flask-cors==6.0.2 -h11==0.16.0 -httpcore==1.0.9 -httpx==0.28.1 -idna==3.11 -importlib_metadata==8.7.1 -itsdangerous==2.2.0 -Jinja2==3.1.6 -lxml==6.0.2 -MarkupSafe==3.0.3 -MouseInfo==0.1.3 -Nuitka==2.8.6 -numpy==1.25.2 -openpyxl==3.1.5 -ordered-set==4.1.0 -packaging==26.0 -pandas==2.3.3 -pefile==2024.8.26 -pillow==11.3.0 -proxy_tools==0.1.0 -psutil==7.2.2 -PyAutoGUI==0.9.54 -pycparser==2.23 -pycryptodome==3.23.0 -pydantic==2.12.5 -pydantic_core==2.41.5 -PyGetWindow==0.0.9 -pyinstaller==6.19.0 -pyinstaller-hooks-contrib==2026.3 -PyMsgBox==2.0.1 -PyMySQL==1.1.2 -PyJWT==2.10.1 -pyperclip==1.11.0 -PyQt5==5.15.11 -PyQt5-Qt5==5.15.2 -PyQt5_sip==12.17.1 -PyRect==0.2.0 -PyScreeze==1.0.1 -python-dateutil==2.9.0.post0 -python-dotenv==1.2.1 -pythonnet==3.0.5 -pytweening==1.2.0 -pytz==2026.1.post1 -pywebview==6.1 -pywin32-ctypes==0.2.3 -requests==2.32.5 -requests-file==3.0.1 -six==1.17.0 -tldextract==5.3.0 -typing-inspection==0.4.2 -typing_extensions==4.15.0 -tzdata==2025.3 -urllib3==2.6.3 -websocket-client==1.9.0 -websockets==14.2 -Werkzeug==3.1.6 -zipp==3.23.0 -zstandard==0.25.0 diff --git a/app/static/bg.jpg b/app/static/bg.jpg deleted file mode 100644 index 2775db8..0000000 Binary files a/app/static/bg.jpg and /dev/null differ diff --git a/app/static/品牌文档格式_模板.xlsx b/app/static/品牌文档格式_模板.xlsx deleted file mode 100644 index e69cd70..0000000 Binary files a/app/static/品牌文档格式_模板.xlsx and /dev/null differ diff --git a/app/static/模板2-以文件夹方式上传.zip b/app/static/模板2-以文件夹方式上传.zip deleted file mode 100644 index 5ccf933..0000000 Binary files a/app/static/模板2-以文件夹方式上传.zip and /dev/null differ diff --git a/app/tests/conftest.py b/app/tests/conftest.py deleted file mode 100644 index e69de29..0000000 diff --git a/app/tests/test_amazon_base.py b/app/tests/test_amazon_base.py deleted file mode 100644 index 01d4ece..0000000 --- a/app/tests/test_amazon_base.py +++ /dev/null @@ -1,411 +0,0 @@ -import json - -import pytest -from amazon import base - - -class FakeResponse: - def __init__(self, payload): - self.payload = payload - - def json(self): - return self.payload - - -class FakeWait: - def __init__(self, *, raise_on_doc_loaded=False): - self.doc_loaded_calls = [] - self.displayed_calls = [] - self.raise_on_doc_loaded = raise_on_doc_loaded - - def doc_loaded(self, **kwargs): - if self.raise_on_doc_loaded: - raise RuntimeError("doc load failed") - self.doc_loaded_calls.append(kwargs) - - def displayed(self, **kwargs): - self.displayed_calls.append(kwargs) - return True - - -class FakeElement: - def __init__(self, *, text="", value=None): - self.text = text - self.value = value - self.clicks = 0 - self.inputs = [] - self.wait = FakeWait() - - def click(self, *args, **kwargs): - self.clicks += 1 - - def input(self, value, clear=False): - self.inputs.append((value, clear)) - - -class FakeTab: - def __init__(self, *, ele_returns=None, eles_returns=None, raise_on_doc_loaded=False): - self.ele_returns = {key: list(values) for key, values in (ele_returns or {}).items()} - self.eles_returns = {key: list(values) for key, values in (eles_returns or {}).items()} - self.wait = FakeWait(raise_on_doc_loaded=raise_on_doc_loaded) - self.refreshes = 0 - - def ele(self, locator, timeout=None): - values = self.ele_returns.get(locator) - if not values: - return None - return values.pop(0) - - def eles(self, locator, timeout=None): - values = self.eles_returns.get(locator) - if not values: - return [] - return values.pop(0) - - def refresh(self): - self.refreshes += 1 - - -def test_ziniao_driver_initializes_browser_state(): - user_info = { - "company": "test-company", - "username": "test-user", - "password": "test-password", - } - - driver = base.ZiniaoDriver(user_info, socket_port=19999) - - assert driver.user_info is user_info - assert driver.socket_port == 19999 - assert driver.client_path is None - assert driver.browser is None - assert driver.tab is None - assert driver.store_id is None - - -def test_amazon_base_inherits_ziniao_driver(): - driver = base.AmamzonBase({}) - - assert isinstance(driver, base.ZiniaoDriver) - - -def test_kill_process_uses_ziniao_driver(monkeypatch): - calls = [] - - class FakeDriver: - def __init__(self, user_info): - calls.append(("init", user_info)) - - def kill_process(self, version): - calls.append(("kill_process", version)) - - monkeypatch.setattr(base, "ZiniaoDriver", FakeDriver) - - base.kill_process("v6") - - assert calls == [("init", {}), ("kill_process", "v6")] - - -def test_get_zinaio_exe_returns_none_when_winreg_unavailable(monkeypatch): - driver = base.ZiniaoDriver({}) - monkeypatch.setattr(base, "winreg", None) - messages = [] - sink_id = base.logger.add(messages.append, level="ERROR", format="{message}") - - try: - result = driver.get_zinaio_exe() - finally: - base.logger.remove(sink_id) - - assert result is None - assert any("winreg" in message for message in messages) - - -@pytest.mark.parametrize( - ("store_info", "expected_key"), - [ - ("12345", "browserId"), - ("oauth-token", "browserOauth"), - ], -) -def test_open_store_payload_uses_id_or_oauth(monkeypatch, store_info, expected_key): - payloads = [] - - def fake_post(url, data, timeout): - payloads.append(json.loads(data.decode("utf-8"))) - return FakeResponse({"statusCode": 0, "debuggingPort": 9222}) - - monkeypatch.setattr(base.requests, "post", fake_post) - - result = base.ZiniaoDriver({"company": "c"}).open_store(store_info) - - assert result["debuggingPort"] == 9222 - assert payloads[0]["action"] == "startBrowser" - assert payloads[0][expected_key] == store_info - - -@pytest.mark.parametrize( - ("payload", "expected"), - [ - ({"statusCode": 0, "browserList": [{"browserName": "shop"}]}, [{"browserName": "shop"}]), - ({"statusCode": -10003}, None), - ({"statusCode": 500, "message": "failed"}, None), - ], -) -def test_get_browser_list_status_handling(monkeypatch, payload, expected): - monkeypatch.setattr(base.requests, "post", lambda *args, **kwargs: FakeResponse(payload)) - - assert base.ZiniaoDriver({}).get_browser_list() == expected - - -def test_update_core_retries_none_then_returns_on_success(monkeypatch): - calls = [] - responses = [FakeResponse(None), FakeResponse({"statusCode": 0})] - - def fake_post(url, data, timeout): - calls.append(json.loads(data.decode("utf-8"))) - return responses.pop(0) - - monkeypatch.setattr(base.requests, "post", fake_post) - monkeypatch.setattr(base.time, "sleep", lambda seconds: None) - - base.ZiniaoDriver({}).update_core() - - assert [payload["action"] for payload in calls] == ["updateCore", "updateCore"] - - -def test_wait_until_client_ready_polls_until_available(monkeypatch): - readiness = [False, False, True] - sleeps = [] - driver = base.ZiniaoDriver({}) - monkeypatch.setattr(driver, "_is_client_ready", lambda: readiness.pop(0)) - monkeypatch.setattr(base.time, "sleep", lambda seconds: sleeps.append(seconds)) - - assert driver._wait_until_client_ready(timeout=10) is True - assert sleeps == [base.CLIENT_READY_INTERVAL, base.CLIENT_READY_INTERVAL] - - -def test_ziniao_webdriver_tail_redacts_password(monkeypatch, tmp_path): - appdata = tmp_path / "AppData" / "Roaming" - log_dir = appdata / "ziniaobrowser" / "instances" / "userdata1" / "logs" / "client" - log_dir.mkdir(parents=True) - log_file = log_dir / "webdriver.20260501.log" - log_file.write_text( - '[error] {"action":"updateCore","username":"u","password":"secret"}\n', - encoding="utf-8", - ) - messages = [] - - monkeypatch.setenv("APPDATA", str(appdata)) - monkeypatch.setattr(base.time, "strftime", lambda fmt: "20260501") - sink_id = base.logger.add(messages.append, level="ERROR", format="{message}") - - try: - base.ZiniaoDriver({})._log_ziniao_webdriver_tail() - finally: - base.logger.remove(sink_id) - - output = "\n".join(messages) - assert "webdriver.20260501.log" in output - assert '"password":"***"' in output - assert "secret" not in output - - -def test_close_store_success_uses_current_store(monkeypatch): - payloads = [] - - def fake_post(url, data, timeout): - payloads.append(json.loads(data.decode("utf-8"))) - return FakeResponse({"statusCode": 0, "ok": True}) - - monkeypatch.setattr(base.requests, "post", fake_post) - driver = base.ZiniaoDriver({}) - driver.store_id = "oauth-1" - - result = driver.close_store() - - assert result["ok"] is True - assert payloads[0]["action"] == "stopBrowser" - assert payloads[0]["browserOauth"] == "oauth-1" - - -def test_close_store_login_failure_raises(monkeypatch): - monkeypatch.setattr(base.requests, "post", lambda *args, **kwargs: FakeResponse({"statusCode": -10003})) - - with pytest.raises(RuntimeError, match="【close_store】登录失败"): - base.ZiniaoDriver({}).close_store("oauth-1") - - -def test_open_shop_returns_message_when_shop_missing(monkeypatch): - driver = base.ZiniaoDriver({}) - monkeypatch.setattr(driver, "start_client", lambda: None) - monkeypatch.setattr(driver, "get_browser_list", lambda: [{"browserName": "other"}]) - - assert driver.open_shop("target") == "店铺不存在" - assert driver.store_id is None - - -def test_open_shop_opens_matching_store(monkeypatch): - opened_pages = [] - fake_browser = object() - driver = base.ZiniaoDriver({}) - monkeypatch.setattr(driver, "start_client", lambda: None) - monkeypatch.setattr(driver, "get_browser_list", lambda: [{"browserName": "target", "browserOauth": "oauth-1"}]) - monkeypatch.setattr( - driver, - "open_store", - lambda store_id: { - "browserOauth": "oauth-2", - "debuggingPort": 9222, - "ipDetectionPage": "https://ip-check", - "launcherPage": "https://launcher", - }, - ) - monkeypatch.setattr(driver, "get_browser", lambda port: fake_browser) - monkeypatch.setattr(driver, "open_ip_check", lambda browser, url: True) - monkeypatch.setattr(driver, "open_launcher_page", lambda page, browser: opened_pages.append((page, browser))) - - assert driver.open_shop("target") is fake_browser - assert driver.store_id == "oauth-2" - assert opened_pages == [("https://launcher", fake_browser)] - - -def test_switching_countries_returns_true_when_already_current(): - current_country = FakeElement(text="西班牙") - driver = base.AmamzonBase({}) - driver.browser = object() - driver.tab = FakeTab( - ele_returns={ - 'xpath://div[@class="dropdown-account-switcher-header-label"]/span[last()]': [current_country], - } - ) - - assert driver.switch_to_country("西班牙") is True - - -def test_switching_countries_returns_false_when_target_missing(monkeypatch): - monkeypatch.setattr(base.time, "sleep", lambda seconds: None) - driver = base.AmamzonBase({}) - driver.browser = object() - driver.tab = FakeTab( - ele_returns={ - 'xpath://div[@class="dropdown-account-switcher-header-label"]/span[last()]': [FakeElement(text="英国")], - 'xpath://div[@class="dropdown-account-switcher-header-label"]': [FakeElement()], - 'xpath://div[@class="dropdown-account-switcher-list-item"]': [FakeElement()], - 'xpath://div[@class="dropdown-account-switcher-list-item dropdown-account-switcher-list-item-indented" and @title="西班牙"]': [ - None - ], - } - ) - - assert driver.switch_to_country("西班牙") is False - - -def test_switching_countries_clicks_and_verifies_target(monkeypatch): - monkeypatch.setattr(base.time, "sleep", lambda seconds: None) - dropdown = FakeElement() - first_item = FakeElement() - target = FakeElement() - driver = base.AmamzonBase({}) - driver.browser = object() - driver.tab = FakeTab( - ele_returns={ - 'xpath://div[@class="dropdown-account-switcher-header-label"]/span[last()]': [ - FakeElement(text="英国"), - FakeElement(text="西班牙"), - ], - 'xpath://div[@class="dropdown-account-switcher-header-label"]': [dropdown], - 'xpath://div[@class="dropdown-account-switcher-list-item"]': [first_item], - 'xpath://div[@class="dropdown-account-switcher-list-item dropdown-account-switcher-list-item-indented" and @title="西班牙"]': [ - target - ], - } - ) - - assert driver.switch_to_country("西班牙") is True - assert dropdown.clicks == 1 - assert first_item.clicks == 1 - assert target.clicks == 1 - - -def test_open_country_dropdown_waits_for_delayed_country_list(monkeypatch): - monkeypatch.setattr(base.time, "sleep", lambda seconds: None) - dropdown = FakeElement() - first_item = FakeElement() - driver = base.AmamzonBase({}) - driver.tab = FakeTab( - ele_returns={ - 'xpath://div[@class="dropdown-account-switcher-header-label"]': [dropdown], - 'xpath://div[@class="dropdown-account-switcher-list-item"]': [None, first_item], - } - ) - - assert driver._open_country_dropdown() is True - assert dropdown.clicks == 2 - assert first_item.clicks == 1 - - -def test_login_returns_true_when_otp_submit_succeeds(monkeypatch): - monkeypatch.setattr(base.time, "sleep", lambda seconds: None) - password_input = FakeElement() - password_submit = FakeElement() - otp_input = FakeElement(value="123456") - otp_submit = FakeElement() - driver = base.AmamzonBase({}) - driver.tab = FakeTab( - eles_returns={ - 'xpath://input[@type="password"]': [[password_input]], - 'xpath://input[@id="signInSubmit"]': [[password_submit]], - 'xpath://span[@id="auth-send-code" and contains(string(.),"发送一次性密码")]': [[]], - 'xpath://input[@name="otpCode"]': [[otp_input]], - 'xpath://input[@id="auth-signin-button"]': [[otp_submit]], - 'xpath://div[@id="auth-error-message-box"]': [[]], - } - ) - - assert driver.login("secret") is True - assert password_input.inputs == [("secret", True)] - assert password_submit.clicks == 1 - assert otp_submit.clicks == 1 - - -def test_login_refreshes_on_otp_error(monkeypatch): - monkeypatch.setattr(base.time, "sleep", lambda seconds: None) - otp_input = FakeElement(value="123456") - driver = base.AmamzonBase({}) - driver.tab = FakeTab( - eles_returns={ - 'xpath://input[@type="password"]': [[]], - 'xpath://input[@id="signInSubmit"]': [[]], - 'xpath://span[@id="auth-send-code" and contains(string(.),"发送一次性密码")]': [[]], - 'xpath://input[@name="otpCode"]': [[otp_input]], - 'xpath://input[@id="auth-signin-button"]': [[FakeElement()]], - 'xpath://div[@id="auth-error-message-box"]': [[FakeElement(text="验证码错误")]], - } - ) - - assert driver.login("secret") is False - assert driver.tab.refreshes == 1 - - -def test_login_returns_false_when_no_otp_input(monkeypatch): - monkeypatch.setattr(base.time, "sleep", lambda seconds: None) - driver = base.AmamzonBase({}) - driver.tab = FakeTab( - eles_returns={ - 'xpath://input[@type="password"]': [[]], - 'xpath://input[@id="signInSubmit"]': [[]], - 'xpath://span[@id="auth-send-code" and contains(string(.),"发送一次性密码")]': [[]], - 'xpath://input[@name="otpCode"]': [[]], - 'xpath://input[@id="auth-signin-button"]': [[]], - } - ) - - assert driver.login("secret") is False - - -def test_login_returns_false_on_exception(): - driver = base.AmamzonBase({}) - driver.tab = FakeTab(raise_on_doc_loaded=True) - - assert driver.login("secret") is False diff --git a/app/tests/test_patrol_delete.py b/app/tests/test_patrol_delete.py deleted file mode 100644 index 18bcb23..0000000 --- a/app/tests/test_patrol_delete.py +++ /dev/null @@ -1,1243 +0,0 @@ -from amazon.patrol_delete import InventoryManage, PatrolDeleteTask - - -def test_patrol_delete_task_post_result_builds_patrol_delete_payload(monkeypatch): - captured = {} - - class Response: - status_code = 200 - text = '{"success":true}' - - def json(self): - return {"success": True} - - def fake_post(url, **kwargs): - captured["url"] = url - captured["kwargs"] = kwargs - return Response() - - monkeypatch.setattr("config.DELETE_BRAND_API_BASE", "http://java.example") - monkeypatch.setattr("amazon.patrol_delete.requests.post", fake_post) - - country_sections = [ - { - "country": "德国", - "rows": [{"status": "正常", "quantity": "12", "deleteQuantity": "3", "processStatus": "处理中"}], - } - ] - cart_ratios = [{"country": "德国", "ratio": "25%"}] - - PatrolDeleteTask().post_result( - task_id=3089, - shop_name="郭亚芳", - country_sections=country_sections, - cart_ratios=cart_ratios, - shop_done=True, - ) - - assert captured["url"] == "http://java.example/api/patrol-delete/tasks/3089/result" - assert captured["kwargs"]["headers"] == {"Content-Type": "application/json"} - assert captured["kwargs"]["timeout"] == 30 - assert captured["kwargs"]["verify"] is False - assert captured["kwargs"]["json"]["shops"] == [ - { - "shopName": "郭亚芳", - "shopDone": True, - "submissionId": captured["kwargs"]["json"]["shops"][0]["submissionId"], - "chunkIndex": 1, - "chunkTotal": 1, - "countrySections": country_sections, - "cartRatios": cart_ratios, - } - ] - assert captured["kwargs"]["json"]["shops"][0]["submissionId"].startswith("patrol-delete:3089:郭亚芳:") - - -def test_patrol_delete_task_post_result_rejects_empty_success_payload(monkeypatch): - calls = [] - - def fake_post(url, **kwargs): - calls.append((url, kwargs)) - raise AssertionError("empty success payload must not be posted") - - monkeypatch.setattr("amazon.patrol_delete.requests.post", fake_post) - - try: - PatrolDeleteTask().post_result(task_id=3089, shop_name="郭亚芳", country_sections=[], cart_ratios=[]) - except RuntimeError as exc: - assert "缺少国家状态数据" in str(exc) - else: - raise AssertionError("expected empty success payload to fail") - - assert calls == [] - - -def test_patrol_delete_task_post_result_retries_business_failure(monkeypatch): - calls = [] - - class Response: - status_code = 200 - text = '{"success":false,"message":"bad payload"}' - - def json(self): - return {"success": False, "message": "bad payload"} - - def fake_post(url, **kwargs): - calls.append((url, kwargs)) - return Response() - - monkeypatch.setattr("config.DELETE_BRAND_API_BASE", "http://java.example") - monkeypatch.setattr("amazon.patrol_delete.requests.post", fake_post) - monkeypatch.setattr("amazon.patrol_delete.time.sleep", lambda seconds: None) - - try: - PatrolDeleteTask().post_result( - task_id=3089, - shop_name="郭亚芳", - country_sections=[{"country": "德国", "rows": [{"status": "全部", "quantity": "1"}]}], - cart_ratios=[{"country": "德国", "ratio": ""}], - ) - except RuntimeError as exc: - assert "最终失败" in str(exc) - else: - raise AssertionError("expected Java business failure to fail") - - assert len(calls) == 3 - - -def test_normalize_country_sections_keeps_status_fields_for_complete_draft_rows(): - rows = PatrolDeleteTask._normalize_country_sections_for_result( - [ - { - "country": "意大利", - "rows": [ - { - "status": "商品信息草稿", - "quantity": "12", - "deleteQuantity": "3", - "processStatus": "已完成", - }, - { - "status": "缺少的信息", - "quantity": "1", - "deleteQuantity": "1", - "processStatus": "已完成", - }, - ], - } - ] - ) - - assert rows == [ - { - "country": "意大利", - "rows": [ - {"status": "商品信息草稿", "quantity": "12", "deleteQuantity": "3", "processStatus": "已完成"}, - {"status": "缺少的信息", "quantity": "1", "deleteQuantity": "1", "processStatus": "已完成"}, - ], - } - ] - - -def test_replace_complete_draft_rows_uses_quick_view_rows(): - country_section = { - "country": "西班牙", - "rows": [ - {"status": "全部", "quantity": "6230", "deleteQuantity": "0", "processStatus": "无可删商品"}, - {"status": "商品信息草稿", "quantity": "", "deleteQuantity": "0", "processStatus": ""}, - ], - } - complete_draft_section = { - "country": "西班牙", - "rows": [ - {"type": "completeDraft", "quantity": "1", "deleteQuantity": "1", "processStatus": "已完成"}, - {"type": "completeDraft", "quantity": "0", "deleteQuantity": "0", "processStatus": ""}, - ], - } - - merged = PatrolDeleteTask._replace_complete_draft_rows(country_section, complete_draft_section) - - assert merged == { - "country": "西班牙", - "rows": [ - {"status": "全部", "quantity": "6230", "deleteQuantity": "0", "processStatus": "无可删商品"}, - {"type": "completeDraft", "quantity": "1", "deleteQuantity": "1", "processStatus": "已完成"}, - {"type": "completeDraft", "quantity": "0", "deleteQuantity": "0", "processStatus": ""}, - ], - } - assert PatrolDeleteTask._normalize_country_sections_for_result([merged]) == [ - { - "country": "西班牙", - "rows": [ - {"status": "全部", "quantity": "6230", "deleteQuantity": "0", "processStatus": "无可删商品"}, - {"status": "商品信息草稿", "quantity": "1", "deleteQuantity": "1", "processStatus": "已完成"}, - {"status": "商品信息草稿", "quantity": "0", "deleteQuantity": "0", "processStatus": ""}, - ], - } - ] - - -def test_patrol_delete_task_process_task_aggregates_country_results(monkeypatch): - from config import runing_shop, runing_task - - runing_task.clear() - runing_shop.clear() - calls = [] - - class Driver: - def close_store(self): - return None - - def fake_post_result(self, **kwargs): - calls.append(kwargs) - - def fake_open_shop(self, **kwargs): - return Driver() - - def fake_process_country(self, driver, task_id, shop_name, country_name, delete_conditions=None): - if country_name == "德国": - return { - "success": True, - "countrySection": { - "country": "德国", - "rows": [ - { - "status": "商品信息草稿", - "quantity": "0", - "deleteQuantity": "2", - "processStatus": "已完成", - } - ], - }, - "cartRatio": {"country": "德国", "ratio": "25%"}, - "deletedCount": 2, - "reopenRequired": False, - } - return { - "success": False, - "countrySection": { - "country": "英国", - "rows": [ - { - "status": "全部", - "quantity": "", - "deleteQuantity": "", - "processStatus": "处理失败: 切换国家失败", - } - ], - }, - "cartRatio": {"country": "英国", "ratio": ""}, - "deletedCount": 0, - "reopenRequired": True, - } - - monkeypatch.setattr(PatrolDeleteTask, "open_shop", fake_open_shop) - monkeypatch.setattr(PatrolDeleteTask, "process_country", fake_process_country) - monkeypatch.setattr(PatrolDeleteTask, "post_result", fake_post_result) - - country_sections = [ - {"country": "德国", "rows": [{"status": "全部", "quantity": "", "deleteQuantity": "", "processStatus": ""}]}, - {"country": "英国", "rows": [{"status": "全部", "quantity": "", "deleteQuantity": "", "processStatus": ""}]}, - ] - cart_ratios = [{"country": "德国", "ratio": ""}, {"country": "英国", "ratio": ""}] - PatrolDeleteTask().process_task( - { - "type": "patrol-delete-run", - "data": { - "taskId": 1, - "items": [{"shopName": "郭亚芳", "companyName": "rongchuang123"}], - "country_sections": country_sections, - "cart_ratios": cart_ratios, - }, - } - ) - - assert runing_task[1]["status"] == "completed" - assert runing_task[1]["processed_shops"] == 1 - assert runing_task[1]["processed_countries"] == 2 - assert runing_task[1]["success_count"] == 1 - assert runing_task[1]["failed_count"] == 0 - assert runing_task[1]["failed_countries"] == 1 - assert runing_task[1]["deleted_listings_count"] == 2 - assert "郭亚芳" not in runing_shop - assert calls == [ - { - "task_id": 1, - "shop_name": "郭亚芳", - "shop_done": False, - "heartbeat_only": True, - }, - { - "task_id": 1, - "shop_name": "郭亚芳", - "shop_done": False, - "heartbeat_only": True, - }, - { - "task_id": 1, - "shop_name": "郭亚芳", - "country_sections": [ - { - "country": "德国", - "rows": [ - { - "status": "商品信息草稿", - "quantity": "0", - "deleteQuantity": "2", - "processStatus": "已完成", - } - ], - }, - { - "country": "英国", - "rows": [ - { - "status": "全部", - "quantity": "", - "deleteQuantity": "", - "processStatus": "处理失败: 切换国家失败", - } - ], - }, - ], - "cart_ratios": [{"country": "德国", "ratio": "25%"}, {"country": "英国", "ratio": ""}], - "shop_done": True, - } - ] - - -def test_patrol_delete_task_process_task_skips_missing_required_data(monkeypatch): - calls = [] - - def fake_post_result(self, **kwargs): - calls.append(kwargs) - - monkeypatch.setattr(PatrolDeleteTask, "post_result", fake_post_result) - - PatrolDeleteTask().process_task({"type": "patrol-delete-run", "data": {"items": [{"shopName": "郭亚芳"}]}}) - PatrolDeleteTask().process_task({"type": "patrol-delete-run", "data": {"taskId": 1, "items": []}}) - - assert calls == [] - - -def test_patrol_delete_task_process_task_passes_delete_conditions(monkeypatch): - from config import runing_shop, runing_task - - runing_task.clear() - runing_shop.clear() - seen_conditions = [] - - class Driver: - def close_store(self): - return None - - def fake_open_shop(self, **kwargs): - return Driver() - - def fake_process_country(self, driver, task_id, shop_name, country_name, delete_conditions=None): - seen_conditions.append(delete_conditions) - return { - "success": True, - "countrySection": { - "country": country_name, - "rows": [{"status": "全部", "quantity": "", "deleteQuantity": "0", "processStatus": "无可删商品"}], - }, - "cartRatio": {"country": country_name, "ratio": ""}, - "deletedCount": 0, - "reopenRequired": False, - } - - monkeypatch.setattr(PatrolDeleteTask, "open_shop", fake_open_shop) - monkeypatch.setattr(PatrolDeleteTask, "process_country", fake_process_country) - monkeypatch.setattr(PatrolDeleteTask, "post_result", lambda self, **kwargs: None) - - PatrolDeleteTask().process_task( - { - "type": "patrol-delete-run", - "data": { - "taskId": 7, - "items": [{"shopName": "郭亚芳", "companyName": "rongchuang123"}], - "country_sections": [{"country": "德国", "rows": [{"status": "全部"}]}], - "delete_conditions": [{"id": 1, "conditionText": "商品信息草稿、补全草稿"}], - }, - } - ) - - assert seen_conditions == [["商品信息草稿", "补全草稿"]] - - -def test_delete_complete_draft_country_section_reports_delete_quantity(monkeypatch): - class Driver: - def delete_complete_drafts_from_non_whitelisted_tags(self, shop_name, country_name, **kwargs): - return { - "draftRows": [ - {"tag": "未提交的草稿", "quantity": 0}, - {"tag": "已提交:提供缺少的信息", "quantity": 2}, - ], - "deleteCounts": {"未提交的草稿": 3}, - "totalDeleted": 3, - } - - result = PatrolDeleteTask()._delete_complete_draft_country_section_safe( - Driver(), - "郭亚芳", - "德国", - ["未提交的草稿"], - ) - - assert result["deletedCount"] == 3 - assert result["countrySection"] == { - "country": "德国", - "rows": [ - { - "type": "completeDraft", - "status": "未提交的草稿", - "quantity": "0", - "deleteQuantity": "3", - "processStatus": "已完成", - }, - { - "type": "completeDraft", - "status": "已提交:提供缺少的信息", - "quantity": "2", - "deleteQuantity": "0", - "processStatus": "", - }, - ], - } - assert PatrolDeleteTask._normalize_country_sections_for_result([result["countrySection"]]) == [ - { - "country": "德国", - "rows": [ - {"status": "未提交的草稿", "quantity": "0", "deleteQuantity": "3", "processStatus": "已完成"}, - {"status": "已提交:提供缺少的信息", "quantity": "2", "deleteQuantity": "0", "processStatus": ""}, - ], - } - ] - - -def test_patrol_delete_task_reports_shop_error(monkeypatch): - from config import runing_shop, runing_task - - runing_task.clear() - runing_shop.clear() - calls = [] - - def fake_post_result(self, **kwargs): - calls.append(kwargs) - - def fake_open_shop(self, **kwargs): - return None - - monkeypatch.setattr(PatrolDeleteTask, "open_shop", fake_open_shop) - monkeypatch.setattr(PatrolDeleteTask, "post_result", fake_post_result) - - PatrolDeleteTask().process_task( - { - "type": "patrol-delete-run", - "data": { - "taskId": 2, - "items": [{"shopName": "郭亚芳", "companyName": "rongchuang123"}], - "country_sections": [{"country": "德国", "rows": [{"status": "全部"}]}], - }, - } - ) - - assert runing_task[2]["status"] == "completed" - assert runing_task[2]["processed_shops"] == 1 - assert runing_task[2]["success_count"] == 0 - assert runing_task[2]["failed_count"] == 1 - assert "郭亚芳" not in runing_shop - assert calls == [{"task_id": 2, "shop_name": "郭亚芳", "error": "店铺 郭亚芳 打开失败", "shop_done": True}] - - -def test_delete_all_listings_from_non_whitelisted_statuses_deletes_each_row_in_status(monkeypatch): - driver = InventoryManage({}) - status_rows = [ - [ - {"status": "商品信息草稿", "quantity": "2", "deleteQuantity": "", "processStatus": ""}, - {"status": "全部", "quantity": "9", "deleteQuantity": "", "processStatus": ""}, - ], - [ - {"status": "全部", "quantity": "7", "deleteQuantity": "", "processStatus": ""}, - ], - ] - state = {"index": 0, "selected": [], "deleted": 0} - - def fake_read_listing_status_rows_for_delete(shop_name, country, **kwargs): - current = status_rows[min(state["index"], len(status_rows) - 1)] - state["index"] += 1 - return current - - def fake_select_listing_status(status, **kwargs): - state["selected"].append(status) - - def fake_delete_selected_filtered_inventory_rows(status, **kwargs): - state["deleted"] += 2 - return { - "deletedCount": 2, - "target": {"sku": "bulk-selected", "rawText": "bulk-selected"}, - "successMessage": f"{status} 删除成功", - } - - monkeypatch.setattr(driver, "_read_listing_status_rows_for_delete", fake_read_listing_status_rows_for_delete) - monkeypatch.setattr(driver, "select_listing_status", fake_select_listing_status) - monkeypatch.setattr(driver, "_delete_selected_filtered_inventory_rows", fake_delete_selected_filtered_inventory_rows) - monkeypatch.setattr(driver, "_wait_inventory_loader", lambda timeout=5: None) - - result = driver.delete_all_listings_from_non_whitelisted_statuses( - "郭亚芳", - "德国", - delete_conditions=["商品信息草稿"], - ) - - assert state["selected"] == ["商品信息草稿"] - assert state["deleted"] == 2 - assert result["deleteCounts"] == {"商品信息草稿": 2} - assert result["totalDeleted"] == 2 - assert result["stopReason"] == "processed-candidates" - assert result["statusRows"] == [{"status": "全部", "quantity": "7", "deleteQuantity": "", "processStatus": ""}] - assert [item["target"]["sku"] for item in result["results"]] == ["bulk-selected"] - - -def test_delete_all_listings_from_non_whitelisted_statuses_respects_allowed_statuses(monkeypatch): - driver = InventoryManage({}) - state = {"selected": [], "deleted": 0} - - def fake_read_listing_status_rows_for_delete(shop_name, country, **kwargs): - return [ - {"status": "商品信息草稿", "quantity": "2", "deleteQuantity": "", "processStatus": ""}, - {"status": "缺少的信息", "quantity": "3", "deleteQuantity": "", "processStatus": ""}, - {"status": "全部", "quantity": "9", "deleteQuantity": "", "processStatus": ""}, - ] - - def fake_select_listing_status(status, **kwargs): - state["selected"].append(status) - - def fake_delete_selected_filtered_inventory_rows(status, **kwargs): - state["deleted"] += 1 - return { - "deletedCount": 1, - "target": {"sku": status, "rawText": status}, - "successMessage": f"{status} 删除成功", - } - - monkeypatch.setattr(driver, "_read_listing_status_rows_for_delete", fake_read_listing_status_rows_for_delete) - monkeypatch.setattr(driver, "select_listing_status", fake_select_listing_status) - monkeypatch.setattr(driver, "_delete_selected_filtered_inventory_rows", fake_delete_selected_filtered_inventory_rows) - monkeypatch.setattr(driver, "_wait_inventory_loader", lambda timeout=5: None) - - result = driver.delete_all_listings_from_non_whitelisted_statuses( - "郭亚芳", - "德国", - allowed_statuses=["缺少的信息"], - ) - - assert state["selected"] == ["缺少的信息"] - assert state["deleted"] == 3 - assert result["deleteCounts"] == {"缺少的信息": 3} - - -def test_delete_all_listings_from_non_whitelisted_statuses_empty_allowed_statuses_deletes_nothing(monkeypatch): - driver = InventoryManage({}) - state = {"selected": []} - - monkeypatch.setattr( - driver, - "_read_listing_status_rows_for_delete", - lambda shop_name, country, **kwargs: [{"status": "商品信息草稿", "quantity": "2"}], - ) - monkeypatch.setattr(driver, "select_listing_status", lambda status, **kwargs: state["selected"].append(status)) - - result = driver.delete_all_listings_from_non_whitelisted_statuses( - "郭亚芳", - "德国", - allowed_statuses=[], - ) - - assert state["selected"] == [] - assert result["deleteCandidates"] == [] - assert result["totalDeleted"] == 0 - - -def test_select_listing_status_uses_dropdown_option_not_visible_status(monkeypatch): - driver = InventoryManage({}) - calls = [] - - monkeypatch.setattr(driver, "open_listing_status_dropdown", lambda: calls.append("open") or {"ok": True}) - monkeypatch.setattr(driver, "_wait_inventory_loader", lambda timeout=5: None) - monkeypatch.setattr(driver, "_run_js", lambda script, *args: calls.append((script, args)) or {"ok": True}) - monkeypatch.setattr("amazon.patrol_delete.time.sleep", lambda seconds: None) - - result = driver.select_listing_status("商品信息草稿") - - assert result["mode"] == "dropdown-option" - assert calls[0] == "open" - assert calls[-1][1] == ({"status": "商品信息草稿"},) - - -def test_get_listing_status_dropdown_options_closes_dropdown_after_read(monkeypatch): - driver = InventoryManage({}) - calls = [] - - monkeypatch.setattr(driver, "open_listing_status_dropdown", lambda: calls.append("open") or {"ok": True}) - monkeypatch.setattr( - driver, - "_wait_listing_status_option_rows", - lambda: calls.append("read") or [{"raw_text": "详情页面已删除 (1)", "value": "DetailPageRemoved"}], - ) - monkeypatch.setattr(driver, "_close_listing_status_dropdown", lambda: calls.append("close")) - - rows = driver.get_listing_status_dropdown_options("郭亚芳", "德国") - - assert calls == ["open", "read", "close"] - assert rows[0]["status"] == "详情页面已删除" - - -def test_open_listing_status_dropdown_waits_until_component_enabled(monkeypatch): - driver = InventoryManage({}) - calls = [] - - class Wait: - def doc_loaded(self, raise_err=False): - calls.append("doc_loaded") - - class Tab: - wait = Wait() - - responses = [ - {"ok": False, "reason": "listing status dropdown disabled/loading"}, - {"ok": True, "selected": {"text": "全部在售不可售商品信息草稿"}}, - ] - - driver.tab = Tab() - monkeypatch.setattr(driver, "_wait_inventory_loader", lambda timeout=5: calls.append(("loader", timeout))) - monkeypatch.setattr(driver, "_run_js", lambda script: calls.append("js") or responses.pop(0)) - monkeypatch.setattr("amazon.patrol_delete.time.sleep", lambda seconds: calls.append(("sleep", seconds))) - - result = driver.open_listing_status_dropdown() - - assert result["ok"] is True - assert calls.count("js") == 2 - - -def test_extract_country_cart_ratio_prefers_ratio2daysago_only(): - ratio = PatrolDeleteTask._extract_country_cart_ratio( - [ - {"country": "德国", "ratio2DaysAgo": "25%", "ratio30DaysAgo": "19%"}, - {"country": "英国", "ratio30DaysAgo": "40%"}, - ], - "德国", - ) - missing_ratio2 = PatrolDeleteTask._extract_country_cart_ratio( - [{"country": "英国", "ratio30DaysAgo": "40%"}], - "英国", - ) - - assert ratio == {"country": "德国", "ratio": "25%"} - assert missing_ratio2 == {"country": "英国", "ratio": ""} - - -def test_parse_status_option_rows_keeps_value_and_raw_text(): - rows = InventoryManage._parse_status_option_rows( - [ - {"raw_text": "在售 (1,234)", "value": "Active"}, - {"raw_text": "禁止显示", "value": "SearchSuppressed"}, - ], - "郭亚芳", - "德国", - ) - - assert rows == [ - { - "shop_name": "郭亚芳", - "country": "德国", - "status": "在售", - "quantity": 1234, - "value": "Active", - "raw_text": "在售 (1,234)", - }, - { - "shop_name": "郭亚芳", - "country": "德国", - "status": "禁止显示", - "quantity": None, - "value": "SearchSuppressed", - "raw_text": "禁止显示", - }, - ] - - -def test_parse_status_text_accepts_chinese_parentheses(): - assert InventoryManage._parse_status_text("不可售(42)") == ("不可售", 42) - - -def test_parse_status_text_preserves_status_without_quantity(): - assert InventoryManage._parse_status_text("非在售") == ("非在售", None) - - -def test_parse_listing_status_section_rows_extracts_rendered_status_tabs(): - rows = InventoryManage._parse_listing_status_section_rows( - [ - { - "raw_text": ( - "全部(6182) 在售(4097) 在搜索结果中禁止显示(2) 不可售(2083) " - "详情页面已删除(2) 定价问题(1) 需要批准(2080) 商品信息草稿 缺少的信息(1)" - ) - } - ] - ) - - assert rows == [ - {"status": "全部", "quantity": "6182", "raw_text": "全部(6182)"}, - {"status": "在售", "quantity": "4097", "raw_text": "在售(4097)"}, - {"status": "在搜索结果中禁止显示", "quantity": "2", "raw_text": "在搜索结果中禁止显示(2)"}, - {"status": "不可售", "quantity": "2083", "raw_text": "不可售(2083)"}, - {"status": "详情页面已删除", "quantity": "2", "raw_text": "详情页面已删除(2)"}, - {"status": "定价问题", "quantity": "1", "raw_text": "定价问题(1)"}, - {"status": "需要批准", "quantity": "2080", "raw_text": "需要批准(2080)"}, - {"status": "商品信息草稿", "quantity": "", "raw_text": "商品信息草稿"}, - {"status": "缺少的信息", "quantity": "1", "raw_text": "缺少的信息(1)"}, - ] - - -def test_parse_listing_status_section_rows_supports_order_page_deleted_alias(): - rows = InventoryManage._parse_listing_status_section_rows( - [ - { - "raw_text": "不可售(2083) 订单页面已删除(2) 定价问题(1) 需要批准(2080)" - } - ] - ) - - assert rows == [ - {"status": "不可售", "quantity": "2083", "raw_text": "不可售(2083)"}, - {"status": "订单页面已删除", "quantity": "2", "raw_text": "订单页面已删除(2)"}, - {"status": "定价问题", "quantity": "1", "raw_text": "定价问题(1)"}, - {"status": "需要批准", "quantity": "2080", "raw_text": "需要批准(2080)"}, - ] - - -def test_build_country_section_rows_adds_required_placeholder_fields(): - rows = InventoryManage._build_country_section_rows( - [ - {"status": "正常", "quantity": "12"}, - {"status": "需要批准", "quantity": "2080"}, - ] - ) - - assert rows == [ - {"status": "正常", "quantity": "12", "deleteQuantity": "", "processStatus": ""}, - {"status": "需要批准", "quantity": "2080", "deleteQuantity": "", "processStatus": ""}, - ] - - -def test_parse_listing_status_section_rows_supports_latest_status_labels(): - rows = InventoryManage._parse_listing_status_section_rows( - [ - { - "raw_text": ( - "全部(10) 在售(4) 配送问题(1) 缺少报价(2) 已停售(3) " - "在搜索结果中禁止显示(0) 需要批准(0)" - ) - } - ] - ) - - assert rows == [ - {"status": "全部", "quantity": "10", "raw_text": "全部(10)"}, - {"status": "在售", "quantity": "4", "raw_text": "在售(4)"}, - {"status": "配送问题", "quantity": "1", "raw_text": "配送问题(1)"}, - {"status": "缺少报价", "quantity": "2", "raw_text": "缺少报价(2)"}, - {"status": "已停售", "quantity": "3", "raw_text": "已停售(3)"}, - {"status": "在搜索结果中禁止显示", "quantity": "0", "raw_text": "在搜索结果中禁止显示(0)"}, - {"status": "需要批准", "quantity": "0", "raw_text": "需要批准(0)"}, - ] - - -def test_build_deletable_status_rows_skips_whitelisted_statuses(): - rows = [ - {"status": "全部", "quantity": "12"}, - {"status": "定价问题", "quantity": "2"}, - {"status": "需要批准", "quantity": "3"}, - {"status": "在搜索结果中禁止显示", "quantity": "1"}, - {"status": "配送问题", "quantity": "5"}, - {"status": "缺少报价", "quantity": "4"}, - {"status": "已停售", "quantity": "6"}, - {"status": "不可售", "quantity": "8"}, - {"status": "在售", "quantity": "7"}, - ] - - assert InventoryManage._build_deletable_status_rows(rows) == [] - - -def test_build_deletable_status_rows_keeps_non_whitelisted_statuses(): - rows = [ - {"status": "商品信息草稿", "quantity": "2"}, - {"status": "自定义异常状态", "quantity": "5"}, - {"status": "全部", "quantity": "9"}, - ] - - assert InventoryManage._build_deletable_status_rows(rows, ["库存状态删除"]) == [ - {"status": "商品信息草稿", "canonicalStatus": "商品信息草稿", "quantity": 2}, - {"status": "自定义异常状态", "canonicalStatus": "自定义异常状态", "quantity": 5}, - ] - - -def test_build_deletable_status_rows_skips_group_labels_without_quantity(): - rows = [ - {"status": "商品信息草稿", "quantity": ""}, - {"status": "详情页面已删除", "quantity": None}, - {"status": "自定义异常状态", "quantity": "0"}, - {"status": "缺少的信息", "quantity": "1"}, - {"status": "全部", "quantity": ""}, - ] - - assert InventoryManage._build_deletable_status_rows(rows, ["库存状态删除"]) == [ - {"status": "缺少的信息", "canonicalStatus": "缺少的信息", "quantity": 1}, - ] - - -def test_build_deletable_status_rows_compatibility_map_prevents_whitelist_misdelete(): - rows = [ - {"status": "搜尋結果中禁止顯示", "quantity": "4"}, - {"status": "在搜索中禁止显示结果", "quantity": "1"}, - {"status": "配送問題", "quantity": "2"}, - {"status": "缺少報價", "quantity": "3"}, - ] - - assert InventoryManage._build_deletable_status_rows(rows) == [] - - -def test_build_deletable_status_rows_keeps_legacy_non_whitelist_statuses_deletable(): - rows = [ - {"status": "详情页面已删除", "quantity": "1"}, - {"status": "缺少的信息", "quantity": "2"}, - {"status": "订单页面已删除", "quantity": "3"}, - ] - - assert InventoryManage._build_deletable_status_rows(rows, ["库存状态删除"]) == [ - {"status": "详情页面已删除", "canonicalStatus": "详情页面已删除", "quantity": 1}, - {"status": "缺少的信息", "canonicalStatus": "缺少的信息", "quantity": 2}, - {"status": "订单页面已删除", "canonicalStatus": "详情页面已删除", "quantity": 3}, - ] - - -def test_build_deletable_status_rows_filters_by_delete_conditions(): - rows = [ - {"status": "商品信息草稿", "quantity": "2"}, - {"status": "缺少的信息", "quantity": "5"}, - {"status": "全部", "quantity": "9"}, - ] - - assert InventoryManage._build_deletable_status_rows(rows, ["商品信息草稿"]) == [ - {"status": "商品信息草稿", "canonicalStatus": "商品信息草稿", "quantity": 2}, - ] - assert InventoryManage._build_deletable_status_rows(rows, []) == [] - - -def test_build_deletable_complete_draft_tag_rows_respects_complete_draft_condition(): - rows = [ - {"tag": "未提交的草稿", "quantity": 1}, - {"tag": "已提交:提供缺少的信息", "quantity": 2}, - ] - - assert InventoryManage._build_deletable_complete_draft_tag_rows(rows, ["已提交:提供缺少的信息"]) == [ - {"tag": "已提交:提供缺少的信息", "canonicalTag": "已提交:提供缺少的信息", "quantity": 2}, - ] - assert InventoryManage._build_deletable_complete_draft_tag_rows(rows, ["补全草稿"]) == [ - {"tag": "未提交的草稿", "canonicalTag": "未提交的草稿", "quantity": 1}, - {"tag": "已提交:提供缺少的信息", "canonicalTag": "已提交:提供缺少的信息", "quantity": 2}, - ] - assert InventoryManage._build_deletable_complete_draft_tag_rows(rows, []) == [] - - -def test_parse_delete_condition_texts_accepts_frontend_payload_shapes(): - assert PatrolDeleteTask._parse_delete_condition_texts( - [ - {"id": 1, "conditionText": "商品信息草稿、缺少的信息"}, - {"id": 2, "condition_text": "补全草稿"}, - "详情页面已删除", - ] - ) == ["商品信息草稿", "缺少的信息", "补全草稿", "详情页面已删除"] - - -def test_resolve_delete_condition_texts_defaults_to_empty_list_when_missing(): - assert PatrolDeleteTask._resolve_delete_condition_texts({}) == [] - - -def test_is_delete_success_message_accepts_both_copy_variants(): - assert InventoryManage._is_delete_success_message("1 个商品已经删除。所作更改需要15分钟才会显示在商品详情页面上") - assert InventoryManage._is_delete_success_message("所做更改需要 15 分钟才会显示在商品详情页面上。 1 个商品已删除。") - - -def test_extract_delete_success_count_accepts_success_message(): - assert InventoryManage._extract_delete_success_count("所做更改需要 15 分钟才会显示在商品详情页面上。 3 个商品已删除。") == 3 - - -def test_build_country_section_result_sets_zero_delete_quantity_when_no_deletable_products(): - section = PatrolDeleteTask._build_country_section_result( - country_name="德国", - status_rows=[{"status": "全部", "quantity": "12"}], - delete_counts={}, - default_process_status="无可删商品", - ) - - assert section == { - "country": "德国", - "rows": [{"status": "全部", "quantity": "12", "deleteQuantity": "无需删除", "processStatus": "无可删商品"}], - } - - -def test_build_country_section_result_sets_zero_delete_quantity_for_empty_no_deletable_result(): - section = PatrolDeleteTask._build_country_section_result( - country_name="德国", - status_rows=[], - delete_counts={}, - default_process_status="无可删商品", - ) - - assert section == { - "country": "德国", - "rows": [{"status": "全部", "quantity": "", "deleteQuantity": "无需删除", "processStatus": "无可删商品"}], - } - - -def test_parse_label_quantity_text_accepts_complete_draft_sample(): - assert InventoryManage._parse_label_quantity_text("未提交的草稿 (0)") == ("未提交的草稿", 0) - - -def test_parse_label_quantity_text_preserves_long_colon_label(): - assert InventoryManage._parse_label_quantity_text("已提交:提供缺少的信息 (1)") == ( - "已提交:提供缺少的信息", - 1, - ) - - -def test_parse_label_quantity_text_accepts_chinese_parentheses(): - assert InventoryManage._parse_label_quantity_text("已提交:查看限制(0)") == ("已提交:查看限制", 0) - - -def test_parse_label_quantity_text_accepts_dynamic_text_and_thousands(): - assert InventoryManage._parse_label_quantity_text("Some dynamic label (1,234)") == ( - "Some dynamic label", - 1234, - ) - - -def test_parse_label_quantity_text_rejects_empty_missing_quantity_and_numeric_label(): - assert InventoryManage._parse_label_quantity_text("") is None - assert InventoryManage._parse_label_quantity_text("没有数量") is None - assert InventoryManage._parse_label_quantity_text("123 (4)") is None - assert InventoryManage._parse_label_quantity_text("未提交的草稿 (0) 已提交:提供缺少的信息 (1)") is None - - -def test_parse_quick_view_tag_rows_supports_raw_and_split_dom_rows(): - rows = InventoryManage._parse_quick_view_tag_rows( - [ - {"raw_text": "未提交的草稿 (0)"}, - {"raw_text": "未提交的草稿 (0)"}, - {"label_text": "已提交:提供缺少的信息", "quantity_text": "1"}, - {"raw_text": "没有数量"}, - ], - "郭亚芳", - "德国", - ) - - assert rows == [ - { - "shop_name": "郭亚芳", - "country": "德国", - "tag": "未提交的草稿", - "quantity": 0, - "raw_text": "未提交的草稿 (0)", - }, - { - "shop_name": "郭亚芳", - "country": "德国", - "tag": "已提交:提供缺少的信息", - "quantity": 1, - "raw_text": "已提交:提供缺少的信息 (1)", - }, - ] - - -def test_parse_quick_view_tag_rows_filters_navigation_and_pagination_noise(): - rows = InventoryManage._parse_quick_view_tag_rows( - [ - {"raw_text": "补全草稿 (1)"}, - {"raw_text": "未提交的草稿 (0)"}, - {"raw_text": "已提交:提供缺少的信息 (1)"}, - {"raw_text": "已提交:查看限制 (0)"}, - {"raw_text": "商品信息草稿 至 0 / 0 (0)"}, - {"raw_text": "页面 / 0 (0)"}, - ], - "郭亚芳", - "德国", - ) - - assert rows == [ - { - "shop_name": "郭亚芳", - "country": "德国", - "tag": "未提交的草稿", - "quantity": 0, - "raw_text": "未提交的草稿 (0)", - }, - { - "shop_name": "郭亚芳", - "country": "德国", - "tag": "已提交:提供缺少的信息", - "quantity": 1, - "raw_text": "已提交:提供缺少的信息 (1)", - }, - { - "shop_name": "郭亚芳", - "country": "德国", - "tag": "已提交:查看限制", - "quantity": 0, - "raw_text": "已提交:查看限制 (0)", - }, - ] - - -def test_parse_cart_ratio_rows_extracts_chinese_day_ratios(): - rows = InventoryManage._parse_cart_ratio_rows( - [{"raw_text": "推荐报价百分比 2 天前 25% 30 天前 30%"}], - "德国", - ) - - assert rows == {"country": "德国", "ratio2DaysAgo": "25%", "ratio30DaysAgo": "30%"} - - -def test_parse_cart_ratio_rows_extracts_english_day_ratios(): - rows = InventoryManage._parse_cart_ratio_rows( - [{"raw_text": "Featured Offer Percentage 2 days ago 25.5% 30 days ago 30%"}], - "英国", - ) - - assert rows == {"country": "英国", "ratio2DaysAgo": "25.5%", "ratio30DaysAgo": "30%"} - - -def test_parse_cart_ratio_rows_supports_percent_before_day_label(): - rows = InventoryManage._parse_cart_ratio_rows( - [{"raw_text": "25% 2 天前 30% 30 天前"}], - "法国", - ) - - assert rows == {"country": "法国", "ratio2DaysAgo": "25%", "ratio30DaysAgo": "30%"} - - -def test_parse_cart_ratio_rows_returns_empty_for_missing_day(): - rows = InventoryManage._parse_cart_ratio_rows( - [{"raw_text": "推荐报价百分比 2 天前 25%"}], - "意大利", - ) - - assert rows == {"country": "意大利", "ratio2DaysAgo": "25%", "ratio30DaysAgo": ""} - - -def test_parse_all_cart_ratio_rows_extracts_all_target_countries_without_switching(): - rows = InventoryManage._parse_all_cart_ratio_rows( - [ - { - "raw_text": ( - "推荐报价百分比 商城 2 天前 30 天前 " - "欧洲 60% 64% " - "英国 50% 61% " - "德国 57% 65% " - "法国 81% 77% " - "西班牙 70% 70% " - "意大利 70% 62%" - ) - } - ] - ) - - assert rows == [ - {"country": "欧洲", "ratio2DaysAgo": "60%", "ratio30DaysAgo": "64%"}, - {"country": "英国", "ratio2DaysAgo": "50%", "ratio30DaysAgo": "61%"}, - {"country": "德国", "ratio2DaysAgo": "57%", "ratio30DaysAgo": "65%"}, - {"country": "法国", "ratio2DaysAgo": "81%", "ratio30DaysAgo": "77%"}, - {"country": "西班牙", "ratio2DaysAgo": "70%", "ratio30DaysAgo": "70%"}, - {"country": "意大利", "ratio2DaysAgo": "70%", "ratio30DaysAgo": "62%"}, - ] - - -def test_parse_all_cart_ratio_rows_prefers_direct_rendered_country_rows(): - rows = InventoryManage._parse_all_cart_ratio_rows( - [ - {"country": "欧洲", "ratio2DaysAgo": "60 %", "ratio30DaysAgo": "64%", "source": "rendered-country-row"}, - {"country": "英国", "ratio2DaysAgo": "50%", "ratio30DaysAgo": "61%", "source": "rendered-country-row"}, - {"country": "德国", "ratio2DaysAgo": "57%", "ratio30DaysAgo": "65%", "source": "rendered-country-row"}, - ] - ) - - assert rows == [ - {"country": "欧洲", "ratio2DaysAgo": "60%", "ratio30DaysAgo": "64%"}, - {"country": "英国", "ratio2DaysAgo": "50%", "ratio30DaysAgo": "61%"}, - {"country": "德国", "ratio2DaysAgo": "57%", "ratio30DaysAgo": "65%"}, - {"country": "法国", "ratio2DaysAgo": "", "ratio30DaysAgo": ""}, - {"country": "西班牙", "ratio2DaysAgo": "", "ratio30DaysAgo": ""}, - {"country": "意大利", "ratio2DaysAgo": "", "ratio30DaysAgo": ""}, - ] - - -def test_parse_all_cart_ratio_rows_supports_date_headers_without_day_labels(): - rows = InventoryManage._parse_all_cart_ratio_rows( - [ - { - "raw_text": ( - "推荐报价百分比 商城 24 Apr 27 Mar " - "欧洲 60% 64% " - "英国 50% 61% " - "德国 57% 65% " - "法国 81% 77% " - "西班牙 70% 70% " - "意大利 70% 62%" - ) - } - ] - ) - - assert rows == [ - {"country": "欧洲", "ratio2DaysAgo": "60%", "ratio30DaysAgo": "64%"}, - {"country": "英国", "ratio2DaysAgo": "50%", "ratio30DaysAgo": "61%"}, - {"country": "德国", "ratio2DaysAgo": "57%", "ratio30DaysAgo": "65%"}, - {"country": "法国", "ratio2DaysAgo": "81%", "ratio30DaysAgo": "77%"}, - {"country": "西班牙", "ratio2DaysAgo": "70%", "ratio30DaysAgo": "70%"}, - {"country": "意大利", "ratio2DaysAgo": "70%", "ratio30DaysAgo": "62%"}, - ] - - -def test_parse_all_cart_ratio_rows_supports_rendered_geometry_rows(): - rows = InventoryManage._parse_all_cart_ratio_rows( - [ - {"attrs": {"title": "欧洲"}, "rect_left": 1315.0, "rect_top": 346.5, "rect_width": 550.0, "rect_height": 43.0}, - {"raw_text": "60%", "rect_left": 1510.0, "rect_top": 357.6, "rect_width": 32.0, "rect_height": 20.0}, - {"label_text": "64%", "rect_left": 1693.3, "rect_top": 357.6, "rect_width": 32.0, "rect_height": 20.0}, - {"attrs": {"title": "英国"}, "rect_left": 1315.0, "rect_top": 390.6, "rect_width": 550.0, "rect_height": 43.0}, - {"raw_text": "50%", "rect_left": 1510.1, "rect_top": 401.7, "rect_width": 32.0, "rect_height": 20.0}, - {"label_text": "61%", "rect_left": 1693.3, "rect_top": 401.6, "rect_width": 32.0, "rect_height": 20.0}, - {"attrs": {"title": "德国"}, "rect_left": 1315.0, "rect_top": 433.8, "rect_width": 550.0, "rect_height": 43.0}, - {"raw_text": "57%", "rect_left": 1510.1, "rect_top": 444.9, "rect_width": 32.0, "rect_height": 20.0}, - {"label_text": "65%", "rect_left": 1693.3, "rect_top": 444.9, "rect_width": 32.0, "rect_height": 20.0}, - {"attrs": {"title": "法国"}, "rect_left": 1315.0, "rect_top": 477.0, "rect_width": 550.0, "rect_height": 43.0}, - {"raw_text": "81%", "rect_left": 1510.1, "rect_top": 488.1, "rect_width": 32.0, "rect_height": 20.0}, - {"label_text": "77%", "rect_left": 1693.3, "rect_top": 488.1, "rect_width": 32.0, "rect_height": 20.0}, - {"attrs": {"title": "西班牙"}, "rect_left": 1315.0, "rect_top": 520.2, "rect_width": 550.0, "rect_height": 43.0}, - {"raw_text": "70%", "rect_left": 1510.1, "rect_top": 531.3, "rect_width": 32.0, "rect_height": 20.0}, - {"label_text": "70%", "rect_left": 1693.3, "rect_top": 531.3, "rect_width": 32.0, "rect_height": 20.0}, - {"attrs": {"title": "意大利"}, "rect_left": 1315.0, "rect_top": 563.4, "rect_width": 550.0, "rect_height": 43.0}, - {"raw_text": "70%", "rect_left": 1510.1, "rect_top": 574.5, "rect_width": 32.0, "rect_height": 20.0}, - {"label_text": "62%", "rect_left": 1693.3, "rect_top": 574.5, "rect_width": 32.0, "rect_height": 20.0}, - ] - ) - - assert rows == [ - {"country": "欧洲", "ratio2DaysAgo": "60%", "ratio30DaysAgo": "64%"}, - {"country": "英国", "ratio2DaysAgo": "50%", "ratio30DaysAgo": "61%"}, - {"country": "德国", "ratio2DaysAgo": "57%", "ratio30DaysAgo": "65%"}, - {"country": "法国", "ratio2DaysAgo": "81%", "ratio30DaysAgo": "77%"}, - {"country": "西班牙", "ratio2DaysAgo": "70%", "ratio30DaysAgo": "70%"}, - {"country": "意大利", "ratio2DaysAgo": "70%", "ratio30DaysAgo": "62%"}, - ] - - -def test_parse_all_cart_ratio_rows_dedupes_nested_rendered_percentage_nodes(): - rows = InventoryManage._parse_all_cart_ratio_rows( - [ - {"attrs": {"title": "欧洲"}, "rect_left": 1315.0, "rect_top": 346.5, "rect_width": 550.0, "rect_height": 43.0}, - {"raw_text": "60%", "rect_left": 1510.1, "rect_top": 357.6, "rect_width": 160.0, "rect_height": 20.0}, - {"label_text": "60%", "rect_left": 1510.1, "rect_top": 357.6, "rect_width": 29.6, "rect_height": 20.0}, - {"raw_text": "64%", "rect_left": 1681.7, "rect_top": 346.5, "rect_width": 183.2, "rect_height": 43.2}, - {"label_text": "64%", "rect_left": 1693.3, "rect_top": 357.6, "rect_width": 160.0, "rect_height": 20.0}, - {"attrs": {"title": "英国"}, "rect_left": 1315.0, "rect_top": 390.6, "rect_width": 550.0, "rect_height": 43.0}, - {"raw_text": "50%", "rect_left": 1510.1, "rect_top": 401.7, "rect_width": 160.0, "rect_height": 18.2}, - {"label_text": "50%", "rect_left": 1510.1, "rect_top": 401.7, "rect_width": 27.6, "rect_height": 18.2}, - {"label_text": "61%", "rect_left": 1693.3, "rect_top": 401.6, "rect_width": 27.6, "rect_height": 18.2}, - {"attrs": {"title": "德国"}, "rect_left": 1315.0, "rect_top": 433.8, "rect_width": 550.0, "rect_height": 43.0}, - {"raw_text": "57%", "rect_left": 1510.1, "rect_top": 444.9, "rect_width": 160.0, "rect_height": 18.2}, - {"label_text": "57%", "rect_left": 1510.1, "rect_top": 444.9, "rect_width": 27.6, "rect_height": 18.2}, - {"label_text": "65%", "rect_left": 1693.3, "rect_top": 444.9, "rect_width": 27.6, "rect_height": 18.2}, - {"attrs": {"title": "法国"}, "rect_left": 1315.0, "rect_top": 477.0, "rect_width": 550.0, "rect_height": 43.0}, - {"raw_text": "81%", "rect_left": 1510.1, "rect_top": 488.1, "rect_width": 160.0, "rect_height": 18.2}, - {"label_text": "81%", "rect_left": 1510.1, "rect_top": 488.1, "rect_width": 27.6, "rect_height": 18.2}, - {"label_text": "77%", "rect_left": 1693.3, "rect_top": 488.1, "rect_width": 27.6, "rect_height": 18.2}, - {"attrs": {"title": "西班牙"}, "rect_left": 1315.0, "rect_top": 520.2, "rect_width": 550.0, "rect_height": 43.0}, - {"raw_text": "70%", "rect_left": 1510.1, "rect_top": 531.3, "rect_width": 160.0, "rect_height": 18.2}, - {"label_text": "70%", "rect_left": 1510.1, "rect_top": 531.3, "rect_width": 27.6, "rect_height": 18.2}, - {"label_text": "70%", "rect_left": 1693.3, "rect_top": 531.3, "rect_width": 27.6, "rect_height": 18.2}, - {"attrs": {"title": "意大利"}, "rect_left": 1315.0, "rect_top": 563.4, "rect_width": 550.0, "rect_height": 43.0}, - {"raw_text": "70%", "rect_left": 1510.1, "rect_top": 574.5, "rect_width": 160.0, "rect_height": 18.2}, - {"label_text": "70%", "rect_left": 1510.1, "rect_top": 574.5, "rect_width": 27.6, "rect_height": 18.2}, - {"raw_text": "62%", "rect_left": 1681.7, "rect_top": 563.4, "rect_width": 183.2, "rect_height": 43.2}, - {"label_text": "62%", "rect_left": 1693.3, "rect_top": 574.5, "rect_width": 27.6, "rect_height": 18.2}, - ] - ) - - assert rows == [ - {"country": "欧洲", "ratio2DaysAgo": "60%", "ratio30DaysAgo": "64%"}, - {"country": "英国", "ratio2DaysAgo": "50%", "ratio30DaysAgo": "61%"}, - {"country": "德国", "ratio2DaysAgo": "57%", "ratio30DaysAgo": "65%"}, - {"country": "法国", "ratio2DaysAgo": "81%", "ratio30DaysAgo": "77%"}, - {"country": "西班牙", "ratio2DaysAgo": "70%", "ratio30DaysAgo": "70%"}, - {"country": "意大利", "ratio2DaysAgo": "70%", "ratio30DaysAgo": "62%"}, - ] - - -def test_has_any_cart_ratio_detects_country_table_rows(): - assert InventoryManage._has_any_cart_ratio( - [ - { - "raw_text": ( - "推荐报价百分比 商城 2 天前 30 天前 " - "欧洲 60% 64% 英国 50% 61% 德国 57% 65%" - ) - } - ] - ) - - -def test_has_any_cart_ratio_detects_date_header_country_table_rows(): - assert InventoryManage._has_any_cart_ratio( - [ - { - "raw_text": ( - "推荐报价百分比 商城 24 Apr 27 Mar " - "欧洲 60% 64% 英国 50% 61% 德国 57% 65%" - ) - } - ] - ) - - -def test_has_complete_cart_ratio_rows_requires_all_target_countries(): - assert not InventoryManage._has_complete_cart_ratio_rows( - [ - { - "raw_text": ( - "推荐报价百分比 商城 2 天前 30 天前 " - "欧洲 60% 64% 英国 50% 61% 德国 57% 65%" - ) - } - ] - ) - - -def test_has_complete_cart_ratio_rows_detects_full_country_table(): - assert InventoryManage._has_complete_cart_ratio_rows( - [ - { - "raw_text": ( - "推荐报价百分比 商城 2 天前 30 天前 " - "欧洲 60% 64% " - "英国 50% 61% " - "德国 57% 65% " - "法国 81% 77% " - "西班牙 70% 70% " - "意大利 70% 62%" - ) - } - ] - ) diff --git a/app/tool/.device_id b/app/tool/.device_id deleted file mode 100644 index 6e07d8f..0000000 --- a/app/tool/.device_id +++ /dev/null @@ -1 +0,0 @@ -8cecee3bc02a178bf372ca1c3d02fc5cae3c0a51c8346f6e6a710988599c08be \ No newline at end of file diff --git a/app/tool/devices.py b/app/tool/devices.py deleted file mode 100644 index efdf582..0000000 --- a/app/tool/devices.py +++ /dev/null @@ -1,249 +0,0 @@ -import hashlib -import platform -import subprocess -import uuid -import os -from typing import Optional - - -class DeviceIDGenerator: - """ - Windows设备唯一ID生成器 - 通过收集多个硬件特征来生成稳定的设备唯一标识符 - """ - - def __init__(self, use_cache: bool = False, cache_file: str = ".device_id"): - """ - 初始化设备ID生成器 - - Args: - use_cache: 是否使用本地缓存 - cache_file: 缓存文件名 - """ - self.use_cache = use_cache - self.cache_file = cache_file - - def _run_wmic_command(self, command: str) -> Optional[str]: - """ - 执行WMIC命令并返回结果 - - Args: - command: WMIC命令 - - Returns: - 命令执行结果,失败则返回None - """ - try: - result = subprocess.run( - command, - shell=True, - capture_output=True, - text=True, - timeout=10 - ) - if result.returncode == 0 and result.stdout.strip(): - return result.stdout.strip() - except (subprocess.TimeoutExpired, Exception): - pass - return None - - def _get_motherboard_serial(self) -> Optional[str]: - """获取主板序列号""" - return self._run_wmic_command("wmic baseboard get serialnumber /value") - - def _get_cpu_id(self) -> Optional[str]: - """获取CPU ID""" - return self._run_wmic_command("wmic cpu get processorid /value") - - def _get_bios_serial(self) -> Optional[str]: - """获取BIOS序列号""" - return self._run_wmic_command("wmic bios get serialnumber /value") - - def _get_disk_serial(self) -> Optional[str]: - """获取系统盘序列号""" - return self._run_wmic_command("wmic diskdrive get serialnumber /value") - - def _get_machine_guid(self) -> Optional[str]: - """获取Windows机器GUID""" - try: - result = subprocess.run( - 'reg query "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography" /v MachineGuid', - shell=True, - capture_output=True, - text=True, - timeout=10 - ) - if result.returncode == 0: - for line in result.stdout.split('\n'): - if 'MachineGuid' in line: - return line.split()[-1] - except Exception: - pass - return None - - def _extract_value(self, wmic_output: str) -> str: - """从WMIC输出中提取实际值""" - if not wmic_output: - return "" - - lines = wmic_output.split('\n') - for line in lines: - if '=' in line and not line.strip().endswith('='): - return line.split('=', 1)[1].strip() - return "" - - def _collect_hardware_info(self) -> dict: - """ - 收集硬件信息 - - Returns: - 包含各种硬件信息的字典 - """ - hardware_info = {} - - # 主板序列号 - motherboard = self._get_motherboard_serial() - hardware_info['motherboard'] = self._extract_value(motherboard) if motherboard else "" - - # CPU ID - cpu_id = self._get_cpu_id() - hardware_info['cpu'] = self._extract_value(cpu_id) if cpu_id else "" - - # BIOS序列号 - bios = self._get_bios_serial() - hardware_info['bios'] = self._extract_value(bios) if bios else "" - - # 硬盘序列号 - disk = self._get_disk_serial() - hardware_info['disk'] = self._extract_value(disk) if disk else "" - - # Windows机器GUID - machine_guid = self._get_machine_guid() - hardware_info['machine_guid'] = machine_guid if machine_guid else "" - - # 计算机名称 - hardware_info['computer_name'] = platform.node() - - # MAC地址(作为备用) - hardware_info['mac_address'] = ':'.join(['{:02x}'.format((uuid.getnode() >> elements) & 0xff) - for elements in range(0, 2*6, 2)][::-1]) - - return hardware_info - - def _generate_device_id(self, hardware_info: dict) -> str: - """ - 基于硬件信息生成设备ID - - Args: - hardware_info: 硬件信息字典 - - Returns: - 32位十六进制设备ID - """ - # 过滤掉空值,并按键排序确保一致性 - filtered_info = {k: v for k, v in hardware_info.items() if v and v.strip()} - - # 如果没有任何硬件信息,使用MAC地址作为后备方案 - if not filtered_info: - filtered_info = {'mac_address': hardware_info.get('mac_address', str(uuid.getnode()))} - - # 将所有信息连接成字符串 - info_string = '|'.join(f"{k}:{v}" for k, v in sorted(filtered_info.items())) - - # 使用SHA256生成哈希值 - hash_object = hashlib.sha256(info_string.encode('utf-8')) - device_id = hash_object.hexdigest() - - return device_id - - def _load_cached_device_id(self) -> Optional[str]: - """从缓存文件加载设备ID""" - try: - if os.path.exists(self.cache_file): - with open(self.cache_file, 'r', encoding='utf-8') as f: - cached_id = f.read().strip() - if len(cached_id) == 64: # SHA256哈希长度 - return cached_id - except Exception: - pass - return None - - def _save_device_id_to_cache(self, device_id: str) -> None: - """将设备ID保存到缓存文件""" - try: - with open(self.cache_file, 'w', encoding='utf-8') as f: - f.write(device_id) - except Exception: - pass - - def get_device_id(self) -> str: - """ - 获取设备唯一ID - - Returns: - 64字符的十六进制设备ID - """ - # 如果启用缓存,先尝试从缓存加载 - if self.use_cache: - cached_id = self._load_cached_device_id() - if cached_id: - return cached_id - - # 收集硬件信息 - hardware_info = self._collect_hardware_info() - - # 生成设备ID - device_id = self._generate_device_id(hardware_info) - - # 保存到缓存 - if self.use_cache: - self._save_device_id_to_cache(device_id) - - return device_id - - def get_device_id_short(self, length: int = 16) -> str: - """ - 获取短版本的设备ID - - Args: - length: 返回ID的长度 - - Returns: - 指定长度的设备ID - """ - full_id = self.get_device_id() - return full_id[:length] - - def get_hardware_info(self) -> dict: - """ - 获取硬件信息(用于调试) - - Returns: - 硬件信息字典 - """ - return self._collect_hardware_info() - - -# 使用示例 -def main(): - """使用示例""" - # 创建设备ID生成器实例 - device_generator = DeviceIDGenerator() - - # 获取完整设备ID(64字符) - device_id = device_generator.get_device_id() - print(f"完整设备ID: {device_id}") - - # 获取短版本设备ID(16字符) - short_id = device_generator.get_device_id_short(16) - print(f"短设备ID: {short_id}") - - # 查看硬件信息(调试用) - hardware_info = device_generator.get_hardware_info() - print("\n硬件信息:") - for key, value in hardware_info.items(): - print(f" {key}: {value}") - - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/app/update/PyQt5/Qt/.keep_dir.txt b/app/update/PyQt5/Qt/.keep_dir.txt deleted file mode 100644 index e69de29..0000000 diff --git a/app/update/PyQt5/Qt5/.keep_dir.txt b/app/update/PyQt5/Qt5/.keep_dir.txt deleted file mode 100644 index e69de29..0000000 diff --git a/app/update/PyQt5/QtCore.pyd b/app/update/PyQt5/QtCore.pyd deleted file mode 100644 index c376c68..0000000 Binary files a/app/update/PyQt5/QtCore.pyd and /dev/null differ diff --git a/app/update/PyQt5/QtGui.pyd b/app/update/PyQt5/QtGui.pyd deleted file mode 100644 index 3381759..0000000 Binary files a/app/update/PyQt5/QtGui.pyd and /dev/null differ diff --git a/app/update/PyQt5/QtWidgets.pyd b/app/update/PyQt5/QtWidgets.pyd deleted file mode 100644 index 5899382..0000000 Binary files a/app/update/PyQt5/QtWidgets.pyd and /dev/null differ diff --git a/app/update/PyQt5/qt-plugins/iconengines/qsvgicon.dll b/app/update/PyQt5/qt-plugins/iconengines/qsvgicon.dll deleted file mode 100644 index cbca63c..0000000 Binary files a/app/update/PyQt5/qt-plugins/iconengines/qsvgicon.dll and /dev/null differ diff --git a/app/update/PyQt5/qt-plugins/imageformats/qgif.dll b/app/update/PyQt5/qt-plugins/imageformats/qgif.dll deleted file mode 100644 index b6e5658..0000000 Binary files a/app/update/PyQt5/qt-plugins/imageformats/qgif.dll and /dev/null differ diff --git a/app/update/PyQt5/qt-plugins/imageformats/qicns.dll b/app/update/PyQt5/qt-plugins/imageformats/qicns.dll deleted file mode 100644 index 5b4365f..0000000 Binary files a/app/update/PyQt5/qt-plugins/imageformats/qicns.dll and /dev/null differ diff --git a/app/update/PyQt5/qt-plugins/imageformats/qico.dll b/app/update/PyQt5/qt-plugins/imageformats/qico.dll deleted file mode 100644 index d89a637..0000000 Binary files a/app/update/PyQt5/qt-plugins/imageformats/qico.dll and /dev/null differ diff --git a/app/update/PyQt5/qt-plugins/imageformats/qjpeg.dll b/app/update/PyQt5/qt-plugins/imageformats/qjpeg.dll deleted file mode 100644 index 98cdf95..0000000 Binary files a/app/update/PyQt5/qt-plugins/imageformats/qjpeg.dll and /dev/null differ diff --git a/app/update/PyQt5/qt-plugins/imageformats/qsvg.dll b/app/update/PyQt5/qt-plugins/imageformats/qsvg.dll deleted file mode 100644 index c6b732b..0000000 Binary files a/app/update/PyQt5/qt-plugins/imageformats/qsvg.dll and /dev/null differ diff --git a/app/update/PyQt5/qt-plugins/imageformats/qtga.dll b/app/update/PyQt5/qt-plugins/imageformats/qtga.dll deleted file mode 100644 index d4f77f8..0000000 Binary files a/app/update/PyQt5/qt-plugins/imageformats/qtga.dll and /dev/null differ diff --git a/app/update/PyQt5/qt-plugins/imageformats/qtiff.dll b/app/update/PyQt5/qt-plugins/imageformats/qtiff.dll deleted file mode 100644 index 43cbc0c..0000000 Binary files a/app/update/PyQt5/qt-plugins/imageformats/qtiff.dll and /dev/null differ diff --git a/app/update/PyQt5/qt-plugins/imageformats/qwbmp.dll b/app/update/PyQt5/qt-plugins/imageformats/qwbmp.dll deleted file mode 100644 index e1dc12c..0000000 Binary files a/app/update/PyQt5/qt-plugins/imageformats/qwbmp.dll and /dev/null differ diff --git a/app/update/PyQt5/qt-plugins/imageformats/qwebp.dll b/app/update/PyQt5/qt-plugins/imageformats/qwebp.dll deleted file mode 100644 index 3c49ed8..0000000 Binary files a/app/update/PyQt5/qt-plugins/imageformats/qwebp.dll and /dev/null differ diff --git a/app/update/PyQt5/qt-plugins/mediaservice/dsengine.dll b/app/update/PyQt5/qt-plugins/mediaservice/dsengine.dll deleted file mode 100644 index 2f5bcc7..0000000 Binary files a/app/update/PyQt5/qt-plugins/mediaservice/dsengine.dll and /dev/null differ diff --git a/app/update/PyQt5/qt-plugins/mediaservice/qtmedia_audioengine.dll b/app/update/PyQt5/qt-plugins/mediaservice/qtmedia_audioengine.dll deleted file mode 100644 index adcf5bc..0000000 Binary files a/app/update/PyQt5/qt-plugins/mediaservice/qtmedia_audioengine.dll and /dev/null differ diff --git a/app/update/PyQt5/qt-plugins/mediaservice/wmfengine.dll b/app/update/PyQt5/qt-plugins/mediaservice/wmfengine.dll deleted file mode 100644 index c7aa07e..0000000 Binary files a/app/update/PyQt5/qt-plugins/mediaservice/wmfengine.dll and /dev/null differ diff --git a/app/update/PyQt5/qt-plugins/platforms/qminimal.dll b/app/update/PyQt5/qt-plugins/platforms/qminimal.dll deleted file mode 100644 index c4bcfd8..0000000 Binary files a/app/update/PyQt5/qt-plugins/platforms/qminimal.dll and /dev/null differ diff --git a/app/update/PyQt5/qt-plugins/platforms/qoffscreen.dll b/app/update/PyQt5/qt-plugins/platforms/qoffscreen.dll deleted file mode 100644 index ad29783..0000000 Binary files a/app/update/PyQt5/qt-plugins/platforms/qoffscreen.dll and /dev/null differ diff --git a/app/update/PyQt5/qt-plugins/platforms/qwebgl.dll b/app/update/PyQt5/qt-plugins/platforms/qwebgl.dll deleted file mode 100644 index 5f317e5..0000000 Binary files a/app/update/PyQt5/qt-plugins/platforms/qwebgl.dll and /dev/null differ diff --git a/app/update/PyQt5/qt-plugins/platforms/qwindows.dll b/app/update/PyQt5/qt-plugins/platforms/qwindows.dll deleted file mode 100644 index e9c319d..0000000 Binary files a/app/update/PyQt5/qt-plugins/platforms/qwindows.dll and /dev/null differ diff --git a/app/update/PyQt5/qt-plugins/platformthemes/qxdgdesktopportal.dll b/app/update/PyQt5/qt-plugins/platformthemes/qxdgdesktopportal.dll deleted file mode 100644 index 34c0231..0000000 Binary files a/app/update/PyQt5/qt-plugins/platformthemes/qxdgdesktopportal.dll and /dev/null differ diff --git a/app/update/PyQt5/qt-plugins/printsupport/windowsprintersupport.dll b/app/update/PyQt5/qt-plugins/printsupport/windowsprintersupport.dll deleted file mode 100644 index 2e50171..0000000 Binary files a/app/update/PyQt5/qt-plugins/printsupport/windowsprintersupport.dll and /dev/null differ diff --git a/app/update/PyQt5/qt-plugins/styles/qwindowsvistastyle.dll b/app/update/PyQt5/qt-plugins/styles/qwindowsvistastyle.dll deleted file mode 100644 index c97acd6..0000000 Binary files a/app/update/PyQt5/qt-plugins/styles/qwindowsvistastyle.dll and /dev/null differ diff --git a/app/update/PyQt5/sip.pyd b/app/update/PyQt5/sip.pyd deleted file mode 100644 index a8009c0..0000000 Binary files a/app/update/PyQt5/sip.pyd and /dev/null differ diff --git a/app/update/_bz2.pyd b/app/update/_bz2.pyd deleted file mode 100644 index 598aa11..0000000 Binary files a/app/update/_bz2.pyd and /dev/null differ diff --git a/app/update/_ctypes.pyd b/app/update/_ctypes.pyd deleted file mode 100644 index 5905ec4..0000000 Binary files a/app/update/_ctypes.pyd and /dev/null differ diff --git a/app/update/_decimal.pyd b/app/update/_decimal.pyd deleted file mode 100644 index 1c4087d..0000000 Binary files a/app/update/_decimal.pyd and /dev/null differ diff --git a/app/update/_elementtree.pyd b/app/update/_elementtree.pyd deleted file mode 100644 index 6ea5ee0..0000000 Binary files a/app/update/_elementtree.pyd and /dev/null differ diff --git a/app/update/_hashlib.pyd b/app/update/_hashlib.pyd deleted file mode 100644 index 8cd8b1e..0000000 Binary files a/app/update/_hashlib.pyd and /dev/null differ diff --git a/app/update/_hashlib.zip b/app/update/_hashlib.zip deleted file mode 100644 index 9ef0fc5..0000000 Binary files a/app/update/_hashlib.zip and /dev/null differ diff --git a/app/update/_lzma.pyd b/app/update/_lzma.pyd deleted file mode 100644 index eb9b88e..0000000 Binary files a/app/update/_lzma.pyd and /dev/null differ diff --git a/app/update/_socket.pyd b/app/update/_socket.pyd deleted file mode 100644 index 4608360..0000000 Binary files a/app/update/_socket.pyd and /dev/null differ diff --git a/app/update/libcrypto-1_1-x64.dll b/app/update/libcrypto-1_1-x64.dll deleted file mode 100644 index 0939c40..0000000 Binary files a/app/update/libcrypto-1_1-x64.dll and /dev/null differ diff --git a/app/update/libeay32.dll b/app/update/libeay32.dll deleted file mode 100644 index 6cefeb1..0000000 Binary files a/app/update/libeay32.dll and /dev/null differ diff --git a/app/update/libffi-7.dll b/app/update/libffi-7.dll deleted file mode 100644 index 8fd2e5e..0000000 Binary files a/app/update/libffi-7.dll and /dev/null differ diff --git a/app/update/msvcp140.dll b/app/update/msvcp140.dll deleted file mode 100644 index 5a1cb64..0000000 Binary files a/app/update/msvcp140.dll and /dev/null differ diff --git a/app/update/msvcp140_1.dll b/app/update/msvcp140_1.dll deleted file mode 100644 index 9ed52a2..0000000 Binary files a/app/update/msvcp140_1.dll and /dev/null differ diff --git a/app/update/psutil/_psutil_windows.pyd b/app/update/psutil/_psutil_windows.pyd deleted file mode 100644 index 6c73e36..0000000 Binary files a/app/update/psutil/_psutil_windows.pyd and /dev/null differ diff --git a/app/update/pyexpat.pyd b/app/update/pyexpat.pyd deleted file mode 100644 index cb7801c..0000000 Binary files a/app/update/pyexpat.pyd and /dev/null differ diff --git a/app/update/python3.dll b/app/update/python3.dll deleted file mode 100644 index 1fe5788..0000000 Binary files a/app/update/python3.dll and /dev/null differ diff --git a/app/update/python39.dll b/app/update/python39.dll deleted file mode 100644 index 8299163..0000000 Binary files a/app/update/python39.dll and /dev/null differ diff --git a/app/update/qt5core.dll b/app/update/qt5core.dll deleted file mode 100644 index 40e8de1..0000000 Binary files a/app/update/qt5core.dll and /dev/null differ diff --git a/app/update/qt5dbus.dll b/app/update/qt5dbus.dll deleted file mode 100644 index e06ebf3..0000000 Binary files a/app/update/qt5dbus.dll and /dev/null differ diff --git a/app/update/qt5gui.dll b/app/update/qt5gui.dll deleted file mode 100644 index bf38dda..0000000 Binary files a/app/update/qt5gui.dll and /dev/null differ diff --git a/app/update/qt5multimedia.dll b/app/update/qt5multimedia.dll deleted file mode 100644 index f4ea511..0000000 Binary files a/app/update/qt5multimedia.dll and /dev/null differ diff --git a/app/update/qt5network.dll b/app/update/qt5network.dll deleted file mode 100644 index d32644d..0000000 Binary files a/app/update/qt5network.dll and /dev/null differ diff --git a/app/update/qt5printsupport.dll b/app/update/qt5printsupport.dll deleted file mode 100644 index de4c30b..0000000 Binary files a/app/update/qt5printsupport.dll and /dev/null differ diff --git a/app/update/qt5qml.dll b/app/update/qt5qml.dll deleted file mode 100644 index 7c2e538..0000000 Binary files a/app/update/qt5qml.dll and /dev/null differ diff --git a/app/update/qt5qmlmodels.dll b/app/update/qt5qmlmodels.dll deleted file mode 100644 index a0497d3..0000000 Binary files a/app/update/qt5qmlmodels.dll and /dev/null differ diff --git a/app/update/qt5quick.dll b/app/update/qt5quick.dll deleted file mode 100644 index 4ff0bc6..0000000 Binary files a/app/update/qt5quick.dll and /dev/null differ diff --git a/app/update/qt5svg.dll b/app/update/qt5svg.dll deleted file mode 100644 index edfbf4a..0000000 Binary files a/app/update/qt5svg.dll and /dev/null differ diff --git a/app/update/qt5websockets.dll b/app/update/qt5websockets.dll deleted file mode 100644 index 1b21504..0000000 Binary files a/app/update/qt5websockets.dll and /dev/null differ diff --git a/app/update/qt5widgets.dll b/app/update/qt5widgets.dll deleted file mode 100644 index 80ae4e3..0000000 Binary files a/app/update/qt5widgets.dll and /dev/null differ diff --git a/app/update/select.pyd b/app/update/select.pyd deleted file mode 100644 index 5b15220..0000000 Binary files a/app/update/select.pyd and /dev/null differ diff --git a/app/update/ssleay32.dll b/app/update/ssleay32.dll deleted file mode 100644 index 0276bba..0000000 Binary files a/app/update/ssleay32.dll and /dev/null differ diff --git a/app/update/unicodedata.pyd b/app/update/unicodedata.pyd deleted file mode 100644 index 77216c7..0000000 Binary files a/app/update/unicodedata.pyd and /dev/null differ diff --git a/app/update/update.exe b/app/update/update.exe deleted file mode 100644 index a2e7113..0000000 Binary files a/app/update/update.exe and /dev/null differ diff --git a/app/update/vcruntime140.dll b/app/update/vcruntime140.dll deleted file mode 100644 index 2e2bb47..0000000 Binary files a/app/update/vcruntime140.dll and /dev/null differ diff --git a/app/update/vcruntime140_1.dll b/app/update/vcruntime140_1.dll deleted file mode 100644 index dd0c100..0000000 Binary files a/app/update/vcruntime140_1.dll and /dev/null differ diff --git a/app/uv.lock b/app/uv.lock deleted file mode 100644 index 4fa57a5..0000000 --- a/app/uv.lock +++ /dev/null @@ -1,1501 +0,0 @@ -version = 1 -revision = 1 -requires-python = "==3.9.*" - -[[package]] -name = "alibabacloud-oss-v2" -version = "1.2.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "crcmod-plus" }, - { name = "pycryptodome" }, - { name = "requests" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/82/02/d681807d49a8debabb6cfde2b5a1057a27c2cd7caa0c51111127110db423/alibabacloud_oss_v2-1.2.4-py3-none-any.whl", hash = "sha256:c4f1878f3b2bf0b65bb1a1182253502b69b30bcccb7356859e3a9f079c14217c", size = 264323 }, -] - -[[package]] -name = "altgraph" -version = "0.17.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7e/f8/97fdf103f38fed6792a1601dbc16cc8aac56e7459a9fff08c812d8ae177a/altgraph-0.17.5.tar.gz", hash = "sha256:c87b395dd12fabde9c99573a9749d67da8d29ef9de0125c7f536699b4a9bc9e7", size = 48428 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/ba/000a1996d4308bc65120167c21241a3b205464a2e0b58deda26ae8ac21d1/altgraph-0.17.5-py2.py3-none-any.whl", hash = "sha256:f3a22400bce1b0c701683820ac4f3b159cd301acab067c51c653e06961600597", size = 21228 }, -] - -[[package]] -name = "annotated-types" -version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, -] - -[[package]] -name = "anyio" -version = "4.12.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "exceptiongroup" }, - { name = "idna" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/96/f0/5eb65b2bb0d09ac6776f2eb54adee6abe8228ea05b20a5ad0e4945de8aac/anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703", size = 228685 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592 }, -] - -[[package]] -name = "authlib" -version = "1.6.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cryptography" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6b/6c/c88eac87468c607f88bc24df1f3b31445ee6fc9ba123b09e666adf687cd9/authlib-1.6.8.tar.gz", hash = "sha256:41ae180a17cf672bc784e4a518e5c82687f1fe1e98b0cafaeda80c8e4ab2d1cb", size = 165074 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/73/f7084bf12755113cd535ae586782ff3a6e710bfbe6a0d13d1c2f81ffbbfa/authlib-1.6.8-py2.py3-none-any.whl", hash = "sha256:97286fd7a15e6cfefc32771c8ef9c54f0ed58028f1322de6a2a7c969c3817888", size = 244116 }, -] - -[[package]] -name = "blinker" -version = "1.9.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/21/28/9b3f50ce0e048515135495f198351908d99540d69bfdc8c1d15b73dc55ce/blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", size = 22460 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc", size = 8458 }, -] - -[[package]] -name = "bottle" -version = "0.13.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7a/71/cca6167c06d00c81375fd668719df245864076d284f7cb46a694cbeb5454/bottle-0.13.4.tar.gz", hash = "sha256:787e78327e12b227938de02248333d788cfe45987edca735f8f88e03472c3f47", size = 98717 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/83/f6/b55ec74cfe68c6584163faa311503c20b0da4c09883a41e8e00d6726c954/bottle-0.13.4-py2.py3-none-any.whl", hash = "sha256:045684fbd2764eac9cdeb824861d1551d113e8b683d8d26e296898d3dd99a12e", size = 103807 }, -] - -[[package]] -name = "certifi" -version = "2026.1.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900 }, -] - -[[package]] -name = "cffi" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pycparser", marker = "implementation_name != 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/cc/08ed5a43f2996a16b462f64a7055c6e962803534924b9b2f1371d8c00b7b/cffi-2.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf", size = 184288 }, - { url = "https://files.pythonhosted.org/packages/3d/de/38d9726324e127f727b4ecc376bc85e505bfe61ef130eaf3f290c6847dd4/cffi-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7", size = 180509 }, - { url = "https://files.pythonhosted.org/packages/9b/13/c92e36358fbcc39cf0962e83223c9522154ee8630e1df7c0b3a39a8124e2/cffi-2.0.0-cp39-cp39-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c", size = 208813 }, - { url = "https://files.pythonhosted.org/packages/15/12/a7a79bd0df4c3bff744b2d7e52cc1b68d5e7e427b384252c42366dc1ecbc/cffi-2.0.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165", size = 216498 }, - { url = "https://files.pythonhosted.org/packages/a3/ad/5c51c1c7600bdd7ed9a24a203ec255dccdd0ebf4527f7b922a0bde2fb6ed/cffi-2.0.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534", size = 203243 }, - { url = "https://files.pythonhosted.org/packages/32/f2/81b63e288295928739d715d00952c8c6034cb6c6a516b17d37e0c8be5600/cffi-2.0.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f", size = 203158 }, - { url = "https://files.pythonhosted.org/packages/1f/74/cc4096ce66f5939042ae094e2e96f53426a979864aa1f96a621ad128be27/cffi-2.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63", size = 216548 }, - { url = "https://files.pythonhosted.org/packages/e8/be/f6424d1dc46b1091ffcc8964fa7c0ab0cd36839dd2761b49c90481a6ba1b/cffi-2.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2", size = 218897 }, - { url = "https://files.pythonhosted.org/packages/f7/e0/dda537c2309817edf60109e39265f24f24aa7f050767e22c98c53fe7f48b/cffi-2.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65", size = 211249 }, - { url = "https://files.pythonhosted.org/packages/2b/e7/7c769804eb75e4c4b35e658dba01de1640a351a9653c3d49ca89d16ccc91/cffi-2.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322", size = 218041 }, - { url = "https://files.pythonhosted.org/packages/aa/d9/6218d78f920dcd7507fc16a766b5ef8f3b913cc7aa938e7fc80b9978d089/cffi-2.0.0-cp39-cp39-win32.whl", hash = "sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a", size = 172138 }, - { url = "https://files.pythonhosted.org/packages/54/8f/a1e836f82d8e32a97e6b29cc8f641779181ac7363734f12df27db803ebda/cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9", size = 182794 }, -] - -[[package]] -name = "charset-normalizer" -version = "3.4.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/46/7c/0c4760bccf082737ca7ab84a4c2034fcc06b1f21cf3032ea98bd6feb1725/charset_normalizer-3.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9", size = 209609 }, - { url = "https://files.pythonhosted.org/packages/bb/a4/69719daef2f3d7f1819de60c9a6be981b8eeead7542d5ec4440f3c80e111/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d", size = 149029 }, - { url = "https://files.pythonhosted.org/packages/e6/21/8d4e1d6c1e6070d3672908b8e4533a71b5b53e71d16828cc24d0efec564c/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608", size = 144580 }, - { url = "https://files.pythonhosted.org/packages/a7/0a/a616d001b3f25647a9068e0b9199f697ce507ec898cacb06a0d5a1617c99/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc", size = 162340 }, - { url = "https://files.pythonhosted.org/packages/85/93/060b52deb249a5450460e0585c88a904a83aec474ab8e7aba787f45e79f2/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e", size = 159619 }, - { url = "https://files.pythonhosted.org/packages/dd/21/0274deb1cc0632cd587a9a0ec6b4674d9108e461cb4cd40d457adaeb0564/charset_normalizer-3.4.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1", size = 153980 }, - { url = "https://files.pythonhosted.org/packages/28/2b/e3d7d982858dccc11b31906976323d790dded2017a0572f093ff982d692f/charset_normalizer-3.4.4-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3", size = 152174 }, - { url = "https://files.pythonhosted.org/packages/6e/ff/4a269f8e35f1e58b2df52c131a1fa019acb7ef3f8697b7d464b07e9b492d/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6", size = 151666 }, - { url = "https://files.pythonhosted.org/packages/da/c9/ec39870f0b330d58486001dd8e532c6b9a905f5765f58a6f8204926b4a93/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88", size = 145550 }, - { url = "https://files.pythonhosted.org/packages/75/8f/d186ab99e40e0ed9f82f033d6e49001701c81244d01905dd4a6924191a30/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1", size = 163721 }, - { url = "https://files.pythonhosted.org/packages/96/b1/6047663b9744df26a7e479ac1e77af7134b1fcf9026243bb48ee2d18810f/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf", size = 152127 }, - { url = "https://files.pythonhosted.org/packages/59/78/e5a6eac9179f24f704d1be67d08704c3c6ab9f00963963524be27c18ed87/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318", size = 161175 }, - { url = "https://files.pythonhosted.org/packages/e5/43/0e626e42d54dd2f8dd6fc5e1c5ff00f05fbca17cb699bedead2cae69c62f/charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c", size = 155375 }, - { url = "https://files.pythonhosted.org/packages/e9/91/d9615bf2e06f35e4997616ff31248c3657ed649c5ab9d35ea12fce54e380/charset_normalizer-3.4.4-cp39-cp39-win32.whl", hash = "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505", size = 99692 }, - { url = "https://files.pythonhosted.org/packages/d1/a9/6c040053909d9d1ef4fcab45fddec083aedc9052c10078339b47c8573ea8/charset_normalizer-3.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966", size = 107192 }, - { url = "https://files.pythonhosted.org/packages/f0/c6/4fa536b2c0cd3edfb7ccf8469fa0f363ea67b7213a842b90909ca33dd851/charset_normalizer-3.4.4-cp39-cp39-win_arm64.whl", hash = "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50", size = 100220 }, - { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402 }, -] - -[[package]] -name = "click" -version = "8.1.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, -] - -[[package]] -name = "clr-loader" -version = "0.2.10" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/18/24/c12faf3f61614b3131b5c98d3bf0d376b49c7feaa73edca559aeb2aee080/clr_loader-0.2.10.tar.gz", hash = "sha256:81f114afbc5005bafc5efe5af1341d400e22137e275b042a8979f3feb9fc9446", size = 83605 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/61/cf819f8e8bb4d4c74661acf2498ba8d4a296714be3478d21eaabf64f5b9b/clr_loader-0.2.10-py3-none-any.whl", hash = "sha256:ebbbf9d511a7fe95fa28a95a4e04cd195b097881dfe66158dc2c281d3536f282", size = 56483 }, -] - -[[package]] -name = "colorama" -version = "0.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, -] - -[[package]] -name = "cozepy" -version = "0.20.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "authlib" }, - { name = "distro" }, - { name = "httpx" }, - { name = "pydantic" }, - { name = "typing-extensions" }, - { name = "websockets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/31/ae/608ca49d2d12941fa33ab588c0b1f54b2260c10a7380059af74448467aa0/cozepy-0.20.0.tar.gz", hash = "sha256:69e359beea826f4a3ecf38d3fbd3efe2dd7558e13006f6444095b74274883dda", size = 88871 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/66/76a9d5e6820d66feee50444b21bf0886273dd55a90c82d4d8ee2b93478fd/cozepy-0.20.0-py3-none-any.whl", hash = "sha256:efcc032fb8ff0b5f41071fb1727a0f242bdfe9d304578d2dcb7837a18d98b181", size = 116218 }, -] - -[[package]] -name = "crawler-desktop-app" -version = "0.1.0" -source = { virtual = "." } -dependencies = [ - { name = "alibabacloud-oss-v2" }, - { name = "altgraph" }, - { name = "annotated-types" }, - { name = "anyio" }, - { name = "authlib" }, - { name = "blinker" }, - { name = "bottle" }, - { name = "certifi" }, - { name = "cffi" }, - { name = "charset-normalizer" }, - { name = "click" }, - { name = "clr-loader" }, - { name = "colorama" }, - { name = "cozepy" }, - { name = "crcmod-plus" }, - { name = "cryptography" }, - { name = "cssselect" }, - { name = "datarecorder" }, - { name = "distro" }, - { name = "downloadkit" }, - { name = "drissionpage" }, - { name = "et-xmlfile" }, - { name = "exceptiongroup" }, - { name = "filelock" }, - { name = "flask" }, - { name = "flask-cors" }, - { name = "h11" }, - { name = "httpcore" }, - { name = "httpx" }, - { name = "idna" }, - { name = "importlib-metadata" }, - { name = "itsdangerous" }, - { name = "jinja2" }, - { name = "loguru" }, - { name = "lxml" }, - { name = "markupsafe" }, - { name = "mouseinfo" }, - { name = "nuitka" }, - { name = "numpy" }, - { name = "openpyxl" }, - { name = "ordered-set" }, - { name = "packaging" }, - { name = "pandas" }, - { name = "pefile" }, - { name = "pillow" }, - { name = "proxy-tools" }, - { name = "psutil" }, - { name = "pyautogui" }, - { name = "pycparser" }, - { name = "pycryptodome" }, - { name = "pydantic" }, - { name = "pydantic-core" }, - { name = "pygetwindow" }, - { name = "pyinstaller" }, - { name = "pyinstaller-hooks-contrib" }, - { name = "pymsgbox" }, - { name = "pymysql" }, - { name = "pyperclip" }, - { name = "pyqt5" }, - { name = "pyqt5-qt5" }, - { name = "pyqt5-sip" }, - { name = "pyrect" }, - { name = "pyscreeze" }, - { name = "python-dateutil" }, - { name = "python-dotenv" }, - { name = "pythonnet" }, - { name = "pytweening" }, - { name = "pytz" }, - { name = "pywebview" }, - { name = "pywin32-ctypes" }, - { name = "requests" }, - { name = "requests-file" }, - { name = "six" }, - { name = "tldextract" }, - { name = "typing-extensions" }, - { name = "typing-inspection" }, - { name = "tzdata" }, - { name = "urllib3" }, - { name = "websocket-client" }, - { name = "websockets" }, - { name = "werkzeug" }, - { name = "zipp" }, - { name = "zstandard" }, -] - -[package.dev-dependencies] -dev = [ - { name = "pytest" }, - { name = "ruff" }, -] - -[package.metadata] -requires-dist = [ - { name = "alibabacloud-oss-v2", specifier = "==1.2.4" }, - { name = "altgraph", specifier = "==0.17.5" }, - { name = "annotated-types", specifier = "==0.7.0" }, - { name = "anyio", specifier = "==4.12.1" }, - { name = "authlib", specifier = "==1.6.8" }, - { name = "blinker", specifier = "==1.9.0" }, - { name = "bottle", specifier = "==0.13.4" }, - { name = "certifi", specifier = "==2026.1.4" }, - { name = "cffi", specifier = "==2.0.0" }, - { name = "charset-normalizer", specifier = "==3.4.4" }, - { name = "click", specifier = "==8.1.8" }, - { name = "clr-loader", specifier = "==0.2.10" }, - { name = "colorama", specifier = "==0.4.6" }, - { name = "cozepy", specifier = "==0.20.0" }, - { name = "crcmod-plus", specifier = "==2.3.1" }, - { name = "cryptography", specifier = "==41.0.0" }, - { name = "cssselect", specifier = "==1.3.0" }, - { name = "datarecorder", specifier = "==3.6.2" }, - { name = "distro", specifier = "==1.9.0" }, - { name = "downloadkit", specifier = "==2.0.7" }, - { name = "drissionpage", specifier = "==4.1.1.2" }, - { name = "et-xmlfile", specifier = "==2.0.0" }, - { name = "exceptiongroup", specifier = "==1.3.1" }, - { name = "filelock", specifier = "==3.19.1" }, - { name = "flask", specifier = "==3.1.3" }, - { name = "flask-cors", specifier = "==6.0.2" }, - { name = "h11", specifier = "==0.16.0" }, - { name = "httpcore", specifier = "==1.0.9" }, - { name = "httpx", specifier = "==0.28.1" }, - { name = "idna", specifier = "==3.11" }, - { name = "importlib-metadata", specifier = "==8.7.1" }, - { name = "itsdangerous", specifier = "==2.2.0" }, - { name = "jinja2", specifier = "==3.1.6" }, - { name = "loguru", specifier = ">=0.7.3" }, - { name = "lxml", specifier = "==6.0.2" }, - { name = "markupsafe", specifier = "==3.0.3" }, - { name = "mouseinfo", specifier = "==0.1.3" }, - { name = "nuitka", specifier = "==2.8.6" }, - { name = "numpy", specifier = "==1.25.2" }, - { name = "openpyxl", specifier = "==3.1.5" }, - { name = "ordered-set", specifier = "==4.1.0" }, - { name = "packaging", specifier = "==26.0" }, - { name = "pandas", specifier = "==2.3.3" }, - { name = "pefile", specifier = "==2024.8.26" }, - { name = "pillow", specifier = "==11.3.0" }, - { name = "proxy-tools", specifier = "==0.1.0" }, - { name = "psutil", specifier = "==7.2.2" }, - { name = "pyautogui", specifier = "==0.9.54" }, - { name = "pycparser", specifier = "==2.23" }, - { name = "pycryptodome", specifier = "==3.23.0" }, - { name = "pydantic", specifier = "==2.12.5" }, - { name = "pydantic-core", specifier = "==2.41.5" }, - { name = "pygetwindow", specifier = "==0.0.9" }, - { name = "pyinstaller", specifier = "==6.19.0" }, - { name = "pyinstaller-hooks-contrib", specifier = "==2026.3" }, - { name = "pymsgbox", specifier = "==2.0.1" }, - { name = "pymysql", specifier = "==1.1.2" }, - { name = "pyperclip", specifier = "==1.11.0" }, - { name = "pyqt5", specifier = "==5.15.11" }, - { name = "pyqt5-qt5", specifier = "==5.15.2" }, - { name = "pyqt5-sip", specifier = "==12.17.1" }, - { name = "pyrect", specifier = "==0.2.0" }, - { name = "pyscreeze", specifier = "==1.0.1" }, - { name = "python-dateutil", specifier = "==2.9.0.post0" }, - { name = "python-dotenv", specifier = "==1.2.1" }, - { name = "pythonnet", specifier = "==3.0.5" }, - { name = "pytweening", specifier = "==1.2.0" }, - { name = "pytz", specifier = "==2026.1.post1" }, - { name = "pywebview", specifier = "==6.1" }, - { name = "pywin32-ctypes", specifier = "==0.2.3" }, - { name = "requests", specifier = "==2.32.5" }, - { name = "requests-file", specifier = "==3.0.1" }, - { name = "six", specifier = "==1.17.0" }, - { name = "tldextract", specifier = "==5.3.0" }, - { name = "typing-extensions", specifier = "==4.15.0" }, - { name = "typing-inspection", specifier = "==0.4.2" }, - { name = "tzdata", specifier = "==2025.3" }, - { name = "urllib3", specifier = "==2.6.3" }, - { name = "websocket-client", specifier = "==1.9.0" }, - { name = "websockets", specifier = "==14.2" }, - { name = "werkzeug", specifier = "==3.1.6" }, - { name = "zipp", specifier = "==3.23.0" }, - { name = "zstandard", specifier = "==0.25.0" }, -] - -[package.metadata.requires-dev] -dev = [ - { name = "pytest", specifier = ">=8.4.2" }, - { name = "ruff", specifier = ">=0.14.0" }, -] - -[[package]] -name = "crcmod-plus" -version = "2.3.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0b/0c/71733bbaf38e9f1eaecfdf7f8e350993f3dcac208a5297c41503ae66e513/crcmod_plus-2.3.1.tar.gz", hash = "sha256:732ffe3c3ce3ef9b272e1827d8fb894590c4d6ff553f2a2b41ae30f4f94b0f5d", size = 22319 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/47/e0/2dad2e6f0cd4914b4144496d9785780ec820e200816c080df785cfa34da6/crcmod_plus-2.3.1-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:b7e35e0f7d93d7571c2c9c3d6760e456999ea4c1eae5ead6acac247b5a79e469", size = 23279 }, - { url = "https://files.pythonhosted.org/packages/66/76/53c0b65b9679b903f98fc54efa32b0e5a19634712a45200c7a80674aa6f5/crcmod_plus-2.3.1-cp311-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6853243120db84677b94b625112116f0ef69cd581741d20de58dce4c34242654", size = 20185 }, - { url = "https://files.pythonhosted.org/packages/98/79/2b4dc9bb26394873d7699737124408b5106264ae33053fdec600e9a9fa65/crcmod_plus-2.3.1-cp311-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:17735bc4e944d552ea18c8609fc6d08a5e64ee9b29cc216ba4d623754029cc3a", size = 26999 }, - { url = "https://files.pythonhosted.org/packages/bb/e8/f5d66778b5a1bff915807016561a02b5cebf6b3840fb8a2be40bbb0c8575/crcmod_plus-2.3.1-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ac755040a2a35f43ab331978c48a9acb4ff64b425f282a296be467a410f00c3", size = 27536 }, - { url = "https://files.pythonhosted.org/packages/f3/2c/0113ad30cadad40c22eef08c0f2618f2446dd282f02268fecbcfc9fda3c1/crcmod_plus-2.3.1-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7bdcfb838ca093ca673a3bbb37f62d1e5ec7182e00cc5ee2d00759f9f9f8ab11", size = 27385 }, - { url = "https://files.pythonhosted.org/packages/8e/ba/501ef1b02119402cf1a31c01eb2cb8399660bca863c2f4dd3dc060220284/crcmod_plus-2.3.1-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9166bc3c9b5e7b07b4e6854cac392b4a451b31d58d3950e48c140ab7b5d05394", size = 27135 }, - { url = "https://files.pythonhosted.org/packages/49/90/d4556c9db69c83e726c5b88da3d656fdaac7d60c4d27b43cb939bed80069/crcmod_plus-2.3.1-cp311-abi3-win32.whl", hash = "sha256:cb99b694cce5c862560cf332a8b5e793620e28f0de3726995608bbd6f9b6e09a", size = 22384 }, - { url = "https://files.pythonhosted.org/packages/4d/7e/57bb97a8c7b4e19900744f58b67dc83bc9c83aaac670deeede9fb3bfab6a/crcmod_plus-2.3.1-cp311-abi3-win_amd64.whl", hash = "sha256:82b0f7e968c430c5a80fe0fc59e75cb54f2e84df2ed0cee5a3ff9cadfbf8a220", size = 22912 }, - { url = "https://files.pythonhosted.org/packages/a4/12/fd9c058b7c2d8c63841038bd9b7a1781881c93ab06d8357a9eecb46c0b74/crcmod_plus-2.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:22600072de422632531e92d7675faf223a5b2548d45c5cd6f77ec4575339900f", size = 23145 }, - { url = "https://files.pythonhosted.org/packages/0f/e2/002c5ee72d99bcc382f15d95f539daf0c2de31bc929f0d9e18733b4facde/crcmod_plus-2.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f940704e359607b47b4a8e98c4d0f453f15bea039eb183cd0ffb14a8268fea78", size = 20120 }, - { url = "https://files.pythonhosted.org/packages/1f/0d/9584047c81aceb2e2e655160d10cd3c39cbf1fad52bcd6dd205ada1e077d/crcmod_plus-2.3.1-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f939fc1f7d143962a8fbed2305ce5931627fea1ea3a7f1865c04dbba9d41bf67", size = 28810 }, - { url = "https://files.pythonhosted.org/packages/46/9f/300d48c4fc6bc409af700fa9bde85faab3934768719bdcc1759b6cce974c/crcmod_plus-2.3.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3c6e8c7cf7ef49bcae7d3293996f82edde98e5fa202752ae58bf37a0289d35d", size = 29524 }, - { url = "https://files.pythonhosted.org/packages/00/03/58e7f4e1eacd1b1bb2c69aa0763d7aa39ba89c013b16d51522316b972492/crcmod_plus-2.3.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:728f68d0e3049ba23978aaf277f3eb405dd21e78be6ba96382739ba09bba473c", size = 29297 }, - { url = "https://files.pythonhosted.org/packages/97/26/f4e31712287292693071f29369a9404c2013f7b9226a5cb50e3f44f93d90/crcmod_plus-2.3.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b3829ed0dba48765f9b4139cb70b9bdf6553d2154302d9e3de6377556357892f", size = 29020 }, - { url = "https://files.pythonhosted.org/packages/60/5b/5f450f6e5edcfe93f019e2fd0a480103db1e853ae46983273e24e9dd96dd/crcmod_plus-2.3.1-cp39-cp39-win32.whl", hash = "sha256:855fcbd07c3eb9162c701c1c7ed1a8b5a5f7b1e8c2dd3fd8ed2273e2f141ecc9", size = 22369 }, - { url = "https://files.pythonhosted.org/packages/6d/50/c6a03607712e51254e3f01b8d4214648e429578074f58f7cf11b83c89c86/crcmod_plus-2.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:5422081be6403b6fba736c544e79c68410307f7a1a8ac1925b421a5c6f4591d3", size = 22916 }, -] - -[[package]] -name = "cryptography" -version = "41.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/bf/92/3301a5d4fb734290a8bca5a9aad61ea61327ed53cb19be110d4f3548df76/cryptography-41.0.0.tar.gz", hash = "sha256:6b71f64beeea341c9b4f963b48ee3b62d62d57ba93eb120e1196b31dc1025e78", size = 628254 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/31/06d6c33f93165c0fc80008fdeab4543b1ce7ceebcc2cf66da70e5e1daaad/cryptography-41.0.0-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:3c5ef25d060c80d6d9f7f9892e1d41bb1c79b78ce74805b8cb4aa373cb7d5ec8", size = 5315010 }, - { url = "https://files.pythonhosted.org/packages/4e/60/e02e88f973fcf2366008d1e0b62e9ef6e432e00d6edae0e47371fe624ccb/cryptography-41.0.0-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:8362565b3835ceacf4dc8f3b56471a2289cf51ac80946f9087e66dc283a810e0", size = 2829238 }, - { url = "https://files.pythonhosted.org/packages/5b/97/1096bb43ff0f9f40a6a04fc26fe209b2991805257a2c2e32f1076201f2dd/cryptography-41.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3680248309d340fda9611498a5319b0193a8dbdb73586a1acf8109d06f25b92d", size = 4080931 }, - { url = "https://files.pythonhosted.org/packages/76/94/e5b948856427b66575e194764e54bb43669e7764396868d015f1e40b5e3a/cryptography-41.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84a165379cb9d411d58ed739e4af3396e544eac190805a54ba2e0322feb55c46", size = 4299395 }, - { url = "https://files.pythonhosted.org/packages/a3/90/182588b47bbe52438193d93a9901d0dddfe25b7abdc25196473f896e63e3/cryptography-41.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:4ab14d567f7bbe7f1cdff1c53d5324ed4d3fc8bd17c481b395db224fb405c237", size = 4069007 }, - { url = "https://files.pythonhosted.org/packages/92/b6/22b9b21fecfb03a90ce9393053f054b2742b00e704c20a595cf4c15f975e/cryptography-41.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9f65e842cb02550fac96536edb1d17f24c0a338fd84eaf582be25926e993dde4", size = 4307626 }, - { url = "https://files.pythonhosted.org/packages/f7/a3/83dc953152063db9d7a2d3349d913576fc672b71523581ddb0faa6af22bc/cryptography-41.0.0-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:b7f2f5c525a642cecad24ee8670443ba27ac1fab81bba4cc24c7b6b41f2d0c75", size = 4178249 }, - { url = "https://files.pythonhosted.org/packages/67/da/096e2074dee14fa5793ed60a39efcab0d9851a67859bf468b1862d53e35a/cryptography-41.0.0-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:7d92f0248d38faa411d17f4107fc0bce0c42cae0b0ba5415505df72d751bf62d", size = 4377029 }, - { url = "https://files.pythonhosted.org/packages/9b/00/1cb49039236a71b9c8511ec3ba7d5153c22b022d67518499f34dcafc8c2e/cryptography-41.0.0-cp37-abi3-win32.whl", hash = "sha256:34d405ea69a8b34566ba3dfb0521379b210ea5d560fafedf9f800a9a94a41928", size = 2209044 }, - { url = "https://files.pythonhosted.org/packages/ab/40/bb01066d306329d3f0e440c5e9863f08d29e783c827ce74a823889d56977/cryptography-41.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:344c6de9f8bda3c425b3a41b319522ba3208551b70c2ae00099c205f0d9fd3be", size = 2640813 }, - { url = "https://files.pythonhosted.org/packages/31/50/db80a57bbaa2cd29162449ac7dd5850a8f5e7c547c2842fd6458e2b62c04/cryptography-41.0.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bf8fc66012ca857d62f6a347007e166ed59c0bc150cefa49f28376ebe7d992a2", size = 2697330 }, - { url = "https://files.pythonhosted.org/packages/70/97/0c178505eb329f0c338888ab3fd058101cb5054fc5cf4b9e2edce3e340f9/cryptography-41.0.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a4fc68d1c5b951cfb72dfd54702afdbbf0fb7acdc9b7dc4301bbf2225a27714d", size = 3978273 }, - { url = "https://files.pythonhosted.org/packages/bf/d5/d68700d996a35c7041c5183aab35572064da0b7ba1dfb7526269a7faeeb8/cryptography-41.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:14754bcdae909d66ff24b7b5f166d69340ccc6cb15731670435efd5719294895", size = 4194143 }, - { url = "https://files.pythonhosted.org/packages/38/d9/a8d08aada88bcb8ea4f1a0a34e3d9cf3ce0faea3df69e54c232e88ab8b32/cryptography-41.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0ddaee209d1cf1f180f1efa338a68c4621154de0afaef92b89486f5f96047c55", size = 2516950 }, -] - -[[package]] -name = "cssselect" -version = "1.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/0a/c3ea9573b1dc2e151abfe88c7fe0c26d1892fe6ed02d0cdb30f0d57029d5/cssselect-1.3.0.tar.gz", hash = "sha256:57f8a99424cfab289a1b6a816a43075a4b00948c86b4dcf3ef4ee7e15f7ab0c7", size = 42870 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ee/58/257350f7db99b4ae12b614a36256d9cc870d71d9e451e79c2dc3b23d7c3c/cssselect-1.3.0-py3-none-any.whl", hash = "sha256:56d1bf3e198080cc1667e137bc51de9cadfca259f03c2d4e09037b3e01e30f0d", size = 18786 }, -] - -[[package]] -name = "datarecorder" -version = "3.6.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "openpyxl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b4/a1/43d52eada4e1364f8d1a5da99b855798f945228ffb7dfb199f675c1d2c2b/DataRecorder-3.6.2.tar.gz", hash = "sha256:8c9024736692af68b947fd884589e685c4f27bc29d031b81164457b09c60e1e5", size = 29567 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/33/05/f0064d93a0b922ea7ad5d40a0dfaac45de37f783a85a2900e6ce8a01dbc3/DataRecorder-3.6.2-py3-none-any.whl", hash = "sha256:41ad022c4c1db58a0f4236f6a4991d1f98cd76ec049484b172bbb3040455e5ff", size = 37539 }, -] - -[[package]] -name = "distro" -version = "1.9.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277 }, -] - -[[package]] -name = "downloadkit" -version = "2.0.7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "datarecorder" }, - { name = "requests" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6b/35/9bbaed54f5d170b1fd8bcfdd3ce5e24ea71f4cac5026a37e6b21ab69726e/DownloadKit-2.0.7.tar.gz", hash = "sha256:601e423d1d4d0bd3e933524d06c913e744577d455990ec20afc3fb1f79aea9a7", size = 17488 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1b/89/979ad2407eb8e0a2ac67461b7bec7db8627218fe3ba287db49636ca0a60c/DownloadKit-2.0.7-py3-none-any.whl", hash = "sha256:55b142d26b4e7ae01fff2181991c92aca9b895f75e2cd8a54f4a3b48c50b90b4", size = 21706 }, -] - -[[package]] -name = "drissionpage" -version = "4.1.1.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "cssselect" }, - { name = "downloadkit" }, - { name = "lxml" }, - { name = "psutil" }, - { name = "requests" }, - { name = "tldextract" }, - { name = "websocket-client" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/12/b3/26bb358f3c7019bba0a2e27a636382a4226780628c30ab315537524809fb/drissionpage-4.1.1.2.tar.gz", hash = "sha256:e4375d3536519a1d24430270e2871de3015836b301cbdfb96583234e6d6ef4c1", size = 208034 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/31/05834b38c12a222012f998d5c2f104f228cf8aaa37747f989c9b29e81d5d/DrissionPage-4.1.1.2-py3-none-any.whl", hash = "sha256:c8b58a8d495550142c10499ce7128655b2baf8f38f46604ba0ce951a148d88e8", size = 257497 }, -] - -[[package]] -name = "et-xmlfile" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54", size = 17234 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", size = 18059 }, -] - -[[package]] -name = "exceptiongroup" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740 }, -] - -[[package]] -name = "filelock" -version = "3.19.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/40/bb/0ab3e58d22305b6f5440629d20683af28959bf793d98d11950e305c1c326/filelock-3.19.1.tar.gz", hash = "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58", size = 17687 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/42/14/42b2651a2f46b022ccd948bca9f2d5af0fd8929c4eec235b8d6d844fbe67/filelock-3.19.1-py3-none-any.whl", hash = "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d", size = 15988 }, -] - -[[package]] -name = "flask" -version = "3.1.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "blinker" }, - { name = "click" }, - { name = "importlib-metadata" }, - { name = "itsdangerous" }, - { name = "jinja2" }, - { name = "markupsafe" }, - { name = "werkzeug" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/26/00/35d85dcce6c57fdc871f3867d465d780f302a175ea360f62533f12b27e2b/flask-3.1.3.tar.gz", hash = "sha256:0ef0e52b8a9cd932855379197dd8f94047b359ca0a78695144304cb45f87c9eb", size = 759004 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/9c/34f6962f9b9e9c71f6e5ed806e0d0ff03c9d1b0b2340088a0cf4bce09b18/flask-3.1.3-py3-none-any.whl", hash = "sha256:f4bcbefc124291925f1a26446da31a5178f9483862233b23c0c96a20701f670c", size = 103424 }, -] - -[[package]] -name = "flask-cors" -version = "6.0.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "flask" }, - { name = "werkzeug" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/70/74/0fc0fa68d62f21daef41017dafab19ef4b36551521260987eb3a5394c7ba/flask_cors-6.0.2.tar.gz", hash = "sha256:6e118f3698249ae33e429760db98ce032a8bf9913638d085ca0f4c5534ad2423", size = 13472 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4f/af/72ad54402e599152de6d067324c46fe6a4f531c7c65baf7e96c63db55eaf/flask_cors-6.0.2-py3-none-any.whl", hash = "sha256:e57544d415dfd7da89a9564e1e3a9e515042df76e12130641ca6f3f2f03b699a", size = 13257 }, -] - -[[package]] -name = "h11" -version = "0.16.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515 }, -] - -[[package]] -name = "httpcore" -version = "1.0.9" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "h11" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784 }, -] - -[[package]] -name = "httpx" -version = "0.28.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "certifi" }, - { name = "httpcore" }, - { name = "idna" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, -] - -[[package]] -name = "idna" -version = "3.11" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008 }, -] - -[[package]] -name = "importlib-metadata" -version = "8.7.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "zipp" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151", size = 27865 }, -] - -[[package]] -name = "iniconfig" -version = "2.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050 }, -] - -[[package]] -name = "itsdangerous" -version = "2.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9c/cb/8ac0172223afbccb63986cc25049b154ecfb5e85932587206f42317be31d/itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173", size = 54410 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", size = 16234 }, -] - -[[package]] -name = "jinja2" -version = "3.1.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markupsafe" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 }, -] - -[[package]] -name = "loguru" -version = "0.7.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "win32-setctime", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3a/05/a1dae3dffd1116099471c643b8924f5aa6524411dc6c63fdae648c4f1aca/loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6", size = 63559 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c", size = 61595 }, -] - -[[package]] -name = "lxml" -version = "6.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/aa/88/262177de60548e5a2bfc46ad28232c9e9cbde697bd94132aeb80364675cb/lxml-6.0.2.tar.gz", hash = "sha256:cd79f3367bd74b317dda655dc8fcfa304d9eb6e4fb06b7168c5cf27f96e0cd62", size = 4073426 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/66/dd13c74fad495957374c8a81c932f4874d3dca5aa0db9e4369f06a399718/lxml-6.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2c8458c2cdd29589a8367c09c8f030f1d202be673f0ca224ec18590b3b9fb694", size = 8602363 }, - { url = "https://files.pythonhosted.org/packages/5e/f4/edb9d47dce464b5dd044d35775ee794364935b93ab6226c95e199118890d/lxml-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3fee0851639d06276e6b387f1c190eb9d7f06f7f53514e966b26bae46481ec90", size = 4634995 }, - { url = "https://files.pythonhosted.org/packages/66/f2/d80c97b6ed83a99bc24b2b29919d5e618af5322df6d3aa61064093712309/lxml-6.0.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b2142a376b40b6736dfc214fd2902409e9e3857eff554fed2d3c60f097e62a62", size = 5003737 }, - { url = "https://files.pythonhosted.org/packages/d5/f1/18b750f79f8889b9109b24749f23ac137870b4f685edc4be54be0ff2c730/lxml-6.0.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6b5b39cc7e2998f968f05309e666103b53e2edd01df8dc51b90d734c0825444", size = 5160821 }, - { url = "https://files.pythonhosted.org/packages/cf/88/2b6a415dbad411c3e9c092128eb7db06054d2d9460aa56676d17ee4f4fd5/lxml-6.0.2-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4aec24d6b72ee457ec665344a29acb2d35937d5192faebe429ea02633151aad", size = 5070959 }, - { url = "https://files.pythonhosted.org/packages/7c/d0/5354afaa0f2e53625e5f96f6bd049a4875c3ab79d96d6c4871dd1f4a98c4/lxml-6.0.2-cp39-cp39-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:b42f4d86b451c2f9d06ffb4f8bbc776e04df3ba070b9fe2657804b1b40277c48", size = 5410267 }, - { url = "https://files.pythonhosted.org/packages/51/63/10dea35a01291dc529fa9d6ba204ea627a1c77b7fbb180d404f6cc4dd2fd/lxml-6.0.2-cp39-cp39-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cdaefac66e8b8f30e37a9b4768a391e1f8a16a7526d5bc77a7928408ef68e93", size = 5292990 }, - { url = "https://files.pythonhosted.org/packages/37/58/51ef422d8bec58db600b3552e5f2d870ec01ffacf11d98689c42ffdcbf7f/lxml-6.0.2-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:b738f7e648735714bbb82bdfd030203360cfeab7f6e8a34772b3c8c8b820568c", size = 4776318 }, - { url = "https://files.pythonhosted.org/packages/77/97/3f797820e82e3a58a19bc51068b40f3b9ab7d0934ba6e5ba6b147b618319/lxml-6.0.2-cp39-cp39-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:daf42de090d59db025af61ce6bdb2521f0f102ea0e6ea310f13c17610a97da4c", size = 5360191 }, - { url = "https://files.pythonhosted.org/packages/e2/14/a9306a8ab122e2f5dfbf4f71fb09beeadca26b0c275708432bbc33f40edc/lxml-6.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:66328dabea70b5ba7e53d94aa774b733cf66686535f3bc9250a7aab53a91caaf", size = 5116114 }, - { url = "https://files.pythonhosted.org/packages/ea/23/2118a1685277b9fa8726ec7ee903db55aa300dcea3d406a220cbe3710953/lxml-6.0.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:e237b807d68a61fc3b1e845407e27e5eb8ef69bc93fe8505337c1acb4ee300b6", size = 4801704 }, - { url = "https://files.pythonhosted.org/packages/4e/e8/d5be34da2059dc9a4ff8643fd6ad3f8234a27b2a44831b7fff58c4dbb3e3/lxml-6.0.2-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:ac02dc29fd397608f8eb15ac1610ae2f2f0154b03f631e6d724d9e2ad4ee2c84", size = 5355451 }, - { url = "https://files.pythonhosted.org/packages/61/84/5aebc8e150d5bf488815ea2d8798c7ff509cc37b5725caa3c1f11bdd3245/lxml-6.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:817ef43a0c0b4a77bd166dc9a09a555394105ff3374777ad41f453526e37f9cb", size = 5318630 }, - { url = "https://files.pythonhosted.org/packages/35/04/629ae603c1c17fb7adc9df2bc21aa5ac96afb84001700b13c1f038f3118c/lxml-6.0.2-cp39-cp39-win32.whl", hash = "sha256:bc532422ff26b304cfb62b328826bd995c96154ffd2bac4544f37dbb95ecaa8f", size = 3614032 }, - { url = "https://files.pythonhosted.org/packages/71/de/07b7b1249acbecbf48f7e42c3ce87a657af6ff38e30f12a1ad81f16010f2/lxml-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:995e783eb0374c120f528f807443ad5a83a656a8624c467ea73781fc5f8a8304", size = 4035311 }, - { url = "https://files.pythonhosted.org/packages/60/e3/02c4c55b281606f3c8e118300e16a9fcf5f3462cc46ce740ed0b82fc3f1b/lxml-6.0.2-cp39-cp39-win_arm64.whl", hash = "sha256:08b9d5e803c2e4725ae9e8559ee880e5328ed61aa0935244e0515d7d9dbec0aa", size = 3683462 }, -] - -[[package]] -name = "macholib" -version = "1.16.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "altgraph" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/10/2f/97589876ea967487978071c9042518d28b958d87b17dceb7cdc1d881f963/macholib-1.16.4.tar.gz", hash = "sha256:f408c93ab2e995cd2c46e34fe328b130404be143469e41bc366c807448979362", size = 59427 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/d1/a9f36f8ecdf0fb7c9b1e78c8d7af12b8c8754e74851ac7b94a8305540fc7/macholib-1.16.4-py2.py3-none-any.whl", hash = "sha256:da1a3fa8266e30f0ce7e97c6a54eefaae8edd1e5f86f3eb8b95457cae90265ea", size = 38117 }, -] - -[[package]] -name = "markupsafe" -version = "3.0.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/56/23/0d8c13a44bde9154821586520840643467aee574d8ce79a17da539ee7fed/markupsafe-3.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26", size = 11623 }, - { url = "https://files.pythonhosted.org/packages/fd/23/07a2cb9a8045d5f3f0890a8c3bc0859d7a47bfd9a560b563899bec7b72ed/markupsafe-3.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc", size = 12049 }, - { url = "https://files.pythonhosted.org/packages/bc/e4/6be85eb81503f8e11b61c0b6369b6e077dcf0a74adbd9ebf6b349937b4e9/markupsafe-3.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c", size = 21923 }, - { url = "https://files.pythonhosted.org/packages/6f/bc/4dc914ead3fe6ddaef035341fee0fc956949bbd27335b611829292b89ee2/markupsafe-3.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42", size = 20543 }, - { url = "https://files.pythonhosted.org/packages/89/6e/5fe81fbcfba4aef4093d5f856e5c774ec2057946052d18d168219b7bd9f9/markupsafe-3.0.3-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b", size = 20585 }, - { url = "https://files.pythonhosted.org/packages/f6/f6/e0e5a3d3ae9c4020f696cd055f940ef86b64fe88de26f3a0308b9d3d048c/markupsafe-3.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758", size = 21387 }, - { url = "https://files.pythonhosted.org/packages/c8/25/651753ef4dea08ea790f4fbb65146a9a44a014986996ca40102e237aa49a/markupsafe-3.0.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2", size = 20133 }, - { url = "https://files.pythonhosted.org/packages/dc/0a/c3cf2b4fef5f0426e8a6d7fce3cb966a17817c568ce59d76b92a233fdbec/markupsafe-3.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d", size = 20588 }, - { url = "https://files.pythonhosted.org/packages/cd/1b/a7782984844bd519ad4ffdbebbba2671ec5d0ebbeac34736c15fb86399e8/markupsafe-3.0.3-cp39-cp39-win32.whl", hash = "sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7", size = 14566 }, - { url = "https://files.pythonhosted.org/packages/18/1f/8d9c20e1c9440e215a44be5ab64359e207fcb4f675543f1cf9a2a7f648d0/markupsafe-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e", size = 15053 }, - { url = "https://files.pythonhosted.org/packages/4e/d3/fe08482b5cd995033556d45041a4f4e76e7f0521112a9c9991d40d39825f/markupsafe-3.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8", size = 13928 }, -] - -[[package]] -name = "mouseinfo" -version = "0.1.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyperclip" }, - { name = "python3-xlib", marker = "sys_platform == 'linux'" }, - { name = "rubicon-objc", marker = "sys_platform == 'darwin'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/28/fa/b2ba8229b9381e8f6381c1dcae6f4159a7f72349e414ed19cfbbd1817173/MouseInfo-0.1.3.tar.gz", hash = "sha256:2c62fb8885062b8e520a3cce0a297c657adcc08c60952eb05bc8256ef6f7f6e7", size = 10850 } - -[[package]] -name = "nuitka" -version = "2.8.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ordered-set" }, - { name = "zstandard" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/10/d9/c202b2e9d91f163417b4c5167df2a71707c57175d0540a4da8b1fc06d4f1/nuitka-2.8.6.tar.gz", hash = "sha256:a648c392d2a041f31c9582a68ef7c1a3a71166eaf2d344a0bb1d03f184ed3a2a", size = 3885843 } - -[[package]] -name = "numpy" -version = "1.25.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a0/41/8f53eff8e969dd8576ddfb45e7ed315407d27c7518ae49418be8ed532b07/numpy-1.25.2.tar.gz", hash = "sha256:fd608e19c8d7c55021dffd43bfe5492fab8cc105cc8986f813f8c3c048b38760", size = 10805282 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/d9/22c304cd123e0a1b7d89213e50ed6ec4b22f07f1117d64d28f81c08be428/numpy-1.25.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b79e513d7aac42ae918db3ad1341a015488530d0bb2a6abcbdd10a3a829ccfd3", size = 20847260 }, - { url = "https://files.pythonhosted.org/packages/0f/a8/5057b97c395a710999b5697ffedd648caee82c24a29595952d26bd750155/numpy-1.25.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:eb942bfb6f84df5ce05dbf4b46673ffed0d3da59f13635ea9b926af3deb76926", size = 14022126 }, - { url = "https://files.pythonhosted.org/packages/6d/b6/94a587cd64ef090f844ab1d8c8f1af44d07be7387f5f1a40eb729a0ff9c9/numpy-1.25.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e0746410e73384e70d286f93abf2520035250aad8c5714240b0492a7302fdca", size = 14206441 }, - { url = "https://files.pythonhosted.org/packages/69/1f/c95b1108a9972a52d7b1b63ed8ca70466b59b8c1811bd121f1e667cc45d8/numpy-1.25.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7806500e4f5bdd04095e849265e55de20d8cc4b661b038957354327f6d9b295", size = 18263142 }, - { url = "https://files.pythonhosted.org/packages/d3/76/fe6b9e75883d1f2bd3cd27cbc7307ec99a0cc76fa941937c177f464fd60a/numpy-1.25.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8b77775f4b7df768967a7c8b3567e309f617dd5e99aeb886fa14dc1a0791141f", size = 18102143 }, - { url = "https://files.pythonhosted.org/packages/81/e3/f562c2d76af16c1d79e73de04f9d08e5a7fd0e50ae12692acd4dbd2501f7/numpy-1.25.2-cp39-cp39-win32.whl", hash = "sha256:2792d23d62ec51e50ce4d4b7d73de8f67a2fd3ea710dcbc8563a51a03fb07b01", size = 12689997 }, - { url = "https://files.pythonhosted.org/packages/df/18/181fb40f03090c6fbd061bb8b1f4c32453f7c602b0dc7c08b307baca7cd7/numpy-1.25.2-cp39-cp39-win_amd64.whl", hash = "sha256:76b4115d42a7dfc5d485d358728cdd8719be33cc5ec6ec08632a5d6fca2ed380", size = 15581137 }, - { url = "https://files.pythonhosted.org/packages/11/58/e921b73d1a181d49fc5a797f5151b7be78cbc5b4483f8f6042e295b85c01/numpy-1.25.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1a1329e26f46230bf77b02cc19e900db9b52f398d6722ca853349a782d4cff55", size = 20168999 }, - { url = "https://files.pythonhosted.org/packages/2c/53/9a023f6960ea6c8f66eafae774ba7ab1700fd987158df5aa9dbb28f98f8b/numpy-1.25.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3abc71e8b6edba80a01a52e66d83c5d14433cbcd26a40c329ec7ed09f37901", size = 17618771 }, - { url = "https://files.pythonhosted.org/packages/2d/2a/5d85ca5d889363ffdec3e3258c7bacdc655801787d004a55e04cf19eeb4a/numpy-1.25.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1b9735c27cea5d995496f46a8b1cd7b408b3f34b6d50459d9ac8fe3a20cc17bf", size = 15442128 }, -] - -[[package]] -name = "openpyxl" -version = "3.1.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "et-xmlfile" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050", size = 186464 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910 }, -] - -[[package]] -name = "ordered-set" -version = "4.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4c/ca/bfac8bc689799bcca4157e0e0ced07e70ce125193fc2e166d2e685b7e2fe/ordered-set-4.1.0.tar.gz", hash = "sha256:694a8e44c87657c59292ede72891eb91d34131f6531463aab3009191c77364a8", size = 12826 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/33/55/af02708f230eb77084a299d7b08175cff006dea4f2721074b92cdb0296c0/ordered_set-4.1.0-py3-none-any.whl", hash = "sha256:046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562", size = 7634 }, -] - -[[package]] -name = "packaging" -version = "26.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366 }, -] - -[[package]] -name = "pandas" -version = "2.3.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, - { name = "python-dateutil" }, - { name = "pytz" }, - { name = "tzdata" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/56/b4/52eeb530a99e2a4c55ffcd352772b599ed4473a0f892d127f4147cf0f88e/pandas-2.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c503ba5216814e295f40711470446bc3fd00f0faea8a086cbc688808e26f92a2", size = 11567720 }, - { url = "https://files.pythonhosted.org/packages/48/4a/2d8b67632a021bced649ba940455ed441ca854e57d6e7658a6024587b083/pandas-2.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a637c5cdfa04b6d6e2ecedcb81fc52ffb0fd78ce2ebccc9ea964df9f658de8c8", size = 10810302 }, - { url = "https://files.pythonhosted.org/packages/13/e6/d2465010ee0569a245c975dc6967b801887068bc893e908239b1f4b6c1ac/pandas-2.3.3-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:854d00d556406bffe66a4c0802f334c9ad5a96b4f1f868adf036a21b11ef13ff", size = 12154874 }, - { url = "https://files.pythonhosted.org/packages/1f/18/aae8c0aa69a386a3255940e9317f793808ea79d0a525a97a903366bb2569/pandas-2.3.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf1f8a81d04ca90e32a0aceb819d34dbd378a98bf923b6398b9a3ec0bf44de29", size = 12790141 }, - { url = "https://files.pythonhosted.org/packages/f7/26/617f98de789de00c2a444fbe6301bb19e66556ac78cff933d2c98f62f2b4/pandas-2.3.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:23ebd657a4d38268c7dfbdf089fbc31ea709d82e4923c5ffd4fbd5747133ce73", size = 13208697 }, - { url = "https://files.pythonhosted.org/packages/b9/fb/25709afa4552042bd0e15717c75e9b4a2294c3dc4f7e6ea50f03c5136600/pandas-2.3.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5554c929ccc317d41a5e3d1234f3be588248e61f08a74dd17c9eabb535777dc9", size = 13879233 }, - { url = "https://files.pythonhosted.org/packages/98/af/7be05277859a7bc399da8ba68b88c96b27b48740b6cf49688899c6eb4176/pandas-2.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:d3e28b3e83862ccf4d85ff19cf8c20b2ae7e503881711ff2d534dc8f761131aa", size = 11359119 }, -] - -[[package]] -name = "pefile" -version = "2024.8.26" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/03/4f/2750f7f6f025a1507cd3b7218691671eecfd0bbebebe8b39aa0fe1d360b8/pefile-2024.8.26.tar.gz", hash = "sha256:3ff6c5d8b43e8c37bb6e6dd5085658d658a7a0bdcd20b6a07b1fcfc1c4e9d632", size = 76008 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/54/16/12b82f791c7f50ddec566873d5bdd245baa1491bac11d15ffb98aecc8f8b/pefile-2024.8.26-py3-none-any.whl", hash = "sha256:76f8b485dcd3b1bb8166f1128d395fa3d87af26360c2358fb75b80019b957c6f", size = 74766 }, -] - -[[package]] -name = "pillow" -version = "11.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/8e/9c089f01677d1264ab8648352dcb7773f37da6ad002542760c80107da816/pillow-11.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:48d254f8a4c776de343051023eb61ffe818299eeac478da55227d96e241de53f", size = 5316478 }, - { url = "https://files.pythonhosted.org/packages/b5/a9/5749930caf674695867eb56a581e78eb5f524b7583ff10b01b6e5048acb3/pillow-11.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7aee118e30a4cf54fdd873bd3a29de51e29105ab11f9aad8c32123f58c8f8081", size = 4686522 }, - { url = "https://files.pythonhosted.org/packages/43/46/0b85b763eb292b691030795f9f6bb6fcaf8948c39413c81696a01c3577f7/pillow-11.3.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:23cff760a9049c502721bdb743a7cb3e03365fafcdfc2ef9784610714166e5a4", size = 5853376 }, - { url = "https://files.pythonhosted.org/packages/5e/c6/1a230ec0067243cbd60bc2dad5dc3ab46a8a41e21c15f5c9b52b26873069/pillow-11.3.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6359a3bc43f57d5b375d1ad54a0074318a0844d11b76abccf478c37c986d3cfc", size = 7626020 }, - { url = "https://files.pythonhosted.org/packages/63/dd/f296c27ffba447bfad76c6a0c44c1ea97a90cb9472b9304c94a732e8dbfb/pillow-11.3.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:092c80c76635f5ecb10f3f83d76716165c96f5229addbd1ec2bdbbda7d496e06", size = 5956732 }, - { url = "https://files.pythonhosted.org/packages/a5/a0/98a3630f0b57f77bae67716562513d3032ae70414fcaf02750279c389a9e/pillow-11.3.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cadc9e0ea0a2431124cde7e1697106471fc4c1da01530e679b2391c37d3fbb3a", size = 6624404 }, - { url = "https://files.pythonhosted.org/packages/de/e6/83dfba5646a290edd9a21964da07674409e410579c341fc5b8f7abd81620/pillow-11.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6a418691000f2a418c9135a7cf0d797c1bb7d9a485e61fe8e7722845b95ef978", size = 6067760 }, - { url = "https://files.pythonhosted.org/packages/bc/41/15ab268fe6ee9a2bc7391e2bbb20a98d3974304ab1a406a992dcb297a370/pillow-11.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:97afb3a00b65cc0804d1c7abddbf090a81eaac02768af58cbdcaaa0a931e0b6d", size = 6700534 }, - { url = "https://files.pythonhosted.org/packages/64/79/6d4f638b288300bed727ff29f2a3cb63db054b33518a95f27724915e3fbc/pillow-11.3.0-cp39-cp39-win32.whl", hash = "sha256:ea944117a7974ae78059fcc1800e5d3295172bb97035c0c1d9345fca1419da71", size = 6277091 }, - { url = "https://files.pythonhosted.org/packages/46/05/4106422f45a05716fd34ed21763f8ec182e8ea00af6e9cb05b93a247361a/pillow-11.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:e5c5858ad8ec655450a7c7df532e9842cf8df7cc349df7225c60d5d348c8aada", size = 6986091 }, - { url = "https://files.pythonhosted.org/packages/63/c6/287fd55c2c12761d0591549d48885187579b7c257bef0c6660755b0b59ae/pillow-11.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:6abdbfd3aea42be05702a8dd98832329c167ee84400a1d1f61ab11437f1717eb", size = 2422632 }, -] - -[[package]] -name = "pluggy" -version = "1.6.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538 }, -] - -[[package]] -name = "proxy-tools" -version = "0.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/cf/77d3e19b7fabd03895caca7857ef51e4c409e0ca6b37ee6e9f7daa50b642/proxy_tools-0.1.0.tar.gz", hash = "sha256:ccb3751f529c047e2d8a58440d86b205303cf0fe8146f784d1cbcd94f0a28010", size = 2978 } - -[[package]] -name = "psutil" -version = "7.2.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090 }, - { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859 }, - { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560 }, - { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997 }, - { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972 }, - { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266 }, - { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737 }, - { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617 }, -] - -[[package]] -name = "pyautogui" -version = "0.9.54" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mouseinfo" }, - { name = "pygetwindow" }, - { name = "pymsgbox" }, - { name = "pyobjc-core", marker = "sys_platform == 'darwin'" }, - { name = "pyobjc-framework-quartz", marker = "sys_platform == 'darwin'" }, - { name = "pyscreeze" }, - { name = "python3-xlib", marker = "sys_platform == 'linux'" }, - { name = "pytweening" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/65/ff/cdae0a8c2118a0de74b6cf4cbcdcaf8fd25857e6c3f205ce4b1794b27814/PyAutoGUI-0.9.54.tar.gz", hash = "sha256:dd1d29e8fd118941cb193f74df57e5c6ff8e9253b99c7b04f39cfc69f3ae04b2", size = 61236 } - -[[package]] -name = "pycparser" -version = "2.23" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140 }, -] - -[[package]] -name = "pycryptodome" -version = "3.23.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8e/a6/8452177684d5e906854776276ddd34eca30d1b1e15aa1ee9cefc289a33f5/pycryptodome-3.23.0.tar.gz", hash = "sha256:447700a657182d60338bab09fdb27518f8856aecd80ae4c6bdddb67ff5da44ef", size = 4921276 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/db/6c/a1f71542c969912bb0e106f64f60a56cc1f0fabecf9396f45accbe63fa68/pycryptodome-3.23.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:187058ab80b3281b1de11c2e6842a357a1f71b42cb1e15bce373f3d238135c27", size = 2495627 }, - { url = "https://files.pythonhosted.org/packages/6e/4e/a066527e079fc5002390c8acdd3aca431e6ea0a50ffd7201551175b47323/pycryptodome-3.23.0-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:cfb5cd445280c5b0a4e6187a7ce8de5a07b5f3f897f235caa11f1f435f182843", size = 1640362 }, - { url = "https://files.pythonhosted.org/packages/50/52/adaf4c8c100a8c49d2bd058e5b551f73dfd8cb89eb4911e25a0c469b6b4e/pycryptodome-3.23.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67bd81fcbe34f43ad9422ee8fd4843c8e7198dd88dd3d40e6de42ee65fbe1490", size = 2182625 }, - { url = "https://files.pythonhosted.org/packages/5f/e9/a09476d436d0ff1402ac3867d933c61805ec2326c6ea557aeeac3825604e/pycryptodome-3.23.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8987bd3307a39bc03df5c8e0e3d8be0c4c3518b7f044b0f4c15d1aa78f52575", size = 2268954 }, - { url = "https://files.pythonhosted.org/packages/f9/c5/ffe6474e0c551d54cab931918127c46d70cab8f114e0c2b5a3c071c2f484/pycryptodome-3.23.0-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa0698f65e5b570426fc31b8162ed4603b0c2841cbb9088e2b01641e3065915b", size = 2308534 }, - { url = "https://files.pythonhosted.org/packages/18/28/e199677fc15ecf43010f2463fde4c1a53015d1fe95fb03bca2890836603a/pycryptodome-3.23.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:53ecbafc2b55353edcebd64bf5da94a2a2cdf5090a6915bcca6eca6cc452585a", size = 2181853 }, - { url = "https://files.pythonhosted.org/packages/ce/ea/4fdb09f2165ce1365c9eaefef36625583371ee514db58dc9b65d3a255c4c/pycryptodome-3.23.0-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:156df9667ad9f2ad26255926524e1c136d6664b741547deb0a86a9acf5ea631f", size = 2342465 }, - { url = "https://files.pythonhosted.org/packages/22/82/6edc3fc42fe9284aead511394bac167693fb2b0e0395b28b8bedaa07ef04/pycryptodome-3.23.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:dea827b4d55ee390dc89b2afe5927d4308a8b538ae91d9c6f7a5090f397af1aa", size = 2267414 }, - { url = "https://files.pythonhosted.org/packages/59/fe/aae679b64363eb78326c7fdc9d06ec3de18bac68be4b612fc1fe8902693c/pycryptodome-3.23.0-cp37-abi3-win32.whl", hash = "sha256:507dbead45474b62b2bbe318eb1c4c8ee641077532067fec9c1aa82c31f84886", size = 1768484 }, - { url = "https://files.pythonhosted.org/packages/54/2f/e97a1b8294db0daaa87012c24a7bb714147c7ade7656973fd6c736b484ff/pycryptodome-3.23.0-cp37-abi3-win_amd64.whl", hash = "sha256:c75b52aacc6c0c260f204cbdd834f76edc9fb0d8e0da9fbf8352ef58202564e2", size = 1799636 }, - { url = "https://files.pythonhosted.org/packages/18/3d/f9441a0d798bf2b1e645adc3265e55706aead1255ccdad3856dbdcffec14/pycryptodome-3.23.0-cp37-abi3-win_arm64.whl", hash = "sha256:11eeeb6917903876f134b56ba11abe95c0b0fd5e3330def218083c7d98bbcb3c", size = 1703675 }, - { url = "https://files.pythonhosted.org/packages/dc/c4/6925ad41576d3e84f03aaf9a0411667af861f9fa2c87553c7dd5bde01518/pycryptodome-3.23.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:865d83c906b0fc6a59b510deceee656b6bc1c4fa0d82176e2b77e97a420a996a", size = 1623768 }, - { url = "https://files.pythonhosted.org/packages/a8/14/d6c6a3098ddf2624068f041c5639be5092ad4ae1a411842369fd56765994/pycryptodome-3.23.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89d4d56153efc4d81defe8b65fd0821ef8b2d5ddf8ed19df31ba2f00872b8002", size = 1672070 }, - { url = "https://files.pythonhosted.org/packages/20/89/5d29c8f178fea7c92fd20d22f9ddd532a5e3ac71c574d555d2362aaa832a/pycryptodome-3.23.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3f2d0aaf8080bda0587d58fc9fe4766e012441e2eed4269a77de6aea981c8be", size = 1664359 }, - { url = "https://files.pythonhosted.org/packages/38/bc/a287d41b4421ad50eafb02313137d0276d6aeffab90a91e2b08f64140852/pycryptodome-3.23.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64093fc334c1eccfd3933c134c4457c34eaca235eeae49d69449dc4728079339", size = 1702359 }, - { url = "https://files.pythonhosted.org/packages/2b/62/2392b7879f4d2c1bfa20815720b89d464687877851716936b9609959c201/pycryptodome-3.23.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ce64e84a962b63a47a592690bdc16a7eaf709d2c2697ababf24a0def566899a6", size = 1802461 }, -] - -[[package]] -name = "pydantic" -version = "2.12.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "annotated-types" }, - { name = "pydantic-core" }, - { name = "typing-extensions" }, - { name = "typing-inspection" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580 }, -] - -[[package]] -name = "pydantic-core" -version = "2.41.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/54/db/160dffb57ed9a3705c4cbcbff0ac03bdae45f1ca7d58ab74645550df3fbd/pydantic_core-2.41.5-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:8bfeaf8735be79f225f3fefab7f941c712aaca36f1128c9d7e2352ee1aa87bdf", size = 2107999 }, - { url = "https://files.pythonhosted.org/packages/a3/7d/88e7de946f60d9263cc84819f32513520b85c0f8322f9b8f6e4afc938383/pydantic_core-2.41.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:346285d28e4c8017da95144c7f3acd42740d637ff41946af5ce6e5e420502dd5", size = 1929745 }, - { url = "https://files.pythonhosted.org/packages/d5/c2/aef51e5b283780e85e99ff19db0f05842d2d4a8a8cd15e63b0280029b08f/pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a75dafbf87d6276ddc5b2bf6fae5254e3d0876b626eb24969a574fff9149ee5d", size = 1920220 }, - { url = "https://files.pythonhosted.org/packages/c7/97/492ab10f9ac8695cd76b2fdb24e9e61f394051df71594e9bcc891c9f586e/pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7b93a4d08587e2b7e7882de461e82b6ed76d9026ce91ca7915e740ecc7855f60", size = 2067296 }, - { url = "https://files.pythonhosted.org/packages/ec/23/984149650e5269c59a2a4c41d234a9570adc68ab29981825cfaf4cfad8f4/pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e8465ab91a4bd96d36dde3263f06caa6a8a6019e4113f24dc753d79a8b3a3f82", size = 2231548 }, - { url = "https://files.pythonhosted.org/packages/71/0c/85bcbb885b9732c28bec67a222dbed5ed2d77baee1f8bba2002e8cd00c5c/pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:299e0a22e7ae2b85c1a57f104538b2656e8ab1873511fd718a1c1c6f149b77b5", size = 2362571 }, - { url = "https://files.pythonhosted.org/packages/c0/4a/412d2048be12c334003e9b823a3fa3d038e46cc2d64dd8aab50b31b65499/pydantic_core-2.41.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:707625ef0983fcfb461acfaf14de2067c5942c6bb0f3b4c99158bed6fedd3cf3", size = 2068175 }, - { url = "https://files.pythonhosted.org/packages/73/f4/c58b6a776b502d0a5540ad02e232514285513572060f0d78f7832ca3c98b/pydantic_core-2.41.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f41eb9797986d6ebac5e8edff36d5cef9de40def462311b3eb3eeded1431e425", size = 2177203 }, - { url = "https://files.pythonhosted.org/packages/ed/ae/f06ea4c7e7a9eead3d165e7623cd2ea0cb788e277e4f935af63fc98fa4e6/pydantic_core-2.41.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0384e2e1021894b1ff5a786dbf94771e2986ebe2869533874d7e43bc79c6f504", size = 2148191 }, - { url = "https://files.pythonhosted.org/packages/c1/57/25a11dcdc656bf5f8b05902c3c2934ac3ea296257cc4a3f79a6319e61856/pydantic_core-2.41.5-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:f0cd744688278965817fd0839c4a4116add48d23890d468bc436f78beb28abf5", size = 2343907 }, - { url = "https://files.pythonhosted.org/packages/96/82/e33d5f4933d7a03327c0c43c65d575e5919d4974ffc026bc917a5f7b9f61/pydantic_core-2.41.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:753e230374206729bf0a807954bcc6c150d3743928a73faffee51ac6557a03c3", size = 2322174 }, - { url = "https://files.pythonhosted.org/packages/81/45/4091be67ce9f469e81656f880f3506f6a5624121ec5eb3eab37d7581897d/pydantic_core-2.41.5-cp39-cp39-win32.whl", hash = "sha256:873e0d5b4fb9b89ef7c2d2a963ea7d02879d9da0da8d9d4933dee8ee86a8b460", size = 1990353 }, - { url = "https://files.pythonhosted.org/packages/44/8a/a98aede18db6e9cd5d66bcacd8a409fcf8134204cdede2e7de35c5a2c5ef/pydantic_core-2.41.5-cp39-cp39-win_amd64.whl", hash = "sha256:e4f4a984405e91527a0d62649ee21138f8e3d0ef103be488c1dc11a80d7f184b", size = 2015698 }, -] - -[[package]] -name = "pygetwindow" -version = "0.0.9" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyrect" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e1/70/c7a4f46dbf06048c6d57d9489b8e0f9c4c3d36b7479f03c5ca97eaa2541d/PyGetWindow-0.0.9.tar.gz", hash = "sha256:17894355e7d2b305cd832d717708384017c1698a90ce24f6f7fbf0242dd0a688", size = 9699 } - -[[package]] -name = "pygments" -version = "2.20.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151 }, -] - -[[package]] -name = "pyinstaller" -version = "6.19.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "altgraph" }, - { name = "importlib-metadata" }, - { name = "macholib", marker = "sys_platform == 'darwin'" }, - { name = "packaging" }, - { name = "pefile", marker = "sys_platform == 'win32'" }, - { name = "pyinstaller-hooks-contrib" }, - { name = "pywin32-ctypes", marker = "sys_platform == 'win32'" }, - { name = "setuptools" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c8/63/fd62472b6371d89dc138d40c36d87a50dc2de18a035803bbdc376b4ffac4/pyinstaller-6.19.0.tar.gz", hash = "sha256:ec73aeb8bd9b7f2f1240d328a4542e90b3c6e6fbc106014778431c616592a865", size = 4036072 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e3/eb/23374721fecfa72677e79800921cb6aceefa6ba48574dc404f3f6c6c3be7/pyinstaller-6.19.0-py3-none-macosx_10_13_universal2.whl", hash = "sha256:4190e76b74f0c4b5c5f11ac360928cd2e36ec8e3194d437bf6b8648c7bc0c134", size = 1040563 }, - { url = "https://files.pythonhosted.org/packages/cd/7e/dfd724b0b533f5aaec0ee5df406fe2319987ed6964480a706f85478b12ea/pyinstaller-6.19.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8bd68abd812d8a6ba33b9f1810e91fee0f325969733721b78151f0065319ca11", size = 735477 }, - { url = "https://files.pythonhosted.org/packages/88/c9/ee3a4101c31f26344e66896c73c1fd6ed8282bf871473365b7f8674af406/pyinstaller-6.19.0-py3-none-manylinux2014_i686.whl", hash = "sha256:1ec54ef967996ca61dacba676227e2b23219878ccce5ee9d6f3aada7b8ed8abf", size = 747143 }, - { url = "https://files.pythonhosted.org/packages/da/0a/fc77e9f861be8cf300ac37155f59cc92aff99b29f2ddd78546f563a5b5a6/pyinstaller-6.19.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:4ab2bb52e58448e14ddf9450601bdedd66800465043501c1d8f1cab87b60b122", size = 744849 }, - { url = "https://files.pythonhosted.org/packages/6d/e3/6872e020ee758afe0b821663858492c10745608b07150e5e2c824a5b3e1c/pyinstaller-6.19.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:da6d5c6391ccefe73554b9fa29b86001c8e378e0f20c2a4004f836ba537eff63", size = 741590 }, - { url = "https://files.pythonhosted.org/packages/53/60/b8db5f1a4b0fb228175f2ea0aa33f949adcc097fbe981cc524f9faf85777/pyinstaller-6.19.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a0fc5f6b3c55aa54353f0c74ffa59b1115433c1850c6f655d62b461a2ed6cbbe", size = 741448 }, - { url = "https://files.pythonhosted.org/packages/6f/4d/63b0600f2694e9141b83129fbc1c488ec84d5a0770b1448ec154dcd0fee9/pyinstaller-6.19.0-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:e649ba6bd1b0b89b210ad92adb5fbdc8a42dd2c5ca4f72ef3a0bfec83a424b83", size = 740613 }, - { url = "https://files.pythonhosted.org/packages/01/d4/e812ad36178093a0e9fd4b8127577748dd85b0cb71de912229dca21fd741/pyinstaller-6.19.0-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:481a909c8e60c8692fc60fcb1344d984b44b943f8bc9682f2fcdae305ad297e6", size = 740350 }, - { url = "https://files.pythonhosted.org/packages/52/03/b2c2ee41fb8e10fd2a45d21f5ec2ef25852cfb978dbf762972eed59e3d63/pyinstaller-6.19.0-py3-none-win32.whl", hash = "sha256:3c5c251054fe4cfaa04c34a363dcfbf811545438cb7198304cd444756bc2edd2", size = 1324317 }, - { url = "https://files.pythonhosted.org/packages/9c/d3/6d5e62b8270e2b53a6065e281b3a7785079b00e9019c8019952828dd1669/pyinstaller-6.19.0-py3-none-win_amd64.whl", hash = "sha256:b5bb6536c6560330d364d91522250f254b107cf69129d9cbcd0e6727c570be33", size = 1384894 }, - { url = "https://files.pythonhosted.org/packages/81/65/458cd523308a101a22fd2742893405030cc24994cc74b1b767cecf137160/pyinstaller-6.19.0-py3-none-win_arm64.whl", hash = "sha256:c2d5a539b0bfe6159d5522c8c70e1c0e487f22c2badae0f97d45246223b798ea", size = 1325374 }, -] - -[[package]] -name = "pyinstaller-hooks-contrib" -version = "2026.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "importlib-metadata" }, - { name = "packaging" }, - { name = "setuptools" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/80/17/716326f6ba18d0663f7995ae369c23e50efebc22fbb054e9710a45688f61/pyinstaller_hooks_contrib-2026.3.tar.gz", hash = "sha256:800d3a198a49a6cd0de2d7fb795005fdca7a0222ed9cb47c0691abd1c27b9310", size = 172323 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/19/781352446af28755f16ce52b2d97f7a6f2d7974ac34c00ca5cd8c40c9098/pyinstaller_hooks_contrib-2026.3-py3-none-any.whl", hash = "sha256:5ecd1068ad262afecadf07556279d2be52ca93a88b049fae17f1a2eb2969254a", size = 454625 }, -] - -[[package]] -name = "pymsgbox" -version = "2.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ae/6a/e80da7594ee598a776972d09e2813df2b06b3bc29218f440631dfa7c78a8/pymsgbox-2.0.1.tar.gz", hash = "sha256:98d055c49a511dcc10fa08c3043e7102d468f5e4b3a83c6d3c61df722c7d798d", size = 20768 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/3e/08c8cac81b2b2f7502746e6b9c8e5b0ec6432cd882c605560fc409aaf087/pymsgbox-2.0.1-py3-none-any.whl", hash = "sha256:5de8ec19bca2ca7e6c09d39c817c83f17c75cee80275235f43a9931db699f73b", size = 9994 }, -] - -[[package]] -name = "pymysql" -version = "1.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f5/ae/1fe3fcd9f959efa0ebe200b8de88b5a5ce3e767e38c7ac32fb179f16a388/pymysql-1.1.2.tar.gz", hash = "sha256:4961d3e165614ae65014e361811a724e2044ad3ea3739de9903ae7c21f539f03", size = 48258 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/4c/ad33b92b9864cbde84f259d5df035a6447f91891f5be77788e2a3892bce3/pymysql-1.1.2-py3-none-any.whl", hash = "sha256:e6b1d89711dd51f8f74b1631fe08f039e7d76cf67a42a323d3178f0f25762ed9", size = 45300 }, -] - -[[package]] -name = "pyobjc-core" -version = "11.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/e9/0b85c81e2b441267bca707b5d89f56c2f02578ef8f3eafddf0e0c0b8848c/pyobjc_core-11.1.tar.gz", hash = "sha256:b63d4d90c5df7e762f34739b39cc55bc63dbcf9fb2fb3f2671e528488c7a87fe", size = 974602 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/3c/98f04333e4f958ee0c44ceccaf0342c2502d361608e00f29a5d50e16a569/pyobjc_core-11.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4a99e6558b48b8e47c092051e7b3be05df1c8d0617b62f6fa6a316c01902d157", size = 677089 }, -] - -[[package]] -name = "pyobjc-framework-cocoa" -version = "11.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyobjc-core" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/4b/c5/7a866d24bc026f79239b74d05e2cf3088b03263da66d53d1b4cf5207f5ae/pyobjc_framework_cocoa-11.1.tar.gz", hash = "sha256:87df76b9b73e7ca699a828ff112564b59251bb9bbe72e610e670a4dc9940d038", size = 5565335 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b2/9b/5499d1ed6790b037b12831d7038eb21031ab90a033d4cfa43c9b51085925/pyobjc_framework_cocoa-11.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bbee71eeb93b1b31ffbac8560b59a0524a8a4b90846a260d2c4f2188f3d4c721", size = 388163 }, -] - -[[package]] -name = "pyobjc-framework-quartz" -version = "11.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyobjc-core" }, - { name = "pyobjc-framework-cocoa" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c7/ac/6308fec6c9ffeda9942fef72724f4094c6df4933560f512e63eac37ebd30/pyobjc_framework_quartz-11.1.tar.gz", hash = "sha256:a57f35ccfc22ad48c87c5932818e583777ff7276605fef6afad0ac0741169f75", size = 3953275 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/ca/204d08ea73125402f408cf139946b90c0d0ccf19d6b5efac616548fbdbbd/pyobjc_framework_quartz-11.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9b1f451ddb5243d8d6316af55f240a02b0fffbfe165bff325628bf73f3df7f44", size = 215537 }, -] - -[[package]] -name = "pyobjc-framework-security" -version = "11.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyobjc-core" }, - { name = "pyobjc-framework-cocoa" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ee/6f/ba50ed2d9c1192c67590a7cfefa44fc5f85c776d1e25beb224dec32081f6/pyobjc_framework_security-11.1.tar.gz", hash = "sha256:dabcee6987c6bae575e2d1ef0fcbe437678c4f49f1c25a4b131a5e960f31a2da", size = 302291 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0d/19d340c7716d8902f6d1aa582b2eff80eca34fcf7d8c474d48e7921ef2ce/pyobjc_framework_security-11.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5dec8412602256e1d7039e670fb987bf1b233a55086e1204f1e32d7aab798f98", size = 41199 }, -] - -[[package]] -name = "pyobjc-framework-uniformtypeidentifiers" -version = "11.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyobjc-core" }, - { name = "pyobjc-framework-cocoa" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c5/4f/066ed1c69352ccc29165f45afb302f8c9c2b5c6f33ee3abfa41b873c07e5/pyobjc_framework_uniformtypeidentifiers-11.1.tar.gz", hash = "sha256:86c499bec8953aeb0c95af39b63f2592832384f09f12523405650b5d5f1ed5e9", size = 20599 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/de/3b/b63b8137dd9f455d5abece6702c06c6b613fac6fda1319aaa2f79d00c380/pyobjc_framework_uniformtypeidentifiers-11.1-py2.py3-none-any.whl", hash = "sha256:6e2e8ea89eb8ca03bc2bc8e506fff901e71d916276475c8d81fbf0280059cb4c", size = 4891 }, -] - -[[package]] -name = "pyobjc-framework-webkit" -version = "11.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyobjc-core" }, - { name = "pyobjc-framework-cocoa" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/92/04/fb3d0b68994f7e657ef00c1ac5fc1c04ae2fc7ea581d647f5ae1f6739b14/pyobjc_framework_webkit-11.1.tar.gz", hash = "sha256:27e701c7aaf4f24fc7e601a128e2ef14f2773f4ab071b9db7438dc5afb5053ae", size = 717102 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/13/46/ad2016804819cfe89d39fa6756252181dc1b46bc478ef8f091248f3ed143/pyobjc_framework_webkit-11.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:94534450e4b3c0a4fe8ad4fa9258afc07ebfe36e1b3966f0fb5cd437c89ccfbf", size = 51390 }, -] - -[[package]] -name = "pyperclip" -version = "1.11.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/52/d87eba7cb129b81563019d1679026e7a112ef76855d6159d24754dbd2a51/pyperclip-1.11.0.tar.gz", hash = "sha256:244035963e4428530d9e3a6101a1ef97209c6825edab1567beac148ccc1db1b6", size = 12185 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/df/80/fc9d01d5ed37ba4c42ca2b55b4339ae6e200b456be3a1aaddf4a9fa99b8c/pyperclip-1.11.0-py3-none-any.whl", hash = "sha256:299403e9ff44581cb9ba2ffeed69c7aa96a008622ad0c46cb575ca75b5b84273", size = 11063 }, -] - -[[package]] -name = "pyqt5" -version = "5.15.11" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyqt5-qt5" }, - { name = "pyqt5-sip" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0e/07/c9ed0bd428df6f87183fca565a79fee19fa7c88c7f00a7f011ab4379e77a/PyQt5-5.15.11.tar.gz", hash = "sha256:fda45743ebb4a27b4b1a51c6d8ef455c4c1b5d610c90d2934c7802b5c1557c52", size = 3216775 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/11/64/42ec1b0bd72d87f87bde6ceb6869f444d91a2d601f2e67cd05febc0346a1/PyQt5-5.15.11-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c8b03dd9380bb13c804f0bdb0f4956067f281785b5e12303d529f0462f9afdc2", size = 6579776 }, - { url = "https://files.pythonhosted.org/packages/49/f5/3fb696f4683ea45d68b7e77302eff173493ac81e43d63adb60fa760b9f91/PyQt5-5.15.11-cp38-abi3-macosx_11_0_x86_64.whl", hash = "sha256:6cd75628f6e732b1ffcfe709ab833a0716c0445d7aec8046a48d5843352becb6", size = 7016415 }, - { url = "https://files.pythonhosted.org/packages/b4/8c/4065950f9d013c4b2e588fe33cf04e564c2322842d84dbcbce5ba1dc28b0/PyQt5-5.15.11-cp38-abi3-manylinux_2_17_x86_64.whl", hash = "sha256:cd672a6738d1ae33ef7d9efa8e6cb0a1525ecf53ec86da80a9e1b6ec38c8d0f1", size = 8188103 }, - { url = "https://files.pythonhosted.org/packages/f3/f0/ae5a5b4f9b826b29ea4be841b2f2d951bcf5ae1d802f3732b145b57c5355/PyQt5-5.15.11-cp38-abi3-win32.whl", hash = "sha256:76be0322ceda5deecd1708a8d628e698089a1cea80d1a49d242a6d579a40babd", size = 5433308 }, - { url = "https://files.pythonhosted.org/packages/56/d5/68eb9f3d19ce65df01b6c7b7a577ad3bbc9ab3a5dd3491a4756e71838ec9/PyQt5-5.15.11-cp38-abi3-win_amd64.whl", hash = "sha256:bdde598a3bb95022131a5c9ea62e0a96bd6fb28932cc1619fd7ba211531b7517", size = 6865864 }, -] - -[[package]] -name = "pyqt5-qt5" -version = "5.15.2" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/62/09/99a222b0360616250fb2e6003a54e43a2a06b0774f0f8d5daafb86a2c375/PyQt5_Qt5-5.15.2-py3-none-macosx_10_13_intel.whl", hash = "sha256:76980cd3d7ae87e3c7a33bfebfaee84448fd650bad6840471d6cae199b56e154", size = 40546019 }, - { url = "https://files.pythonhosted.org/packages/83/d4/241a6a518d0bcf0a9fcdcbad5edfed18d43e884317eab8d5230a2b27e206/PyQt5_Qt5-5.15.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:1988f364ec8caf87a6ee5d5a3a5210d57539988bf8e84714c7d60972692e2f4a", size = 59921716 }, - { url = "https://files.pythonhosted.org/packages/1c/7e/ce7c66a541a105fa98b41d6405fe84940564695e29fc7dccf6d9e8c5f898/PyQt5_Qt5-5.15.2-py3-none-win32.whl", hash = "sha256:9cc7a768b1921f4b982ebc00a318ccb38578e44e45316c7a4a850e953e1dd327", size = 43447358 }, - { url = "https://files.pythonhosted.org/packages/37/97/5d3b222b924fa2ed4c2488925155cd0b03fd5d09ee1cfcf7c553c11c9f66/PyQt5_Qt5-5.15.2-py3-none-win_amd64.whl", hash = "sha256:750b78e4dba6bdf1607febedc08738e318ea09e9b10aea9ff0d73073f11f6962", size = 50075158 }, -] - -[[package]] -name = "pyqt5-sip" -version = "12.17.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ea/08/88a20c862f40b5c178c517cdc7e93767967dec5ac1b994e226d517991c9b/pyqt5_sip-12.17.1.tar.gz", hash = "sha256:0eab72bcb628f1926bf5b9ac51259d4fa18e8b2a81d199071135458f7d087ea8", size = 104136 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/fd/097af91c0446c4877b2614f3e7e40729c7d0a276c401cef3ff95850cd236/pyqt5_sip-12.17.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6fdc457bd528e5909a5893db0a7dee0066d5f22e08234c9152db0ae6df9a367f", size = 122513 }, - { url = "https://files.pythonhosted.org/packages/2c/cf/58143e15d0bfa1d1450071ad9a2d71adca82ebefbd7729d0c543463d4d31/pyqt5_sip-12.17.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:06ea59741c1bffb198d99b00d26594791f45fb11b10f774c8105aea5962e3835", size = 268959 }, - { url = "https://files.pythonhosted.org/packages/e6/9b/8e8f1af1b500f0d4fcd48c9f7ee474731db8b046d3629151e382634eaf59/pyqt5_sip-12.17.1-cp39-cp39-win32.whl", hash = "sha256:b9ef23869d35c6740a95fcb1f387f4aea8d8fac80e19096fbaf1a64e18409c4b", size = 49030 }, - { url = "https://files.pythonhosted.org/packages/64/1e/08bd86000c8294772c6c4aaaf53babd69b9b37e80d1c87583c1fe8eeab5b/pyqt5_sip-12.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:90eed15f19557dfab22e68c7763e3690053cc8dd30d93ade2523d1b5a04a87be", size = 59011 }, -] - -[[package]] -name = "pyrect" -version = "0.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cb/04/2ba023d5f771b645f7be0c281cdacdcd939fe13d1deb331fc5ed1a6b3a98/PyRect-0.2.0.tar.gz", hash = "sha256:f65155f6df9b929b67caffbd57c0947c5ae5449d3b580d178074bffb47a09b78", size = 17219 } - -[[package]] -name = "pyscreeze" -version = "1.0.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pillow" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ee/f0/cb456ac4f1a73723d5b866933b7986f02bacea27516629c00f8e7da94c2d/pyscreeze-1.0.1.tar.gz", hash = "sha256:cf1662710f1b46aa5ff229ee23f367da9e20af4a78e6e365bee973cad0ead4be", size = 27826 } - -[[package]] -name = "pytest" -version = "8.4.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "exceptiongroup" }, - { name = "iniconfig" }, - { name = "packaging" }, - { name = "pluggy" }, - { name = "pygments" }, - { name = "tomli" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750 }, -] - -[[package]] -name = "python-dateutil" -version = "2.9.0.post0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "six" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, -] - -[[package]] -name = "python-dotenv" -version = "1.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f0/26/19cadc79a718c5edbec86fd4919a6b6d3f681039a2f6d66d14be94e75fb9/python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6", size = 44221 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/14/1b/a298b06749107c305e1fe0f814c6c74aea7b2f1e10989cb30f544a1b3253/python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61", size = 21230 }, -] - -[[package]] -name = "python3-xlib" -version = "0.15" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ef/c6/2c5999de3bb1533521f1101e8fe56fd9c266732f4d48011c7c69b29d12ae/python3-xlib-0.15.tar.gz", hash = "sha256:dc4245f3ae4aa5949c1d112ee4723901ade37a96721ba9645f2bfa56e5b383f8", size = 132828 } - -[[package]] -name = "pythonnet" -version = "3.0.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "clr-loader" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9a/d6/1afd75edd932306ae9bd2c2d961d603dc2b52fcec51b04afea464f1f6646/pythonnet-3.0.5.tar.gz", hash = "sha256:48e43ca463941b3608b32b4e236db92d8d40db4c58a75ace902985f76dac21cf", size = 239212 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cd/f1/bfb6811df4745f92f14c47a29e50e89a36b1533130fcc56452d4660bd2d6/pythonnet-3.0.5-py3-none-any.whl", hash = "sha256:f6702d694d5d5b163c9f3f5cc34e0bed8d6857150237fae411fefb883a656d20", size = 297506 }, -] - -[[package]] -name = "pytweening" -version = "1.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/79/0c/c16bc93ac2755bac0066a8ecbd2a2931a1735a6fffd99a2b9681c7e83e90/pytweening-1.2.0.tar.gz", hash = "sha256:243318b7736698066c5f362ec5c2b6434ecf4297c3c8e7caa8abfe6af4cac71b", size = 171241 } - -[[package]] -name = "pytz" -version = "2026.1.post1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/56/db/b8721d71d945e6a8ac63c0fc900b2067181dbb50805958d4d4661cf7d277/pytz-2026.1.post1.tar.gz", hash = "sha256:3378dde6a0c3d26719182142c56e60c7f9af7e968076f31aae569d72a0358ee1", size = 321088 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/10/99/781fe0c827be2742bcc775efefccb3b048a3a9c6ce9aec0cbf4a101677e5/pytz-2026.1.post1-py2.py3-none-any.whl", hash = "sha256:f2fd16142fda348286a75e1a524be810bb05d444e5a081f37f7affc635035f7a", size = 510489 }, -] - -[[package]] -name = "pywebview" -version = "6.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "bottle" }, - { name = "proxy-tools" }, - { name = "pyobjc-core", marker = "sys_platform == 'darwin'" }, - { name = "pyobjc-framework-cocoa", marker = "sys_platform == 'darwin'" }, - { name = "pyobjc-framework-quartz", marker = "sys_platform == 'darwin'" }, - { name = "pyobjc-framework-security", marker = "sys_platform == 'darwin'" }, - { name = "pyobjc-framework-uniformtypeidentifiers", marker = "sys_platform == 'darwin'" }, - { name = "pyobjc-framework-webkit", marker = "sys_platform == 'darwin'" }, - { name = "pythonnet", marker = "sys_platform == 'win32'" }, - { name = "qtpy", marker = "sys_platform == 'openbsd6'" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/64/09/75cf92c4db19350ddb084d841e352ce30e89668815d0494d1dd595c85469/pywebview-6.1.tar.gz", hash = "sha256:f0b95047860caf3d921581f9e16b4edb1a125b23e2ce691c4da2968f8b160ff2", size = 496270 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/74/12/ce9006cdcc1834378826b5c0d4b554d899cd25ac9c665569d060f220b0e1/pywebview-6.1-py3-none-any.whl", hash = "sha256:2b552a340557e76a740b045a25937f72dae751e0985d5f5d9556f697ba622ec5", size = 511255 }, -] - -[[package]] -name = "pywin32-ctypes" -version = "0.2.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", size = 29471 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756 }, -] - -[[package]] -name = "qtpy" -version = "2.4.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "packaging" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/70/01/392eba83c8e47b946b929d7c46e0f04b35e9671f8bb6fc36b6f7945b4de8/qtpy-2.4.3.tar.gz", hash = "sha256:db744f7832e6d3da90568ba6ccbca3ee2b3b4a890c3d6fbbc63142f6e4cdf5bb", size = 66982 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/69/76/37c0ccd5ab968a6a438f9c623aeecc84c202ab2fabc6a8fd927580c15b5a/QtPy-2.4.3-py3-none-any.whl", hash = "sha256:72095afe13673e017946cc258b8d5da43314197b741ed2890e563cf384b51aa1", size = 95045 }, -] - -[[package]] -name = "requests" -version = "2.32.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "charset-normalizer" }, - { name = "idna" }, - { name = "urllib3" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738 }, -] - -[[package]] -name = "requests-file" -version = "3.0.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "requests" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3c/f8/5dc70102e4d337063452c82e1f0d95e39abfe67aa222ed8a5ddeb9df8de8/requests_file-3.0.1.tar.gz", hash = "sha256:f14243d7796c588f3521bd423c5dea2ee4cc730e54a3cac9574d78aca1272576", size = 6967 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/d5/de8f089119205a09da657ed4784c584ede8381a0ce6821212a6d4ca47054/requests_file-3.0.1-py2.py3-none-any.whl", hash = "sha256:d0f5eb94353986d998f80ac63c7f146a307728be051d4d1cd390dbdb59c10fa2", size = 4514 }, -] - -[[package]] -name = "rubicon-objc" -version = "0.5.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/2f/612049b8601e810080f63f4b85acbf2ed0784349088d3c944eb288e1d487/rubicon_objc-0.5.2.tar.gz", hash = "sha256:1180593935f6a8a39c23b5f4b7baa24aedf9f7285e80804a1d9d6b50a50572f5", size = 175710 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/a4/11ad29100060af56408ed084dca76a16d2ce8eb31b75081bfc0eec45d755/rubicon_objc-0.5.2-py3-none-any.whl", hash = "sha256:829b253c579e51fc34f4bb6587c34806e78960dcc1eb24e62b38141a1fe02b39", size = 63512 }, -] - -[[package]] -name = "ruff" -version = "0.15.12" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/99/43/3291f1cc9106f4c63bdce7a8d0df5047fe8422a75b091c16b5e9355e0b11/ruff-0.15.12.tar.gz", hash = "sha256:ecea26adb26b4232c0c2ca19ccbc0083a68344180bba2a600605538ce51a40a6", size = 4643852 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/6e/e78ffb61d4686f3d96ba3df2c801161843746dcbcbb17a1e927d4829312b/ruff-0.15.12-py3-none-linux_armv6l.whl", hash = "sha256:f86f176e188e94d6bdbc09f09bfd9dc729059ad93d0e7390b5a73efe19f8861c", size = 10640713 }, - { url = "https://files.pythonhosted.org/packages/ae/08/a317bc231fb9e7b93e4ef3089501e51922ff88d6936ce5cf870c4fe55419/ruff-0.15.12-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e3bcd123364c3770b8e1b7baaf343cc99a35f197c5c6e8af79015c666c423a6c", size = 11069267 }, - { url = "https://files.pythonhosted.org/packages/aa/a4/f828e9718d3dce1f5f11c39c4f65afd32783c8b2aebb2e3d259e492c47bd/ruff-0.15.12-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fe87510d000220aa1ed530d4448a7c696a0cae1213e5ec30e5874287b66557b5", size = 10397182 }, - { url = "https://files.pythonhosted.org/packages/71/e0/3310fc6d1b5e1fdea22bf3b1b807c7e187b581021b0d7d4514cccdb5fb71/ruff-0.15.12-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84a1630093121375a3e2a95b4a6dc7b59e2b4ee76216e32d81aae550a832d002", size = 10758012 }, - { url = "https://files.pythonhosted.org/packages/11/c1/a606911aee04c324ddaa883ae418f3569792fd3c4a10c50e0dd0a2311e1e/ruff-0.15.12-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fb129f40f114f089ebe0ca56c0d251cf2061b17651d464bb6478dc01e69f11f5", size = 10447479 }, - { url = "https://files.pythonhosted.org/packages/9d/68/4201e8444f0894f21ab4aeeaee68aa4f10b51613514a20d80bd628d57e88/ruff-0.15.12-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0c862b172d695db7598426b8af465e7e9ac00a3ea2a3630ee67eb82e366aaa6", size = 11234040 }, - { url = "https://files.pythonhosted.org/packages/34/ff/8a6d6cf4ccc23fd67060874e832c18919d1557a0611ebef03fdb01fff11e/ruff-0.15.12-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2849ea9f3484c3aca43a82f484210370319e7170df4dfe4843395ddf6c57bc33", size = 12087377 }, - { url = "https://files.pythonhosted.org/packages/85/f6/c669cf73f5152f623d34e69866a46d5e6185816b19fcd5b6dd8a2d299922/ruff-0.15.12-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e77c7e51c07fe396826d5969a5b846d9cd4c402535835fb6e21ce8b28fef847", size = 11367784 }, - { url = "https://files.pythonhosted.org/packages/e8/39/c61d193b8a1daaa8977f7dea9e8d8ba866e02ea7b65d32f6861693aa4c12/ruff-0.15.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83b2f4f2f3b1026b5fb449b467d9264bf22067b600f7b6f41fc5958909f449d0", size = 11344088 }, - { url = "https://files.pythonhosted.org/packages/c2/8d/49afab3645e31e12c590acb6d3b5b69d7aab5b81926dbaf7461f9441f37a/ruff-0.15.12-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:9ba3b8f1afd7e2e43d8943e55f249e13f9682fde09711644a6e7290eb4f3e339", size = 11271770 }, - { url = "https://files.pythonhosted.org/packages/46/06/33f41fe94403e2b755481cdfb9b7ef3e4e0ed031c4581124658d935d52b4/ruff-0.15.12-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e852ba9fdc890655e1d78f2df1499efbe0e54126bd405362154a75e2bde159c5", size = 10719355 }, - { url = "https://files.pythonhosted.org/packages/0d/59/18aa4e014debbf559670e4048e39260a85c7fcee84acfd761ac01e7b8d35/ruff-0.15.12-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:dd8aed930da53780d22fc70bdf84452c843cf64f8cb4eb38984319c24c5cd5fd", size = 10462758 }, - { url = "https://files.pythonhosted.org/packages/25/e7/cc9f16fd0f3b5fddcbd7ec3d6ae30c8f3fde1047f32a4093a98d633c6570/ruff-0.15.12-py3-none-musllinux_1_2_i686.whl", hash = "sha256:01da3988d225628b709493d7dc67c3b9b12c0210016b08690ef9bd27970b262b", size = 10953498 }, - { url = "https://files.pythonhosted.org/packages/72/7a/a9ba7f98c7a575978698f4230c5e8cc54bbc761af34f560818f933dafa0c/ruff-0.15.12-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:9cae0f92bd5700d1213188b31cd3bdd2b315361296d10b96b8e2337d3d11f53e", size = 11447765 }, - { url = "https://files.pythonhosted.org/packages/ea/f9/0ae446942c846b8266059ad8a30702a35afae55f5cdc54c5adf8d7afdc27/ruff-0.15.12-py3-none-win32.whl", hash = "sha256:d0185894e038d7043ba8fd6aee7499ece6462dc0ea9f1e260c7451807c714c20", size = 10657277 }, - { url = "https://files.pythonhosted.org/packages/33/f1/9614e03e1cdcbf9437570b5400ced8a720b5db22b28d8e0f1bda429f660d/ruff-0.15.12-py3-none-win_amd64.whl", hash = "sha256:c87a162d61ab3adca47c03f7f717c68672edec7d1b5499e652331780fe74950d", size = 11837758 }, - { url = "https://files.pythonhosted.org/packages/c0/98/6beb4b351e472e5f4c4613f7c35a5290b8be2497e183825310c4c3a3984b/ruff-0.15.12-py3-none-win_arm64.whl", hash = "sha256:a538f7a82d061cee7be55542aca1d86d1393d55d81d4fcc314370f4340930d4f", size = 11120821 }, -] - -[[package]] -name = "setuptools" -version = "82.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4f/db/cfac1baf10650ab4d1c111714410d2fbb77ac5a616db26775db562c8fab2/setuptools-82.0.1.tar.gz", hash = "sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9", size = 1152316 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl", hash = "sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb", size = 1006223 }, -] - -[[package]] -name = "six" -version = "1.17.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, -] - -[[package]] -name = "tldextract" -version = "5.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "filelock" }, - { name = "idna" }, - { name = "requests" }, - { name = "requests-file" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/97/78/182641ea38e3cfd56e9c7b3c0d48a53d432eea755003aa544af96403d4ac/tldextract-5.3.0.tar.gz", hash = "sha256:b3d2b70a1594a0ecfa6967d57251527d58e00bb5a91a74387baa0d87a0678609", size = 128502 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/67/7c/ea488ef48f2f544566947ced88541bc45fae9e0e422b2edbf165ee07da99/tldextract-5.3.0-py3-none-any.whl", hash = "sha256:f70f31d10b55c83993f55e91ecb7c5d84532a8972f22ec578ecfbe5ea2292db2", size = 107384 }, -] - -[[package]] -name = "tomli" -version = "2.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583 }, -] - -[[package]] -name = "typing-extensions" -version = "4.15.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614 }, -] - -[[package]] -name = "typing-inspection" -version = "0.4.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611 }, -] - -[[package]] -name = "tzdata" -version = "2025.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521 }, -] - -[[package]] -name = "urllib3" -version = "2.6.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584 }, -] - -[[package]] -name = "websocket-client" -version = "1.9.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2c/41/aa4bf9664e4cda14c3b39865b12251e8e7d239f4cd0e3cc1b6c2ccde25c1/websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98", size = 70576 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef", size = 82616 }, -] - -[[package]] -name = "websockets" -version = "14.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/54/8359678c726243d19fae38ca14a334e740782336c9f19700858c4eb64a1e/websockets-14.2.tar.gz", hash = "sha256:5059ed9c54945efb321f097084b4c7e52c246f2c869815876a69d1efc4ad6eb5", size = 164394 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/eb/367e0ed7b8a960b4fc12c7c6bf3ebddf06875037de641637994849560d47/websockets-14.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7cd5706caec1686c5d233bc76243ff64b1c0dc445339bd538f30547e787c11fe", size = 163087 }, - { url = "https://files.pythonhosted.org/packages/96/f7/1f18d028ec4a2c14598dfec6a73381a915c27464b693873198c1de872095/websockets-14.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ec607328ce95a2f12b595f7ae4c5d71bf502212bddcea528290b35c286932b12", size = 160740 }, - { url = "https://files.pythonhosted.org/packages/5c/db/b4b353fb9c3f0eaa8138ea4c76e6fa555b6d2821ed2d51d0ac3c320bc57e/websockets-14.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da85651270c6bfb630136423037dd4975199e5d4114cae6d3066641adcc9d1c7", size = 160992 }, - { url = "https://files.pythonhosted.org/packages/b9/b1/9149e420c61f375e432654d5c1545e563b90ac1f829ee1a8d1dccaf0869d/websockets-14.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3ecadc7ce90accf39903815697917643f5b7cfb73c96702318a096c00aa71f5", size = 169757 }, - { url = "https://files.pythonhosted.org/packages/2b/33/0bb58204191e113212360f1392b6b1e9f85f62c7ca5b3b15f52f2f835516/websockets-14.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1979bee04af6a78608024bad6dfcc0cc930ce819f9e10342a29a05b5320355d0", size = 168762 }, - { url = "https://files.pythonhosted.org/packages/be/3d/c3c192f16210d7b7535fbf4ee9a299612f4dccff665587617b13fa0a6aa3/websockets-14.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dddacad58e2614a24938a50b85969d56f88e620e3f897b7d80ac0d8a5800258", size = 169060 }, - { url = "https://files.pythonhosted.org/packages/a6/73/75efa8d9e4b1b257818a7b7a0b9ac84a07c91120b52148941370ef2c8f16/websockets-14.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:89a71173caaf75fa71a09a5f614f450ba3ec84ad9fca47cb2422a860676716f0", size = 169457 }, - { url = "https://files.pythonhosted.org/packages/a4/11/300cf36cfd6990ffb218394862f0513be8c21917c9ff5e362f94599caedd/websockets-14.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6af6a4b26eea4fc06c6818a6b962a952441e0e39548b44773502761ded8cc1d4", size = 168860 }, - { url = "https://files.pythonhosted.org/packages/c0/3d/5fd82500714ab7c09f003bde671dad1a3a131ac77b6b11ada72e466de4f6/websockets-14.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:80c8efa38957f20bba0117b48737993643204645e9ec45512579132508477cfc", size = 168825 }, - { url = "https://files.pythonhosted.org/packages/88/16/715580eb6caaacc232f303e9619103a42dcd354b0854baa5ed26aacaf828/websockets-14.2-cp39-cp39-win32.whl", hash = "sha256:2e20c5f517e2163d76e2729104abc42639c41cf91f7b1839295be43302713661", size = 163960 }, - { url = "https://files.pythonhosted.org/packages/63/a7/a1035cb198eaa12eaa9621aaaa3ec021b0e3bac96e1df9ceb6bfe5e53e5f/websockets-14.2-cp39-cp39-win_amd64.whl", hash = "sha256:b4c8cef610e8d7c70dea92e62b6814a8cd24fbd01d7103cc89308d2bfe1659ef", size = 164424 }, - { url = "https://files.pythonhosted.org/packages/f7/c0/8e9325c4987dcf66d4a0d63ec380d4aefe8dcc1e521af71ad17adf2c1ae2/websockets-14.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:bbe03eb853e17fd5b15448328b4ec7fb2407d45fb0245036d06a3af251f8e48f", size = 160773 }, - { url = "https://files.pythonhosted.org/packages/5a/6e/c9a7f2edd4afddc4f8cccfc4e12468b7f6ec40f28d1b1e966a8d0298b875/websockets-14.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a3c4aa3428b904d5404a0ed85f3644d37e2cb25996b7f096d77caeb0e96a3b42", size = 161006 }, - { url = "https://files.pythonhosted.org/packages/f3/10/b90ece894828c954e674a81cb0db250e6c324c54db30a8b19e96431f928f/websockets-14.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:577a4cebf1ceaf0b65ffc42c54856214165fb8ceeba3935852fc33f6b0c55e7f", size = 162260 }, - { url = "https://files.pythonhosted.org/packages/52/93/1147b6b5464a5fb6e8987da3ec7991dcc44f9090f67d9c841d7382fed429/websockets-14.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad1c1d02357b7665e700eca43a31d52814ad9ad9b89b58118bdabc365454b574", size = 161868 }, - { url = "https://files.pythonhosted.org/packages/32/ab/f7d80b4049bff0aa617507330db3a27389d0e70df54e29f7a3d76bbd2086/websockets-14.2-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f390024a47d904613577df83ba700bd189eedc09c57af0a904e5c39624621270", size = 161813 }, - { url = "https://files.pythonhosted.org/packages/cd/cc/adc9fb85f031b8df8e9f3d96cc004df25d2643e503953af5223c5b6825b7/websockets-14.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3c1426c021c38cf92b453cdf371228d3430acd775edee6bac5a4d577efc72365", size = 164457 }, - { url = "https://files.pythonhosted.org/packages/7b/c8/d529f8a32ce40d98309f4470780631e971a5a842b60aec864833b3615786/websockets-14.2-py3-none-any.whl", hash = "sha256:7a6ceec4ea84469f15cf15807a747e9efe57e369c384fa86e022b3bea679b79b", size = 157416 }, -] - -[[package]] -name = "werkzeug" -version = "3.1.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markupsafe" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/61/f1/ee81806690a87dab5f5653c1f146c92bc066d7f4cebc603ef88eb9e13957/werkzeug-3.1.6.tar.gz", hash = "sha256:210c6bede5a420a913956b4791a7f4d6843a43b6fcee4dfa08a65e93007d0d25", size = 864736 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/ec/d58832f89ede95652fd01f4f24236af7d32b70cab2196dfcc2d2fd13c5c2/werkzeug-3.1.6-py3-none-any.whl", hash = "sha256:7ddf3357bb9564e407607f988f683d72038551200c704012bb9a4c523d42f131", size = 225166 }, -] - -[[package]] -name = "win32-setctime" -version = "1.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b3/8f/705086c9d734d3b663af0e9bb3d4de6578d08f46b1b101c2442fd9aecaa2/win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0", size = 4867 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/07/c6fe3ad3e685340704d314d765b7912993bcb8dc198f0e7a89382d37974b/win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390", size = 4083 }, -] - -[[package]] -name = "zipp" -version = "3.23.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276 }, -] - -[[package]] -name = "zstandard" -version = "0.25.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fd/aa/3e0508d5a5dd96529cdc5a97011299056e14c6505b678fd58938792794b1/zstandard-0.25.0.tar.gz", hash = "sha256:7713e1179d162cf5c7906da876ec2ccb9c3a9dcbdffef0cc7f70c3667a205f0b", size = 711513 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/14/0d/d0a405dad6ab6f9f759c26d866cca66cb209bff6f8db656074d662a953dd/zstandard-0.25.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b9af1fe743828123e12b41dd8091eca1074d0c1569cc42e6e1eee98027f2bbd0", size = 795263 }, - { url = "https://files.pythonhosted.org/packages/ca/aa/ceb8d79cbad6dabd4cb1178ca853f6a4374d791c5e0241a0988173e2a341/zstandard-0.25.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4b14abacf83dfb5c25eb4e4a79520de9e7e205f72c9ee7702f91233ae57d33a2", size = 640560 }, - { url = "https://files.pythonhosted.org/packages/88/cd/2cf6d476131b509cc122d25d3416a2d0aa17687ddbada7599149f9da620e/zstandard-0.25.0-cp39-cp39-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:a51ff14f8017338e2f2e5dab738ce1ec3b5a851f23b18c1ae1359b1eecbee6df", size = 5344244 }, - { url = "https://files.pythonhosted.org/packages/5c/71/e14820b61a1c137966b7667b400b72fa4a45c836257e443f3d77607db268/zstandard-0.25.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3b870ce5a02d4b22286cf4944c628e0f0881b11b3f14667c1d62185a99e04f53", size = 5054550 }, - { url = "https://files.pythonhosted.org/packages/f9/ce/26dc5a6fa956be41d0e984909224ed196ee6f91d607f0b3fd84577741a77/zstandard-0.25.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:05353cef599a7b0b98baca9b068dd36810c3ef0f42bf282583f438caf6ddcee3", size = 5401150 }, - { url = "https://files.pythonhosted.org/packages/f2/1b/402cab5edcfe867465daf869d5ac2a94930931c0989633bc01d6a7d8bd68/zstandard-0.25.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:19796b39075201d51d5f5f790bf849221e58b48a39a5fc74837675d8bafc7362", size = 5448595 }, - { url = "https://files.pythonhosted.org/packages/86/b2/fc50c58271a1ead0e5a0a0e6311f4b221f35954dce438ce62751b3af9b68/zstandard-0.25.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:53e08b2445a6bc241261fea89d065536f00a581f02535f8122eba42db9375530", size = 5555290 }, - { url = "https://files.pythonhosted.org/packages/d2/20/5f72d6ba970690df90fdd37195c5caa992e70cb6f203f74cc2bcc0b8cf30/zstandard-0.25.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1f3689581a72eaba9131b1d9bdbfe520ccd169999219b41000ede2fca5c1bfdb", size = 5043898 }, - { url = "https://files.pythonhosted.org/packages/e4/f1/131a0382b8b8d11e84690574645f528f5c5b9343e06cefd77f5fd730cd2b/zstandard-0.25.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d8c56bb4e6c795fc77d74d8e8b80846e1fb8292fc0b5060cd8131d522974b751", size = 5571173 }, - { url = "https://files.pythonhosted.org/packages/53/f6/2a37931023f737fd849c5c28def57442bbafadb626da60cf9ed58461fe24/zstandard-0.25.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:53f94448fe5b10ee75d246497168e5825135d54325458c4bfffbaafabcc0a577", size = 4958261 }, - { url = "https://files.pythonhosted.org/packages/b5/52/ca76ed6dbfd8845a5563d3af4e972da3b9da8a9308ca6b56b0b929d93e23/zstandard-0.25.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c2ba942c94e0691467ab901fc51b6f2085ff48f2eea77b1a48240f011e8247c7", size = 5265680 }, - { url = "https://files.pythonhosted.org/packages/7a/59/edd117dedb97a768578b49fb2f1156defb839d1aa5b06200a62be943667f/zstandard-0.25.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:07b527a69c1e1c8b5ab1ab14e2afe0675614a09182213f21a0717b62027b5936", size = 5439747 }, - { url = "https://files.pythonhosted.org/packages/75/71/c2e9234643dcfbd6c5e975e9a2b0050e1b2afffda6c3a959e1b87997bc80/zstandard-0.25.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:51526324f1b23229001eb3735bc8c94f9c578b1bd9e867a0a646a3b17109f388", size = 5818805 }, - { url = "https://files.pythonhosted.org/packages/f5/93/8ebc19f0a31c44ea0e7348f9b0d4b326ed413b6575a3c6ff4ed50222abb6/zstandard-0.25.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89c4b48479a43f820b749df49cd7ba2dbc2b1b78560ecb5ab52985574fd40b27", size = 5362280 }, - { url = "https://files.pythonhosted.org/packages/b8/e9/29cc59d4a9d51b3fd8b477d858d0bd7ab627f700908bf1517f46ddd470ae/zstandard-0.25.0-cp39-cp39-win32.whl", hash = "sha256:1cd5da4d8e8ee0e88be976c294db744773459d51bb32f707a0f166e5ad5c8649", size = 436460 }, - { url = "https://files.pythonhosted.org/packages/41/b5/bc7a92c116e2ef32dc8061c209d71e97ff6df37487d7d39adb51a343ee89/zstandard-0.25.0-cp39-cp39-win_amd64.whl", hash = "sha256:37daddd452c0ffb65da00620afb8e17abd4adaae6ce6310702841760c2c26860", size = 506097 }, -] diff --git a/app/version.txt b/app/version.txt deleted file mode 100644 index 52a718a..0000000 --- a/app/version.txt +++ /dev/null @@ -1 +0,0 @@ -{"version": "1.0.13"} \ No newline at end of file diff --git a/app/web_source/admin.html b/app/web_source/admin.html deleted file mode 100644 index b28ea2f..0000000 --- a/app/web_source/admin.html +++ /dev/null @@ -1,583 +0,0 @@ - - - - - - 管理后台 - 数富AI - - - - -

管理后台

- -
-
用户管理
-
查看生成记录
-
- - -
-
-

创建用户

-

无注册入口,仅管理员可在此创建用户。层级:超级管理员 → 管理员 → 普通号。

-
- - -
-
- - -
-
- - -
- - -

-
- -
-

用户列表

-
-
- - -
- - -
- - - - - - - - - - - - -
ID用户名角色所属管理员创建时间操作
- -
-
- - -
-
-

筛选条件

-
-
- - -
-
- - -
-
- - -
- -
-
-
-

生成记录

- - - - - - - - - - - -
ID用户类型创建时间结果预览
- -
-
- - - - - - - diff --git a/app/web_source/brand - 副本.html b/app/web_source/brand - 副本.html deleted file mode 100644 index b929e7e..0000000 --- a/app/web_source/brand - 副本.html +++ /dev/null @@ -1,1071 +0,0 @@ - - - - - - 亚马逊 - 数富AI - - - -
-
- 数富AI-亚马逊 - 返回首页 -
- -
-
- -
- -
- - -
-
- 任务队列 - -
-
-
    -
    暂无任务
    -
    -
    -
    -
    - -
    - - - - diff --git a/app/web_source/brand-旧.html b/app/web_source/brand-旧.html deleted file mode 100644 index 871c8f7..0000000 --- a/app/web_source/brand-旧.html +++ /dev/null @@ -1,1001 +0,0 @@ - - - - - - 亚马逊 - 数富AI - - - -
    -
    - 数富AI-亚马逊 - 返回首页 -
    - -
    -
    - -
    - -
    - - -
    -
    - 任务队列 - -
    -
    -
      -
      暂无任务
      -
      -
      -
      -
      - -
      - - - - diff --git a/app/web_source/brand.html b/app/web_source/brand.html deleted file mode 100644 index 1d37aaa..0000000 --- a/app/web_source/brand.html +++ /dev/null @@ -1,1450 +0,0 @@ - - - - - - - 亚马逊 - 数富AI - - - - -
      -
      - 数富AI-亚马逊 - 返回首页 -
      - -
      -
      - -
      - -
      - - -
      -
      - 任务队列 - -
      -
      -
        -
        暂无任务
        -
        -
        -
        -
        - -
        - - - - - diff --git a/app/web_source/home.html b/app/web_source/home.html deleted file mode 100644 index 9c31e7d..0000000 --- a/app/web_source/home.html +++ /dev/null @@ -1,441 +0,0 @@ - - - - - - - 首页 - 数富AI - - - - -
        - 数富AI -
        - {% if is_admin %} - - {% endif %} - {{ username }} - - 退出 -
        -
        软件更新
        -
        - 当前版本: {{ version }} - -
        -
        -
        - -
        -
        -
        -
        - - - -
        - - - - - diff --git a/app/web_source/index.html b/app/web_source/index.html deleted file mode 100644 index ad863bb..0000000 --- a/app/web_source/index.html +++ /dev/null @@ -1,5833 +0,0 @@ - - - - - - 数富AI - - - - -
        -
        - - 数富AI - ← 返回首页 - -
        - -
        - -
        -
        - -
        - - - - -
        -
        - - - - - -
        - -
        -
        -
        - -
        -
        生成或恢复到工作台的图片将显示在此处,点击可查看大图
        -
        -
        - -
        右侧显示所有图片竖向拼接后的效果,点击可查看大图并保存
        -
        - -
        - - -
        - - -
        -
        -
        - 设置 - -
        -
        -
        -
        API Key
        -
        用于生成接口鉴权,必须设置后才能进行生成。仅保存在本机,不会上传。
        -
        - -
        -
        -
        -
        自动保存位置
        -
        设置后,生图完成后将自动保存副本到此文件夹。
        -
        - - - -
        -
        -
        -
        软件更新
        -
        - 当前版本: v1.0.0 - -
        -
        -
        - -
        -
        -
        - -
        -
        - - -
        -
        -
        选择参与拼接的图片及顺序(拖拽调整顺序,× 移出拼接)
        -
        -
        点击下方图片可加入拼接顺序:
        -
        -
        - - -
        -
        -
        - - - -
        - - -
        -
        -
        - -
        查看大图
        -
        -
        - - - -
        - -
        -
        - - -
        -
        -
        - -
        - -
        -
        -
        - - - 画笔: 20px - - - -
        -
        - *提示: 红色区域将被重新绘制
        - *提示: 点击图片添加标记,右键删除标记 -
        -
        - - -
        - -
        -
        - - -
        -
        -
        -
        Just the Right Capacity, Easily Holds Daily Essentials.
        -
        Phone, long wallet, keys, lipstick—all fit in without looking bulky.
        -
        - -
        -
        -
        - - -
        - - -
        -
        - - -
        - -
        -
        -
        - - - - diff --git a/app/web_source/login.html b/app/web_source/login.html deleted file mode 100644 index f04ca64..0000000 --- a/app/web_source/login.html +++ /dev/null @@ -1,263 +0,0 @@ - - - - - - 登录 - 南日AI - - - -
        - 南日AI -
        - - - - - diff --git a/app/winsrc.bat b/app/winsrc.bat deleted file mode 100644 index 28e3730..0000000 --- a/app/winsrc.bat +++ /dev/null @@ -1,38 +0,0 @@ -@echo off -chcp 65001 >nul -setlocal enabledelayedexpansion - -echo 正在执行 PowerShell 命令解除文件锁定... -powershell -Command "Get-ChildItem -Path \"%cd%\" -Recurse | Unblock-File" -if %errorlevel% equ 0 ( - echo 文件解锁完成 -) else ( - echo 文件解锁失败,请检查 PowerShell 权限 -) - -echo. -echo 检查 ShuFuAi.exe.config 文件... - -if exist "ShuFuAi.exe.config" ( - echo ShuFuAi.exe.config 已存在,跳过创建 -) else ( - echo 正在创建 ShuFuAi.exe.config... - ( - echo ^ - echo ^ - echo ^ - echo ^ - echo ^ - echo ^ - ) > "ShuFuAi.exe.config" - - if exist "ShuFuAi.exe.config" ( - echo ShuFuAi.exe.config 创建成功 - ) else ( - echo ShuFuAi.exe.config 创建失败,请检查权限 - ) -) - -echo. -echo 操作完成! -pause \ No newline at end of file diff --git a/backend-java/src/main/java/com/nanri/aiimage/modules/collectdata/service/CollectDataService.java b/backend-java/src/main/java/com/nanri/aiimage/modules/collectdata/service/CollectDataService.java index 2d606d2..644c50a 100644 --- a/backend-java/src/main/java/com/nanri/aiimage/modules/collectdata/service/CollectDataService.java +++ b/backend-java/src/main/java/com/nanri/aiimage/modules/collectdata/service/CollectDataService.java @@ -748,7 +748,7 @@ public class CollectDataService { } private void enqueueFinalWorkbook(FileTaskEntity task, FileResultEntity result, CollectDataStats stats) { - String filename = buildResultFilename(task); + String filename = buildResultFilename(task, result); result.setResultFilename(filename); result.setResultFileUrl(null); result.setResultFileSize(0L); @@ -789,7 +789,7 @@ public class CollectDataService { } List rows = loadFinalRows(task.getId()); File workRoot = FileUtil.mkdir(FileUtil.file(System.getProperty("java.io.tmpdir"), "collect-data-result", String.valueOf(task.getId()))); - String filename = buildResultFilename(task); + String filename = buildResultFilename(task, result); File xlsx = FileUtil.file(workRoot, filename); try { excelAssemblyService.writeWorkbook(xlsx, rows); @@ -986,11 +986,26 @@ public class CollectDataService { return normalize(value).toLowerCase(Locale.ROOT); } - private String buildResultFilename(FileTaskEntity task) { - String base = task == null || task.getTaskNo() == null || task.getTaskNo().isBlank() + private String buildResultFilename(FileTaskEntity task, FileResultEntity result) { + String base = result == null || result.getSourceFilename() == null || result.getSourceFilename().isBlank() + ? null + : result.getSourceFilename(); + if (base == null || base.isBlank()) { + base = task == null || task.getTaskNo() == null || task.getTaskNo().isBlank() ? "collect-data-" + (task == null ? "result" : task.getId()) : task.getTaskNo(); - return base.replaceAll("[\\\\/:*?\"<>|]", "_") + "-result.xlsx"; + } + return safeFileStem(base) + "-result.xlsx"; + } + + private String safeFileStem(String filename) { + String name = filename == null || filename.isBlank() ? "collect-data" : filename; + int idx = name.lastIndexOf('.'); + if (idx > 0) { + name = name.substring(0, idx); + } + String safe = name.replaceAll("[\\\\/:*?\"<>|]", "_").trim(); + return safe.isBlank() ? "collect-data" : safe; } private void deleteTransientTaskPayloads(Long taskId) { @@ -1212,7 +1227,7 @@ public class CollectDataService { vo.setResultId(row.getId()); vo.setTaskId(row.getTaskId()); vo.setSourceFilename(row.getSourceFilename()); - vo.setResultFilename(row.getResultFilename()); + vo.setResultFilename(resolveDisplayResultFilename(row, task)); vo.setDownloadUrl(buildFreshDownloadUrl(row)); vo.setRowCount(row.getRowCount()); vo.setSuccess(row.getSuccess() != null && row.getSuccess() == 1); @@ -1234,6 +1249,21 @@ public class CollectDataService { return vo; } + private String resolveDisplayResultFilename(FileResultEntity row, FileTaskEntity task) { + if (row == null) { + return null; + } + String persisted = row.getResultFilename(); + if (persisted == null || persisted.isBlank() || isLegacyTaskNoResultFilename(persisted)) { + return buildResultFilename(task, row); + } + return persisted; + } + + private boolean isLegacyTaskNoResultFilename(String filename) { + return filename != null && filename.startsWith(MODULE_TYPE + "-") && filename.endsWith("-result.xlsx"); + } + private String buildFreshDownloadUrl(FileResultEntity row) { String resultFileUrl = row == null ? null : row.getResultFileUrl(); if (resultFileUrl == null || resultFileUrl.isBlank()) { diff --git a/frontend-vue/src/pages/brand/components/BrandCollectDataTab.vue b/frontend-vue/src/pages/brand/components/BrandCollectDataTab.vue index 49d3386..9f78211 100644 --- a/frontend-vue/src/pages/brand/components/BrandCollectDataTab.vue +++ b/frontend-vue/src/pages/brand/components/BrandCollectDataTab.vue @@ -179,6 +179,7 @@
        {{ statusText(item) }} +
        @@ -198,6 +199,7 @@ import { expandBrandFolderRecursive, type BrandExpandFolderItem } from '@/shared import { getPywebviewApi } from '@/shared/bridges/pywebview' import { useTaskProgressLoop } from '@/shared/composables/useTaskProgressLoop' import { createCategorizedTimers } from '@/shared/utils/categorized-timers' +import { saveUrlWithProgress } from '@/shared/utils/download-progress' import { parseCollectData, activateCollectDataTask, @@ -538,6 +540,27 @@ function statusClass(item: CollectDataHistoryItem) { return 'pending' } +function canDownload(item: CollectDataHistoryItem) { + const status = normalizeTaskStatus(item) + return Boolean(item.downloadUrl && (item.success || status === 'SUCCESS')) +} + +async function downloadResult(item: CollectDataHistoryItem) { + if (!item.downloadUrl) { + ElMessage.warning('当前结果没有下载地址') + return + } + + const filename = item.resultFilename || `${item.sourceFilename || 'collect-data-result'}.xlsx` + const downloadId = `collect-data:${item.resultId || item.taskId || Date.now()}` + const result = await saveUrlWithProgress(item.downloadUrl, filename, downloadId) + if (result.success) { + ElMessage.success(`已保存: ${result.path || filename}`) + } else if (result.error && result.error !== '用户取消') { + ElMessage.error(result.error) + } +} + async function loadDashboard() { try { dashboard.value = await getCollectDataDashboard() @@ -721,6 +744,7 @@ onBeforeUnmount(() => { .status.failed { background: rgba(231, 76, 60, .18); color: #ff6b6b; } .status.running { background: rgba(52, 152, 219, .18); color: #3498db; } .status.pending { background: rgba(149, 165, 166, .18); color: #bdc3c7; } +.download { padding: 6px 10px; color: #d6ecff; background: rgba(52, 152, 219, .18); } .btn-delete { padding: 6px 10px; color: #ff8f8f; background: rgba(231, 76, 60, .12); } @media (max-width: 1100px) { .main-content { flex-direction: column; height: auto; } diff --git a/app/assets/brand-DE-sObfq.js b/new_web_source/assets/brand-DE-sObfq.js similarity index 100% rename from app/assets/brand-DE-sObfq.js rename to new_web_source/assets/brand-DE-sObfq.js diff --git a/new_web_source/assets/collect-data-CB983FnC.css b/new_web_source/assets/collect-data-CB983FnC.css new file mode 100644 index 0000000..79fab17 --- /dev/null +++ b/new_web_source/assets/collect-data-CB983FnC.css @@ -0,0 +1 @@ +.module-page[data-v-1311c61c]{min-height:100vh;background:#1a1a1a}.main-content[data-v-1311c61c]{display:flex;height:calc(100vh - 56px);min-height:calc(100vh - 56px)}.left-panel[data-v-1311c61c]{width:400px;background:#1e1e1e;padding:20px;overflow-y:auto;border-right:1px solid #2a2a2a}.right-panel[data-v-1311c61c]{flex:1;min-width:0;background:#1a1a1a;display:flex;flex-direction:column}.section-title[data-v-1311c61c],.subsection-title[data-v-1311c61c]{font-size:13px;color:#bbb;margin:12px 0 10px}.upload-zone[data-v-1311c61c]{border:1px dashed #3a3a3a;border-radius:10px;padding:18px;background:#252525;margin-bottom:18px}.hint[data-v-1311c61c],.loading-msg[data-v-1311c61c],.files[data-v-1311c61c],.muted[data-v-1311c61c]{color:#888;font-size:12px;line-height:1.5}.btns[data-v-1311c61c],.run-row[data-v-1311c61c]{display:flex;gap:10px;flex-wrap:wrap}.opt-btn[data-v-1311c61c],.btn-run[data-v-1311c61c],.btn-delete[data-v-1311c61c],.download[data-v-1311c61c]{border:none;cursor:pointer;border-radius:7px}.opt-btn[data-v-1311c61c]{padding:8px 14px;color:#ccc;background:#2a2a2a;border:1px solid #3a3a3a}.btn-run[data-v-1311c61c]{padding:10px 18px;color:#fff;background:#3498db;font-weight:600}.btn-run.btn-queue[data-v-1311c61c]{background:#27ae60}.btn-run[data-v-1311c61c]:disabled{opacity:.55;cursor:not-allowed}.selected-files[data-v-1311c61c]{margin-top:14px;color:#999;font-size:12px;word-break:break-all}.selected-files span[data-v-1311c61c]{display:block;margin:4px 0}.selected-files .more-line[data-v-1311c61c]{color:#777}.filter-zone[data-v-1311c61c]{border:1px solid #2a2a2a;border-radius:8px;padding:12px;background:#252525;margin-bottom:14px;display:flex;flex-direction:column;gap:10px}.filter-row[data-v-1311c61c]{display:flex;align-items:center;gap:10px}.filter-label[data-v-1311c61c]{width:110px;color:#bbb;font-size:12px}.filter-input[data-v-1311c61c]{flex:1;min-width:0;padding:6px 10px;background:#1e1e1e;border:1px solid #3a3a3a;border-radius:6px;color:#ddd;font-size:13px;outline:none}.filter-input[data-v-1311c61c]:focus{border-color:#3498db}.range-inputs[data-v-1311c61c]{flex:1;min-width:0;display:flex;align-items:center;gap:8px}.range-separator[data-v-1311c61c]{color:#777;font-size:12px;white-space:nowrap}.filter-checks[data-v-1311c61c]{display:flex;gap:16px}.filter-check-row[data-v-1311c61c]{display:inline-flex;align-items:center;gap:6px;cursor:pointer;-webkit-user-select:none;user-select:none;color:#ccc;font-size:12px}.filter-check-input[data-v-1311c61c]{width:16px;height:16px;accent-color:#409eff;cursor:pointer}.country-pref-hint[data-v-1311c61c]{margin-top:-4px}.country-section-title[data-v-1311c61c]{display:flex;align-items:center;justify-content:space-between;gap:12px}.country-pref-saving[data-v-1311c61c]{color:#3498db;font-size:11px}.country-pref-radios[data-v-1311c61c]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-bottom:14px}.country-check-row[data-v-1311c61c]{display:inline-flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none;font-size:12px;color:#ccc;padding:8px 10px;border:1px solid #333;border-radius:8px;background:#252525}.country-check-row.selected[data-v-1311c61c]{border-color:#409eff;background:#409eff1f;color:#e6f2ff}.country-check-input[data-v-1311c61c]{width:16px;height:16px;accent-color:#409eff;cursor:pointer;flex-shrink:0}.country-check-text[data-v-1311c61c]{line-height:1.3}.queue-debug-card[data-v-1311c61c]{margin-top:14px;border:1px solid #2a2a2a;border-radius:8px;padding:10px 12px;background:#1f1f1f}.queue-debug-title[data-v-1311c61c]{margin-top:0}.queue-debug-line[data-v-1311c61c]{color:#9ad;font-size:12px}.queue-debug-payload[data-v-1311c61c]{margin-top:8px;padding:8px 10px;background:#181818;border-radius:6px;color:#bbb;font-size:11px;overflow:auto;max-height:200px}.panel-header[data-v-1311c61c]{padding:16px 20px;border-bottom:1px solid #2a2a2a;font-size:15px;font-weight:600;color:#ddd}.task-list-wrap[data-v-1311c61c]{flex:1;padding:16px 20px;overflow:auto}.clean-result-summary[data-v-1311c61c]{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-bottom:16px}.summary-card[data-v-1311c61c]{padding:14px 16px;border:1px solid #2a2a2a;border-radius:8px;background:#1e1e1e}.summary-card strong[data-v-1311c61c]{display:block;margin-top:8px;color:#eaf4ff;font-size:22px}.summary-label[data-v-1311c61c]{color:#8d8d8d;font-size:12px}.result-list-wrap[data-v-1311c61c]{border:1px solid #2a2a2a;border-radius:8px;background:#1e1e1e;min-height:180px;margin:0 0 16px}.result-list-header[data-v-1311c61c]{display:flex;justify-content:space-between;padding:12px 16px;border-bottom:1px solid #2a2a2a;color:#ddd;font-size:14px}.empty-tasks[data-v-1311c61c]{color:#666;font-size:13px;padding:18px;text-align:center}.task-list[data-v-1311c61c]{list-style:none;margin:0;padding:12px}.task-item[data-v-1311c61c]{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:12px 14px;border:1px solid #2a2a2a;border-radius:8px;margin-bottom:8px;background:#222}.left[data-v-1311c61c]{flex:1;min-width:0}.id[data-v-1311c61c]{color:#e0e0e0;font-size:13px;font-weight:600}.task-right[data-v-1311c61c]{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.status[data-v-1311c61c]{padding:4px 10px;border-radius:6px;font-size:12px}.status.success[data-v-1311c61c]{background:#2ecc712e;color:#2ecc71}.status.failed[data-v-1311c61c]{background:#e74c3c2e;color:#ff6b6b}.status.running[data-v-1311c61c]{background:#3498db2e;color:#3498db}.status.pending[data-v-1311c61c]{background:#95a5a62e;color:#bdc3c7}.download[data-v-1311c61c]{padding:6px 10px;color:#d6ecff;background:#3498db2e}.btn-delete[data-v-1311c61c]{padding:6px 10px;color:#ff8f8f;background:#e74c3c1f}@media(max-width:1100px){.main-content[data-v-1311c61c]{flex-direction:column;height:auto}.left-panel[data-v-1311c61c]{width:100%;border-right:none;border-bottom:1px solid #2a2a2a}.clean-result-summary[data-v-1311c61c]{grid-template-columns:repeat(2,minmax(0,1fr))}} diff --git a/new_web_source/assets/collect-data.js b/new_web_source/assets/collect-data.js new file mode 100644 index 0000000..1922a88 --- /dev/null +++ b/new_web_source/assets/collect-data.js @@ -0,0 +1 @@ +import{g as y,N as pe,O as oe,d as me,o as ye,a as f,c as v,b as he,e as t,F as V,r as Y,t as l,f as D,w as z,p as ae,v as X,n as ne,P as ke,h as le,E as m,i as Q,_ as ge,j as _e,k as be}from"./pywebview-B8lwamDf.js";import{v as we,B as Ce,aZ as Se,a_ as Ie,a$ as Te,b0 as Ne,s as Pe,b1 as xe,b2 as Ae,b3 as Ee,b4 as Fe,b5 as De}from"./java-modules-B9jblDzU.js";import{e as Ue}from"./brand-DE-sObfq.js";import{c as re}from"./categorized-timers-JPA-olTr.js";const $e=c=>c==="SUCCESS"||c==="FAILED";function Be(c){if(!c||typeof window>"u")return[];try{const k=window.localStorage.getItem(c);if(!k)return[];const g=JSON.parse(k);return Array.isArray(g)?g.filter(b=>typeof b=="number"&&b>0):[]}catch{return[]}}function Re(c,k){if(!(!c||typeof window>"u"))try{k.length===0?window.localStorage.removeItem(c):window.localStorage.setItem(c,JSON.stringify(k))}catch{}}function Le(c){const k=re(`task-progress-loop:${c.scope}`),g=c.isTerminal??$e,b=c.getIntervalMs??we,p=y(Be(c.storageKey)),_=y({}),o=y(!1);let d=null,S=!1;function R(){Re(c.storageKey,p.value)}function O(n){!Number.isFinite(n)||n<=0||p.value.includes(n)||(p.value=[...p.value,n],R(),E(!0))}function U(n){if(p.value.includes(n)&&(p.value=p.value.filter(r=>r!==n),R(),_.value[n])){const r={..._.value};delete r[n],_.value=r}}function T(n){const r=Array.from(new Set(n.filter(M=>Number.isFinite(M)&&M>0)));p.value=r,R()}function w(n){const r=_.value[n];return!!r&&g(r)}async function N(){if(S)return;const n=p.value.filter(r=>r>0);if(n.length){o.value=!0;try{const M=(await c.fetchProgress(n))?.items||[],K=[],j={..._.value};for(const C of M){const F=c.extractTaskId(C);if(typeof F!="number"||F<=0)continue;const q=c.extractStatus(C)||"";try{c.onUpdate?.(F,C)}catch{}q&&(j[F]=q,g(q)&&K.push({taskId:F,detail:C,status:q}))}_.value=j;for(const C of K){U(C.taskId);try{await c.onTerminal?.(C.taskId,C.detail,C.status)}catch{}}}catch(r){c.onError?.(r)}finally{o.value=!1}}}function L(){d!=null&&(k.clearTimer("task-poll",d),d=null)}function A(n=!1){if(S||d!=null&&!n)return;L();const r=async()=>{if(d=null,!S&&p.value.length){if(o.value){d=k.setTimeout("task-poll",r,500);return}await N(),!S&&p.value.length>0&&(d=k.setTimeout("task-poll",r,b()))}};n?r():d=k.setTimeout("task-poll",r,b())}function E(n=!1){S||p.value.length&&(d!=null&&!n||A(n))}function $(){L()}pe(p,(n,r)=>{if(!S){if(!n.length){$();return}(!r||r.length===0)&&A(!0)}},{flush:"post"});let P=null;typeof document<"u"&&(P=()=>{document.visibilityState==="visible"&&p.value.length>0&&A(!0)},document.addEventListener("visibilitychange",P));function I(){S||(S=!0,$(),k.clearScope(),P&&typeof document<"u"&&(document.removeEventListener("visibilitychange",P),P=null))}return oe(()=>I()),p.value.length>0&&A(!0),{taskIds:p,taskStatuses:_,inFlight:o,add:O,remove:U,reset:T,ensure:E,stop:$,refreshOnce:N,isTerminal:w,dispose:I}}const Me={class:"page-shell module-page"},qe={class:"main-content"},Oe={class:"left-panel"},Ge={class:"upload-zone"},Ve={class:"selected-files"},ze={key:0,class:"more-line"},Ke={key:1},je={class:"filter-zone"},He={class:"filter-row"},Je={class:"range-inputs"},Ye={class:"filter-checks"},Qe={class:"filter-check-row"},We={class:"filter-check-row"},Ze={class:"filter-check-row"},Xe={class:"section-title country-section-title"},et={key:0,class:"country-pref-saving"},tt={class:"country-pref-radios"},st=["checked","onChange"],at={class:"country-check-text"},nt={class:"run-row"},lt=["disabled"],ot=["disabled"],rt={key:0,class:"queue-debug-card"},it={class:"queue-debug-line"},ut={key:0,class:"queue-debug-payload"},ct={class:"right-panel"},dt={class:"task-list-wrap"},ft={class:"clean-result-summary"},vt={class:"summary-card"},pt={class:"summary-card"},mt={class:"summary-card"},yt={class:"summary-card"},ht={class:"result-list-wrap"},kt={key:0,class:"empty-tasks"},gt={key:1,class:"task-list clean-result-list"},_t={class:"left"},bt={class:"id"},wt={class:"files"},Ct={class:"files"},St={class:"files"},It={class:"files"},Tt={class:"files"},Nt={class:"task-right"},Pt={class:"status running"},xt=["onClick"],At={class:"result-list-wrap"},Et={key:0,class:"empty-tasks"},Ft={key:1,class:"task-list clean-result-list"},Dt={class:"left"},Ut={class:"id"},$t={class:"files"},Bt={class:"files"},Rt={class:"files"},Lt={class:"files"},Mt={class:"files"},qt={key:0,class:"files"},Ot={key:1,class:"files"},Gt={class:"task-right"},Vt=["onClick"],zt=["onClick"],Kt="brand:collect-data:polling-task-ids",jt=me({__name:"BrandCollectDataTab",setup(c){const k=[{code:"DE",label:"德国"},{code:"UK",label:"英国"},{code:"FR",label:"法国"},{code:"IT",label:"意大利"},{code:"ES",label:"西班牙"}],g=y([]),b=y([]),p=y(!1),_=y(!1),o=ke({minAmount:null,maxAmount:null,rank:!1,fba:!1,fbm:!1}),d=y("DE"),S=le(()=>d.value?[d.value]:[]),R=y(!1),O=y(!1),U=re("collect-data-tab");let T=null;const w=y(null),N=y(null),L=y(""),A=y(""),E=y({pendingTaskCount:0,processedTaskCount:0,successTaskCount:0,failedTaskCount:0}),$=y([]),P=y([]),I=y({}),n=Le({scope:"collect-data-tab",storageKey:Kt,fetchProgress:s=>De(s),extractTaskId:s=>s.task?.id??null,extractStatus:s=>s.task?.status??"",onUpdate:(s,e)=>{const a=I.value[s];I.value={...I.value,[s]:a?{...a,task:{...a.task||{},...e.task||{}},items:e.items??a.items}:e}},onTerminal:async s=>{if(I.value[s]){const e={...I.value};delete e[s],I.value=e}await Promise.all([G(),H()])}}),r=le(()=>g.value.slice(0,8));function M(s){k.some(e=>e.code===s)&&d.value!==s&&(R.value=!0,d.value=s,K())}function K(){T!=null&&U.clearTimer("country-pref-save",T),T=U.setTimeout("country-pref-save",()=>{T=null,j()},450)}async function j(){if(d.value){O.value=!0;try{await Se([d.value])}catch(s){m.error(s instanceof Error?s.message:"保存国家顺序失败")}finally{O.value=!1}}}async function C(){try{const s=await Ie();if(R.value)return;const e=s?.country_codes;Array.isArray(e)&&e.length&&(d.value=String(e[0]||"DE"))}catch{}}async function F(s){const e=Q();if(!e?.upload_file_to_java)throw new Error("当前桌面端未提供文件上传能力");const a=[];for(const i of s){const x=typeof i=="string"?i:i.absolutePath,B=typeof i=="string"?void 0:i.relativePath,u=await e.upload_file_to_java(x,B);if(!u?.success||!u.data)throw new Error(u?.error||u?.message||`上传失败:${x}`);a.push(u.data)}return a}async function q(){const s=Q();if(!s?.select_brand_xlsx_files||!s.upload_file_to_java){m.warning("当前环境不支持文件选择或上传");return}try{const e=await s.select_brand_xlsx_files();if(!e?.length)return;const a=await F(e);b.value=a,g.value=a.map(i=>i.relativePath||i.originalFilename||i.fileKey),w.value=null,N.value=null}catch(e){m.error(e instanceof Error?e.message:"文件选择失败")}}async function ie(){const s=Q();if(!s?.select_brand_folder){m.warning("当前环境不支持文件夹选择,请在本地客户端中打开");return}try{const e=await s.select_brand_folder();if(!e)return;const a=await Ue(e);if(!a.success||!a.items?.length){m.warning(a.error||"该文件夹下没有可用的 xlsx 文件");return}const i=await F(a.items);b.value=i,g.value=a.items.map(x=>x.relativePath||x.absolutePath),w.value=null,N.value=null,m.success(`已选择文件夹内 ${a.items.length} 个 Excel 文件`)}catch(e){m.error(e instanceof Error?e.message:"选择失败")}}function ee(){const s=o.minAmount===null||o.minAmount===void 0||Number.isNaN(o.minAmount)?null:o.minAmount,e=o.maxAmount===null||o.maxAmount===void 0||Number.isNaN(o.maxAmount)?null:o.maxAmount;return{amount:e??s,minAmount:s,maxAmount:e,min_amount:s,max_amount:e,rank:!!o.rank,fba:!!o.fba,fbm:!!o.fbm,countryCodes:[...S.value],countryCode:d.value,country_code:d.value}}async function ue(){if(!b.value.length){m.warning("请先选择 Excel 文件");return}if(!d.value){m.warning("请选择采集国家");return}p.value=!0;try{const s=await Te({files:b.value.map(e=>({fileKey:e.fileKey,originalFilename:e.originalFilename,relativePath:e.relativePath})),task_type:"collect-data",filters:ee()});N.value=s,w.value=s.taskId??null,s.taskId&&n.add(s.taskId),m.success(`提交成功:任务 ${s.taskNo||s.taskId},落库 ${s.acceptedRows??0} 行`),await Promise.all([G(),H()])}catch(s){m.error(s instanceof Error?s.message:"提交失败")}finally{p.value=!1}}async function ce(){if(!w.value){m.warning("请先提交采集任务");return}const s=Q();if(!s?.enqueue_json){m.warning("当前环境未提供 Python 队列能力");return}_.value=!0;try{await Ne(w.value);const e={type:"collect-data-run",ts:Date.now(),data:{taskId:w.value,taskNo:N.value?.taskNo,taskType:"collect-data",totalRows:N.value?.acceptedRows??0,pageSize:N.value?.pageSize??50,filters:ee()}},a=await s.enqueue_json(e);if(!a?.success)throw new Error(a?.error||"入队失败");L.value=`已推送至 Python 队列(队列长度:${a.queue_size??"-"})`,A.value=JSON.stringify(e,null,2),w.value&&n.add(w.value),m.success("已推送到 Python 队列"),await G()}catch(e){m.error(e instanceof Error?e.message:"推送失败")}finally{_.value=!1}}function W(s){if(!s)return"-";const e=new Date(s);if(Number.isNaN(e.getTime()))return s;const a=e.getFullYear(),i=String(e.getMonth()+1).padStart(2,"0"),x=String(e.getDate()).padStart(2,"0"),B=String(e.getHours()).padStart(2,"0"),u=String(e.getMinutes()).padStart(2,"0"),h=String(e.getSeconds()).padStart(2,"0");return`${a}-${i}-${x} ${B}:${u}:${h}`}function Z(s){return(s.taskStatus||"").toUpperCase()}function te(s){const e=Z(s);return e==="RUNNING"?"执行中":e==="PENDING"?"等待中":e==="SUCCESS"||s.success?"已完成":e==="FAILED"?"失败":"等待中"}function de(s){const e=Z(s);return e==="RUNNING"?"running":e==="FAILED"?"failed":e==="SUCCESS"||s.success?"success":"pending"}function fe(s){const e=Z(s);return!!(s.downloadUrl&&(s.success||e==="SUCCESS"))}async function ve(s){if(!s.downloadUrl){m.warning("当前结果没有下载地址");return}const e=s.resultFilename||`${s.sourceFilename||"collect-data-result"}.xlsx`,a=`collect-data:${s.resultId||s.taskId||Date.now()}`,i=await Pe(s.downloadUrl,e,a);i.success?m.success(`已保存: ${i.path||e}`):i.error&&i.error!=="用户取消"&&m.error(i.error)}async function G(){try{E.value=await xe()}catch{}}async function H(){try{const e=(await Ae(50)).items||[],a=e.filter(u=>{const h=(u.taskStatus||"").toUpperCase();return h==="PENDING"||h==="RUNNING"});P.value=e.filter(u=>{const h=(u.taskStatus||"").toUpperCase();return h==="SUCCESS"||h==="FAILED"});const i=new Set;for(const u of a)u.taskId&&(i.add(u.taskId),n.add(u.taskId));for(const u of[...n.taskIds.value])e.some(J=>J.taskId===u)||n.remove(u);const x=new Set(a.map(u=>u.taskId).filter(u=>typeof u=="number")),B=[...a];for(const u of n.taskIds.value){if(x.has(u))continue;const h=I.value[u],J=h?.items?.[0];J?B.push(J):h?.task&&B.push({taskId:h.task.id,taskNo:h.task.taskNo,taskStatus:h.task.status,startedAt:h.task.createdAt,finishedAt:h.task.finishedAt,sourceFilename:"采集数据"})}$.value=B}catch{}}async function se(s){try{if(s.resultId)await Ee(s.resultId);else if(s.taskId)await Fe(s.taskId);else return;s.taskId&&n.remove(s.taskId),m.success("已删除"),await Promise.all([G(),H()])}catch(e){m.error(e instanceof Error?e.message:"删除失败")}}return ye(()=>{C(),G(),H()}),oe(()=>{T!=null&&(U.clearTimer("country-pref-save",T),T=null),U.clearScope()}),(s,e)=>(f(),v("div",Me,[he(Ce,{active:"collect-data"}),t("div",qe,[t("aside",Oe,[e[13]||(e[13]=t("div",{class:"section-title"},"上传文件",-1)),t("div",Ge,[e[5]||(e[5]=t("div",{class:"hint"},"选择需要采集的 Excel 文件或文件夹(默认根目录:采集前数据.xlsx),后续将按下方筛选条件交给 Python 端进行数据采集。",-1)),t("div",{class:"btns"},[t("button",{type:"button",class:"opt-btn",onClick:q},"选择 Excel"),t("button",{type:"button",class:"opt-btn",onClick:ie},"选择文件夹")]),t("div",Ve,[g.value.length?(f(),v(V,{key:0},[(f(!0),v(V,null,Y(r.value,a=>(f(),v("span",{key:a},l(a),1))),128)),g.value.length>r.value.length?(f(),v("span",ze," 还有 "+l(g.value.length-r.value.length)+" 个文件未展开显示 ",1)):D("",!0)],64)):(f(),v("span",Ke,"暂未选择文件"))])]),e[14]||(e[14]=t("div",{class:"section-title"},"筛选条件",-1)),t("div",je,[t("div",He,[e[7]||(e[7]=t("label",{class:"filter-label"},"金额区间",-1)),t("div",Je,[z(t("input",{"onUpdate:modelValue":e[0]||(e[0]=a=>o.minAmount=a),type:"number",step:"0.01",min:"0",class:"filter-input",placeholder:"最低"},null,512),[[ae,o.minAmount,void 0,{number:!0}]]),e[6]||(e[6]=t("span",{class:"range-separator"},"至",-1)),z(t("input",{"onUpdate:modelValue":e[1]||(e[1]=a=>o.maxAmount=a),type:"number",step:"0.01",min:"0",class:"filter-input",placeholder:"最高"},null,512),[[ae,o.maxAmount,void 0,{number:!0}]])])]),t("div",Ye,[t("label",Qe,[z(t("input",{type:"checkbox",class:"filter-check-input","onUpdate:modelValue":e[2]||(e[2]=a=>o.rank=a)},null,512),[[X,o.rank]]),e[8]||(e[8]=t("span",{class:"filter-check-text"},"排名",-1))]),t("label",We,[z(t("input",{type:"checkbox",class:"filter-check-input","onUpdate:modelValue":e[3]||(e[3]=a=>o.fba=a)},null,512),[[X,o.fba]]),e[9]||(e[9]=t("span",{class:"filter-check-text"},"FBA",-1))]),t("label",Ze,[z(t("input",{type:"checkbox",class:"filter-check-input","onUpdate:modelValue":e[4]||(e[4]=a=>o.fbm=a)},null,512),[[X,o.fbm]]),e[10]||(e[10]=t("span",{class:"filter-check-text"},"FBM",-1))])])]),t("div",Xe,[e[11]||(e[11]=t("span",null,"采集国家",-1)),O.value?(f(),v("span",et,"保存中…")):D("",!0)]),e[15]||(e[15]=t("p",{class:"hint country-pref-hint"}," 每次任务只采集一个国家,选择后会自动保存,下次进入默认使用该国家。 ",-1)),t("div",tt,[(f(),v(V,null,Y(k,a=>t("label",{key:a.code,class:ne(["country-check-row",{selected:d.value===a.code}])},[t("input",{type:"radio",name:"collect-data-country",class:"country-check-input",checked:d.value===a.code,onChange:i=>M(a.code)},null,40,st),t("span",at,l(a.label)+"("+l(a.code)+")",1)],2)),64))]),t("div",nt,[t("button",{type:"button",class:"btn-run",disabled:p.value||!b.value.length,onClick:ue},l(p.value?"提交中...":"提交采集任务"),9,lt),t("button",{type:"button",class:"btn-run btn-queue",disabled:_.value||!w.value,onClick:ce},l(_.value?"推送中...":"推送到 Python 队列"),9,ot)]),e[16]||(e[16]=t("p",{class:"loading-msg"},"提交后由 Java 解析 Excel 并落库为待采集任务(PENDING);推送到 Python 队列将激活任务(RUNNING),Python 端按 50 条/页拉取明细执行采集。",-1)),L.value?(f(),v("div",rt,[e[12]||(e[12]=t("div",{class:"section-title queue-debug-title"},"推送结果",-1)),t("div",it,l(L.value),1),A.value?(f(),v("pre",ut,l(A.value),1)):D("",!0)])):D("",!0)]),t("section",ct,[e[24]||(e[24]=t("div",{class:"panel-header"},"采集数据",-1)),t("div",dt,[t("div",ft,[t("div",vt,[e[17]||(e[17]=t("span",{class:"summary-label"},"运行中任务",-1)),t("strong",null,l(E.value.pendingTaskCount),1)]),t("div",pt,[e[18]||(e[18]=t("span",{class:"summary-label"},"已结束任务",-1)),t("strong",null,l(E.value.processedTaskCount),1)]),t("div",mt,[e[19]||(e[19]=t("span",{class:"summary-label"},"成功任务",-1)),t("strong",null,l(E.value.successTaskCount),1)]),t("div",yt,[e[20]||(e[20]=t("span",{class:"summary-label"},"失败任务",-1)),t("strong",null,l(E.value.failedTaskCount),1)])]),e[23]||(e[23]=t("div",{class:"subsection-title"},"匹配任务",-1)),t("div",ht,[e[21]||(e[21]=t("div",{class:"result-list-header"},[t("span",null,"当前任务")],-1)),$.value.length?(f(),v("ul",gt,[(f(!0),v(V,null,Y($.value,a=>(f(),v("li",{key:`cur-${a.taskId}`,class:"task-item"},[t("div",_t,[t("span",bt,l(a.sourceFilename||"采集数据"),1),t("div",wt,"任务 ID:"+l(a.taskId),1),t("div",Ct,"开始时间:"+l(W(a.startedAt||a.createdAt)),1),t("div",St,"行数:"+l(a.rowCount??"-"),1),t("div",It,"总数据去重过滤:"+l(a.dedupeFilteredCount??0),1),t("div",Tt,"不符合 ASIN 过滤:"+l(a.invalidFilteredCount??0),1)]),t("div",Nt,[t("span",Pt,l(te(a)),1),t("button",{type:"button",class:"btn-delete",onClick:i=>se(a)},"删除",8,xt)])]))),128))])):(f(),v("div",kt,"暂无当前任务"))]),t("div",At,[e[22]||(e[22]=t("div",{class:"result-list-header"},[t("span",null,"历史记录")],-1)),P.value.length?(f(),v("ul",Ft,[(f(!0),v(V,null,Y(P.value,a=>(f(),v("li",{key:`his-${a.resultId}-${a.taskId}`,class:"task-item"},[t("div",Dt,[t("span",Ut,l(a.sourceFilename||"采集数据"),1),t("div",$t,"任务 ID:"+l(a.taskId??"-"),1),t("div",Bt,"开始时间:"+l(W(a.startedAt||a.createdAt)),1),t("div",Rt,"结束时间:"+l(W(a.finishedAt)),1),t("div",Lt,"总数据去重过滤:"+l(a.dedupeFilteredCount??0),1),t("div",Mt,"不符合 ASIN 过滤:"+l(a.invalidFilteredCount??0),1),a.resultFilename?(f(),v("div",qt,l(a.resultFilename),1)):D("",!0),a.error?(f(),v("div",Ot,"错误:"+l(a.error),1)):D("",!0)]),t("div",Gt,[t("span",{class:ne(["status",de(a)])},l(te(a)),3),fe(a)?(f(),v("button",{key:0,type:"button",class:"download",onClick:i=>ve(a)},"下载",8,Vt)):D("",!0),a.resultId?(f(),v("button",{key:1,type:"button",class:"btn-delete",onClick:i=>se(a)},"删除",8,zt)):D("",!0)])]))),128))])):(f(),v("div",Et,"暂无历史记录"))])])])])]))}}),Ht=ge(jt,[["__scopeId","data-v-1311c61c"]]);_e(Ht).use(be).mount("#app"); diff --git a/app/assets/java-modules-B9jblDzU.js b/new_web_source/assets/java-modules-B9jblDzU.js similarity index 100% rename from app/assets/java-modules-B9jblDzU.js rename to new_web_source/assets/java-modules-B9jblDzU.js diff --git a/app/assets/java-modules-CXcfGmAJ.css b/new_web_source/assets/java-modules-CXcfGmAJ.css similarity index 100% rename from app/assets/java-modules-CXcfGmAJ.css rename to new_web_source/assets/java-modules-CXcfGmAJ.css diff --git a/app/new_web_source/delete-brand.html b/new_web_source/collect-data.html similarity index 79% rename from app/new_web_source/delete-brand.html rename to new_web_source/collect-data.html index fcecdd7..4c7ddf9 100644 --- a/app/new_web_source/delete-brand.html +++ b/new_web_source/collect-data.html @@ -3,15 +3,15 @@ - 删除品牌 - 数富AI - + 采集数据 + - +