diff --git a/.where-agent-progress.md b/.where-agent-progress.md index cf92b3a..285e783 100644 --- a/.where-agent-progress.md +++ b/.where-agent-progress.md @@ -1,5 +1,6 @@ -# Plan: ProtoFlow English User Guide Sync -- [x] Align structure with Chinese guide (learn-first flow) -- [x] Rewrite docs/USER_GUIDE_EN.md with current software behavior -- [x] Verify feature status/commands against implementation -- [x] Finalize delivery notes +# Plan: 全链路 Logo 统一 +- [x] 任务栏/安装器图标统一到指定 Logo(ico) +- [x] 桌面运行时应用图标链路统一(AppUserModelID + QApplication/窗口图标) +- [x] 前端侧边栏品牌图标替换为同款 Logo +- [x] 前端 favicon 替换为同款 Logo +- [x] 完成基础验证(py_compile + 前端组件测试) diff --git a/app/main_web.py b/app/main_web.py index 81af138..a3cf15f 100644 --- a/app/main_web.py +++ b/app/main_web.py @@ -12,6 +12,10 @@ from pathlib import Path from typing import Optional import yaml +try: + from PySide6.QtGui import QIcon +except ImportError: # pragma: no cover + from PyQt6.QtGui import QIcon # type: ignore try: from PySide6.QtWidgets import QApplication @@ -26,6 +30,8 @@ from infra.protocol.protocol_loader import ProtocolLoader from ui.desktop.web_window import WebWindow +APP_USER_MODEL_ID = "ProtoFlow.Desktop.App" + class _TeeStream: def __init__(self, primary, file_handle, is_error: bool) -> None: @@ -106,6 +112,38 @@ def _ensure_repo_cwd() -> None: pass +def _set_windows_app_id() -> None: + if sys.platform != "win32": + return + try: + import ctypes + ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(APP_USER_MODEL_ID) + except Exception: + logging.getLogger("main_web").warning("Failed to set AppUserModelID", exc_info=True) + + +def _resolve_app_icon() -> Optional[Path]: + root_dir = Path(__file__).resolve().parents[1] + candidates = [ + root_dir / "ui" / "assets" / "icons" / "logo.png", + root_dir / "ui" / "assets" / "icons" / "logo.svg", + root_dir / "installer" / "ProtoFlow.ico", + ] + if getattr(sys, "frozen", False): + exe_dir = Path(sys.executable).resolve().parent + candidates = [ + exe_dir / "ProtoFlow.ico", + exe_dir / "_internal" / "ProtoFlow.ico", + exe_dir / "ui" / "assets" / "icons" / "logo.png", + exe_dir / "ui" / "assets" / "icons" / "logo.svg", + *candidates, + ] + for path in candidates: + if path.exists(): + return path + return None + + def _detect_d3d11() -> bool: if sys.platform != "win32": return False @@ -195,10 +233,15 @@ def _proxy_monitor_enabled() -> bool: def main() -> None: _ensure_repo_cwd() + _set_windows_app_id() _setup_run_logging() flags = _select_webengine_flags() if flags: os.environ.setdefault("QTWEBENGINE_CHROMIUM_FLAGS", flags) + logging.getLogger("main_web").info( + "WebEngine flags: %s", + os.environ.get("QTWEBENGINE_CHROMIUM_FLAGS", ""), + ) bus = EventBus() comm = CommunicationManager(bus) proxy_enabled = _proxy_monitor_enabled() @@ -206,10 +249,15 @@ def main() -> None: logging.getLogger("main_web").info("Proxy monitor enabled: %s", proxy_enabled) protocol = ProtocolLoader(bus) packet_engine = PacketAnalysisEngine(bus) - plugins = PluginManager(bus, protocol=protocol) - plugins.load_all() + plugin_manager = PluginManager(bus, protocol=protocol) + plugin_manager.load_all() app = QApplication.instance() or QApplication(sys.argv) + icon_path = _resolve_app_icon() + if icon_path is not None: + icon = QIcon(str(icon_path)) + if not icon.isNull(): + app.setWindowIcon(icon) _shutdown_done = {"value": False} def _shutdown_proxy() -> None: @@ -228,6 +276,7 @@ def _shutdown_proxy() -> None: window = WebWindow( bus=bus, comm=comm, + plugin_manager=plugin_manager, proxy_manager=proxy_manager, proxy_monitor_enabled=proxy_enabled, ) diff --git a/app/plugin_manager.py b/app/plugin_manager.py index b77e20e..881db47 100644 --- a/app/plugin_manager.py +++ b/app/plugin_manager.py @@ -52,6 +52,22 @@ def load(self, name: str) -> None: def list_plugins(self) -> List[str]: return list(self._plugins.keys()) + def list_plugin_items(self) -> List[Dict[str, str]]: + items: List[Dict[str, str]] = [] + for name in sorted(self._plugins.keys()): + items.append( + { + "id": name, + "name": name, + "status": "enabled", + } + ) + return items + + def refresh_all(self) -> None: + self._plugins.clear() + self.load_all() + def reload(self, name: str) -> None: """热更新插件。""" module = self._plugins.get(name) diff --git a/docs/USER_GUIDE.md b/docs/USER_GUIDE.md index fa62bec..e199742 100644 --- a/docs/USER_GUIDE.md +++ b/docs/USER_GUIDE.md @@ -6,6 +6,9 @@ - 能根据模板编写自己的脚本 - 能定位常见错误 +相关文档: +- i18n 多语言说明书索引:[`docs/i18n-manual/README.md`](./i18n-manual/README.md) + ## 1. 软件定位 ProtoFlow 是一个通信自动化工具,不只是“串口收发器”。 它把通信流程拆成可执行步骤(DSL),用于: diff --git a/docs/USER_GUIDE_EN.md b/docs/USER_GUIDE_EN.md index dc8b8b2..eb7ad58 100644 --- a/docs/USER_GUIDE_EN.md +++ b/docs/USER_GUIDE_EN.md @@ -7,6 +7,9 @@ By the end, you should be able to: - write your own script from templates - troubleshoot common errors +Related docs: +- i18n manual index: [`docs/i18n-manual/README.md`](./i18n-manual/README.md) + ## 1. What ProtoFlow Is ProtoFlow is a communication automation tool, not just a serial terminal. It models communication as executable workflow steps (DSL), and is suitable for: diff --git a/docs/i18n-manual/I18N_MANUAL.ar.md b/docs/i18n-manual/I18N_MANUAL.ar.md new file mode 100644 index 0000000..40d72f2 --- /dev/null +++ b/docs/i18n-manual/I18N_MANUAL.ar.md @@ -0,0 +1,73 @@ +# ProtoFlow i18n Manual (ar) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | **ar** | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) + +Current Language: **Arabic** + +## 1. Source of Truth + +- Aggregator: `ui/frontend/src/i18n/index.ts` +- Locale dictionaries: `ui/frontend/src/i18n/locales/*.ts` +- Default locale: `zh-CN` + +## 2. Locale Map + +| Locale | Locale File | +|---|---| +| `zh-CN` | ui/frontend/src/i18n/locales/zhCN.ts | +| `en-US` | ui/frontend/src/i18n/locales/enUS.ts | +| `zh-TW` | ui/frontend/src/i18n/locales/zhTW.ts | +| `ja-JP` | ui/frontend/src/i18n/locales/jaJP.ts | +| `ko-KR` | ui/frontend/src/i18n/locales/koKR.ts | +| `fr-FR` | ui/frontend/src/i18n/locales/frFR.ts | +| `de-DE` | ui/frontend/src/i18n/locales/deDE.ts | +| `es-ES` | ui/frontend/src/i18n/locales/esES.ts | +| `pt-BR` | ui/frontend/src/i18n/locales/ptBR.ts | +| `ru-RU` | ui/frontend/src/i18n/locales/ruRU.ts | +| `ar` | ui/frontend/src/i18n/locales/ar.ts | +| `hi` | ui/frontend/src/i18n/locales/hi.ts | +| `it-IT` | ui/frontend/src/i18n/locales/itIT.ts | +| `nl-NL` | ui/frontend/src/i18n/locales/nlNL.ts | +| `th-TH` | ui/frontend/src/i18n/locales/thTH.ts | +| `vi-VN` | ui/frontend/src/i18n/locales/viVN.ts | +| `id-ID` | ui/frontend/src/i18n/locales/idID.ts | +| `tr-TR` | ui/frontend/src/i18n/locales/trTR.ts | +| `pl-PL` | ui/frontend/src/i18n/locales/plPL.ts | +| `uk-UA` | ui/frontend/src/i18n/locales/ukUA.ts | + +## 3. Resolution Order + +1. `translations[selectedLocale][key]` +2. `translations[DEFAULT_LANGUAGE][key]` +3. Inline fallback text passed to `t(key, fallback)` +4. Final fallback to the key string itself + +## 4. Add or Update a Language + +1. Create or update locale file in `ui/frontend/src/i18n/locales/`. +2. Export locale object and import it in `ui/frontend/src/i18n/index.ts`. +3. Add locale code to `translations` map. +4. Verify language switch in Settings page. +5. Run frontend build and smoke-check docs button text visibility. + +## 5. Required Key Groups + +- `nav.*` +- `header.*` +- `action.*` +- `status.*` and `filter.*` +- `settings.*` + +## 6. QA Checklist + +- No missing labels on primary pages (Manual/Scripts/Protocols/Settings). +- No mojibake in locale files. +- `npm --prefix ui/frontend run build` passes. +- Settings docs button has icon and visible text. + +## 7. Related Documents + +- [User Guide (ZH)](../USER_GUIDE.md) +- [User Guide (EN)](../USER_GUIDE_EN.md) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | **ar** | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) \ No newline at end of file diff --git a/docs/i18n-manual/I18N_MANUAL.de-DE.md b/docs/i18n-manual/I18N_MANUAL.de-DE.md new file mode 100644 index 0000000..a1e63b6 --- /dev/null +++ b/docs/i18n-manual/I18N_MANUAL.de-DE.md @@ -0,0 +1,73 @@ +# ProtoFlow i18n Manual (de-DE) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | **de-DE** | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) + +Current Language: **German** + +## 1. Source of Truth + +- Aggregator: `ui/frontend/src/i18n/index.ts` +- Locale dictionaries: `ui/frontend/src/i18n/locales/*.ts` +- Default locale: `zh-CN` + +## 2. Locale Map + +| Locale | Locale File | +|---|---| +| `zh-CN` | ui/frontend/src/i18n/locales/zhCN.ts | +| `en-US` | ui/frontend/src/i18n/locales/enUS.ts | +| `zh-TW` | ui/frontend/src/i18n/locales/zhTW.ts | +| `ja-JP` | ui/frontend/src/i18n/locales/jaJP.ts | +| `ko-KR` | ui/frontend/src/i18n/locales/koKR.ts | +| `fr-FR` | ui/frontend/src/i18n/locales/frFR.ts | +| `de-DE` | ui/frontend/src/i18n/locales/deDE.ts | +| `es-ES` | ui/frontend/src/i18n/locales/esES.ts | +| `pt-BR` | ui/frontend/src/i18n/locales/ptBR.ts | +| `ru-RU` | ui/frontend/src/i18n/locales/ruRU.ts | +| `ar` | ui/frontend/src/i18n/locales/ar.ts | +| `hi` | ui/frontend/src/i18n/locales/hi.ts | +| `it-IT` | ui/frontend/src/i18n/locales/itIT.ts | +| `nl-NL` | ui/frontend/src/i18n/locales/nlNL.ts | +| `th-TH` | ui/frontend/src/i18n/locales/thTH.ts | +| `vi-VN` | ui/frontend/src/i18n/locales/viVN.ts | +| `id-ID` | ui/frontend/src/i18n/locales/idID.ts | +| `tr-TR` | ui/frontend/src/i18n/locales/trTR.ts | +| `pl-PL` | ui/frontend/src/i18n/locales/plPL.ts | +| `uk-UA` | ui/frontend/src/i18n/locales/ukUA.ts | + +## 3. Resolution Order + +1. `translations[selectedLocale][key]` +2. `translations[DEFAULT_LANGUAGE][key]` +3. Inline fallback text passed to `t(key, fallback)` +4. Final fallback to the key string itself + +## 4. Add or Update a Language + +1. Create or update locale file in `ui/frontend/src/i18n/locales/`. +2. Export locale object and import it in `ui/frontend/src/i18n/index.ts`. +3. Add locale code to `translations` map. +4. Verify language switch in Settings page. +5. Run frontend build and smoke-check docs button text visibility. + +## 5. Required Key Groups + +- `nav.*` +- `header.*` +- `action.*` +- `status.*` and `filter.*` +- `settings.*` + +## 6. QA Checklist + +- No missing labels on primary pages (Manual/Scripts/Protocols/Settings). +- No mojibake in locale files. +- `npm --prefix ui/frontend run build` passes. +- Settings docs button has icon and visible text. + +## 7. Related Documents + +- [User Guide (ZH)](../USER_GUIDE.md) +- [User Guide (EN)](../USER_GUIDE_EN.md) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | **de-DE** | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) \ No newline at end of file diff --git a/docs/i18n-manual/I18N_MANUAL.en-US.md b/docs/i18n-manual/I18N_MANUAL.en-US.md new file mode 100644 index 0000000..e5b83f5 --- /dev/null +++ b/docs/i18n-manual/I18N_MANUAL.en-US.md @@ -0,0 +1,73 @@ +# ProtoFlow i18n Manual (en-US) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | **en-US** | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) + +Current Language: **English (US)** + +## 1. Source of Truth + +- Aggregator: `ui/frontend/src/i18n/index.ts` +- Locale dictionaries: `ui/frontend/src/i18n/locales/*.ts` +- Default locale: `zh-CN` + +## 2. Locale Map + +| Locale | Locale File | +|---|---| +| `zh-CN` | ui/frontend/src/i18n/locales/zhCN.ts | +| `en-US` | ui/frontend/src/i18n/locales/enUS.ts | +| `zh-TW` | ui/frontend/src/i18n/locales/zhTW.ts | +| `ja-JP` | ui/frontend/src/i18n/locales/jaJP.ts | +| `ko-KR` | ui/frontend/src/i18n/locales/koKR.ts | +| `fr-FR` | ui/frontend/src/i18n/locales/frFR.ts | +| `de-DE` | ui/frontend/src/i18n/locales/deDE.ts | +| `es-ES` | ui/frontend/src/i18n/locales/esES.ts | +| `pt-BR` | ui/frontend/src/i18n/locales/ptBR.ts | +| `ru-RU` | ui/frontend/src/i18n/locales/ruRU.ts | +| `ar` | ui/frontend/src/i18n/locales/ar.ts | +| `hi` | ui/frontend/src/i18n/locales/hi.ts | +| `it-IT` | ui/frontend/src/i18n/locales/itIT.ts | +| `nl-NL` | ui/frontend/src/i18n/locales/nlNL.ts | +| `th-TH` | ui/frontend/src/i18n/locales/thTH.ts | +| `vi-VN` | ui/frontend/src/i18n/locales/viVN.ts | +| `id-ID` | ui/frontend/src/i18n/locales/idID.ts | +| `tr-TR` | ui/frontend/src/i18n/locales/trTR.ts | +| `pl-PL` | ui/frontend/src/i18n/locales/plPL.ts | +| `uk-UA` | ui/frontend/src/i18n/locales/ukUA.ts | + +## 3. Resolution Order + +1. `translations[selectedLocale][key]` +2. `translations[DEFAULT_LANGUAGE][key]` +3. Inline fallback text passed to `t(key, fallback)` +4. Final fallback to the key string itself + +## 4. Add or Update a Language + +1. Create or update locale file in `ui/frontend/src/i18n/locales/`. +2. Export locale object and import it in `ui/frontend/src/i18n/index.ts`. +3. Add locale code to `translations` map. +4. Verify language switch in Settings page. +5. Run frontend build and smoke-check docs button text visibility. + +## 5. Required Key Groups + +- `nav.*` +- `header.*` +- `action.*` +- `status.*` and `filter.*` +- `settings.*` + +## 6. QA Checklist + +- No missing labels on primary pages (Manual/Scripts/Protocols/Settings). +- No mojibake in locale files. +- `npm --prefix ui/frontend run build` passes. +- Settings docs button has icon and visible text. + +## 7. Related Documents + +- [User Guide (ZH)](../USER_GUIDE.md) +- [User Guide (EN)](../USER_GUIDE_EN.md) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | **en-US** | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) \ No newline at end of file diff --git a/docs/i18n-manual/I18N_MANUAL.es-ES.md b/docs/i18n-manual/I18N_MANUAL.es-ES.md new file mode 100644 index 0000000..21d4e37 --- /dev/null +++ b/docs/i18n-manual/I18N_MANUAL.es-ES.md @@ -0,0 +1,73 @@ +# ProtoFlow i18n Manual (es-ES) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | **es-ES** | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) + +Current Language: **Spanish** + +## 1. Source of Truth + +- Aggregator: `ui/frontend/src/i18n/index.ts` +- Locale dictionaries: `ui/frontend/src/i18n/locales/*.ts` +- Default locale: `zh-CN` + +## 2. Locale Map + +| Locale | Locale File | +|---|---| +| `zh-CN` | ui/frontend/src/i18n/locales/zhCN.ts | +| `en-US` | ui/frontend/src/i18n/locales/enUS.ts | +| `zh-TW` | ui/frontend/src/i18n/locales/zhTW.ts | +| `ja-JP` | ui/frontend/src/i18n/locales/jaJP.ts | +| `ko-KR` | ui/frontend/src/i18n/locales/koKR.ts | +| `fr-FR` | ui/frontend/src/i18n/locales/frFR.ts | +| `de-DE` | ui/frontend/src/i18n/locales/deDE.ts | +| `es-ES` | ui/frontend/src/i18n/locales/esES.ts | +| `pt-BR` | ui/frontend/src/i18n/locales/ptBR.ts | +| `ru-RU` | ui/frontend/src/i18n/locales/ruRU.ts | +| `ar` | ui/frontend/src/i18n/locales/ar.ts | +| `hi` | ui/frontend/src/i18n/locales/hi.ts | +| `it-IT` | ui/frontend/src/i18n/locales/itIT.ts | +| `nl-NL` | ui/frontend/src/i18n/locales/nlNL.ts | +| `th-TH` | ui/frontend/src/i18n/locales/thTH.ts | +| `vi-VN` | ui/frontend/src/i18n/locales/viVN.ts | +| `id-ID` | ui/frontend/src/i18n/locales/idID.ts | +| `tr-TR` | ui/frontend/src/i18n/locales/trTR.ts | +| `pl-PL` | ui/frontend/src/i18n/locales/plPL.ts | +| `uk-UA` | ui/frontend/src/i18n/locales/ukUA.ts | + +## 3. Resolution Order + +1. `translations[selectedLocale][key]` +2. `translations[DEFAULT_LANGUAGE][key]` +3. Inline fallback text passed to `t(key, fallback)` +4. Final fallback to the key string itself + +## 4. Add or Update a Language + +1. Create or update locale file in `ui/frontend/src/i18n/locales/`. +2. Export locale object and import it in `ui/frontend/src/i18n/index.ts`. +3. Add locale code to `translations` map. +4. Verify language switch in Settings page. +5. Run frontend build and smoke-check docs button text visibility. + +## 5. Required Key Groups + +- `nav.*` +- `header.*` +- `action.*` +- `status.*` and `filter.*` +- `settings.*` + +## 6. QA Checklist + +- No missing labels on primary pages (Manual/Scripts/Protocols/Settings). +- No mojibake in locale files. +- `npm --prefix ui/frontend run build` passes. +- Settings docs button has icon and visible text. + +## 7. Related Documents + +- [User Guide (ZH)](../USER_GUIDE.md) +- [User Guide (EN)](../USER_GUIDE_EN.md) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | **es-ES** | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) \ No newline at end of file diff --git a/docs/i18n-manual/I18N_MANUAL.fr-FR.md b/docs/i18n-manual/I18N_MANUAL.fr-FR.md new file mode 100644 index 0000000..6764191 --- /dev/null +++ b/docs/i18n-manual/I18N_MANUAL.fr-FR.md @@ -0,0 +1,73 @@ +# ProtoFlow i18n Manual (fr-FR) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | **fr-FR** | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) + +Current Language: **French** + +## 1. Source of Truth + +- Aggregator: `ui/frontend/src/i18n/index.ts` +- Locale dictionaries: `ui/frontend/src/i18n/locales/*.ts` +- Default locale: `zh-CN` + +## 2. Locale Map + +| Locale | Locale File | +|---|---| +| `zh-CN` | ui/frontend/src/i18n/locales/zhCN.ts | +| `en-US` | ui/frontend/src/i18n/locales/enUS.ts | +| `zh-TW` | ui/frontend/src/i18n/locales/zhTW.ts | +| `ja-JP` | ui/frontend/src/i18n/locales/jaJP.ts | +| `ko-KR` | ui/frontend/src/i18n/locales/koKR.ts | +| `fr-FR` | ui/frontend/src/i18n/locales/frFR.ts | +| `de-DE` | ui/frontend/src/i18n/locales/deDE.ts | +| `es-ES` | ui/frontend/src/i18n/locales/esES.ts | +| `pt-BR` | ui/frontend/src/i18n/locales/ptBR.ts | +| `ru-RU` | ui/frontend/src/i18n/locales/ruRU.ts | +| `ar` | ui/frontend/src/i18n/locales/ar.ts | +| `hi` | ui/frontend/src/i18n/locales/hi.ts | +| `it-IT` | ui/frontend/src/i18n/locales/itIT.ts | +| `nl-NL` | ui/frontend/src/i18n/locales/nlNL.ts | +| `th-TH` | ui/frontend/src/i18n/locales/thTH.ts | +| `vi-VN` | ui/frontend/src/i18n/locales/viVN.ts | +| `id-ID` | ui/frontend/src/i18n/locales/idID.ts | +| `tr-TR` | ui/frontend/src/i18n/locales/trTR.ts | +| `pl-PL` | ui/frontend/src/i18n/locales/plPL.ts | +| `uk-UA` | ui/frontend/src/i18n/locales/ukUA.ts | + +## 3. Resolution Order + +1. `translations[selectedLocale][key]` +2. `translations[DEFAULT_LANGUAGE][key]` +3. Inline fallback text passed to `t(key, fallback)` +4. Final fallback to the key string itself + +## 4. Add or Update a Language + +1. Create or update locale file in `ui/frontend/src/i18n/locales/`. +2. Export locale object and import it in `ui/frontend/src/i18n/index.ts`. +3. Add locale code to `translations` map. +4. Verify language switch in Settings page. +5. Run frontend build and smoke-check docs button text visibility. + +## 5. Required Key Groups + +- `nav.*` +- `header.*` +- `action.*` +- `status.*` and `filter.*` +- `settings.*` + +## 6. QA Checklist + +- No missing labels on primary pages (Manual/Scripts/Protocols/Settings). +- No mojibake in locale files. +- `npm --prefix ui/frontend run build` passes. +- Settings docs button has icon and visible text. + +## 7. Related Documents + +- [User Guide (ZH)](../USER_GUIDE.md) +- [User Guide (EN)](../USER_GUIDE_EN.md) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | **fr-FR** | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) \ No newline at end of file diff --git a/docs/i18n-manual/I18N_MANUAL.hi.md b/docs/i18n-manual/I18N_MANUAL.hi.md new file mode 100644 index 0000000..8397f37 --- /dev/null +++ b/docs/i18n-manual/I18N_MANUAL.hi.md @@ -0,0 +1,73 @@ +# ProtoFlow i18n Manual (hi) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | **hi** | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) + +Current Language: **Hindi** + +## 1. Source of Truth + +- Aggregator: `ui/frontend/src/i18n/index.ts` +- Locale dictionaries: `ui/frontend/src/i18n/locales/*.ts` +- Default locale: `zh-CN` + +## 2. Locale Map + +| Locale | Locale File | +|---|---| +| `zh-CN` | ui/frontend/src/i18n/locales/zhCN.ts | +| `en-US` | ui/frontend/src/i18n/locales/enUS.ts | +| `zh-TW` | ui/frontend/src/i18n/locales/zhTW.ts | +| `ja-JP` | ui/frontend/src/i18n/locales/jaJP.ts | +| `ko-KR` | ui/frontend/src/i18n/locales/koKR.ts | +| `fr-FR` | ui/frontend/src/i18n/locales/frFR.ts | +| `de-DE` | ui/frontend/src/i18n/locales/deDE.ts | +| `es-ES` | ui/frontend/src/i18n/locales/esES.ts | +| `pt-BR` | ui/frontend/src/i18n/locales/ptBR.ts | +| `ru-RU` | ui/frontend/src/i18n/locales/ruRU.ts | +| `ar` | ui/frontend/src/i18n/locales/ar.ts | +| `hi` | ui/frontend/src/i18n/locales/hi.ts | +| `it-IT` | ui/frontend/src/i18n/locales/itIT.ts | +| `nl-NL` | ui/frontend/src/i18n/locales/nlNL.ts | +| `th-TH` | ui/frontend/src/i18n/locales/thTH.ts | +| `vi-VN` | ui/frontend/src/i18n/locales/viVN.ts | +| `id-ID` | ui/frontend/src/i18n/locales/idID.ts | +| `tr-TR` | ui/frontend/src/i18n/locales/trTR.ts | +| `pl-PL` | ui/frontend/src/i18n/locales/plPL.ts | +| `uk-UA` | ui/frontend/src/i18n/locales/ukUA.ts | + +## 3. Resolution Order + +1. `translations[selectedLocale][key]` +2. `translations[DEFAULT_LANGUAGE][key]` +3. Inline fallback text passed to `t(key, fallback)` +4. Final fallback to the key string itself + +## 4. Add or Update a Language + +1. Create or update locale file in `ui/frontend/src/i18n/locales/`. +2. Export locale object and import it in `ui/frontend/src/i18n/index.ts`. +3. Add locale code to `translations` map. +4. Verify language switch in Settings page. +5. Run frontend build and smoke-check docs button text visibility. + +## 5. Required Key Groups + +- `nav.*` +- `header.*` +- `action.*` +- `status.*` and `filter.*` +- `settings.*` + +## 6. QA Checklist + +- No missing labels on primary pages (Manual/Scripts/Protocols/Settings). +- No mojibake in locale files. +- `npm --prefix ui/frontend run build` passes. +- Settings docs button has icon and visible text. + +## 7. Related Documents + +- [User Guide (ZH)](../USER_GUIDE.md) +- [User Guide (EN)](../USER_GUIDE_EN.md) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | **hi** | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) \ No newline at end of file diff --git a/docs/i18n-manual/I18N_MANUAL.id-ID.md b/docs/i18n-manual/I18N_MANUAL.id-ID.md new file mode 100644 index 0000000..324f70d --- /dev/null +++ b/docs/i18n-manual/I18N_MANUAL.id-ID.md @@ -0,0 +1,73 @@ +# ProtoFlow i18n Manual (id-ID) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | **id-ID** | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) + +Current Language: **Indonesian** + +## 1. Source of Truth + +- Aggregator: `ui/frontend/src/i18n/index.ts` +- Locale dictionaries: `ui/frontend/src/i18n/locales/*.ts` +- Default locale: `zh-CN` + +## 2. Locale Map + +| Locale | Locale File | +|---|---| +| `zh-CN` | ui/frontend/src/i18n/locales/zhCN.ts | +| `en-US` | ui/frontend/src/i18n/locales/enUS.ts | +| `zh-TW` | ui/frontend/src/i18n/locales/zhTW.ts | +| `ja-JP` | ui/frontend/src/i18n/locales/jaJP.ts | +| `ko-KR` | ui/frontend/src/i18n/locales/koKR.ts | +| `fr-FR` | ui/frontend/src/i18n/locales/frFR.ts | +| `de-DE` | ui/frontend/src/i18n/locales/deDE.ts | +| `es-ES` | ui/frontend/src/i18n/locales/esES.ts | +| `pt-BR` | ui/frontend/src/i18n/locales/ptBR.ts | +| `ru-RU` | ui/frontend/src/i18n/locales/ruRU.ts | +| `ar` | ui/frontend/src/i18n/locales/ar.ts | +| `hi` | ui/frontend/src/i18n/locales/hi.ts | +| `it-IT` | ui/frontend/src/i18n/locales/itIT.ts | +| `nl-NL` | ui/frontend/src/i18n/locales/nlNL.ts | +| `th-TH` | ui/frontend/src/i18n/locales/thTH.ts | +| `vi-VN` | ui/frontend/src/i18n/locales/viVN.ts | +| `id-ID` | ui/frontend/src/i18n/locales/idID.ts | +| `tr-TR` | ui/frontend/src/i18n/locales/trTR.ts | +| `pl-PL` | ui/frontend/src/i18n/locales/plPL.ts | +| `uk-UA` | ui/frontend/src/i18n/locales/ukUA.ts | + +## 3. Resolution Order + +1. `translations[selectedLocale][key]` +2. `translations[DEFAULT_LANGUAGE][key]` +3. Inline fallback text passed to `t(key, fallback)` +4. Final fallback to the key string itself + +## 4. Add or Update a Language + +1. Create or update locale file in `ui/frontend/src/i18n/locales/`. +2. Export locale object and import it in `ui/frontend/src/i18n/index.ts`. +3. Add locale code to `translations` map. +4. Verify language switch in Settings page. +5. Run frontend build and smoke-check docs button text visibility. + +## 5. Required Key Groups + +- `nav.*` +- `header.*` +- `action.*` +- `status.*` and `filter.*` +- `settings.*` + +## 6. QA Checklist + +- No missing labels on primary pages (Manual/Scripts/Protocols/Settings). +- No mojibake in locale files. +- `npm --prefix ui/frontend run build` passes. +- Settings docs button has icon and visible text. + +## 7. Related Documents + +- [User Guide (ZH)](../USER_GUIDE.md) +- [User Guide (EN)](../USER_GUIDE_EN.md) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | **id-ID** | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) \ No newline at end of file diff --git a/docs/i18n-manual/I18N_MANUAL.it-IT.md b/docs/i18n-manual/I18N_MANUAL.it-IT.md new file mode 100644 index 0000000..2b96ec3 --- /dev/null +++ b/docs/i18n-manual/I18N_MANUAL.it-IT.md @@ -0,0 +1,73 @@ +# ProtoFlow i18n Manual (it-IT) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | **it-IT** | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) + +Current Language: **Italian** + +## 1. Source of Truth + +- Aggregator: `ui/frontend/src/i18n/index.ts` +- Locale dictionaries: `ui/frontend/src/i18n/locales/*.ts` +- Default locale: `zh-CN` + +## 2. Locale Map + +| Locale | Locale File | +|---|---| +| `zh-CN` | ui/frontend/src/i18n/locales/zhCN.ts | +| `en-US` | ui/frontend/src/i18n/locales/enUS.ts | +| `zh-TW` | ui/frontend/src/i18n/locales/zhTW.ts | +| `ja-JP` | ui/frontend/src/i18n/locales/jaJP.ts | +| `ko-KR` | ui/frontend/src/i18n/locales/koKR.ts | +| `fr-FR` | ui/frontend/src/i18n/locales/frFR.ts | +| `de-DE` | ui/frontend/src/i18n/locales/deDE.ts | +| `es-ES` | ui/frontend/src/i18n/locales/esES.ts | +| `pt-BR` | ui/frontend/src/i18n/locales/ptBR.ts | +| `ru-RU` | ui/frontend/src/i18n/locales/ruRU.ts | +| `ar` | ui/frontend/src/i18n/locales/ar.ts | +| `hi` | ui/frontend/src/i18n/locales/hi.ts | +| `it-IT` | ui/frontend/src/i18n/locales/itIT.ts | +| `nl-NL` | ui/frontend/src/i18n/locales/nlNL.ts | +| `th-TH` | ui/frontend/src/i18n/locales/thTH.ts | +| `vi-VN` | ui/frontend/src/i18n/locales/viVN.ts | +| `id-ID` | ui/frontend/src/i18n/locales/idID.ts | +| `tr-TR` | ui/frontend/src/i18n/locales/trTR.ts | +| `pl-PL` | ui/frontend/src/i18n/locales/plPL.ts | +| `uk-UA` | ui/frontend/src/i18n/locales/ukUA.ts | + +## 3. Resolution Order + +1. `translations[selectedLocale][key]` +2. `translations[DEFAULT_LANGUAGE][key]` +3. Inline fallback text passed to `t(key, fallback)` +4. Final fallback to the key string itself + +## 4. Add or Update a Language + +1. Create or update locale file in `ui/frontend/src/i18n/locales/`. +2. Export locale object and import it in `ui/frontend/src/i18n/index.ts`. +3. Add locale code to `translations` map. +4. Verify language switch in Settings page. +5. Run frontend build and smoke-check docs button text visibility. + +## 5. Required Key Groups + +- `nav.*` +- `header.*` +- `action.*` +- `status.*` and `filter.*` +- `settings.*` + +## 6. QA Checklist + +- No missing labels on primary pages (Manual/Scripts/Protocols/Settings). +- No mojibake in locale files. +- `npm --prefix ui/frontend run build` passes. +- Settings docs button has icon and visible text. + +## 7. Related Documents + +- [User Guide (ZH)](../USER_GUIDE.md) +- [User Guide (EN)](../USER_GUIDE_EN.md) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | **it-IT** | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) \ No newline at end of file diff --git a/docs/i18n-manual/I18N_MANUAL.ja-JP.md b/docs/i18n-manual/I18N_MANUAL.ja-JP.md new file mode 100644 index 0000000..ea1dad2 --- /dev/null +++ b/docs/i18n-manual/I18N_MANUAL.ja-JP.md @@ -0,0 +1,73 @@ +# ProtoFlow i18n Manual (ja-JP) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | **ja-JP** | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) + +Current Language: **Japanese** + +## 1. Source of Truth + +- Aggregator: `ui/frontend/src/i18n/index.ts` +- Locale dictionaries: `ui/frontend/src/i18n/locales/*.ts` +- Default locale: `zh-CN` + +## 2. Locale Map + +| Locale | Locale File | +|---|---| +| `zh-CN` | ui/frontend/src/i18n/locales/zhCN.ts | +| `en-US` | ui/frontend/src/i18n/locales/enUS.ts | +| `zh-TW` | ui/frontend/src/i18n/locales/zhTW.ts | +| `ja-JP` | ui/frontend/src/i18n/locales/jaJP.ts | +| `ko-KR` | ui/frontend/src/i18n/locales/koKR.ts | +| `fr-FR` | ui/frontend/src/i18n/locales/frFR.ts | +| `de-DE` | ui/frontend/src/i18n/locales/deDE.ts | +| `es-ES` | ui/frontend/src/i18n/locales/esES.ts | +| `pt-BR` | ui/frontend/src/i18n/locales/ptBR.ts | +| `ru-RU` | ui/frontend/src/i18n/locales/ruRU.ts | +| `ar` | ui/frontend/src/i18n/locales/ar.ts | +| `hi` | ui/frontend/src/i18n/locales/hi.ts | +| `it-IT` | ui/frontend/src/i18n/locales/itIT.ts | +| `nl-NL` | ui/frontend/src/i18n/locales/nlNL.ts | +| `th-TH` | ui/frontend/src/i18n/locales/thTH.ts | +| `vi-VN` | ui/frontend/src/i18n/locales/viVN.ts | +| `id-ID` | ui/frontend/src/i18n/locales/idID.ts | +| `tr-TR` | ui/frontend/src/i18n/locales/trTR.ts | +| `pl-PL` | ui/frontend/src/i18n/locales/plPL.ts | +| `uk-UA` | ui/frontend/src/i18n/locales/ukUA.ts | + +## 3. Resolution Order + +1. `translations[selectedLocale][key]` +2. `translations[DEFAULT_LANGUAGE][key]` +3. Inline fallback text passed to `t(key, fallback)` +4. Final fallback to the key string itself + +## 4. Add or Update a Language + +1. Create or update locale file in `ui/frontend/src/i18n/locales/`. +2. Export locale object and import it in `ui/frontend/src/i18n/index.ts`. +3. Add locale code to `translations` map. +4. Verify language switch in Settings page. +5. Run frontend build and smoke-check docs button text visibility. + +## 5. Required Key Groups + +- `nav.*` +- `header.*` +- `action.*` +- `status.*` and `filter.*` +- `settings.*` + +## 6. QA Checklist + +- No missing labels on primary pages (Manual/Scripts/Protocols/Settings). +- No mojibake in locale files. +- `npm --prefix ui/frontend run build` passes. +- Settings docs button has icon and visible text. + +## 7. Related Documents + +- [User Guide (ZH)](../USER_GUIDE.md) +- [User Guide (EN)](../USER_GUIDE_EN.md) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | **ja-JP** | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) \ No newline at end of file diff --git a/docs/i18n-manual/I18N_MANUAL.ko-KR.md b/docs/i18n-manual/I18N_MANUAL.ko-KR.md new file mode 100644 index 0000000..b85cce3 --- /dev/null +++ b/docs/i18n-manual/I18N_MANUAL.ko-KR.md @@ -0,0 +1,73 @@ +# ProtoFlow i18n Manual (ko-KR) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | **ko-KR** | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) + +Current Language: **Korean** + +## 1. Source of Truth + +- Aggregator: `ui/frontend/src/i18n/index.ts` +- Locale dictionaries: `ui/frontend/src/i18n/locales/*.ts` +- Default locale: `zh-CN` + +## 2. Locale Map + +| Locale | Locale File | +|---|---| +| `zh-CN` | ui/frontend/src/i18n/locales/zhCN.ts | +| `en-US` | ui/frontend/src/i18n/locales/enUS.ts | +| `zh-TW` | ui/frontend/src/i18n/locales/zhTW.ts | +| `ja-JP` | ui/frontend/src/i18n/locales/jaJP.ts | +| `ko-KR` | ui/frontend/src/i18n/locales/koKR.ts | +| `fr-FR` | ui/frontend/src/i18n/locales/frFR.ts | +| `de-DE` | ui/frontend/src/i18n/locales/deDE.ts | +| `es-ES` | ui/frontend/src/i18n/locales/esES.ts | +| `pt-BR` | ui/frontend/src/i18n/locales/ptBR.ts | +| `ru-RU` | ui/frontend/src/i18n/locales/ruRU.ts | +| `ar` | ui/frontend/src/i18n/locales/ar.ts | +| `hi` | ui/frontend/src/i18n/locales/hi.ts | +| `it-IT` | ui/frontend/src/i18n/locales/itIT.ts | +| `nl-NL` | ui/frontend/src/i18n/locales/nlNL.ts | +| `th-TH` | ui/frontend/src/i18n/locales/thTH.ts | +| `vi-VN` | ui/frontend/src/i18n/locales/viVN.ts | +| `id-ID` | ui/frontend/src/i18n/locales/idID.ts | +| `tr-TR` | ui/frontend/src/i18n/locales/trTR.ts | +| `pl-PL` | ui/frontend/src/i18n/locales/plPL.ts | +| `uk-UA` | ui/frontend/src/i18n/locales/ukUA.ts | + +## 3. Resolution Order + +1. `translations[selectedLocale][key]` +2. `translations[DEFAULT_LANGUAGE][key]` +3. Inline fallback text passed to `t(key, fallback)` +4. Final fallback to the key string itself + +## 4. Add or Update a Language + +1. Create or update locale file in `ui/frontend/src/i18n/locales/`. +2. Export locale object and import it in `ui/frontend/src/i18n/index.ts`. +3. Add locale code to `translations` map. +4. Verify language switch in Settings page. +5. Run frontend build and smoke-check docs button text visibility. + +## 5. Required Key Groups + +- `nav.*` +- `header.*` +- `action.*` +- `status.*` and `filter.*` +- `settings.*` + +## 6. QA Checklist + +- No missing labels on primary pages (Manual/Scripts/Protocols/Settings). +- No mojibake in locale files. +- `npm --prefix ui/frontend run build` passes. +- Settings docs button has icon and visible text. + +## 7. Related Documents + +- [User Guide (ZH)](../USER_GUIDE.md) +- [User Guide (EN)](../USER_GUIDE_EN.md) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | **ko-KR** | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) \ No newline at end of file diff --git a/docs/i18n-manual/I18N_MANUAL.nl-NL.md b/docs/i18n-manual/I18N_MANUAL.nl-NL.md new file mode 100644 index 0000000..4bae382 --- /dev/null +++ b/docs/i18n-manual/I18N_MANUAL.nl-NL.md @@ -0,0 +1,73 @@ +# ProtoFlow i18n Manual (nl-NL) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | **nl-NL** | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) + +Current Language: **Dutch** + +## 1. Source of Truth + +- Aggregator: `ui/frontend/src/i18n/index.ts` +- Locale dictionaries: `ui/frontend/src/i18n/locales/*.ts` +- Default locale: `zh-CN` + +## 2. Locale Map + +| Locale | Locale File | +|---|---| +| `zh-CN` | ui/frontend/src/i18n/locales/zhCN.ts | +| `en-US` | ui/frontend/src/i18n/locales/enUS.ts | +| `zh-TW` | ui/frontend/src/i18n/locales/zhTW.ts | +| `ja-JP` | ui/frontend/src/i18n/locales/jaJP.ts | +| `ko-KR` | ui/frontend/src/i18n/locales/koKR.ts | +| `fr-FR` | ui/frontend/src/i18n/locales/frFR.ts | +| `de-DE` | ui/frontend/src/i18n/locales/deDE.ts | +| `es-ES` | ui/frontend/src/i18n/locales/esES.ts | +| `pt-BR` | ui/frontend/src/i18n/locales/ptBR.ts | +| `ru-RU` | ui/frontend/src/i18n/locales/ruRU.ts | +| `ar` | ui/frontend/src/i18n/locales/ar.ts | +| `hi` | ui/frontend/src/i18n/locales/hi.ts | +| `it-IT` | ui/frontend/src/i18n/locales/itIT.ts | +| `nl-NL` | ui/frontend/src/i18n/locales/nlNL.ts | +| `th-TH` | ui/frontend/src/i18n/locales/thTH.ts | +| `vi-VN` | ui/frontend/src/i18n/locales/viVN.ts | +| `id-ID` | ui/frontend/src/i18n/locales/idID.ts | +| `tr-TR` | ui/frontend/src/i18n/locales/trTR.ts | +| `pl-PL` | ui/frontend/src/i18n/locales/plPL.ts | +| `uk-UA` | ui/frontend/src/i18n/locales/ukUA.ts | + +## 3. Resolution Order + +1. `translations[selectedLocale][key]` +2. `translations[DEFAULT_LANGUAGE][key]` +3. Inline fallback text passed to `t(key, fallback)` +4. Final fallback to the key string itself + +## 4. Add or Update a Language + +1. Create or update locale file in `ui/frontend/src/i18n/locales/`. +2. Export locale object and import it in `ui/frontend/src/i18n/index.ts`. +3. Add locale code to `translations` map. +4. Verify language switch in Settings page. +5. Run frontend build and smoke-check docs button text visibility. + +## 5. Required Key Groups + +- `nav.*` +- `header.*` +- `action.*` +- `status.*` and `filter.*` +- `settings.*` + +## 6. QA Checklist + +- No missing labels on primary pages (Manual/Scripts/Protocols/Settings). +- No mojibake in locale files. +- `npm --prefix ui/frontend run build` passes. +- Settings docs button has icon and visible text. + +## 7. Related Documents + +- [User Guide (ZH)](../USER_GUIDE.md) +- [User Guide (EN)](../USER_GUIDE_EN.md) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | **nl-NL** | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) \ No newline at end of file diff --git a/docs/i18n-manual/I18N_MANUAL.pl-PL.md b/docs/i18n-manual/I18N_MANUAL.pl-PL.md new file mode 100644 index 0000000..106ce55 --- /dev/null +++ b/docs/i18n-manual/I18N_MANUAL.pl-PL.md @@ -0,0 +1,73 @@ +# ProtoFlow i18n Manual (pl-PL) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | **pl-PL** | [uk-UA](I18N_MANUAL.uk-UA.md) + +Current Language: **Polish** + +## 1. Source of Truth + +- Aggregator: `ui/frontend/src/i18n/index.ts` +- Locale dictionaries: `ui/frontend/src/i18n/locales/*.ts` +- Default locale: `zh-CN` + +## 2. Locale Map + +| Locale | Locale File | +|---|---| +| `zh-CN` | ui/frontend/src/i18n/locales/zhCN.ts | +| `en-US` | ui/frontend/src/i18n/locales/enUS.ts | +| `zh-TW` | ui/frontend/src/i18n/locales/zhTW.ts | +| `ja-JP` | ui/frontend/src/i18n/locales/jaJP.ts | +| `ko-KR` | ui/frontend/src/i18n/locales/koKR.ts | +| `fr-FR` | ui/frontend/src/i18n/locales/frFR.ts | +| `de-DE` | ui/frontend/src/i18n/locales/deDE.ts | +| `es-ES` | ui/frontend/src/i18n/locales/esES.ts | +| `pt-BR` | ui/frontend/src/i18n/locales/ptBR.ts | +| `ru-RU` | ui/frontend/src/i18n/locales/ruRU.ts | +| `ar` | ui/frontend/src/i18n/locales/ar.ts | +| `hi` | ui/frontend/src/i18n/locales/hi.ts | +| `it-IT` | ui/frontend/src/i18n/locales/itIT.ts | +| `nl-NL` | ui/frontend/src/i18n/locales/nlNL.ts | +| `th-TH` | ui/frontend/src/i18n/locales/thTH.ts | +| `vi-VN` | ui/frontend/src/i18n/locales/viVN.ts | +| `id-ID` | ui/frontend/src/i18n/locales/idID.ts | +| `tr-TR` | ui/frontend/src/i18n/locales/trTR.ts | +| `pl-PL` | ui/frontend/src/i18n/locales/plPL.ts | +| `uk-UA` | ui/frontend/src/i18n/locales/ukUA.ts | + +## 3. Resolution Order + +1. `translations[selectedLocale][key]` +2. `translations[DEFAULT_LANGUAGE][key]` +3. Inline fallback text passed to `t(key, fallback)` +4. Final fallback to the key string itself + +## 4. Add or Update a Language + +1. Create or update locale file in `ui/frontend/src/i18n/locales/`. +2. Export locale object and import it in `ui/frontend/src/i18n/index.ts`. +3. Add locale code to `translations` map. +4. Verify language switch in Settings page. +5. Run frontend build and smoke-check docs button text visibility. + +## 5. Required Key Groups + +- `nav.*` +- `header.*` +- `action.*` +- `status.*` and `filter.*` +- `settings.*` + +## 6. QA Checklist + +- No missing labels on primary pages (Manual/Scripts/Protocols/Settings). +- No mojibake in locale files. +- `npm --prefix ui/frontend run build` passes. +- Settings docs button has icon and visible text. + +## 7. Related Documents + +- [User Guide (ZH)](../USER_GUIDE.md) +- [User Guide (EN)](../USER_GUIDE_EN.md) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | **pl-PL** | [uk-UA](I18N_MANUAL.uk-UA.md) \ No newline at end of file diff --git a/docs/i18n-manual/I18N_MANUAL.pt-BR.md b/docs/i18n-manual/I18N_MANUAL.pt-BR.md new file mode 100644 index 0000000..0090955 --- /dev/null +++ b/docs/i18n-manual/I18N_MANUAL.pt-BR.md @@ -0,0 +1,73 @@ +# ProtoFlow i18n Manual (pt-BR) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | **pt-BR** | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) + +Current Language: **Portuguese (Brazil)** + +## 1. Source of Truth + +- Aggregator: `ui/frontend/src/i18n/index.ts` +- Locale dictionaries: `ui/frontend/src/i18n/locales/*.ts` +- Default locale: `zh-CN` + +## 2. Locale Map + +| Locale | Locale File | +|---|---| +| `zh-CN` | ui/frontend/src/i18n/locales/zhCN.ts | +| `en-US` | ui/frontend/src/i18n/locales/enUS.ts | +| `zh-TW` | ui/frontend/src/i18n/locales/zhTW.ts | +| `ja-JP` | ui/frontend/src/i18n/locales/jaJP.ts | +| `ko-KR` | ui/frontend/src/i18n/locales/koKR.ts | +| `fr-FR` | ui/frontend/src/i18n/locales/frFR.ts | +| `de-DE` | ui/frontend/src/i18n/locales/deDE.ts | +| `es-ES` | ui/frontend/src/i18n/locales/esES.ts | +| `pt-BR` | ui/frontend/src/i18n/locales/ptBR.ts | +| `ru-RU` | ui/frontend/src/i18n/locales/ruRU.ts | +| `ar` | ui/frontend/src/i18n/locales/ar.ts | +| `hi` | ui/frontend/src/i18n/locales/hi.ts | +| `it-IT` | ui/frontend/src/i18n/locales/itIT.ts | +| `nl-NL` | ui/frontend/src/i18n/locales/nlNL.ts | +| `th-TH` | ui/frontend/src/i18n/locales/thTH.ts | +| `vi-VN` | ui/frontend/src/i18n/locales/viVN.ts | +| `id-ID` | ui/frontend/src/i18n/locales/idID.ts | +| `tr-TR` | ui/frontend/src/i18n/locales/trTR.ts | +| `pl-PL` | ui/frontend/src/i18n/locales/plPL.ts | +| `uk-UA` | ui/frontend/src/i18n/locales/ukUA.ts | + +## 3. Resolution Order + +1. `translations[selectedLocale][key]` +2. `translations[DEFAULT_LANGUAGE][key]` +3. Inline fallback text passed to `t(key, fallback)` +4. Final fallback to the key string itself + +## 4. Add or Update a Language + +1. Create or update locale file in `ui/frontend/src/i18n/locales/`. +2. Export locale object and import it in `ui/frontend/src/i18n/index.ts`. +3. Add locale code to `translations` map. +4. Verify language switch in Settings page. +5. Run frontend build and smoke-check docs button text visibility. + +## 5. Required Key Groups + +- `nav.*` +- `header.*` +- `action.*` +- `status.*` and `filter.*` +- `settings.*` + +## 6. QA Checklist + +- No missing labels on primary pages (Manual/Scripts/Protocols/Settings). +- No mojibake in locale files. +- `npm --prefix ui/frontend run build` passes. +- Settings docs button has icon and visible text. + +## 7. Related Documents + +- [User Guide (ZH)](../USER_GUIDE.md) +- [User Guide (EN)](../USER_GUIDE_EN.md) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | **pt-BR** | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) \ No newline at end of file diff --git a/docs/i18n-manual/I18N_MANUAL.ru-RU.md b/docs/i18n-manual/I18N_MANUAL.ru-RU.md new file mode 100644 index 0000000..5a2e4d0 --- /dev/null +++ b/docs/i18n-manual/I18N_MANUAL.ru-RU.md @@ -0,0 +1,73 @@ +# ProtoFlow i18n Manual (ru-RU) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | **ru-RU** | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) + +Current Language: **Russian** + +## 1. Source of Truth + +- Aggregator: `ui/frontend/src/i18n/index.ts` +- Locale dictionaries: `ui/frontend/src/i18n/locales/*.ts` +- Default locale: `zh-CN` + +## 2. Locale Map + +| Locale | Locale File | +|---|---| +| `zh-CN` | ui/frontend/src/i18n/locales/zhCN.ts | +| `en-US` | ui/frontend/src/i18n/locales/enUS.ts | +| `zh-TW` | ui/frontend/src/i18n/locales/zhTW.ts | +| `ja-JP` | ui/frontend/src/i18n/locales/jaJP.ts | +| `ko-KR` | ui/frontend/src/i18n/locales/koKR.ts | +| `fr-FR` | ui/frontend/src/i18n/locales/frFR.ts | +| `de-DE` | ui/frontend/src/i18n/locales/deDE.ts | +| `es-ES` | ui/frontend/src/i18n/locales/esES.ts | +| `pt-BR` | ui/frontend/src/i18n/locales/ptBR.ts | +| `ru-RU` | ui/frontend/src/i18n/locales/ruRU.ts | +| `ar` | ui/frontend/src/i18n/locales/ar.ts | +| `hi` | ui/frontend/src/i18n/locales/hi.ts | +| `it-IT` | ui/frontend/src/i18n/locales/itIT.ts | +| `nl-NL` | ui/frontend/src/i18n/locales/nlNL.ts | +| `th-TH` | ui/frontend/src/i18n/locales/thTH.ts | +| `vi-VN` | ui/frontend/src/i18n/locales/viVN.ts | +| `id-ID` | ui/frontend/src/i18n/locales/idID.ts | +| `tr-TR` | ui/frontend/src/i18n/locales/trTR.ts | +| `pl-PL` | ui/frontend/src/i18n/locales/plPL.ts | +| `uk-UA` | ui/frontend/src/i18n/locales/ukUA.ts | + +## 3. Resolution Order + +1. `translations[selectedLocale][key]` +2. `translations[DEFAULT_LANGUAGE][key]` +3. Inline fallback text passed to `t(key, fallback)` +4. Final fallback to the key string itself + +## 4. Add or Update a Language + +1. Create or update locale file in `ui/frontend/src/i18n/locales/`. +2. Export locale object and import it in `ui/frontend/src/i18n/index.ts`. +3. Add locale code to `translations` map. +4. Verify language switch in Settings page. +5. Run frontend build and smoke-check docs button text visibility. + +## 5. Required Key Groups + +- `nav.*` +- `header.*` +- `action.*` +- `status.*` and `filter.*` +- `settings.*` + +## 6. QA Checklist + +- No missing labels on primary pages (Manual/Scripts/Protocols/Settings). +- No mojibake in locale files. +- `npm --prefix ui/frontend run build` passes. +- Settings docs button has icon and visible text. + +## 7. Related Documents + +- [User Guide (ZH)](../USER_GUIDE.md) +- [User Guide (EN)](../USER_GUIDE_EN.md) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | **ru-RU** | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) \ No newline at end of file diff --git a/docs/i18n-manual/I18N_MANUAL.th-TH.md b/docs/i18n-manual/I18N_MANUAL.th-TH.md new file mode 100644 index 0000000..6a0b24c --- /dev/null +++ b/docs/i18n-manual/I18N_MANUAL.th-TH.md @@ -0,0 +1,73 @@ +# ProtoFlow i18n Manual (th-TH) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | **th-TH** | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) + +Current Language: **Thai** + +## 1. Source of Truth + +- Aggregator: `ui/frontend/src/i18n/index.ts` +- Locale dictionaries: `ui/frontend/src/i18n/locales/*.ts` +- Default locale: `zh-CN` + +## 2. Locale Map + +| Locale | Locale File | +|---|---| +| `zh-CN` | ui/frontend/src/i18n/locales/zhCN.ts | +| `en-US` | ui/frontend/src/i18n/locales/enUS.ts | +| `zh-TW` | ui/frontend/src/i18n/locales/zhTW.ts | +| `ja-JP` | ui/frontend/src/i18n/locales/jaJP.ts | +| `ko-KR` | ui/frontend/src/i18n/locales/koKR.ts | +| `fr-FR` | ui/frontend/src/i18n/locales/frFR.ts | +| `de-DE` | ui/frontend/src/i18n/locales/deDE.ts | +| `es-ES` | ui/frontend/src/i18n/locales/esES.ts | +| `pt-BR` | ui/frontend/src/i18n/locales/ptBR.ts | +| `ru-RU` | ui/frontend/src/i18n/locales/ruRU.ts | +| `ar` | ui/frontend/src/i18n/locales/ar.ts | +| `hi` | ui/frontend/src/i18n/locales/hi.ts | +| `it-IT` | ui/frontend/src/i18n/locales/itIT.ts | +| `nl-NL` | ui/frontend/src/i18n/locales/nlNL.ts | +| `th-TH` | ui/frontend/src/i18n/locales/thTH.ts | +| `vi-VN` | ui/frontend/src/i18n/locales/viVN.ts | +| `id-ID` | ui/frontend/src/i18n/locales/idID.ts | +| `tr-TR` | ui/frontend/src/i18n/locales/trTR.ts | +| `pl-PL` | ui/frontend/src/i18n/locales/plPL.ts | +| `uk-UA` | ui/frontend/src/i18n/locales/ukUA.ts | + +## 3. Resolution Order + +1. `translations[selectedLocale][key]` +2. `translations[DEFAULT_LANGUAGE][key]` +3. Inline fallback text passed to `t(key, fallback)` +4. Final fallback to the key string itself + +## 4. Add or Update a Language + +1. Create or update locale file in `ui/frontend/src/i18n/locales/`. +2. Export locale object and import it in `ui/frontend/src/i18n/index.ts`. +3. Add locale code to `translations` map. +4. Verify language switch in Settings page. +5. Run frontend build and smoke-check docs button text visibility. + +## 5. Required Key Groups + +- `nav.*` +- `header.*` +- `action.*` +- `status.*` and `filter.*` +- `settings.*` + +## 6. QA Checklist + +- No missing labels on primary pages (Manual/Scripts/Protocols/Settings). +- No mojibake in locale files. +- `npm --prefix ui/frontend run build` passes. +- Settings docs button has icon and visible text. + +## 7. Related Documents + +- [User Guide (ZH)](../USER_GUIDE.md) +- [User Guide (EN)](../USER_GUIDE_EN.md) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | **th-TH** | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) \ No newline at end of file diff --git a/docs/i18n-manual/I18N_MANUAL.tr-TR.md b/docs/i18n-manual/I18N_MANUAL.tr-TR.md new file mode 100644 index 0000000..9d30a81 --- /dev/null +++ b/docs/i18n-manual/I18N_MANUAL.tr-TR.md @@ -0,0 +1,73 @@ +# ProtoFlow i18n Manual (tr-TR) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | **tr-TR** | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) + +Current Language: **Turkish** + +## 1. Source of Truth + +- Aggregator: `ui/frontend/src/i18n/index.ts` +- Locale dictionaries: `ui/frontend/src/i18n/locales/*.ts` +- Default locale: `zh-CN` + +## 2. Locale Map + +| Locale | Locale File | +|---|---| +| `zh-CN` | ui/frontend/src/i18n/locales/zhCN.ts | +| `en-US` | ui/frontend/src/i18n/locales/enUS.ts | +| `zh-TW` | ui/frontend/src/i18n/locales/zhTW.ts | +| `ja-JP` | ui/frontend/src/i18n/locales/jaJP.ts | +| `ko-KR` | ui/frontend/src/i18n/locales/koKR.ts | +| `fr-FR` | ui/frontend/src/i18n/locales/frFR.ts | +| `de-DE` | ui/frontend/src/i18n/locales/deDE.ts | +| `es-ES` | ui/frontend/src/i18n/locales/esES.ts | +| `pt-BR` | ui/frontend/src/i18n/locales/ptBR.ts | +| `ru-RU` | ui/frontend/src/i18n/locales/ruRU.ts | +| `ar` | ui/frontend/src/i18n/locales/ar.ts | +| `hi` | ui/frontend/src/i18n/locales/hi.ts | +| `it-IT` | ui/frontend/src/i18n/locales/itIT.ts | +| `nl-NL` | ui/frontend/src/i18n/locales/nlNL.ts | +| `th-TH` | ui/frontend/src/i18n/locales/thTH.ts | +| `vi-VN` | ui/frontend/src/i18n/locales/viVN.ts | +| `id-ID` | ui/frontend/src/i18n/locales/idID.ts | +| `tr-TR` | ui/frontend/src/i18n/locales/trTR.ts | +| `pl-PL` | ui/frontend/src/i18n/locales/plPL.ts | +| `uk-UA` | ui/frontend/src/i18n/locales/ukUA.ts | + +## 3. Resolution Order + +1. `translations[selectedLocale][key]` +2. `translations[DEFAULT_LANGUAGE][key]` +3. Inline fallback text passed to `t(key, fallback)` +4. Final fallback to the key string itself + +## 4. Add or Update a Language + +1. Create or update locale file in `ui/frontend/src/i18n/locales/`. +2. Export locale object and import it in `ui/frontend/src/i18n/index.ts`. +3. Add locale code to `translations` map. +4. Verify language switch in Settings page. +5. Run frontend build and smoke-check docs button text visibility. + +## 5. Required Key Groups + +- `nav.*` +- `header.*` +- `action.*` +- `status.*` and `filter.*` +- `settings.*` + +## 6. QA Checklist + +- No missing labels on primary pages (Manual/Scripts/Protocols/Settings). +- No mojibake in locale files. +- `npm --prefix ui/frontend run build` passes. +- Settings docs button has icon and visible text. + +## 7. Related Documents + +- [User Guide (ZH)](../USER_GUIDE.md) +- [User Guide (EN)](../USER_GUIDE_EN.md) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | **tr-TR** | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) \ No newline at end of file diff --git a/docs/i18n-manual/I18N_MANUAL.uk-UA.md b/docs/i18n-manual/I18N_MANUAL.uk-UA.md new file mode 100644 index 0000000..12da029 --- /dev/null +++ b/docs/i18n-manual/I18N_MANUAL.uk-UA.md @@ -0,0 +1,73 @@ +# ProtoFlow i18n Manual (uk-UA) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | **uk-UA** + +Current Language: **Ukrainian** + +## 1. Source of Truth + +- Aggregator: `ui/frontend/src/i18n/index.ts` +- Locale dictionaries: `ui/frontend/src/i18n/locales/*.ts` +- Default locale: `zh-CN` + +## 2. Locale Map + +| Locale | Locale File | +|---|---| +| `zh-CN` | ui/frontend/src/i18n/locales/zhCN.ts | +| `en-US` | ui/frontend/src/i18n/locales/enUS.ts | +| `zh-TW` | ui/frontend/src/i18n/locales/zhTW.ts | +| `ja-JP` | ui/frontend/src/i18n/locales/jaJP.ts | +| `ko-KR` | ui/frontend/src/i18n/locales/koKR.ts | +| `fr-FR` | ui/frontend/src/i18n/locales/frFR.ts | +| `de-DE` | ui/frontend/src/i18n/locales/deDE.ts | +| `es-ES` | ui/frontend/src/i18n/locales/esES.ts | +| `pt-BR` | ui/frontend/src/i18n/locales/ptBR.ts | +| `ru-RU` | ui/frontend/src/i18n/locales/ruRU.ts | +| `ar` | ui/frontend/src/i18n/locales/ar.ts | +| `hi` | ui/frontend/src/i18n/locales/hi.ts | +| `it-IT` | ui/frontend/src/i18n/locales/itIT.ts | +| `nl-NL` | ui/frontend/src/i18n/locales/nlNL.ts | +| `th-TH` | ui/frontend/src/i18n/locales/thTH.ts | +| `vi-VN` | ui/frontend/src/i18n/locales/viVN.ts | +| `id-ID` | ui/frontend/src/i18n/locales/idID.ts | +| `tr-TR` | ui/frontend/src/i18n/locales/trTR.ts | +| `pl-PL` | ui/frontend/src/i18n/locales/plPL.ts | +| `uk-UA` | ui/frontend/src/i18n/locales/ukUA.ts | + +## 3. Resolution Order + +1. `translations[selectedLocale][key]` +2. `translations[DEFAULT_LANGUAGE][key]` +3. Inline fallback text passed to `t(key, fallback)` +4. Final fallback to the key string itself + +## 4. Add or Update a Language + +1. Create or update locale file in `ui/frontend/src/i18n/locales/`. +2. Export locale object and import it in `ui/frontend/src/i18n/index.ts`. +3. Add locale code to `translations` map. +4. Verify language switch in Settings page. +5. Run frontend build and smoke-check docs button text visibility. + +## 5. Required Key Groups + +- `nav.*` +- `header.*` +- `action.*` +- `status.*` and `filter.*` +- `settings.*` + +## 6. QA Checklist + +- No missing labels on primary pages (Manual/Scripts/Protocols/Settings). +- No mojibake in locale files. +- `npm --prefix ui/frontend run build` passes. +- Settings docs button has icon and visible text. + +## 7. Related Documents + +- [User Guide (ZH)](../USER_GUIDE.md) +- [User Guide (EN)](../USER_GUIDE_EN.md) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | **uk-UA** \ No newline at end of file diff --git a/docs/i18n-manual/I18N_MANUAL.vi-VN.md b/docs/i18n-manual/I18N_MANUAL.vi-VN.md new file mode 100644 index 0000000..300e8ab --- /dev/null +++ b/docs/i18n-manual/I18N_MANUAL.vi-VN.md @@ -0,0 +1,73 @@ +# ProtoFlow i18n Manual (vi-VN) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | **vi-VN** | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) + +Current Language: **Vietnamese** + +## 1. Source of Truth + +- Aggregator: `ui/frontend/src/i18n/index.ts` +- Locale dictionaries: `ui/frontend/src/i18n/locales/*.ts` +- Default locale: `zh-CN` + +## 2. Locale Map + +| Locale | Locale File | +|---|---| +| `zh-CN` | ui/frontend/src/i18n/locales/zhCN.ts | +| `en-US` | ui/frontend/src/i18n/locales/enUS.ts | +| `zh-TW` | ui/frontend/src/i18n/locales/zhTW.ts | +| `ja-JP` | ui/frontend/src/i18n/locales/jaJP.ts | +| `ko-KR` | ui/frontend/src/i18n/locales/koKR.ts | +| `fr-FR` | ui/frontend/src/i18n/locales/frFR.ts | +| `de-DE` | ui/frontend/src/i18n/locales/deDE.ts | +| `es-ES` | ui/frontend/src/i18n/locales/esES.ts | +| `pt-BR` | ui/frontend/src/i18n/locales/ptBR.ts | +| `ru-RU` | ui/frontend/src/i18n/locales/ruRU.ts | +| `ar` | ui/frontend/src/i18n/locales/ar.ts | +| `hi` | ui/frontend/src/i18n/locales/hi.ts | +| `it-IT` | ui/frontend/src/i18n/locales/itIT.ts | +| `nl-NL` | ui/frontend/src/i18n/locales/nlNL.ts | +| `th-TH` | ui/frontend/src/i18n/locales/thTH.ts | +| `vi-VN` | ui/frontend/src/i18n/locales/viVN.ts | +| `id-ID` | ui/frontend/src/i18n/locales/idID.ts | +| `tr-TR` | ui/frontend/src/i18n/locales/trTR.ts | +| `pl-PL` | ui/frontend/src/i18n/locales/plPL.ts | +| `uk-UA` | ui/frontend/src/i18n/locales/ukUA.ts | + +## 3. Resolution Order + +1. `translations[selectedLocale][key]` +2. `translations[DEFAULT_LANGUAGE][key]` +3. Inline fallback text passed to `t(key, fallback)` +4. Final fallback to the key string itself + +## 4. Add or Update a Language + +1. Create or update locale file in `ui/frontend/src/i18n/locales/`. +2. Export locale object and import it in `ui/frontend/src/i18n/index.ts`. +3. Add locale code to `translations` map. +4. Verify language switch in Settings page. +5. Run frontend build and smoke-check docs button text visibility. + +## 5. Required Key Groups + +- `nav.*` +- `header.*` +- `action.*` +- `status.*` and `filter.*` +- `settings.*` + +## 6. QA Checklist + +- No missing labels on primary pages (Manual/Scripts/Protocols/Settings). +- No mojibake in locale files. +- `npm --prefix ui/frontend run build` passes. +- Settings docs button has icon and visible text. + +## 7. Related Documents + +- [User Guide (ZH)](../USER_GUIDE.md) +- [User Guide (EN)](../USER_GUIDE_EN.md) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | **vi-VN** | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) \ No newline at end of file diff --git a/docs/i18n-manual/I18N_MANUAL.zh-CN.md b/docs/i18n-manual/I18N_MANUAL.zh-CN.md new file mode 100644 index 0000000..a2f4f3f --- /dev/null +++ b/docs/i18n-manual/I18N_MANUAL.zh-CN.md @@ -0,0 +1,73 @@ +# ProtoFlow i18n Manual (zh-CN) + +Language Index: **zh-CN** | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) + +Current Language: **Chinese Simplified** + +## 1. Source of Truth + +- Aggregator: `ui/frontend/src/i18n/index.ts` +- Locale dictionaries: `ui/frontend/src/i18n/locales/*.ts` +- Default locale: `zh-CN` + +## 2. Locale Map + +| Locale | Locale File | +|---|---| +| `zh-CN` | ui/frontend/src/i18n/locales/zhCN.ts | +| `en-US` | ui/frontend/src/i18n/locales/enUS.ts | +| `zh-TW` | ui/frontend/src/i18n/locales/zhTW.ts | +| `ja-JP` | ui/frontend/src/i18n/locales/jaJP.ts | +| `ko-KR` | ui/frontend/src/i18n/locales/koKR.ts | +| `fr-FR` | ui/frontend/src/i18n/locales/frFR.ts | +| `de-DE` | ui/frontend/src/i18n/locales/deDE.ts | +| `es-ES` | ui/frontend/src/i18n/locales/esES.ts | +| `pt-BR` | ui/frontend/src/i18n/locales/ptBR.ts | +| `ru-RU` | ui/frontend/src/i18n/locales/ruRU.ts | +| `ar` | ui/frontend/src/i18n/locales/ar.ts | +| `hi` | ui/frontend/src/i18n/locales/hi.ts | +| `it-IT` | ui/frontend/src/i18n/locales/itIT.ts | +| `nl-NL` | ui/frontend/src/i18n/locales/nlNL.ts | +| `th-TH` | ui/frontend/src/i18n/locales/thTH.ts | +| `vi-VN` | ui/frontend/src/i18n/locales/viVN.ts | +| `id-ID` | ui/frontend/src/i18n/locales/idID.ts | +| `tr-TR` | ui/frontend/src/i18n/locales/trTR.ts | +| `pl-PL` | ui/frontend/src/i18n/locales/plPL.ts | +| `uk-UA` | ui/frontend/src/i18n/locales/ukUA.ts | + +## 3. Resolution Order + +1. `translations[selectedLocale][key]` +2. `translations[DEFAULT_LANGUAGE][key]` +3. Inline fallback text passed to `t(key, fallback)` +4. Final fallback to the key string itself + +## 4. Add or Update a Language + +1. Create or update locale file in `ui/frontend/src/i18n/locales/`. +2. Export locale object and import it in `ui/frontend/src/i18n/index.ts`. +3. Add locale code to `translations` map. +4. Verify language switch in Settings page. +5. Run frontend build and smoke-check docs button text visibility. + +## 5. Required Key Groups + +- `nav.*` +- `header.*` +- `action.*` +- `status.*` and `filter.*` +- `settings.*` + +## 6. QA Checklist + +- No missing labels on primary pages (Manual/Scripts/Protocols/Settings). +- No mojibake in locale files. +- `npm --prefix ui/frontend run build` passes. +- Settings docs button has icon and visible text. + +## 7. Related Documents + +- [User Guide (ZH)](../USER_GUIDE.md) +- [User Guide (EN)](../USER_GUIDE_EN.md) + +Language Index: **zh-CN** | [en-US](I18N_MANUAL.en-US.md) | [zh-TW](I18N_MANUAL.zh-TW.md) | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) \ No newline at end of file diff --git a/docs/i18n-manual/I18N_MANUAL.zh-TW.md b/docs/i18n-manual/I18N_MANUAL.zh-TW.md new file mode 100644 index 0000000..7460ebf --- /dev/null +++ b/docs/i18n-manual/I18N_MANUAL.zh-TW.md @@ -0,0 +1,73 @@ +# ProtoFlow i18n Manual (zh-TW) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | **zh-TW** | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) + +Current Language: **Chinese Traditional** + +## 1. Source of Truth + +- Aggregator: `ui/frontend/src/i18n/index.ts` +- Locale dictionaries: `ui/frontend/src/i18n/locales/*.ts` +- Default locale: `zh-CN` + +## 2. Locale Map + +| Locale | Locale File | +|---|---| +| `zh-CN` | ui/frontend/src/i18n/locales/zhCN.ts | +| `en-US` | ui/frontend/src/i18n/locales/enUS.ts | +| `zh-TW` | ui/frontend/src/i18n/locales/zhTW.ts | +| `ja-JP` | ui/frontend/src/i18n/locales/jaJP.ts | +| `ko-KR` | ui/frontend/src/i18n/locales/koKR.ts | +| `fr-FR` | ui/frontend/src/i18n/locales/frFR.ts | +| `de-DE` | ui/frontend/src/i18n/locales/deDE.ts | +| `es-ES` | ui/frontend/src/i18n/locales/esES.ts | +| `pt-BR` | ui/frontend/src/i18n/locales/ptBR.ts | +| `ru-RU` | ui/frontend/src/i18n/locales/ruRU.ts | +| `ar` | ui/frontend/src/i18n/locales/ar.ts | +| `hi` | ui/frontend/src/i18n/locales/hi.ts | +| `it-IT` | ui/frontend/src/i18n/locales/itIT.ts | +| `nl-NL` | ui/frontend/src/i18n/locales/nlNL.ts | +| `th-TH` | ui/frontend/src/i18n/locales/thTH.ts | +| `vi-VN` | ui/frontend/src/i18n/locales/viVN.ts | +| `id-ID` | ui/frontend/src/i18n/locales/idID.ts | +| `tr-TR` | ui/frontend/src/i18n/locales/trTR.ts | +| `pl-PL` | ui/frontend/src/i18n/locales/plPL.ts | +| `uk-UA` | ui/frontend/src/i18n/locales/ukUA.ts | + +## 3. Resolution Order + +1. `translations[selectedLocale][key]` +2. `translations[DEFAULT_LANGUAGE][key]` +3. Inline fallback text passed to `t(key, fallback)` +4. Final fallback to the key string itself + +## 4. Add or Update a Language + +1. Create or update locale file in `ui/frontend/src/i18n/locales/`. +2. Export locale object and import it in `ui/frontend/src/i18n/index.ts`. +3. Add locale code to `translations` map. +4. Verify language switch in Settings page. +5. Run frontend build and smoke-check docs button text visibility. + +## 5. Required Key Groups + +- `nav.*` +- `header.*` +- `action.*` +- `status.*` and `filter.*` +- `settings.*` + +## 6. QA Checklist + +- No missing labels on primary pages (Manual/Scripts/Protocols/Settings). +- No mojibake in locale files. +- `npm --prefix ui/frontend run build` passes. +- Settings docs button has icon and visible text. + +## 7. Related Documents + +- [User Guide (ZH)](../USER_GUIDE.md) +- [User Guide (EN)](../USER_GUIDE_EN.md) + +Language Index: [zh-CN](I18N_MANUAL.zh-CN.md) | [en-US](I18N_MANUAL.en-US.md) | **zh-TW** | [ja-JP](I18N_MANUAL.ja-JP.md) | [ko-KR](I18N_MANUAL.ko-KR.md) | [fr-FR](I18N_MANUAL.fr-FR.md) | [de-DE](I18N_MANUAL.de-DE.md) | [es-ES](I18N_MANUAL.es-ES.md) | [pt-BR](I18N_MANUAL.pt-BR.md) | [ru-RU](I18N_MANUAL.ru-RU.md) | [ar](I18N_MANUAL.ar.md) | [hi](I18N_MANUAL.hi.md) | [it-IT](I18N_MANUAL.it-IT.md) | [nl-NL](I18N_MANUAL.nl-NL.md) | [th-TH](I18N_MANUAL.th-TH.md) | [vi-VN](I18N_MANUAL.vi-VN.md) | [id-ID](I18N_MANUAL.id-ID.md) | [tr-TR](I18N_MANUAL.tr-TR.md) | [pl-PL](I18N_MANUAL.pl-PL.md) | [uk-UA](I18N_MANUAL.uk-UA.md) \ No newline at end of file diff --git a/docs/i18n-manual/README.md b/docs/i18n-manual/README.md new file mode 100644 index 0000000..79d54c8 --- /dev/null +++ b/docs/i18n-manual/README.md @@ -0,0 +1,35 @@ +# ProtoFlow i18n Manual Index + +This directory contains i18n documentation pages per locale. Each page links to all other language pages. + +## Language Pages + +| Locale | Language | Document | +|---|---|---| +| `zh-CN` | Chinese Simplified | [I18N_MANUAL.zh-CN.md](I18N_MANUAL.zh-CN.md) | +| `en-US` | English (US) | [I18N_MANUAL.en-US.md](I18N_MANUAL.en-US.md) | +| `zh-TW` | Chinese Traditional | [I18N_MANUAL.zh-TW.md](I18N_MANUAL.zh-TW.md) | +| `ja-JP` | Japanese | [I18N_MANUAL.ja-JP.md](I18N_MANUAL.ja-JP.md) | +| `ko-KR` | Korean | [I18N_MANUAL.ko-KR.md](I18N_MANUAL.ko-KR.md) | +| `fr-FR` | French | [I18N_MANUAL.fr-FR.md](I18N_MANUAL.fr-FR.md) | +| `de-DE` | German | [I18N_MANUAL.de-DE.md](I18N_MANUAL.de-DE.md) | +| `es-ES` | Spanish | [I18N_MANUAL.es-ES.md](I18N_MANUAL.es-ES.md) | +| `pt-BR` | Portuguese (Brazil) | [I18N_MANUAL.pt-BR.md](I18N_MANUAL.pt-BR.md) | +| `ru-RU` | Russian | [I18N_MANUAL.ru-RU.md](I18N_MANUAL.ru-RU.md) | +| `ar` | Arabic | [I18N_MANUAL.ar.md](I18N_MANUAL.ar.md) | +| `hi` | Hindi | [I18N_MANUAL.hi.md](I18N_MANUAL.hi.md) | +| `it-IT` | Italian | [I18N_MANUAL.it-IT.md](I18N_MANUAL.it-IT.md) | +| `nl-NL` | Dutch | [I18N_MANUAL.nl-NL.md](I18N_MANUAL.nl-NL.md) | +| `th-TH` | Thai | [I18N_MANUAL.th-TH.md](I18N_MANUAL.th-TH.md) | +| `vi-VN` | Vietnamese | [I18N_MANUAL.vi-VN.md](I18N_MANUAL.vi-VN.md) | +| `id-ID` | Indonesian | [I18N_MANUAL.id-ID.md](I18N_MANUAL.id-ID.md) | +| `tr-TR` | Turkish | [I18N_MANUAL.tr-TR.md](I18N_MANUAL.tr-TR.md) | +| `pl-PL` | Polish | [I18N_MANUAL.pl-PL.md](I18N_MANUAL.pl-PL.md) | +| `uk-UA` | Ukrainian | [I18N_MANUAL.uk-UA.md](I18N_MANUAL.uk-UA.md) | + +## Scope + +- Locale file structure and naming +- Translation key grouping and resolution order +- New language onboarding checklist +- QA and release checks \ No newline at end of file diff --git a/installer/ProtoFlow.ico b/installer/ProtoFlow.ico index a66d607..8eda500 100644 Binary files a/installer/ProtoFlow.ico and b/installer/ProtoFlow.ico differ diff --git a/installer/ProtoFlow.iss b/installer/ProtoFlow.iss index 2dad087..7443872 100644 --- a/installer/ProtoFlow.iss +++ b/installer/ProtoFlow.iss @@ -28,8 +28,8 @@ Source: "{#SourcePath}\..\dist\ProtoFlow\*"; DestDir: "{app}"; Flags: ignorevers Source: "{#SourcePath}\ProtoFlow.ico"; DestDir: "{app}"; Flags: ignoreversion [Icons] -Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; IconFilename: "{app}\ProtoFlow.ico" -Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon; IconFilename: "{app}\ProtoFlow.ico" +Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; IconFilename: "{app}\ProtoFlow.ico"; AppUserModelID: "ProtoFlow.Desktop.App" +Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon; IconFilename: "{app}\ProtoFlow.ico"; AppUserModelID: "ProtoFlow.Desktop.App" [Tasks] Name: "desktopicon"; Description: "Create a desktop icon"; GroupDescription: "Additional icons:"; Flags: unchecked diff --git a/scripts/build_windows.ps1 b/scripts/build_windows.ps1 index a62c961..1936c2b 100644 --- a/scripts/build_windows.ps1 +++ b/scripts/build_windows.ps1 @@ -15,16 +15,16 @@ Write-Host "==> Install Python deps" & $Python -m pip install --upgrade pip & $Python -m pip install -r requirements.txt +Write-Host "==> Regenerate installer/app icon from current logo" +& powershell -File scripts\generate_icon.ps1 -Source ui\\assets\\icons\\logo.png -Output installer\\ProtoFlow.ico -Size 256 + Write-Host "==> Build app (PyInstaller)" -& $Python -m PyInstaller --name ProtoFlow --windowed --onedir --noconfirm --icon "installer\ProtoFlow.ico" ` +if (Test-Path -LiteralPath "build\\ProtoFlow") { Remove-Item -LiteralPath "build\\ProtoFlow" -Recurse -Force } +if (Test-Path -LiteralPath "dist\\ProtoFlow") { Remove-Item -LiteralPath "dist\\ProtoFlow" -Recurse -Force } +& $Python -m PyInstaller --name ProtoFlow --windowed --onedir --noconfirm --clean --icon "installer\ProtoFlow.ico" ` --add-data "ui\\frontend\\dist;ui\\frontend\\dist" ` --add-data "config;config" ` --add-data "plugins;plugins" ` --add-data "ui\\assets;ui\\assets" ` --add-data "VERSION;." ` main.py - -Write-Host "==> Generate installer icon" -if (-not (Test-Path -LiteralPath "installer\\ProtoFlow.ico")) { - & powershell -File scripts\generate_icon.ps1 -Source ui\\assets\\icons\\logo.png -Output installer\\ProtoFlow.ico -Size 256 -} diff --git a/ui/assets/icons/logo.png b/ui/assets/icons/logo.png index e179df7..759d020 100644 Binary files a/ui/assets/icons/logo.png and b/ui/assets/icons/logo.png differ diff --git a/ui/assets/icons/logo.svg b/ui/assets/icons/logo.svg index a58330b..b7fd356 100644 --- a/ui/assets/icons/logo.svg +++ b/ui/assets/icons/logo.svg @@ -1,2 +1,21 @@ - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ui/assets/web/assets/ChannelDialogModal-CkCBEJ0r.js b/ui/assets/web/assets/ChannelDialogModal-CkCBEJ0r.js new file mode 100644 index 0000000..1b738bc --- /dev/null +++ b/ui/assets/web/assets/ChannelDialogModal-CkCBEJ0r.js @@ -0,0 +1 @@ +import{_ as c}from"./DropdownSelect-C0USmkt8.js";import{i as b,c as i,b as m,o as r,a as t,t as u,u as n,n as y,d,e as p}from"./index-Dc1DYgSA.js";const f={key:0,class:"modal-backdrop"},g={class:"channel-modal"},T={class:"modal-header"},S={class:"modal-body"},B={key:0,class:"channel-type-grid"},C={key:1,class:"modal-section"},k={class:"section-title"},N={class:"form-grid"},P=["value","placeholder"],V={key:0},x={key:1},A=["value","placeholder"],R={key:2,class:"modal-section first"},D={class:"section-title"},F={class:"form-grid triple"},U={class:"form-grid quad"},$=["value"],I=["value"],w={key:3,class:"modal-section"},H={class:"form-grid"},O=["value"],W={class:"channel-toggle"},L=["checked"],X={class:"modal-footer"},z={__name:"ChannelDialogModal",props:{open:{type:Boolean,default:!1},mode:{type:String,default:"create"},channelType:{type:String,default:"serial"},channelName:{type:String,default:""},channelPort:{type:String,default:""},channelBaud:{type:[String,Number],default:115200},channelDataBits:{type:[String,Number],default:"8"},channelParity:{type:String,default:"none"},channelStopBits:{type:[String,Number],default:"1"},channelFlowControl:{type:String,default:"none"},channelReadTimeout:{type:[String,Number],default:1e3},channelWriteTimeout:{type:[String,Number],default:1e3},channelHost:{type:String,default:""},channelTcpPort:{type:[String,Number],default:0},channelAutoConnect:{type:Boolean,default:!0},hasPorts:{type:Boolean,default:!1},portOptionsList:{type:Array,default:()=>[]},supportedBaudRates:{type:Array,default:()=>[]}},emits:["close","submit","update:channelType","update:channelName","update:channelPort","update:channelBaud","update:channelDataBits","update:channelParity","update:channelStopBits","update:channelFlowControl","update:channelReadTimeout","update:channelWriteTimeout","update:channelHost","update:channelTcpPort","update:channelAutoConnect"],setup(o,{emit:v}){const l=b("tr",h=>h),s=v;return(h,e)=>o.open?(r(),i("div",f,[t("div",g,[t("div",T,[t("div",null,[t("h3",null,u(o.mode==="serial"?n(l)("串口配置"):n(l)("新建通道")),1),t("p",null,u(o.mode==="serial"?n(l)("配置串口连接参数"):n(l)("配置新的通信连接参数")),1)]),t("button",{class:"icon-btn",type:"button",onClick:e[0]||(e[0]=a=>s("close"))},[...e[17]||(e[17]=[t("span",{class:"material-symbols-outlined"},"close",-1)])])]),t("div",S,[o.mode!=="serial"?(r(),i("div",B,[t("button",{class:y(["channel-type-card",{active:o.channelType==="serial"}]),type:"button",onClick:e[1]||(e[1]=a=>s("update:channelType","serial"))},[e[18]||(e[18]=t("span",{class:"material-symbols-outlined"},"settings_input_hdmi",-1)),t("span",null,u(n(l)("串口 (Serial)")),1)],2),t("button",{class:y(["channel-type-card",{active:o.channelType==="tcp"}]),type:"button",onClick:e[2]||(e[2]=a=>s("update:channelType","tcp"))},[e[19]||(e[19]=t("span",{class:"material-symbols-outlined"},"lan",-1)),t("span",null,u(n(l)("TCP / 网络")),1)],2)])):m("",!0),o.mode!=="serial"?(r(),i("div",C,[t("div",k,u(n(l)("基本信息")),1),t("div",N,[t("label",null,[d(u(n(l)("通道名称"))+" ",1),t("input",{value:o.channelName,type:"text",placeholder:n(l)("例如:传感器A接口"),onInput:e[3]||(e[3]=a=>s("update:channelName",a.target.value))},null,40,P)]),o.channelType==="serial"?(r(),i("label",V,[d(u(n(l)("串口端口"))+" ",1),p(c,{"model-value":o.channelPort,options:o.portOptionsList,placeholder:o.hasPorts?n(l)("选择串口"):n(l)("无可用串口"),"leading-icon":"usb","onUpdate:modelValue":e[4]||(e[4]=a=>s("update:channelPort",a))},null,8,["model-value","options","placeholder"])])):(r(),i("label",x,[d(u(n(l)("目标地址"))+" ",1),t("input",{value:o.channelHost,type:"text",placeholder:n(l)("例如:192.168.1.10"),onInput:e[5]||(e[5]=a=>s("update:channelHost",a.target.value))},null,40,A)]))])])):m("",!0),o.channelType==="serial"?(r(),i("div",R,[t("div",D,u(n(l)("串口参数")),1),t("div",F,[t("label",null,[d(u(n(l)("波特率"))+" ",1),p(c,{"model-value":o.channelBaud,options:o.supportedBaudRates,"onUpdate:modelValue":e[6]||(e[6]=a=>s("update:channelBaud",a))},null,8,["model-value","options"])]),t("label",null,[d(u(n(l)("数据位"))+" ",1),p(c,{"model-value":o.channelDataBits,options:["7","8"],"onUpdate:modelValue":e[7]||(e[7]=a=>s("update:channelDataBits",a))},null,8,["model-value"])]),t("label",null,[d(u(n(l)("停止位"))+" ",1),p(c,{"model-value":o.channelStopBits,options:["1","1.5","2"],"onUpdate:modelValue":e[8]||(e[8]=a=>s("update:channelStopBits",a))},null,8,["model-value"])])]),t("div",U,[t("label",null,[d(u(n(l)("校验位"))+" ",1),p(c,{"model-value":o.channelParity,options:[{label:n(l)("无校验"),value:"none"},{label:n(l)("奇校验"),value:"odd"},{label:n(l)("偶校验"),value:"even"}],"onUpdate:modelValue":e[9]||(e[9]=a=>s("update:channelParity",a))},null,8,["model-value","options"])]),t("label",null,[d(u(n(l)("流控"))+" ",1),p(c,{"model-value":o.channelFlowControl,options:[{label:n(l)("无"),value:"none"},{label:"RTS/CTS",value:"rtscts"},{label:"XON/XOFF",value:"xonxoff"}],"onUpdate:modelValue":e[10]||(e[10]=a=>s("update:channelFlowControl",a))},null,8,["model-value","options"])]),t("label",null,[d(u(n(l)("读超时 (ms)"))+" ",1),t("input",{value:o.channelReadTimeout,type:"number",min:"0",placeholder:"1000",onInput:e[11]||(e[11]=a=>s("update:channelReadTimeout",Number(a.target.value||0)))},null,40,$)]),t("label",null,[d(u(n(l)("写超时 (ms)"))+" ",1),t("input",{value:o.channelWriteTimeout,type:"number",min:"0",placeholder:"1000",onInput:e[12]||(e[12]=a=>s("update:channelWriteTimeout",Number(a.target.value||0)))},null,40,I)])])])):(r(),i("div",w,[t("div",H,[t("label",null,[d(u(n(l)("TCP 端口"))+" ",1),t("input",{value:o.channelTcpPort,type:"number",onInput:e[13]||(e[13]=a=>s("update:channelTcpPort",Number(a.target.value||0)))},null,40,O)])])])),t("label",W,[t("input",{checked:o.channelAutoConnect,type:"checkbox",onChange:e[14]||(e[14]=a=>s("update:channelAutoConnect",a.target.checked))},null,40,L),t("span",null,u(o.mode==="serial"?n(l)("保存后立即连接"):n(l)("创建后立即启动连接")),1)])]),t("div",X,[t("button",{class:"btn btn-outline",type:"button",onClick:e[15]||(e[15]=a=>s("close"))},u(n(l)("取消")),1),t("button",{class:"btn btn-primary",type:"button",onClick:e[16]||(e[16]=a=>s("submit"))},u(o.mode==="serial"?n(l)("保存配置"):n(l)("创建通道")),1)])])])):m("",!0)}};export{z as default}; diff --git a/ui/assets/web/assets/ChannelDialogModal-DzmGdCiS.js b/ui/assets/web/assets/ChannelDialogModal-DzmGdCiS.js new file mode 100644 index 0000000..4efe463 --- /dev/null +++ b/ui/assets/web/assets/ChannelDialogModal-DzmGdCiS.js @@ -0,0 +1 @@ +import{_ as c}from"./DropdownSelect-DwmPnboD.js";import{i as b,c as i,b as m,o as r,a as t,t as u,u as n,n as y,d,e as p}from"./index-CY12nbn6.js";const f={key:0,class:"modal-backdrop"},g={class:"channel-modal"},T={class:"modal-header"},S={class:"modal-body"},B={key:0,class:"channel-type-grid"},C={key:1,class:"modal-section"},k={class:"section-title"},N={class:"form-grid"},P=["value","placeholder"],V={key:0},x={key:1},A=["value","placeholder"],R={key:2,class:"modal-section first"},D={class:"section-title"},F={class:"form-grid triple"},U={class:"form-grid quad"},$=["value"],I=["value"],w={key:3,class:"modal-section"},H={class:"form-grid"},O=["value"],W={class:"channel-toggle"},L=["checked"],X={class:"modal-footer"},z={__name:"ChannelDialogModal",props:{open:{type:Boolean,default:!1},mode:{type:String,default:"create"},channelType:{type:String,default:"serial"},channelName:{type:String,default:""},channelPort:{type:String,default:""},channelBaud:{type:[String,Number],default:115200},channelDataBits:{type:[String,Number],default:"8"},channelParity:{type:String,default:"none"},channelStopBits:{type:[String,Number],default:"1"},channelFlowControl:{type:String,default:"none"},channelReadTimeout:{type:[String,Number],default:1e3},channelWriteTimeout:{type:[String,Number],default:1e3},channelHost:{type:String,default:""},channelTcpPort:{type:[String,Number],default:0},channelAutoConnect:{type:Boolean,default:!0},hasPorts:{type:Boolean,default:!1},portOptionsList:{type:Array,default:()=>[]},supportedBaudRates:{type:Array,default:()=>[]}},emits:["close","submit","update:channelType","update:channelName","update:channelPort","update:channelBaud","update:channelDataBits","update:channelParity","update:channelStopBits","update:channelFlowControl","update:channelReadTimeout","update:channelWriteTimeout","update:channelHost","update:channelTcpPort","update:channelAutoConnect"],setup(o,{emit:v}){const l=b("tr",h=>h),s=v;return(h,e)=>o.open?(r(),i("div",f,[t("div",g,[t("div",T,[t("div",null,[t("h3",null,u(o.mode==="serial"?n(l)("串口配置"):n(l)("新建通道")),1),t("p",null,u(o.mode==="serial"?n(l)("配置串口连接参数"):n(l)("配置新的通信连接参数")),1)]),t("button",{class:"icon-btn",type:"button",onClick:e[0]||(e[0]=a=>s("close"))},[...e[17]||(e[17]=[t("span",{class:"material-symbols-outlined"},"close",-1)])])]),t("div",S,[o.mode!=="serial"?(r(),i("div",B,[t("button",{class:y(["channel-type-card",{active:o.channelType==="serial"}]),type:"button",onClick:e[1]||(e[1]=a=>s("update:channelType","serial"))},[e[18]||(e[18]=t("span",{class:"material-symbols-outlined"},"settings_input_hdmi",-1)),t("span",null,u(n(l)("串口 (Serial)")),1)],2),t("button",{class:y(["channel-type-card",{active:o.channelType==="tcp"}]),type:"button",onClick:e[2]||(e[2]=a=>s("update:channelType","tcp"))},[e[19]||(e[19]=t("span",{class:"material-symbols-outlined"},"lan",-1)),t("span",null,u(n(l)("TCP / 网络")),1)],2)])):m("",!0),o.mode!=="serial"?(r(),i("div",C,[t("div",k,u(n(l)("基本信息")),1),t("div",N,[t("label",null,[d(u(n(l)("通道名称"))+" ",1),t("input",{value:o.channelName,type:"text",placeholder:n(l)("例如:传感器A接口"),onInput:e[3]||(e[3]=a=>s("update:channelName",a.target.value))},null,40,P)]),o.channelType==="serial"?(r(),i("label",V,[d(u(n(l)("串口端口"))+" ",1),p(c,{"model-value":o.channelPort,options:o.portOptionsList,placeholder:o.hasPorts?n(l)("选择串口"):n(l)("无可用串口"),"leading-icon":"usb","onUpdate:modelValue":e[4]||(e[4]=a=>s("update:channelPort",a))},null,8,["model-value","options","placeholder"])])):(r(),i("label",x,[d(u(n(l)("目标地址"))+" ",1),t("input",{value:o.channelHost,type:"text",placeholder:n(l)("例如:192.168.1.10"),onInput:e[5]||(e[5]=a=>s("update:channelHost",a.target.value))},null,40,A)]))])])):m("",!0),o.channelType==="serial"?(r(),i("div",R,[t("div",D,u(n(l)("串口参数")),1),t("div",F,[t("label",null,[d(u(n(l)("波特率"))+" ",1),p(c,{"model-value":o.channelBaud,options:o.supportedBaudRates,"onUpdate:modelValue":e[6]||(e[6]=a=>s("update:channelBaud",a))},null,8,["model-value","options"])]),t("label",null,[d(u(n(l)("数据位"))+" ",1),p(c,{"model-value":o.channelDataBits,options:["7","8"],"onUpdate:modelValue":e[7]||(e[7]=a=>s("update:channelDataBits",a))},null,8,["model-value"])]),t("label",null,[d(u(n(l)("停止位"))+" ",1),p(c,{"model-value":o.channelStopBits,options:["1","1.5","2"],"onUpdate:modelValue":e[8]||(e[8]=a=>s("update:channelStopBits",a))},null,8,["model-value"])])]),t("div",U,[t("label",null,[d(u(n(l)("校验位"))+" ",1),p(c,{"model-value":o.channelParity,options:[{label:n(l)("无校验"),value:"none"},{label:n(l)("奇校验"),value:"odd"},{label:n(l)("偶校验"),value:"even"}],"onUpdate:modelValue":e[9]||(e[9]=a=>s("update:channelParity",a))},null,8,["model-value","options"])]),t("label",null,[d(u(n(l)("流控"))+" ",1),p(c,{"model-value":o.channelFlowControl,options:[{label:n(l)("无"),value:"none"},{label:"RTS/CTS",value:"rtscts"},{label:"XON/XOFF",value:"xonxoff"}],"onUpdate:modelValue":e[10]||(e[10]=a=>s("update:channelFlowControl",a))},null,8,["model-value","options"])]),t("label",null,[d(u(n(l)("读超时 (ms)"))+" ",1),t("input",{value:o.channelReadTimeout,type:"number",min:"0",placeholder:"1000",onInput:e[11]||(e[11]=a=>s("update:channelReadTimeout",Number(a.target.value||0)))},null,40,$)]),t("label",null,[d(u(n(l)("写超时 (ms)"))+" ",1),t("input",{value:o.channelWriteTimeout,type:"number",min:"0",placeholder:"1000",onInput:e[12]||(e[12]=a=>s("update:channelWriteTimeout",Number(a.target.value||0)))},null,40,I)])])])):(r(),i("div",w,[t("div",H,[t("label",null,[d(u(n(l)("TCP 端口"))+" ",1),t("input",{value:o.channelTcpPort,type:"number",onInput:e[13]||(e[13]=a=>s("update:channelTcpPort",Number(a.target.value||0)))},null,40,O)])])])),t("label",W,[t("input",{checked:o.channelAutoConnect,type:"checkbox",onChange:e[14]||(e[14]=a=>s("update:channelAutoConnect",a.target.checked))},null,40,L),t("span",null,u(o.mode==="serial"?n(l)("保存后立即连接"):n(l)("创建后立即启动连接")),1)])]),t("div",X,[t("button",{class:"btn btn-outline",type:"button",onClick:e[15]||(e[15]=a=>s("close"))},u(n(l)("取消")),1),t("button",{class:"btn btn-primary",type:"button",onClick:e[16]||(e[16]=a=>s("submit"))},u(o.mode==="serial"?n(l)("保存配置"):n(l)("创建通道")),1)])])])):m("",!0)}};export{z as default}; diff --git a/ui/assets/web/assets/DropdownSelect-C0USmkt8.js b/ui/assets/web/assets/DropdownSelect-C0USmkt8.js new file mode 100644 index 0000000..eaf47da --- /dev/null +++ b/ui/assets/web/assets/DropdownSelect-C0USmkt8.js @@ -0,0 +1 @@ +import{k as f,l as C,q as F,s as K,c as i,o as d,a as w,x as N,b as m,t as b,h as B,j as $,F as A,r as H,n as P,T as j,p as U}from"./index-Dc1DYgSA.js";const G=["data-open"],J=["disabled","title","aria-expanded","aria-disabled"],Q={key:0,class:"material-symbols-outlined"},W={class:"select-value"},X=["disabled","onClick"],Y={key:0,class:"material-symbols-outlined"},I="__protoflowDropdownSeq__",h="__protoflowDropdownRegistry__",V="__protoflowDropdownOpenId__",ne={__name:"DropdownSelect",props:{modelValue:{type:[String,Number],default:""},options:{type:Array,default:()=>[]},placeholder:{type:String,default:"--"},leadingIcon:{type:String,default:""},disabled:{type:Boolean,default:!1},disabledReason:{type:String,default:""}},emits:["update:modelValue","change"],setup(o,{emit:D}){const v=globalThis[h]instanceof Map?globalThis[h]:globalThis[h]=new Map,M=()=>{const e=(Number(globalThis[I])||0)+1;return globalThis[I]=e,e},r=o,k=D,u=f(null),a=f(!1),l=M(),c=f(null),E=f({}),g=()=>globalThis[V],y=e=>{globalThis[V]=e},x=C(()=>(r.options||[]).map(e=>typeof e=="string"||typeof e=="number"?{label:String(e),value:e}:{label:String(e.label??e.value??""),value:e.value??e.label??"",icon:e.icon||"",disabled:!!e.disabled})),q=C(()=>{const e=x.value.find(t=>t.value===r.modelValue);return e?e.label:r.placeholder});function z(){if(!r.disabled){if(a.value){s();return}v.forEach((e,t)=>{t!==l&&e()}),a.value=!0,y(l),document.body.classList.add("dropdown-open"),window.dispatchEvent(new CustomEvent("dropdown:open",{detail:l})),U(()=>S())}}function s(){a.value=!1,g()===l&&y(null),g()==null&&document.body.classList.remove("dropdown-open")}function O(e){r.disabled||(k("update:modelValue",e),k("change",e),s())}function L(){if(!u.value||!c.value)return;const e=u.value.getBoundingClientRect(),t=c.value.offsetHeight||0;let n=e.bottom+6;n+t>window.innerHeight-8&&(n=e.top-t-6),n<8&&(n=8),E.value={top:`${n}px`,left:`${e.left}px`,width:`${e.width}px`}}function S(){a.value&&(requestAnimationFrame(()=>L()),requestAnimationFrame(()=>L()))}function _(e){!u.value||!e||!u.value.contains(e.target)&&(!c.value||!c.value.contains(e.target))&&s()}function R(e){e&&e.key==="Escape"&&s()}function p(){a.value&&S()}function T(e){!e||e.detail===l||s()}return F(()=>{v.set(l,s),window.addEventListener("pointerdown",_,!0),window.addEventListener("keydown",R),window.addEventListener("dropdown:open",T),window.addEventListener("scroll",p,!0),window.addEventListener("resize",p)}),K(()=>{v.delete(l),window.removeEventListener("pointerdown",_,!0),window.removeEventListener("keydown",R),window.removeEventListener("dropdown:open",T),window.removeEventListener("scroll",p,!0),window.removeEventListener("resize",p),s(),g()===l&&y(null)}),(e,t)=>(d(),i("div",{class:"select-wrap",ref_key:"rootRef",ref:u,"data-open":a.value?"true":"false"},[w("button",{class:"select-trigger",type:"button",onClick:B(z,["stop"]),disabled:o.disabled,title:o.disabled&&o.disabledReason?o.disabledReason:"","aria-expanded":a.value?"true":"false","aria-disabled":o.disabled?"true":"false"},[o.leadingIcon?(d(),i("span",Q,b(o.leadingIcon),1)):m("",!0),w("span",W,b(q.value),1),t[1]||(t[1]=w("span",{class:"material-symbols-outlined expand"},"expand_more",-1))],8,J),(d(),N(j,{to:"body"},[a.value?(d(),i("div",{key:0,ref_key:"menuRef",ref:c,class:"select-menu",style:$(E.value),onClick:t[0]||(t[0]=B(()=>{},["stop"]))},[(d(!0),i(A,null,H(x.value,n=>(d(),i("button",{key:String(n.value),class:P(["select-option",{selected:n.value===o.modelValue}]),type:"button",disabled:o.disabled||n.disabled,onClick:Z=>O(n.value)},[n.icon?(d(),i("span",Y,b(n.icon),1)):m("",!0),w("span",null,b(n.label),1)],10,X))),128))],4)):m("",!0)]))],8,G))}};export{ne as _}; diff --git a/ui/assets/web/assets/DropdownSelect-DwmPnboD.js b/ui/assets/web/assets/DropdownSelect-DwmPnboD.js new file mode 100644 index 0000000..dec5dc5 --- /dev/null +++ b/ui/assets/web/assets/DropdownSelect-DwmPnboD.js @@ -0,0 +1 @@ +import{k as f,l as C,q as F,s as K,c as i,o as d,a as w,x as N,b as m,t as b,h as B,j as $,F as A,r as H,n as P,T as j,p as U}from"./index-CY12nbn6.js";const G=["data-open"],J=["disabled","title","aria-expanded","aria-disabled"],Q={key:0,class:"material-symbols-outlined"},W={class:"select-value"},X=["disabled","onClick"],Y={key:0,class:"material-symbols-outlined"},I="__protoflowDropdownSeq__",h="__protoflowDropdownRegistry__",V="__protoflowDropdownOpenId__",ne={__name:"DropdownSelect",props:{modelValue:{type:[String,Number],default:""},options:{type:Array,default:()=>[]},placeholder:{type:String,default:"--"},leadingIcon:{type:String,default:""},disabled:{type:Boolean,default:!1},disabledReason:{type:String,default:""}},emits:["update:modelValue","change"],setup(o,{emit:D}){const v=globalThis[h]instanceof Map?globalThis[h]:globalThis[h]=new Map,M=()=>{const e=(Number(globalThis[I])||0)+1;return globalThis[I]=e,e},r=o,k=D,u=f(null),a=f(!1),l=M(),c=f(null),E=f({}),g=()=>globalThis[V],y=e=>{globalThis[V]=e},x=C(()=>(r.options||[]).map(e=>typeof e=="string"||typeof e=="number"?{label:String(e),value:e}:{label:String(e.label??e.value??""),value:e.value??e.label??"",icon:e.icon||"",disabled:!!e.disabled})),q=C(()=>{const e=x.value.find(t=>t.value===r.modelValue);return e?e.label:r.placeholder});function z(){if(!r.disabled){if(a.value){s();return}v.forEach((e,t)=>{t!==l&&e()}),a.value=!0,y(l),document.body.classList.add("dropdown-open"),window.dispatchEvent(new CustomEvent("dropdown:open",{detail:l})),U(()=>S())}}function s(){a.value=!1,g()===l&&y(null),g()==null&&document.body.classList.remove("dropdown-open")}function O(e){r.disabled||(k("update:modelValue",e),k("change",e),s())}function L(){if(!u.value||!c.value)return;const e=u.value.getBoundingClientRect(),t=c.value.offsetHeight||0;let n=e.bottom+6;n+t>window.innerHeight-8&&(n=e.top-t-6),n<8&&(n=8),E.value={top:`${n}px`,left:`${e.left}px`,width:`${e.width}px`}}function S(){a.value&&(requestAnimationFrame(()=>L()),requestAnimationFrame(()=>L()))}function _(e){!u.value||!e||!u.value.contains(e.target)&&(!c.value||!c.value.contains(e.target))&&s()}function R(e){e&&e.key==="Escape"&&s()}function p(){a.value&&S()}function T(e){!e||e.detail===l||s()}return F(()=>{v.set(l,s),window.addEventListener("pointerdown",_,!0),window.addEventListener("keydown",R),window.addEventListener("dropdown:open",T),window.addEventListener("scroll",p,!0),window.addEventListener("resize",p)}),K(()=>{v.delete(l),window.removeEventListener("pointerdown",_,!0),window.removeEventListener("keydown",R),window.removeEventListener("dropdown:open",T),window.removeEventListener("scroll",p,!0),window.removeEventListener("resize",p),s(),g()===l&&y(null)}),(e,t)=>(d(),i("div",{class:"select-wrap",ref_key:"rootRef",ref:u,"data-open":a.value?"true":"false"},[w("button",{class:"select-trigger",type:"button",onClick:B(z,["stop"]),disabled:o.disabled,title:o.disabled&&o.disabledReason?o.disabledReason:"","aria-expanded":a.value?"true":"false","aria-disabled":o.disabled?"true":"false"},[o.leadingIcon?(d(),i("span",Q,b(o.leadingIcon),1)):m("",!0),w("span",W,b(q.value),1),t[1]||(t[1]=w("span",{class:"material-symbols-outlined expand"},"expand_more",-1))],8,J),(d(),N(j,{to:"body"},[a.value?(d(),i("div",{key:0,ref_key:"menuRef",ref:c,class:"select-menu",style:$(E.value),onClick:t[0]||(t[0]=B(()=>{},["stop"]))},[(d(!0),i(A,null,H(x.value,n=>(d(),i("button",{key:String(n.value),class:P(["select-option",{selected:n.value===o.modelValue}]),type:"button",disabled:o.disabled||n.disabled,onClick:Z=>O(n.value)},[n.icon?(d(),i("span",Y,b(n.icon),1)):m("",!0),w("span",null,b(n.label),1)],10,X))),128))],4)):m("",!0)]))],8,G))}};export{ne as _}; diff --git a/ui/assets/web/assets/LogStream-C7ftHG0R.js b/ui/assets/web/assets/LogStream-C7ftHG0R.js new file mode 100644 index 0000000..cf96dc1 --- /dev/null +++ b/ui/assets/web/assets/LogStream-C7ftHG0R.js @@ -0,0 +1 @@ +import{k,l as v,m as V,p as b,q as B,s as H,c,o as m,b as M,u as d,j as O,F as T,r as z,n as w,t as p,a as x}from"./index-CY12nbn6.js";function L(e,a,t){return Math.max(a,Math.min(t,e))}function N(e,a,t,s,i=10,f=20){if(e<=0||a<=0)return{start:0,end:0,topOffset:0,bottomOffset:0};const u=Math.max(f,Math.ceil(t/a)||f),o=Math.floor(s/a)-i,l=L(o,0,Math.max(0,e-1)),r=L(l+u+i*2,l,e),g=l*a,h=Math.max(0,(e-r)*a);return{start:l,end:r,topOffset:g,bottomOffset:h}}function S(e){const a=k(0),t=k(0),s=e.overscan,i=e.minVisibleRows,f=v(()=>N(e.itemCount.value,typeof e.rowHeight=="number"?e.rowHeight:e.rowHeight.value,a.value,t.value,s,i));function u(l,r){a.value=Math.max(0,Number(l)||0),t.value=Math.max(0,Number(r)||0)}function o(){t.value=0}return{range:f,updateViewport:u,reset:o}}const $={class:"log-time"},R={__name:"LogStream",props:{items:{type:Array,default:()=>[]},compact:{type:Boolean,default:!1},mode:{type:String,default:"comm"},formatTime:{type:Function,default:null},formatPayload:{type:Function,default:null},virtualize:{type:Boolean,default:!0},virtualThreshold:{type:Number,default:160},rowHeight:{type:Number,default:0}},setup(e,{expose:a}){const t=e,s=k(null),i=v(()=>Array.isArray(t.items)?t.items.length:0),f=v(()=>t.rowHeight>0?t.rowHeight:t.mode==="text"?t.compact?18:22:t.compact?22:28),u=v(()=>t.virtualize&&i.value>t.virtualThreshold),o=S({itemCount:i,rowHeight:f,overscan:12,minVisibleRows:24}),l=v(()=>{if(!u.value)return t.items;const{start:g,end:h}=o.range.value;return t.items.slice(g,h)});function r(){s.value&&o.updateViewport(s.value.clientHeight||0,s.value.scrollTop||0)}return V(()=>i.value,()=>{b(()=>r())}),B(()=>{b(()=>r()),window.addEventListener("resize",r)}),H(()=>{window.removeEventListener("resize",r)}),a({rootEl:s}),(g,h)=>(m(),c("div",{ref_key:"rootEl",ref:s,class:w(["log-stream",{compact:e.compact}]),onScrollPassive:r},[u.value&&d(o).range.topOffset>0?(m(),c("div",{key:0,class:"log-spacer",style:O({height:`${d(o).range.topOffset}px`})},null,4)):M("",!0),e.mode==="text"?(m(!0),c(T,{key:1},z(l.value,(n,y)=>(m(),c("div",{class:"log-line",key:n?.id??`${d(o).range.start+y}`},p(n.text),1))),128)):(m(!0),c(T,{key:2},z(l.value,(n,y)=>(m(),c("div",{class:"log-line",key:n?.id??`${d(o).range.start+y}`},[x("span",$,p(e.formatTime?e.formatTime(n.ts):""),1),x("span",{class:w(["log-kind",`kind-${n.kind?.toLowerCase()}`])},p(n.kind),3),x("span",{class:w(["log-text",`text-${n.kind?.toLowerCase()}`])},p(e.formatPayload?e.formatPayload(n):n.text),3)]))),128)),u.value&&d(o).range.bottomOffset>0?(m(),c("div",{key:3,class:"log-spacer",style:O({height:`${d(o).range.bottomOffset}px`})},null,4)):M("",!0)],34))}};export{R as _}; diff --git a/ui/assets/web/assets/LogStream-DjhqBYTz.js b/ui/assets/web/assets/LogStream-DjhqBYTz.js new file mode 100644 index 0000000..a1c6360 --- /dev/null +++ b/ui/assets/web/assets/LogStream-DjhqBYTz.js @@ -0,0 +1 @@ +import{k,l as v,m as V,p as b,q as B,s as H,c,o as m,b as M,u as d,j as O,F as T,r as z,n as w,t as p,a as x}from"./index-Dc1DYgSA.js";function L(e,a,t){return Math.max(a,Math.min(t,e))}function N(e,a,t,s,i=10,f=20){if(e<=0||a<=0)return{start:0,end:0,topOffset:0,bottomOffset:0};const u=Math.max(f,Math.ceil(t/a)||f),o=Math.floor(s/a)-i,l=L(o,0,Math.max(0,e-1)),r=L(l+u+i*2,l,e),g=l*a,h=Math.max(0,(e-r)*a);return{start:l,end:r,topOffset:g,bottomOffset:h}}function S(e){const a=k(0),t=k(0),s=e.overscan,i=e.minVisibleRows,f=v(()=>N(e.itemCount.value,typeof e.rowHeight=="number"?e.rowHeight:e.rowHeight.value,a.value,t.value,s,i));function u(l,r){a.value=Math.max(0,Number(l)||0),t.value=Math.max(0,Number(r)||0)}function o(){t.value=0}return{range:f,updateViewport:u,reset:o}}const $={class:"log-time"},R={__name:"LogStream",props:{items:{type:Array,default:()=>[]},compact:{type:Boolean,default:!1},mode:{type:String,default:"comm"},formatTime:{type:Function,default:null},formatPayload:{type:Function,default:null},virtualize:{type:Boolean,default:!0},virtualThreshold:{type:Number,default:160},rowHeight:{type:Number,default:0}},setup(e,{expose:a}){const t=e,s=k(null),i=v(()=>Array.isArray(t.items)?t.items.length:0),f=v(()=>t.rowHeight>0?t.rowHeight:t.mode==="text"?t.compact?18:22:t.compact?22:28),u=v(()=>t.virtualize&&i.value>t.virtualThreshold),o=S({itemCount:i,rowHeight:f,overscan:12,minVisibleRows:24}),l=v(()=>{if(!u.value)return t.items;const{start:g,end:h}=o.range.value;return t.items.slice(g,h)});function r(){s.value&&o.updateViewport(s.value.clientHeight||0,s.value.scrollTop||0)}return V(()=>i.value,()=>{b(()=>r())}),B(()=>{b(()=>r()),window.addEventListener("resize",r)}),H(()=>{window.removeEventListener("resize",r)}),a({rootEl:s}),(g,h)=>(m(),c("div",{ref_key:"rootEl",ref:s,class:w(["log-stream",{compact:e.compact}]),onScrollPassive:r},[u.value&&d(o).range.topOffset>0?(m(),c("div",{key:0,class:"log-spacer",style:O({height:`${d(o).range.topOffset}px`})},null,4)):M("",!0),e.mode==="text"?(m(!0),c(T,{key:1},z(l.value,(n,y)=>(m(),c("div",{class:"log-line",key:n?.id??`${d(o).range.start+y}`},p(n.text),1))),128)):(m(!0),c(T,{key:2},z(l.value,(n,y)=>(m(),c("div",{class:"log-line",key:n?.id??`${d(o).range.start+y}`},[x("span",$,p(e.formatTime?e.formatTime(n.ts):""),1),x("span",{class:w(["log-kind",`kind-${n.kind?.toLowerCase()}`])},p(n.kind),3),x("span",{class:w(["log-text",`text-${n.kind?.toLowerCase()}`])},p(e.formatPayload?e.formatPayload(n):n.text),3)]))),128)),u.value&&d(o).range.bottomOffset>0?(m(),c("div",{key:3,class:"log-spacer",style:O({height:`${d(o).range.bottomOffset}px`})},null,4)):M("",!0)],34))}};export{R as _}; diff --git a/ui/assets/web/assets/ManualView-CkxwU3vG.js b/ui/assets/web/assets/ManualView-CkxwU3vG.js new file mode 100644 index 0000000..880ae66 --- /dev/null +++ b/ui/assets/web/assets/ManualView-CkxwU3vG.js @@ -0,0 +1,2 @@ +import{i as Q,c as r,o as p,a as s,b as K,t as n,u as t,n as a,d as v,e as E,f as c,w as d,v as C,g,F as vt,r as kt,h as J}from"./index-Dc1DYgSA.js";import{_ as yt}from"./DropdownSelect-C0USmkt8.js";import{_ as W}from"./LogStream-DjhqBYTz.js";const Ct={class:"page"},gt={class:"page-header spaced"},_t={class:"header-actions terminal-config-actions"},ft={class:"config-status"},xt={class:"port-picker terminal-port-picker"},qt=["title"],Vt=["title","disabled"],Pt={class:"config-controls terminal-config-controls"},wt=["disabled"],ht={class:"manual-grid"},Dt={class:"manual-left"},$t={class:"panel stack manual-send"},Lt={class:"panel-title"},Ut={class:"segmented"},Tt=["placeholder"],Qt={class:"toggle-row"},Et={class:"check"},Mt={class:"check"},Ft={class:"check"},Rt={class:"panel stack manual-quick"},Ht={class:"panel-title simple"},It=["title"],Nt={class:"quick-list"},St=["onClick"],Xt={class:"quick-info"},At={class:"quick-title"},Ot={class:"quick-meta"},Bt={class:"quick-item-actions"},zt=["title","onClick"],jt=["title","onClick"],Gt={class:"manual-right"},Kt={class:"panel monitor manual-monitor"},Jt={class:"panel-title bar"},Wt={class:"panel-title-left"},Yt={class:"panel-actions"},Zt={class:"segmented small"},ts=["title"],ss=["title"],ls=["title"],os={class:"panel console manual-console"},es={class:"tab-strip"},ns={class:"search"},is=["placeholder"],as={class:"panel-footer"},ds={key:0,class:"modal-backdrop"},us={class:"quick-modal"},ms={class:"modal-header"},rs={class:"modal-body"},ps={class:"quick-field"},cs=["placeholder"],bs={class:"quick-field"},vs={class:"quick-field-header"},ks={class:"quick-mode"},ys={class:"quick-mode-label"},Cs={class:"segmented small"},gs=["placeholder"],_s={class:"quick-counter"},fs={class:"modal-section quick-options"},xs={class:"section-title"},qs={class:"toggle-row"},Vs={class:"check"},Ps={class:"check"},ws={class:"modal-footer"},hs={key:1,class:"modal-backdrop"},Ds={class:"quick-modal quick-modal-sm"},$s={class:"modal-header"},Ls={class:"modal-body"},Us={class:"quick-delete-summary"},Ts={class:"quick-delete-title"},Qs={class:"quick-delete-meta"},Es={class:"modal-footer"},Xs={__name:"ManualView",setup(Ms){const u=Q("t",V=>V),e=Q("tr",V=>V),M=Q("manualView");if(!M)throw new Error("manualView bindings not provided");const{connectionInfo:F,isConnected:m,isConnecting:k,selectedPort:P,portOptionsList:Y,portPlaceholder:Z,noPorts:Fs,sendMode:y,sendText:w,sendHex:h,appendCR:D,appendLF:$,loopSend:L,displayMode:_,quickCommands:tt,logTab:b,logKeyword:U,visibleCommLogs:st,renderedCommLogs:lt,renderedVisibleCommLogs:ot,formatTime:R,formatPayload:H,commPaused:et,clearCommLogs:f,toggleCommPaused:I,exportCommLogs:N,quickDialogOpen:nt,quickDialogMode:T,quickDraft:i,quickPayloadCount:it,quickPayloadLimit:at,openQuickCommandDialog:Rs,closeQuickCommandDialog:x,saveQuickCommand:S,quickDeleteOpen:dt,quickDeleting:X,openQuickDeleteDialog:ut,closeQuickDeleteDialog:q,confirmQuickDelete:A,addQuickCommand:O,editQuickCommand:mt,removeQuickCommand:Hs,selectPort:rt,refreshPorts:B,disconnect:pt,connectSerial:ct,openChannelSettings:z,sendPayload:j,sendQuickCommand:bt}=M;return(V,l)=>(p(),r("section",Ct,[s("header",gt,[s("div",null,[s("h2",null,n(t(u)("header.manual.title")),1),s("p",null,n(t(u)("header.manual.desc")),1)]),s("div",_t,[s("div",ft,[s("div",{class:a(["status-pill",t(F).state])},[l[35]||(l[35]=s("span",{class:"dot"},null,-1)),v(" "+n(t(m)?t(u)("status.connected"):t(F).state==="error"?t(u)("status.error"):t(u)("status.disconnected")),1)],2)]),s("div",xt,[E(yt,{modelValue:t(P),"onUpdate:modelValue":l[0]||(l[0]=o=>c(P)?P.value=o:null),options:t(Y),placeholder:t(Z),disabled:t(m)||t(k),"disabled-reason":t(k)?t(e)("连接中"):t(m)?t(e)("已连接"):"","leading-icon":"usb",onChange:t(rt)},null,8,["modelValue","options","placeholder","disabled","disabled-reason","onChange"]),s("button",{class:"icon-btn",type:"button",title:t(e)("串口设置"),onClick:l[1]||(l[1]=(...o)=>t(z)&&t(z)(...o))},[...l[36]||(l[36]=[s("span",{class:"material-symbols-outlined"},"settings",-1)])],8,qt),s("button",{class:"icon-btn refresh-icon",type:"button",title:t(e)("刷新串口"),disabled:t(m)||t(k),onClick:l[2]||(l[2]=(...o)=>t(B)&&t(B)(...o))},[...l[37]||(l[37]=[s("span",{class:"material-symbols-outlined"},"refresh",-1)])],8,Vt)]),s("div",Pt,[s("button",{class:a(["btn",t(m)?"btn-danger":"btn-success"]),disabled:t(k)&&!t(m),onClick:l[3]||(l[3]=o=>t(m)?t(pt)():t(ct)())},[l[38]||(l[38]=s("span",{class:"material-symbols-outlined"},"link",-1)),v(" "+n(t(m)?t(u)("action.disconnect"):t(k)?t(u)("status.connecting"):t(u)("action.connect")),1)],10,wt)])])]),s("div",ht,[s("div",Dt,[s("div",$t,[s("div",Lt,[l[39]||(l[39]=s("span",{class:"material-symbols-outlined"},"send",-1)),v(n(t(e)("发送数据")),1),s("div",Ut,[s("button",{class:a({active:t(y)==="text"}),onClick:l[4]||(l[4]=o=>y.value="text")},n(t(e)("文本")),3),s("button",{class:a({active:t(y)==="hex"}),onClick:l[5]||(l[5]=o=>y.value="hex")},"HEX",2)])]),t(y)==="text"?d((p(),r("textarea",{key:0,"onUpdate:modelValue":l[6]||(l[6]=o=>c(w)?w.value=o:null),class:"text-area",placeholder:t(e)("输入要发送的数据...")},null,8,Tt)),[[C,t(w)]]):d((p(),r("textarea",{key:1,"onUpdate:modelValue":l[7]||(l[7]=o=>c(h)?h.value=o:null),class:"text-area",placeholder:"55 AA 01"},null,512)),[[C,t(h)]]),s("div",Qt,[s("label",Et,[d(s("input",{"onUpdate:modelValue":l[8]||(l[8]=o=>c(D)?D.value=o:null),type:"checkbox"},null,512),[[g,t(D)]]),l[40]||(l[40]=s("span",null,"+CR",-1))]),s("label",Mt,[d(s("input",{"onUpdate:modelValue":l[9]||(l[9]=o=>c($)?$.value=o:null),type:"checkbox"},null,512),[[g,t($)]]),l[41]||(l[41]=s("span",null,"+LF",-1))]),s("label",Ft,[d(s("input",{"onUpdate:modelValue":l[10]||(l[10]=o=>c(L)?L.value=o:null),type:"checkbox"},null,512),[[g,t(L)]]),s("span",null,n(t(e)("循环发送")),1)])]),s("button",{class:"btn btn-primary",onClick:l[11]||(l[11]=(...o)=>t(j)&&t(j)(...o))},[l[42]||(l[42]=s("span",{class:"material-symbols-outlined"},"send",-1)),v(n(t(e)("发送数据")),1)])]),s("div",Rt,[s("div",Ht,[v(n(t(e)("快捷指令")),1),s("button",{class:"icon-btn",type:"button",title:t(e)("新增快捷指令"),onClick:l[12]||(l[12]=(...o)=>t(O)&&t(O)(...o))},[...l[43]||(l[43]=[s("span",{class:"material-symbols-outlined"},"add",-1)])],8,It)]),s("div",Nt,[(p(!0),r(vt,null,kt(t(tt),o=>(p(),r("button",{key:o.id,class:"quick-item",onClick:G=>t(bt)(o)},[s("div",Xt,[s("span",At,n(o.name),1),s("span",Ot,n(o.mode==="hex"?"HEX":t(e)("文本")),1)]),s("div",Bt,[s("button",{class:"icon-btn small",type:"button",title:t(e)("编辑"),onClick:J(G=>t(mt)(o),["stop"])},[...l[44]||(l[44]=[s("span",{class:"material-symbols-outlined"},"edit",-1)])],8,zt),s("button",{class:"icon-btn small",type:"button",title:t(e)("删除"),onClick:J(G=>t(ut)(o),["stop"])},[...l[45]||(l[45]=[s("span",{class:"material-symbols-outlined"},"delete",-1)])],8,jt),l[46]||(l[46]=s("span",{class:"material-symbols-outlined"},"play_arrow",-1))])],8,St))),128))])])]),s("div",Gt,[s("div",Kt,[s("div",Jt,[s("div",Wt,[l[47]||(l[47]=s("span",{class:"material-symbols-outlined"},"swap_horiz",-1)),v(n(t(e)("IO 监控")),1),l[48]||(l[48]=s("span",{class:"pill live"},"LIVE",-1))]),s("div",Yt,[s("div",Zt,[s("button",{class:a({active:t(_)==="ascii"}),onClick:l[13]||(l[13]=o=>_.value="ascii")},"ASCII",2),s("button",{class:a({active:t(_)==="hex"}),onClick:l[14]||(l[14]=o=>_.value="hex")},"HEX",2)]),l[52]||(l[52]=s("span",{class:"divider"},null,-1)),s("button",{class:"icon-btn",type:"button",title:t(e)("清除"),onClick:l[15]||(l[15]=(...o)=>t(f)&&t(f)(...o))},[...l[49]||(l[49]=[s("span",{class:"material-symbols-outlined"},"delete",-1)])],8,ts),s("button",{class:a(["icon-btn",{active:t(et)}]),type:"button",title:t(e)("暂停"),onClick:l[16]||(l[16]=(...o)=>t(I)&&t(I)(...o))},[...l[50]||(l[50]=[s("span",{class:"material-symbols-outlined"},"pause_circle",-1)])],10,ss),s("button",{class:"icon-btn",type:"button",title:t(e)("导出"),onClick:l[17]||(l[17]=(...o)=>t(N)&&t(N)(...o))},[...l[51]||(l[51]=[s("span",{class:"material-symbols-outlined"},"download",-1)])],8,ls)])]),E(W,{items:t(lt),formatTime:t(R),formatPayload:t(H)},null,8,["items","formatTime","formatPayload"])]),s("div",os,[s("div",es,[s("button",{class:a({active:t(b)==="all"}),onClick:l[18]||(l[18]=o=>b.value="all")},n(t(e)("全部日志")),3),s("button",{class:a({active:t(b)==="uart"}),onClick:l[19]||(l[19]=o=>b.value="uart")},n(t(e)("串口 (UART)")),3),s("button",{class:a({active:t(b)==="tcp"}),onClick:l[20]||(l[20]=o=>b.value="tcp")},n(t(e)("网络 (TCP)")),3),s("div",ns,[l[53]||(l[53]=s("span",{class:"material-symbols-outlined"},"search",-1)),d(s("input",{"onUpdate:modelValue":l[21]||(l[21]=o=>c(U)?U.value=o:null),type:"text",placeholder:t(e)("过滤日志...")},null,8,is),[[C,t(U)]])])]),E(W,{compact:"",items:t(ot),formatTime:t(R),formatPayload:t(H)},null,8,["items","formatTime","formatPayload"]),s("div",as,[s("span",null,n(t(st).length)+" "+n(t(e)("条日志记录")),1),s("button",{class:"link-btn",type:"button",onClick:l[22]||(l[22]=(...o)=>t(f)&&t(f)(...o))},n(t(e)("清除日志")),1)])])])]),t(nt)?(p(),r("div",ds,[s("div",us,[s("div",ms,[s("div",null,[s("h3",null,n(t(T)==="edit"?t(e)("快捷指令编辑"):t(e)("新增快捷指令")),1),s("p",null,n(t(T)==="edit"?t(e)("编辑或更新现有的快捷调试指令"):t(e)("创建新的快捷调试指令")),1)]),s("button",{class:"icon-btn",type:"button",onClick:l[23]||(l[23]=(...o)=>t(x)&&t(x)(...o))},[...l[54]||(l[54]=[s("span",{class:"material-symbols-outlined"},"close",-1)])])]),s("div",rs,[s("div",ps,[s("label",null,n(t(e)("指令名称")),1),d(s("input",{"onUpdate:modelValue":l[24]||(l[24]=o=>t(i).name=o),type:"text",placeholder:t(e)("例如:CMD PING")},null,8,cs),[[C,t(i).name]])]),s("div",bs,[s("div",vs,[s("label",null,n(t(e)("指令内容")),1),s("div",ks,[s("span",ys,n(t(e)("格式:")),1),s("div",Cs,[s("button",{class:a({active:t(i).mode==="text"}),onClick:l[25]||(l[25]=o=>t(i).mode="text")},n(t(e)("文本")),3),s("button",{class:a({active:t(i).mode==="hex"}),onClick:l[26]||(l[26]=o=>t(i).mode="hex")}," HEX ",2)])])]),d(s("textarea",{"onUpdate:modelValue":l[27]||(l[27]=o=>t(i).payload=o),class:"quick-textarea",rows:"4",placeholder:t(e)("输入要发送的指令内容")},null,8,gs),[[C,t(i).payload]]),s("p",_s,n(t(it))+" / "+n(t(at)),1)]),s("div",fs,[s("div",xs,n(t(e)("发送选项")),1),s("div",qs,[s("label",Vs,[d(s("input",{"onUpdate:modelValue":l[28]||(l[28]=o=>t(i).appendCR=o),type:"checkbox"},null,512),[[g,t(i).appendCR]]),s("span",null,n(t(e)("添加 CR (\r)")),1)]),s("label",Ps,[d(s("input",{"onUpdate:modelValue":l[29]||(l[29]=o=>t(i).appendLF=o),type:"checkbox"},null,512),[[g,t(i).appendLF]]),s("span",null,n(t(e)(`添加 LF ( +)`)),1)])])])]),s("div",ws,[s("button",{class:"btn btn-outline",type:"button",onClick:l[30]||(l[30]=(...o)=>t(x)&&t(x)(...o))},n(t(e)("取消")),1),s("button",{class:"btn btn-primary",type:"button",onClick:l[31]||(l[31]=(...o)=>t(S)&&t(S)(...o))},n(t(T)==="edit"?t(e)("保存修改"):t(e)("创建指令")),1)])])])):K("",!0),t(dt)?(p(),r("div",hs,[s("div",Ds,[s("div",$s,[s("div",null,[s("h3",null,n(t(e)("删除快捷指令")),1),s("p",null,n(t(e)("确认删除该快捷指令,删除后无法恢复。")),1)]),s("button",{class:"icon-btn",type:"button",onClick:l[32]||(l[32]=(...o)=>t(q)&&t(q)(...o))},[...l[55]||(l[55]=[s("span",{class:"material-symbols-outlined"},"close",-1)])])]),s("div",Ls,[s("div",Us,[l[56]||(l[56]=s("span",{class:"material-symbols-outlined"},"warning",-1)),s("div",null,[s("p",Ts,n(t(X)?.name||t(e)("未命名指令")),1),s("p",Qs,n(t(X)?.mode==="hex"?"HEX":t(e)("文本")),1)])])]),s("div",Es,[s("button",{class:"btn btn-outline",type:"button",onClick:l[33]||(l[33]=(...o)=>t(q)&&t(q)(...o))},n(t(e)("取消")),1),s("button",{class:"btn btn-danger",type:"button",onClick:l[34]||(l[34]=(...o)=>t(A)&&t(A)(...o))},n(t(e)("确认删除")),1)])])])):K("",!0)]))}};export{Xs as default}; diff --git a/ui/assets/web/assets/ManualView-DJLo1BfX.js b/ui/assets/web/assets/ManualView-DJLo1BfX.js new file mode 100644 index 0000000..39bca13 --- /dev/null +++ b/ui/assets/web/assets/ManualView-DJLo1BfX.js @@ -0,0 +1,2 @@ +import{i as Q,c as r,o as p,a as s,b as K,t as n,u as t,n as a,d as v,e as E,f as c,w as d,v as C,g,F as vt,r as kt,h as J}from"./index-CY12nbn6.js";import{_ as yt}from"./DropdownSelect-DwmPnboD.js";import{_ as W}from"./LogStream-C7ftHG0R.js";const Ct={class:"page"},gt={class:"page-header spaced"},_t={class:"header-actions terminal-config-actions"},ft={class:"config-status"},xt={class:"port-picker terminal-port-picker"},qt=["title"],Vt=["title","disabled"],Pt={class:"config-controls terminal-config-controls"},wt=["disabled"],ht={class:"manual-grid"},Dt={class:"manual-left"},$t={class:"panel stack manual-send"},Lt={class:"panel-title"},Ut={class:"segmented"},Tt=["placeholder"],Qt={class:"toggle-row"},Et={class:"check"},Mt={class:"check"},Ft={class:"check"},Rt={class:"panel stack manual-quick"},Ht={class:"panel-title simple"},It=["title"],Nt={class:"quick-list"},St=["onClick"],Xt={class:"quick-info"},At={class:"quick-title"},Ot={class:"quick-meta"},Bt={class:"quick-item-actions"},zt=["title","onClick"],jt=["title","onClick"],Gt={class:"manual-right"},Kt={class:"panel monitor manual-monitor"},Jt={class:"panel-title bar"},Wt={class:"panel-title-left"},Yt={class:"panel-actions"},Zt={class:"segmented small"},ts=["title"],ss=["title"],ls=["title"],os={class:"panel console manual-console"},es={class:"tab-strip"},ns={class:"search"},is=["placeholder"],as={class:"panel-footer"},ds={key:0,class:"modal-backdrop"},us={class:"quick-modal"},ms={class:"modal-header"},rs={class:"modal-body"},ps={class:"quick-field"},cs=["placeholder"],bs={class:"quick-field"},vs={class:"quick-field-header"},ks={class:"quick-mode"},ys={class:"quick-mode-label"},Cs={class:"segmented small"},gs=["placeholder"],_s={class:"quick-counter"},fs={class:"modal-section quick-options"},xs={class:"section-title"},qs={class:"toggle-row"},Vs={class:"check"},Ps={class:"check"},ws={class:"modal-footer"},hs={key:1,class:"modal-backdrop"},Ds={class:"quick-modal quick-modal-sm"},$s={class:"modal-header"},Ls={class:"modal-body"},Us={class:"quick-delete-summary"},Ts={class:"quick-delete-title"},Qs={class:"quick-delete-meta"},Es={class:"modal-footer"},Xs={__name:"ManualView",setup(Ms){const u=Q("t",V=>V),e=Q("tr",V=>V),M=Q("manualView");if(!M)throw new Error("manualView bindings not provided");const{connectionInfo:F,isConnected:m,isConnecting:k,selectedPort:P,portOptionsList:Y,portPlaceholder:Z,noPorts:Fs,sendMode:y,sendText:w,sendHex:h,appendCR:D,appendLF:$,loopSend:L,displayMode:_,quickCommands:tt,logTab:b,logKeyword:U,visibleCommLogs:st,renderedCommLogs:lt,renderedVisibleCommLogs:ot,formatTime:R,formatPayload:H,commPaused:et,clearCommLogs:f,toggleCommPaused:I,exportCommLogs:N,quickDialogOpen:nt,quickDialogMode:T,quickDraft:i,quickPayloadCount:it,quickPayloadLimit:at,openQuickCommandDialog:Rs,closeQuickCommandDialog:x,saveQuickCommand:S,quickDeleteOpen:dt,quickDeleting:X,openQuickDeleteDialog:ut,closeQuickDeleteDialog:q,confirmQuickDelete:A,addQuickCommand:O,editQuickCommand:mt,removeQuickCommand:Hs,selectPort:rt,refreshPorts:B,disconnect:pt,connectSerial:ct,openChannelSettings:z,sendPayload:j,sendQuickCommand:bt}=M;return(V,l)=>(p(),r("section",Ct,[s("header",gt,[s("div",null,[s("h2",null,n(t(u)("header.manual.title")),1),s("p",null,n(t(u)("header.manual.desc")),1)]),s("div",_t,[s("div",ft,[s("div",{class:a(["status-pill",t(F).state])},[l[35]||(l[35]=s("span",{class:"dot"},null,-1)),v(" "+n(t(m)?t(u)("status.connected"):t(F).state==="error"?t(u)("status.error"):t(u)("status.disconnected")),1)],2)]),s("div",xt,[E(yt,{modelValue:t(P),"onUpdate:modelValue":l[0]||(l[0]=o=>c(P)?P.value=o:null),options:t(Y),placeholder:t(Z),disabled:t(m)||t(k),"disabled-reason":t(k)?t(e)("连接中"):t(m)?t(e)("已连接"):"","leading-icon":"usb",onChange:t(rt)},null,8,["modelValue","options","placeholder","disabled","disabled-reason","onChange"]),s("button",{class:"icon-btn",type:"button",title:t(e)("串口设置"),onClick:l[1]||(l[1]=(...o)=>t(z)&&t(z)(...o))},[...l[36]||(l[36]=[s("span",{class:"material-symbols-outlined"},"settings",-1)])],8,qt),s("button",{class:"icon-btn refresh-icon",type:"button",title:t(e)("刷新串口"),disabled:t(m)||t(k),onClick:l[2]||(l[2]=(...o)=>t(B)&&t(B)(...o))},[...l[37]||(l[37]=[s("span",{class:"material-symbols-outlined"},"refresh",-1)])],8,Vt)]),s("div",Pt,[s("button",{class:a(["btn",t(m)?"btn-danger":"btn-success"]),disabled:t(k)&&!t(m),onClick:l[3]||(l[3]=o=>t(m)?t(pt)():t(ct)())},[l[38]||(l[38]=s("span",{class:"material-symbols-outlined"},"link",-1)),v(" "+n(t(m)?t(u)("action.disconnect"):t(k)?t(u)("status.connecting"):t(u)("action.connect")),1)],10,wt)])])]),s("div",ht,[s("div",Dt,[s("div",$t,[s("div",Lt,[l[39]||(l[39]=s("span",{class:"material-symbols-outlined"},"send",-1)),v(n(t(e)("发送数据")),1),s("div",Ut,[s("button",{class:a({active:t(y)==="text"}),onClick:l[4]||(l[4]=o=>y.value="text")},n(t(e)("文本")),3),s("button",{class:a({active:t(y)==="hex"}),onClick:l[5]||(l[5]=o=>y.value="hex")},"HEX",2)])]),t(y)==="text"?d((p(),r("textarea",{key:0,"onUpdate:modelValue":l[6]||(l[6]=o=>c(w)?w.value=o:null),class:"text-area",placeholder:t(e)("输入要发送的数据...")},null,8,Tt)),[[C,t(w)]]):d((p(),r("textarea",{key:1,"onUpdate:modelValue":l[7]||(l[7]=o=>c(h)?h.value=o:null),class:"text-area",placeholder:"55 AA 01"},null,512)),[[C,t(h)]]),s("div",Qt,[s("label",Et,[d(s("input",{"onUpdate:modelValue":l[8]||(l[8]=o=>c(D)?D.value=o:null),type:"checkbox"},null,512),[[g,t(D)]]),l[40]||(l[40]=s("span",null,"+CR",-1))]),s("label",Mt,[d(s("input",{"onUpdate:modelValue":l[9]||(l[9]=o=>c($)?$.value=o:null),type:"checkbox"},null,512),[[g,t($)]]),l[41]||(l[41]=s("span",null,"+LF",-1))]),s("label",Ft,[d(s("input",{"onUpdate:modelValue":l[10]||(l[10]=o=>c(L)?L.value=o:null),type:"checkbox"},null,512),[[g,t(L)]]),s("span",null,n(t(e)("循环发送")),1)])]),s("button",{class:"btn btn-primary",onClick:l[11]||(l[11]=(...o)=>t(j)&&t(j)(...o))},[l[42]||(l[42]=s("span",{class:"material-symbols-outlined"},"send",-1)),v(n(t(e)("发送数据")),1)])]),s("div",Rt,[s("div",Ht,[v(n(t(e)("快捷指令")),1),s("button",{class:"icon-btn",type:"button",title:t(e)("新增快捷指令"),onClick:l[12]||(l[12]=(...o)=>t(O)&&t(O)(...o))},[...l[43]||(l[43]=[s("span",{class:"material-symbols-outlined"},"add",-1)])],8,It)]),s("div",Nt,[(p(!0),r(vt,null,kt(t(tt),o=>(p(),r("button",{key:o.id,class:"quick-item",onClick:G=>t(bt)(o)},[s("div",Xt,[s("span",At,n(o.name),1),s("span",Ot,n(o.mode==="hex"?"HEX":t(e)("文本")),1)]),s("div",Bt,[s("button",{class:"icon-btn small",type:"button",title:t(e)("编辑"),onClick:J(G=>t(mt)(o),["stop"])},[...l[44]||(l[44]=[s("span",{class:"material-symbols-outlined"},"edit",-1)])],8,zt),s("button",{class:"icon-btn small",type:"button",title:t(e)("删除"),onClick:J(G=>t(ut)(o),["stop"])},[...l[45]||(l[45]=[s("span",{class:"material-symbols-outlined"},"delete",-1)])],8,jt),l[46]||(l[46]=s("span",{class:"material-symbols-outlined"},"play_arrow",-1))])],8,St))),128))])])]),s("div",Gt,[s("div",Kt,[s("div",Jt,[s("div",Wt,[l[47]||(l[47]=s("span",{class:"material-symbols-outlined"},"swap_horiz",-1)),v(n(t(e)("IO 监控")),1),l[48]||(l[48]=s("span",{class:"pill live"},"LIVE",-1))]),s("div",Yt,[s("div",Zt,[s("button",{class:a({active:t(_)==="ascii"}),onClick:l[13]||(l[13]=o=>_.value="ascii")},"ASCII",2),s("button",{class:a({active:t(_)==="hex"}),onClick:l[14]||(l[14]=o=>_.value="hex")},"HEX",2)]),l[52]||(l[52]=s("span",{class:"divider"},null,-1)),s("button",{class:"icon-btn",type:"button",title:t(e)("清除"),onClick:l[15]||(l[15]=(...o)=>t(f)&&t(f)(...o))},[...l[49]||(l[49]=[s("span",{class:"material-symbols-outlined"},"delete",-1)])],8,ts),s("button",{class:a(["icon-btn",{active:t(et)}]),type:"button",title:t(e)("暂停"),onClick:l[16]||(l[16]=(...o)=>t(I)&&t(I)(...o))},[...l[50]||(l[50]=[s("span",{class:"material-symbols-outlined"},"pause_circle",-1)])],10,ss),s("button",{class:"icon-btn",type:"button",title:t(e)("导出"),onClick:l[17]||(l[17]=(...o)=>t(N)&&t(N)(...o))},[...l[51]||(l[51]=[s("span",{class:"material-symbols-outlined"},"download",-1)])],8,ls)])]),E(W,{items:t(lt),formatTime:t(R),formatPayload:t(H)},null,8,["items","formatTime","formatPayload"])]),s("div",os,[s("div",es,[s("button",{class:a({active:t(b)==="all"}),onClick:l[18]||(l[18]=o=>b.value="all")},n(t(e)("全部日志")),3),s("button",{class:a({active:t(b)==="uart"}),onClick:l[19]||(l[19]=o=>b.value="uart")},n(t(e)("串口 (UART)")),3),s("button",{class:a({active:t(b)==="tcp"}),onClick:l[20]||(l[20]=o=>b.value="tcp")},n(t(e)("网络 (TCP)")),3),s("div",ns,[l[53]||(l[53]=s("span",{class:"material-symbols-outlined"},"search",-1)),d(s("input",{"onUpdate:modelValue":l[21]||(l[21]=o=>c(U)?U.value=o:null),type:"text",placeholder:t(e)("过滤日志...")},null,8,is),[[C,t(U)]])])]),E(W,{compact:"",items:t(ot),formatTime:t(R),formatPayload:t(H)},null,8,["items","formatTime","formatPayload"]),s("div",as,[s("span",null,n(t(st).length)+" "+n(t(e)("条日志记录")),1),s("button",{class:"link-btn",type:"button",onClick:l[22]||(l[22]=(...o)=>t(f)&&t(f)(...o))},n(t(e)("清除日志")),1)])])])]),t(nt)?(p(),r("div",ds,[s("div",us,[s("div",ms,[s("div",null,[s("h3",null,n(t(T)==="edit"?t(e)("快捷指令编辑"):t(e)("新增快捷指令")),1),s("p",null,n(t(T)==="edit"?t(e)("编辑或更新现有的快捷调试指令"):t(e)("创建新的快捷调试指令")),1)]),s("button",{class:"icon-btn",type:"button",onClick:l[23]||(l[23]=(...o)=>t(x)&&t(x)(...o))},[...l[54]||(l[54]=[s("span",{class:"material-symbols-outlined"},"close",-1)])])]),s("div",rs,[s("div",ps,[s("label",null,n(t(e)("指令名称")),1),d(s("input",{"onUpdate:modelValue":l[24]||(l[24]=o=>t(i).name=o),type:"text",placeholder:t(e)("例如:CMD PING")},null,8,cs),[[C,t(i).name]])]),s("div",bs,[s("div",vs,[s("label",null,n(t(e)("指令内容")),1),s("div",ks,[s("span",ys,n(t(e)("格式:")),1),s("div",Cs,[s("button",{class:a({active:t(i).mode==="text"}),onClick:l[25]||(l[25]=o=>t(i).mode="text")},n(t(e)("文本")),3),s("button",{class:a({active:t(i).mode==="hex"}),onClick:l[26]||(l[26]=o=>t(i).mode="hex")}," HEX ",2)])])]),d(s("textarea",{"onUpdate:modelValue":l[27]||(l[27]=o=>t(i).payload=o),class:"quick-textarea",rows:"4",placeholder:t(e)("输入要发送的指令内容")},null,8,gs),[[C,t(i).payload]]),s("p",_s,n(t(it))+" / "+n(t(at)),1)]),s("div",fs,[s("div",xs,n(t(e)("发送选项")),1),s("div",qs,[s("label",Vs,[d(s("input",{"onUpdate:modelValue":l[28]||(l[28]=o=>t(i).appendCR=o),type:"checkbox"},null,512),[[g,t(i).appendCR]]),s("span",null,n(t(e)("添加 CR (\r)")),1)]),s("label",Ps,[d(s("input",{"onUpdate:modelValue":l[29]||(l[29]=o=>t(i).appendLF=o),type:"checkbox"},null,512),[[g,t(i).appendLF]]),s("span",null,n(t(e)(`添加 LF ( +)`)),1)])])])]),s("div",ws,[s("button",{class:"btn btn-outline",type:"button",onClick:l[30]||(l[30]=(...o)=>t(x)&&t(x)(...o))},n(t(e)("取消")),1),s("button",{class:"btn btn-primary",type:"button",onClick:l[31]||(l[31]=(...o)=>t(S)&&t(S)(...o))},n(t(T)==="edit"?t(e)("保存修改"):t(e)("创建指令")),1)])])])):K("",!0),t(dt)?(p(),r("div",hs,[s("div",Ds,[s("div",$s,[s("div",null,[s("h3",null,n(t(e)("删除快捷指令")),1),s("p",null,n(t(e)("确认删除该快捷指令,删除后无法恢复。")),1)]),s("button",{class:"icon-btn",type:"button",onClick:l[32]||(l[32]=(...o)=>t(q)&&t(q)(...o))},[...l[55]||(l[55]=[s("span",{class:"material-symbols-outlined"},"close",-1)])])]),s("div",Ls,[s("div",Us,[l[56]||(l[56]=s("span",{class:"material-symbols-outlined"},"warning",-1)),s("div",null,[s("p",Ts,n(t(X)?.name||t(e)("未命名指令")),1),s("p",Qs,n(t(X)?.mode==="hex"?"HEX":t(e)("文本")),1)])])]),s("div",Es,[s("button",{class:"btn btn-outline",type:"button",onClick:l[33]||(l[33]=(...o)=>t(q)&&t(q)(...o))},n(t(e)("取消")),1),s("button",{class:"btn btn-danger",type:"button",onClick:l[34]||(l[34]=(...o)=>t(A)&&t(A)(...o))},n(t(e)("确认删除")),1)])])])):K("",!0)]))}};export{Xs as default}; diff --git a/ui/assets/web/assets/MaterialSymbolsOutlined-DvxE0gZD.ttf b/ui/assets/web/assets/MaterialSymbolsOutlined-DvxE0gZD.ttf new file mode 100644 index 0000000..9006c26 Binary files /dev/null and b/ui/assets/web/assets/MaterialSymbolsOutlined-DvxE0gZD.ttf differ diff --git a/ui/assets/web/assets/ProtocolCardsSection-Cn6wfyRB.js b/ui/assets/web/assets/ProtocolCardsSection-Cn6wfyRB.js new file mode 100644 index 0000000..4d6f4b9 --- /dev/null +++ b/ui/assets/web/assets/ProtocolCardsSection-Cn6wfyRB.js @@ -0,0 +1 @@ +import{i as v,c as i,o as c,a as t,n as r,t as e,u as a,b as p,F as C,r as k,d as T}from"./index-CY12nbn6.js";const f={class:"protocol-cards-section"},$={class:"tab-strip secondary"},g={class:"protocol-grid"},P={class:"protocol-header"},x={class:"protocol-title"},S={class:"protocol-sub"},B={class:"protocol-rows"},I={class:"protocol-actions"},M=["onClick"],N=["onClick"],V={key:0,class:"protocol-card empty"},F={__name:"ProtocolCardsSection",props:{protocolTab:{type:String,default:"all"},filteredProtocolCards:{type:Array,default:()=>[]}},emits:["set-tab","create","details","delete"],setup(n,{emit:y}){const m=v("t",b=>b),d=v("tr",b=>b),l=y;return(b,o)=>(c(),i("div",f,[t("div",$,[t("button",{class:r({active:n.protocolTab==="all"}),onClick:o[0]||(o[0]=s=>l("set-tab","all"))},e(a(m)("protocol.tab.all")),3),t("button",{class:r({active:n.protocolTab==="modbus-rtu"}),onClick:o[1]||(o[1]=s=>l("set-tab","modbus-rtu"))},"Modbus RTU",2),t("button",{class:r({active:n.protocolTab==="modbus-ascii"}),onClick:o[2]||(o[2]=s=>l("set-tab","modbus-ascii"))},"Modbus ASCII",2),t("button",{class:r({active:n.protocolTab==="modbus-tcp"}),onClick:o[3]||(o[3]=s=>l("set-tab","modbus-tcp"))},"Modbus TCP",2),t("button",{class:r({active:n.protocolTab==="tcp"}),onClick:o[4]||(o[4]=s=>l("set-tab","tcp"))},"TCP/IP",2),t("button",{class:r({active:n.protocolTab==="custom"}),onClick:o[5]||(o[5]=s=>l("set-tab","custom"))},e(a(m)("protocol.tab.custom")),3)]),t("div",g,[(c(!0),i(C,null,k(n.filteredProtocolCards,s=>(c(),i("div",{key:s.id,class:"protocol-card"},[t("div",P,[t("div",null,[t("div",x,e(s.name),1),t("div",S,e(s.desc||a(d)("暂无描述")),1)]),t("span",{class:r(["badge",s.statusClass])},e(s.statusText),3)]),t("div",B,[(c(!0),i(C,null,k(s.rows,u=>(c(),i("div",{key:u.label,class:"protocol-row"},[t("span",null,e(u.label),1),t("strong",null,e(u.value),1)]))),128))]),t("div",I,[t("button",{class:"btn btn-ghost",onClick:u=>l("details",s)},e(s.source==="custom"?a(d)("配置"):a(d)("查看")),9,M),s.source==="custom"?(c(),i("button",{key:0,class:"icon-btn",onClick:u=>l("delete",s)},[...o[7]||(o[7]=[t("span",{class:"material-symbols-outlined"},"delete",-1)])],8,N)):p("",!0)])]))),128)),n.filteredProtocolCards.length===0?(c(),i("div",V,[o[9]||(o[9]=t("div",{class:"empty-icon"},[t("span",{class:"material-symbols-outlined"},"inventory_2")],-1)),t("h3",null,e(a(d)("暂无协议")),1),t("p",null,e(a(d)("暂无可用协议,可从内置模板创建或新增自定义协议。")),1),t("button",{class:"btn btn-primary",onClick:o[6]||(o[6]=s=>l("create"))},[o[8]||(o[8]=t("span",{class:"material-symbols-outlined"},"add",-1)),T(" "+e(a(m)("action.createProtocol")),1)])])):p("",!0)])]))}};export{F as default}; diff --git a/ui/assets/web/assets/ProtocolCardsSection-D1zESQTn.js b/ui/assets/web/assets/ProtocolCardsSection-D1zESQTn.js new file mode 100644 index 0000000..86385e9 --- /dev/null +++ b/ui/assets/web/assets/ProtocolCardsSection-D1zESQTn.js @@ -0,0 +1 @@ +import{i as v,c as i,o as c,a as t,n as r,t as e,u as a,b as p,F as C,r as k,d as T}from"./index-Dc1DYgSA.js";const f={class:"protocol-cards-section"},$={class:"tab-strip secondary"},g={class:"protocol-grid"},P={class:"protocol-header"},x={class:"protocol-title"},S={class:"protocol-sub"},B={class:"protocol-rows"},I={class:"protocol-actions"},M=["onClick"],N=["onClick"],V={key:0,class:"protocol-card empty"},F={__name:"ProtocolCardsSection",props:{protocolTab:{type:String,default:"all"},filteredProtocolCards:{type:Array,default:()=>[]}},emits:["set-tab","create","details","delete"],setup(n,{emit:y}){const m=v("t",b=>b),d=v("tr",b=>b),l=y;return(b,o)=>(c(),i("div",f,[t("div",$,[t("button",{class:r({active:n.protocolTab==="all"}),onClick:o[0]||(o[0]=s=>l("set-tab","all"))},e(a(m)("protocol.tab.all")),3),t("button",{class:r({active:n.protocolTab==="modbus-rtu"}),onClick:o[1]||(o[1]=s=>l("set-tab","modbus-rtu"))},"Modbus RTU",2),t("button",{class:r({active:n.protocolTab==="modbus-ascii"}),onClick:o[2]||(o[2]=s=>l("set-tab","modbus-ascii"))},"Modbus ASCII",2),t("button",{class:r({active:n.protocolTab==="modbus-tcp"}),onClick:o[3]||(o[3]=s=>l("set-tab","modbus-tcp"))},"Modbus TCP",2),t("button",{class:r({active:n.protocolTab==="tcp"}),onClick:o[4]||(o[4]=s=>l("set-tab","tcp"))},"TCP/IP",2),t("button",{class:r({active:n.protocolTab==="custom"}),onClick:o[5]||(o[5]=s=>l("set-tab","custom"))},e(a(m)("protocol.tab.custom")),3)]),t("div",g,[(c(!0),i(C,null,k(n.filteredProtocolCards,s=>(c(),i("div",{key:s.id,class:"protocol-card"},[t("div",P,[t("div",null,[t("div",x,e(s.name),1),t("div",S,e(s.desc||a(d)("暂无描述")),1)]),t("span",{class:r(["badge",s.statusClass])},e(s.statusText),3)]),t("div",B,[(c(!0),i(C,null,k(s.rows,u=>(c(),i("div",{key:u.label,class:"protocol-row"},[t("span",null,e(u.label),1),t("strong",null,e(u.value),1)]))),128))]),t("div",I,[t("button",{class:"btn btn-ghost",onClick:u=>l("details",s)},e(s.source==="custom"?a(d)("配置"):a(d)("查看")),9,M),s.source==="custom"?(c(),i("button",{key:0,class:"icon-btn",onClick:u=>l("delete",s)},[...o[7]||(o[7]=[t("span",{class:"material-symbols-outlined"},"delete",-1)])],8,N)):p("",!0)])]))),128)),n.filteredProtocolCards.length===0?(c(),i("div",V,[o[9]||(o[9]=t("div",{class:"empty-icon"},[t("span",{class:"material-symbols-outlined"},"inventory_2")],-1)),t("h3",null,e(a(d)("暂无协议")),1),t("p",null,e(a(d)("暂无可用协议,可从内置模板创建或新增自定义协议。")),1),t("button",{class:"btn btn-primary",onClick:o[6]||(o[6]=s=>l("create"))},[o[8]||(o[8]=t("span",{class:"material-symbols-outlined"},"add",-1)),T(" "+e(a(m)("action.createProtocol")),1)])])):p("",!0)])]))}};export{F as default}; diff --git a/ui/assets/web/assets/ProtocolDeleteModal-BpFjVLgh.js b/ui/assets/web/assets/ProtocolDeleteModal-BpFjVLgh.js new file mode 100644 index 0000000..9519d50 --- /dev/null +++ b/ui/assets/web/assets/ProtocolDeleteModal-BpFjVLgh.js @@ -0,0 +1 @@ +import{i as m,c as p,b,o as c,a as o,t as e,u as s,h as a}from"./index-Dc1DYgSA.js";const f={class:"modal-header"},k={class:"modal-footer"},y={__name:"ProtocolDeleteModal",props:{open:{type:Boolean,default:!1},deleting:{type:Object,default:null}},emits:["close","confirm"],setup(d,{emit:r}){const n=m("tr",u=>u),l=r;return(u,t)=>d.open?(c(),p("div",{key:0,class:"modal-backdrop",onMousedown:t[5]||(t[5]=a(i=>l("close"),["self"]))},[o("div",{class:"quick-modal quick-modal-sm",onMousedown:t[3]||(t[3]=a(()=>{},["stop"])),onClick:t[4]||(t[4]=a(()=>{},["stop"]))},[o("div",f,[o("div",null,[o("h3",null,e(s(n)("删除协议")),1),o("p",null,e(s(n)("确认删除自定义协议"))+"“"+e(d.deleting?.name)+"”"+e(s(n)("吗?")),1)]),o("button",{class:"icon-btn",type:"button",onClick:t[0]||(t[0]=i=>l("close"))},[...t[6]||(t[6]=[o("span",{class:"material-symbols-outlined"},"close",-1)])])]),o("div",k,[o("button",{class:"btn btn-outline",type:"button",onClick:t[1]||(t[1]=i=>l("close"))},e(s(n)("取消")),1),o("button",{class:"btn btn-danger",type:"button",onClick:t[2]||(t[2]=i=>l("confirm"))},e(s(n)("确认删除")),1)])],32)],32)):b("",!0)}};export{y as default}; diff --git a/ui/assets/web/assets/ProtocolDeleteModal-DSL3yVyk.js b/ui/assets/web/assets/ProtocolDeleteModal-DSL3yVyk.js new file mode 100644 index 0000000..40bab9f --- /dev/null +++ b/ui/assets/web/assets/ProtocolDeleteModal-DSL3yVyk.js @@ -0,0 +1 @@ +import{i as m,c as p,b,o as c,a as o,t as e,u as s,h as a}from"./index-CY12nbn6.js";const f={class:"modal-header"},k={class:"modal-footer"},y={__name:"ProtocolDeleteModal",props:{open:{type:Boolean,default:!1},deleting:{type:Object,default:null}},emits:["close","confirm"],setup(d,{emit:r}){const n=m("tr",u=>u),l=r;return(u,t)=>d.open?(c(),p("div",{key:0,class:"modal-backdrop",onMousedown:t[5]||(t[5]=a(i=>l("close"),["self"]))},[o("div",{class:"quick-modal quick-modal-sm",onMousedown:t[3]||(t[3]=a(()=>{},["stop"])),onClick:t[4]||(t[4]=a(()=>{},["stop"]))},[o("div",f,[o("div",null,[o("h3",null,e(s(n)("删除协议")),1),o("p",null,e(s(n)("确认删除自定义协议"))+"“"+e(d.deleting?.name)+"”"+e(s(n)("吗?")),1)]),o("button",{class:"icon-btn",type:"button",onClick:t[0]||(t[0]=i=>l("close"))},[...t[6]||(t[6]=[o("span",{class:"material-symbols-outlined"},"close",-1)])])]),o("div",k,[o("button",{class:"btn btn-outline",type:"button",onClick:t[1]||(t[1]=i=>l("close"))},e(s(n)("取消")),1),o("button",{class:"btn btn-danger",type:"button",onClick:t[2]||(t[2]=i=>l("confirm"))},e(s(n)("确认删除")),1)])],32)],32)):b("",!0)}};export{y as default}; diff --git a/ui/assets/web/assets/ProtocolEditModal-DeOzd6kz.js b/ui/assets/web/assets/ProtocolEditModal-DeOzd6kz.js new file mode 100644 index 0000000..527e8f0 --- /dev/null +++ b/ui/assets/web/assets/ProtocolEditModal-DeOzd6kz.js @@ -0,0 +1 @@ +import{i as y,c as v,b,o as m,a as t,t as s,u as l,d as i,h as c}from"./index-CY12nbn6.js";const p={class:"modal-header"},k={class:"modal-body protocol-modal-body"},w={class:"form-grid protocol-grid"},x=["value","disabled"],C=["value","disabled"],M={class:"form-grid protocol-grid"},B=["value","disabled"],I={value:"custom"},$=["value","disabled"],j={value:"available"},N={value:"custom"},P={value:"disabled"},V={class:"protocol-textarea"},D=["value","disabled"],E={key:0,class:"modal-section protocol-driver"},O={class:"section-title"},S={class:"form-grid protocol-grid"},T=["value"],q={class:"modal-footer"},A={__name:"ProtocolEditModal",props:{open:{type:Boolean,default:!1},mode:{type:String,default:"create"},draft:{type:Object,default:()=>({})},editing:{type:Object,default:null}},emits:["close","save","update-draft"],setup(o,{emit:g}){const f=y("t",n=>n),d=y("tr",n=>n),u=g;function r(n,e){u("update-draft",{field:n,value:e})}return(n,e)=>o.open?(m(),v("div",{key:0,class:"modal-backdrop",onMousedown:e[10]||(e[10]=c(a=>u("close"),["self"]))},[t("div",{class:"channel-modal protocol-modal",onMousedown:e[8]||(e[8]=c(()=>{},["stop"])),onClick:e[9]||(e[9]=c(()=>{},["stop"]))},[t("div",p,[t("div",null,[t("h3",null,s(o.mode==="create"?l(d)("新建协议"):o.mode==="edit"?l(d)("配置协议"):l(d)("协议详情")),1),t("p",null,s(o.mode==="create"?l(d)("添加自定义协议元数据,供解析引擎识别。"):l(d)("查看或更新协议描述与分类。")),1)]),t("button",{class:"icon-btn",type:"button",onClick:e[0]||(e[0]=a=>u("close"))},[...e[11]||(e[11]=[t("span",{class:"material-symbols-outlined"},"close",-1)])])]),t("div",k,[t("div",w,[t("label",null,[i(s(l(d)("协议名称"))+" ",1),t("input",{value:o.draft.name,type:"text",disabled:o.mode==="view",onInput:e[1]||(e[1]=a=>r("name",a.target.value))},null,40,x)]),t("label",null,[i(s(l(d)("键名"))+" ",1),t("input",{value:o.draft.key,type:"text",disabled:o.mode!=="create",onInput:e[2]||(e[2]=a=>r("key",a.target.value))},null,40,C)])]),t("div",M,[t("label",null,[i(s(l(d)("分类"))+" ",1),t("select",{value:o.draft.category,disabled:o.mode==="view",onChange:e[3]||(e[3]=a=>r("category",a.target.value))},[e[12]||(e[12]=t("option",{value:"modbus"},"Modbus",-1)),e[13]||(e[13]=t("option",{value:"tcp"},"TCP/IP",-1)),t("option",I,s(l(f)("protocol.tab.custom")),1)],40,B)]),t("label",null,[i(s(l(d)("状态"))+" ",1),t("select",{value:o.draft.status,disabled:o.mode==="view",onChange:e[4]||(e[4]=a=>r("status",a.target.value))},[t("option",j,s(l(d)("可用")),1),t("option",N,s(l(f)("protocol.tab.custom")),1),t("option",P,s(l(d)("已禁用")),1)],40,$)])]),t("label",V,[i(s(l(d)("描述"))+" ",1),t("textarea",{value:o.draft.desc,rows:"3",disabled:o.mode==="view",onInput:e[5]||(e[5]=a=>r("desc",a.target.value))},null,40,D)]),o.editing&&o.editing.driver?(m(),v("div",E,[t("div",O,s(l(d)("驱动")),1),t("div",S,[t("label",null,[i(s(l(d)("驱动类"))+" ",1),t("input",{value:o.editing.driver,type:"text",disabled:""},null,8,T)])])])):b("",!0)]),t("div",q,[t("button",{class:"btn btn-outline",type:"button",onClick:e[6]||(e[6]=a=>u("close"))},s(l(d)("取消")),1),o.mode!=="view"?(m(),v("button",{key:0,class:"btn btn-primary",type:"button",onClick:e[7]||(e[7]=a=>u("save"))},s(l(d)("保存")),1)):b("",!0)])],32)],32)):b("",!0)}};export{A as default}; diff --git a/ui/assets/web/assets/ProtocolEditModal-RbcnUl73.js b/ui/assets/web/assets/ProtocolEditModal-RbcnUl73.js new file mode 100644 index 0000000..4654334 --- /dev/null +++ b/ui/assets/web/assets/ProtocolEditModal-RbcnUl73.js @@ -0,0 +1 @@ +import{i as y,c as v,b,o as m,a as t,t as s,u as l,d as i,h as c}from"./index-Dc1DYgSA.js";const p={class:"modal-header"},k={class:"modal-body protocol-modal-body"},w={class:"form-grid protocol-grid"},x=["value","disabled"],C=["value","disabled"],M={class:"form-grid protocol-grid"},B=["value","disabled"],I={value:"custom"},$=["value","disabled"],j={value:"available"},N={value:"custom"},P={value:"disabled"},V={class:"protocol-textarea"},D=["value","disabled"],E={key:0,class:"modal-section protocol-driver"},O={class:"section-title"},S={class:"form-grid protocol-grid"},T=["value"],q={class:"modal-footer"},A={__name:"ProtocolEditModal",props:{open:{type:Boolean,default:!1},mode:{type:String,default:"create"},draft:{type:Object,default:()=>({})},editing:{type:Object,default:null}},emits:["close","save","update-draft"],setup(o,{emit:g}){const f=y("t",n=>n),d=y("tr",n=>n),u=g;function r(n,e){u("update-draft",{field:n,value:e})}return(n,e)=>o.open?(m(),v("div",{key:0,class:"modal-backdrop",onMousedown:e[10]||(e[10]=c(a=>u("close"),["self"]))},[t("div",{class:"channel-modal protocol-modal",onMousedown:e[8]||(e[8]=c(()=>{},["stop"])),onClick:e[9]||(e[9]=c(()=>{},["stop"]))},[t("div",p,[t("div",null,[t("h3",null,s(o.mode==="create"?l(d)("新建协议"):o.mode==="edit"?l(d)("配置协议"):l(d)("协议详情")),1),t("p",null,s(o.mode==="create"?l(d)("添加自定义协议元数据,供解析引擎识别。"):l(d)("查看或更新协议描述与分类。")),1)]),t("button",{class:"icon-btn",type:"button",onClick:e[0]||(e[0]=a=>u("close"))},[...e[11]||(e[11]=[t("span",{class:"material-symbols-outlined"},"close",-1)])])]),t("div",k,[t("div",w,[t("label",null,[i(s(l(d)("协议名称"))+" ",1),t("input",{value:o.draft.name,type:"text",disabled:o.mode==="view",onInput:e[1]||(e[1]=a=>r("name",a.target.value))},null,40,x)]),t("label",null,[i(s(l(d)("键名"))+" ",1),t("input",{value:o.draft.key,type:"text",disabled:o.mode!=="create",onInput:e[2]||(e[2]=a=>r("key",a.target.value))},null,40,C)])]),t("div",M,[t("label",null,[i(s(l(d)("分类"))+" ",1),t("select",{value:o.draft.category,disabled:o.mode==="view",onChange:e[3]||(e[3]=a=>r("category",a.target.value))},[e[12]||(e[12]=t("option",{value:"modbus"},"Modbus",-1)),e[13]||(e[13]=t("option",{value:"tcp"},"TCP/IP",-1)),t("option",I,s(l(f)("protocol.tab.custom")),1)],40,B)]),t("label",null,[i(s(l(d)("状态"))+" ",1),t("select",{value:o.draft.status,disabled:o.mode==="view",onChange:e[4]||(e[4]=a=>r("status",a.target.value))},[t("option",j,s(l(d)("可用")),1),t("option",N,s(l(f)("protocol.tab.custom")),1),t("option",P,s(l(d)("已禁用")),1)],40,$)])]),t("label",V,[i(s(l(d)("描述"))+" ",1),t("textarea",{value:o.draft.desc,rows:"3",disabled:o.mode==="view",onInput:e[5]||(e[5]=a=>r("desc",a.target.value))},null,40,D)]),o.editing&&o.editing.driver?(m(),v("div",E,[t("div",O,s(l(d)("驱动")),1),t("div",S,[t("label",null,[i(s(l(d)("驱动类"))+" ",1),t("input",{value:o.editing.driver,type:"text",disabled:""},null,8,T)])])])):b("",!0)]),t("div",q,[t("button",{class:"btn btn-outline",type:"button",onClick:e[6]||(e[6]=a=>u("close"))},s(l(d)("取消")),1),o.mode!=="view"?(m(),v("button",{key:0,class:"btn btn-primary",type:"button",onClick:e[7]||(e[7]=a=>u("save"))},s(l(d)("保存")),1)):b("",!0)])],32)],32)):b("",!0)}};export{A as default}; diff --git a/ui/assets/web/assets/ProtocolHeader-4VYFv1lh.js b/ui/assets/web/assets/ProtocolHeader-4VYFv1lh.js new file mode 100644 index 0000000..3a478ff --- /dev/null +++ b/ui/assets/web/assets/ProtocolHeader-4VYFv1lh.js @@ -0,0 +1 @@ +import{i as d,c as p,o as u,a as t,t as o,u as a,d as l}from"./index-Dc1DYgSA.js";const m={class:"page-header spaced"},b={class:"header-actions"},k={__name:"ProtocolHeader",emits:["refresh","create"],setup(f,{emit:i}){const s=d("t",n=>n),r=i;return(n,e)=>(u(),p("header",m,[t("div",null,[t("h2",null,o(a(s)("header.protocols.title")),1),t("p",null,o(a(s)("header.protocols.desc")),1)]),t("div",b,[t("button",{class:"btn btn-outline",onClick:e[0]||(e[0]=c=>r("refresh"))},[e[2]||(e[2]=t("span",{class:"material-symbols-outlined"},"refresh",-1)),l(" "+o(a(s)("action.refresh")),1)]),t("button",{class:"btn btn-primary",onClick:e[1]||(e[1]=c=>r("create"))},[e[3]||(e[3]=t("span",{class:"material-symbols-outlined"},"add",-1)),l(" "+o(a(s)("action.createProtocol")),1)])])]))}};export{k as default}; diff --git a/ui/assets/web/assets/ProtocolHeader-CYs6sqHy.js b/ui/assets/web/assets/ProtocolHeader-CYs6sqHy.js new file mode 100644 index 0000000..dd77e9a --- /dev/null +++ b/ui/assets/web/assets/ProtocolHeader-CYs6sqHy.js @@ -0,0 +1 @@ +import{i as d,c as p,o as u,a as t,t as o,u as a,d as l}from"./index-CY12nbn6.js";const m={class:"page-header spaced"},b={class:"header-actions"},k={__name:"ProtocolHeader",emits:["refresh","create"],setup(f,{emit:i}){const s=d("t",n=>n),r=i;return(n,e)=>(u(),p("header",m,[t("div",null,[t("h2",null,o(a(s)("header.protocols.title")),1),t("p",null,o(a(s)("header.protocols.desc")),1)]),t("div",b,[t("button",{class:"btn btn-outline",onClick:e[0]||(e[0]=c=>r("refresh"))},[e[2]||(e[2]=t("span",{class:"material-symbols-outlined"},"refresh",-1)),l(" "+o(a(s)("action.refresh")),1)]),t("button",{class:"btn btn-primary",onClick:e[1]||(e[1]=c=>r("create"))},[e[3]||(e[3]=t("span",{class:"material-symbols-outlined"},"add",-1)),l(" "+o(a(s)("action.createProtocol")),1)])])]))}};export{k as default}; diff --git a/ui/assets/web/assets/ScriptsView-1qSko5pB.js b/ui/assets/web/assets/ScriptsView-1qSko5pB.js new file mode 100644 index 0000000..3b210d2 --- /dev/null +++ b/ui/assets/web/assets/ScriptsView-1qSko5pB.js @@ -0,0 +1 @@ +import{_ as O}from"./LogStream-C7ftHG0R.js";import{i as c,c as L,o as R,a as t,d as e,t as o,u as s,n as d,b as q,j as A,e as G}from"./index-CY12nbn6.js";const H={class:"page"},J={class:"page-header spaced scripts-header"},K={class:"scripts-title"},Q={class:"chip"},U={class:"badge"},W={class:"scripts-path"},X={class:"header-actions"},Z={class:"scripts-grid"},ss={class:"panel editor"},ts={class:"panel-title bar"},ls={class:"panel-actions"},os=["title"],is={class:"material-symbols-outlined"},ns=["title"],es=["title"],as={class:"scripts-side"},ds={class:"panel stack"},rs={class:"panel-title simple"},ps={key:0,class:"pulse"},cs={class:"button-grid"},us=["disabled"],ms=["disabled"],bs={class:"progress-block"},_s={class:"progress-row"},ys={class:"mono"},gs={class:"progress-bar"},vs={class:"progress-stats"},fs={class:"mono"},ks={class:"mono"},Cs={class:"panel log-panel"},Ss={class:"panel-title bar"},hs={class:"panel-actions"},ws=["title"],Ls=["title"],Es={__name:"ScriptsView",setup(Rs){const r=c("t",a=>a),n=c("tr",a=>a),u=c("scriptsView");if(!u)throw new Error("scriptsView bindings not provided");const{scriptFileName:V,scriptFilePath:x,loadYaml:m,saveYaml:b,yamlFileInputRef:E,handleYamlFile:_,yamlCollapsed:p,toggleYamlCollapsed:y,copyYaml:g,searchYaml:v,yamlEditorRef:Y,scriptStatusClass:F,scriptRunning:N,scriptStatusLabel:B,scriptCanRun:f,scriptCanStop:k,runScript:C,stopScript:S,scriptState:I,scriptStepIndex:T,scriptStepTotal:j,scriptProgress:z,scriptElapsedLabel:D,scriptErrorCount:P,clearScriptLogs:h,scrollScriptLogsToBottom:w,renderedScriptLogs:$,scriptLogRef:M}=u;return(a,l)=>(R(),L("section",H,[t("header",J,[t("div",null,[t("h2",K,[e(o(s(r)("header.scripts.title"))+" ",1),t("span",Q,o(s(V)),1),t("span",U,o(s(r)("badge.readOnly")),1)]),t("p",W,o(s(x)),1)]),t("div",X,[t("button",{class:"btn btn-outline",onClick:l[0]||(l[0]=(...i)=>s(m)&&s(m)(...i))},[l[10]||(l[10]=t("span",{class:"material-symbols-outlined"},"folder_open",-1)),e(" "+o(s(r)("action.loadScript")),1)]),t("button",{class:"btn btn-outline",onClick:l[1]||(l[1]=(...i)=>s(b)&&s(b)(...i))},[l[11]||(l[11]=t("span",{class:"material-symbols-outlined"},"save",-1)),e(o(s(n)("保存")),1)])]),t("input",{ref_key:"yamlFileInputRef",ref:E,type:"file",accept:".yaml,.yml,text/yaml",style:{display:"none"},onChange:l[2]||(l[2]=(...i)=>s(_)&&s(_)(...i))},null,544)]),t("div",Z,[t("div",ss,[t("div",ts,[l[14]||(l[14]=t("span",{class:"material-symbols-outlined"},"code",-1)),e(o(s(n)("DSL 编辑器")),1),t("div",ls,[t("button",{class:"icon-btn",title:s(p)?s(n)("展开"):s(n)("收起"),onClick:l[3]||(l[3]=(...i)=>s(y)&&s(y)(...i))},[t("span",is,o(s(p)?"unfold_more":"unfold_less"),1)],8,os),t("button",{class:"icon-btn",title:s(n)("复制"),onClick:l[4]||(l[4]=(...i)=>s(g)&&s(g)(...i))},[...l[12]||(l[12]=[t("span",{class:"material-symbols-outlined"},"content_copy",-1)])],8,ns),t("button",{class:"icon-btn",title:s(n)("搜索"),onClick:l[5]||(l[5]=(...i)=>s(v)&&s(v)(...i))},[...l[13]||(l[13]=[t("span",{class:"material-symbols-outlined"},"search",-1)])],8,es)])]),t("div",{ref_key:"yamlEditorRef",ref:Y,class:d(["code-area",{collapsed:s(p)}])},null,2)]),t("div",as,[t("div",ds,[t("div",rs,o(s(n)("执行控制")),1),t("div",{class:d(["status-pill",s(F)])},[s(N)?(R(),L("span",ps)):q("",!0),e(" "+o(s(B)),1)],2),t("div",cs,[t("button",{class:d(["btn btn-primary",{"btn-muted":!s(f)}]),disabled:!s(f),onClick:l[6]||(l[6]=(...i)=>s(C)&&s(C)(...i))},[l[15]||(l[15]=t("span",{class:"material-symbols-outlined"},"play_arrow",-1)),e(o(s(n)("运行")),1)],10,us),t("button",{class:d(["btn btn-danger",{"btn-muted":!s(k)}]),disabled:!s(k),onClick:l[7]||(l[7]=(...i)=>s(S)&&s(S)(...i))},[l[16]||(l[16]=t("span",{class:"material-symbols-outlined"},"stop",-1)),e(o(s(n)("停止")),1)],10,ms)]),t("div",bs,[t("div",_s,[t("span",null,[e(o(s(n)("当前步骤:")),1),t("strong",null,o(s(I)),1)]),t("span",ys,o(s(T))+"/"+o(s(j)),1)]),t("div",gs,[t("div",{class:"progress",style:A({width:`${Math.min(100,s(z))}%`})},null,4)]),t("div",vs,[t("div",null,[t("span",null,o(s(n)("已用时间")),1),t("strong",fs,o(s(D)),1)]),t("div",null,[t("span",null,o(s(n)("错误数")),1),t("strong",ks,o(s(P)),1)])])])])])]),t("div",Cs,[t("div",Ss,[l[19]||(l[19]=t("span",{class:"material-symbols-outlined"},"terminal",-1)),e(o(s(n)("运行日志")),1),t("div",hs,[t("button",{class:"icon-btn",title:s(n)("清空日志"),onClick:l[8]||(l[8]=(...i)=>s(h)&&s(h)(...i))},[...l[17]||(l[17]=[t("span",{class:"material-symbols-outlined"},"block",-1)])],8,ws),t("button",{class:"icon-btn",title:s(n)("滚动到底部"),onClick:l[9]||(l[9]=(...i)=>s(w)&&s(w)(...i))},[...l[18]||(l[18]=[t("span",{class:"material-symbols-outlined"},"vertical_align_bottom",-1)])],8,Ls)])]),G(O,{ref_key:"scriptLogRef",ref:M,compact:"",mode:"text",items:s($)},null,8,["items"])])]))}};export{Es as default}; diff --git a/ui/assets/web/assets/ScriptsView-CW4YNIup.js b/ui/assets/web/assets/ScriptsView-CW4YNIup.js new file mode 100644 index 0000000..3d183c7 --- /dev/null +++ b/ui/assets/web/assets/ScriptsView-CW4YNIup.js @@ -0,0 +1 @@ +import{_ as O}from"./LogStream-DjhqBYTz.js";import{i as c,c as L,o as R,a as t,d as e,t as o,u as s,n as d,b as q,j as A,e as G}from"./index-Dc1DYgSA.js";const H={class:"page"},J={class:"page-header spaced scripts-header"},K={class:"scripts-title"},Q={class:"chip"},U={class:"badge"},W={class:"scripts-path"},X={class:"header-actions"},Z={class:"scripts-grid"},ss={class:"panel editor"},ts={class:"panel-title bar"},ls={class:"panel-actions"},os=["title"],is={class:"material-symbols-outlined"},ns=["title"],es=["title"],as={class:"scripts-side"},ds={class:"panel stack"},rs={class:"panel-title simple"},ps={key:0,class:"pulse"},cs={class:"button-grid"},us=["disabled"],ms=["disabled"],bs={class:"progress-block"},_s={class:"progress-row"},ys={class:"mono"},gs={class:"progress-bar"},vs={class:"progress-stats"},fs={class:"mono"},ks={class:"mono"},Cs={class:"panel log-panel"},Ss={class:"panel-title bar"},hs={class:"panel-actions"},ws=["title"],Ls=["title"],Es={__name:"ScriptsView",setup(Rs){const r=c("t",a=>a),n=c("tr",a=>a),u=c("scriptsView");if(!u)throw new Error("scriptsView bindings not provided");const{scriptFileName:V,scriptFilePath:x,loadYaml:m,saveYaml:b,yamlFileInputRef:E,handleYamlFile:_,yamlCollapsed:p,toggleYamlCollapsed:y,copyYaml:g,searchYaml:v,yamlEditorRef:Y,scriptStatusClass:F,scriptRunning:N,scriptStatusLabel:B,scriptCanRun:f,scriptCanStop:k,runScript:C,stopScript:S,scriptState:I,scriptStepIndex:T,scriptStepTotal:j,scriptProgress:z,scriptElapsedLabel:D,scriptErrorCount:P,clearScriptLogs:h,scrollScriptLogsToBottom:w,renderedScriptLogs:$,scriptLogRef:M}=u;return(a,l)=>(R(),L("section",H,[t("header",J,[t("div",null,[t("h2",K,[e(o(s(r)("header.scripts.title"))+" ",1),t("span",Q,o(s(V)),1),t("span",U,o(s(r)("badge.readOnly")),1)]),t("p",W,o(s(x)),1)]),t("div",X,[t("button",{class:"btn btn-outline",onClick:l[0]||(l[0]=(...i)=>s(m)&&s(m)(...i))},[l[10]||(l[10]=t("span",{class:"material-symbols-outlined"},"folder_open",-1)),e(" "+o(s(r)("action.loadScript")),1)]),t("button",{class:"btn btn-outline",onClick:l[1]||(l[1]=(...i)=>s(b)&&s(b)(...i))},[l[11]||(l[11]=t("span",{class:"material-symbols-outlined"},"save",-1)),e(o(s(n)("保存")),1)])]),t("input",{ref_key:"yamlFileInputRef",ref:E,type:"file",accept:".yaml,.yml,text/yaml",style:{display:"none"},onChange:l[2]||(l[2]=(...i)=>s(_)&&s(_)(...i))},null,544)]),t("div",Z,[t("div",ss,[t("div",ts,[l[14]||(l[14]=t("span",{class:"material-symbols-outlined"},"code",-1)),e(o(s(n)("DSL 编辑器")),1),t("div",ls,[t("button",{class:"icon-btn",title:s(p)?s(n)("展开"):s(n)("收起"),onClick:l[3]||(l[3]=(...i)=>s(y)&&s(y)(...i))},[t("span",is,o(s(p)?"unfold_more":"unfold_less"),1)],8,os),t("button",{class:"icon-btn",title:s(n)("复制"),onClick:l[4]||(l[4]=(...i)=>s(g)&&s(g)(...i))},[...l[12]||(l[12]=[t("span",{class:"material-symbols-outlined"},"content_copy",-1)])],8,ns),t("button",{class:"icon-btn",title:s(n)("搜索"),onClick:l[5]||(l[5]=(...i)=>s(v)&&s(v)(...i))},[...l[13]||(l[13]=[t("span",{class:"material-symbols-outlined"},"search",-1)])],8,es)])]),t("div",{ref_key:"yamlEditorRef",ref:Y,class:d(["code-area",{collapsed:s(p)}])},null,2)]),t("div",as,[t("div",ds,[t("div",rs,o(s(n)("执行控制")),1),t("div",{class:d(["status-pill",s(F)])},[s(N)?(R(),L("span",ps)):q("",!0),e(" "+o(s(B)),1)],2),t("div",cs,[t("button",{class:d(["btn btn-primary",{"btn-muted":!s(f)}]),disabled:!s(f),onClick:l[6]||(l[6]=(...i)=>s(C)&&s(C)(...i))},[l[15]||(l[15]=t("span",{class:"material-symbols-outlined"},"play_arrow",-1)),e(o(s(n)("运行")),1)],10,us),t("button",{class:d(["btn btn-danger",{"btn-muted":!s(k)}]),disabled:!s(k),onClick:l[7]||(l[7]=(...i)=>s(S)&&s(S)(...i))},[l[16]||(l[16]=t("span",{class:"material-symbols-outlined"},"stop",-1)),e(o(s(n)("停止")),1)],10,ms)]),t("div",bs,[t("div",_s,[t("span",null,[e(o(s(n)("当前步骤:")),1),t("strong",null,o(s(I)),1)]),t("span",ys,o(s(T))+"/"+o(s(j)),1)]),t("div",gs,[t("div",{class:"progress",style:A({width:`${Math.min(100,s(z))}%`})},null,4)]),t("div",vs,[t("div",null,[t("span",null,o(s(n)("已用时间")),1),t("strong",fs,o(s(D)),1)]),t("div",null,[t("span",null,o(s(n)("错误数")),1),t("strong",ks,o(s(P)),1)])])])])])]),t("div",Cs,[t("div",Ss,[l[19]||(l[19]=t("span",{class:"material-symbols-outlined"},"terminal",-1)),e(o(s(n)("运行日志")),1),t("div",hs,[t("button",{class:"icon-btn",title:s(n)("清空日志"),onClick:l[8]||(l[8]=(...i)=>s(h)&&s(h)(...i))},[...l[17]||(l[17]=[t("span",{class:"material-symbols-outlined"},"block",-1)])],8,ws),t("button",{class:"icon-btn",title:s(n)("滚动到底部"),onClick:l[9]||(l[9]=(...i)=>s(w)&&s(w)(...i))},[...l[18]||(l[18]=[t("span",{class:"material-symbols-outlined"},"vertical_align_bottom",-1)])],8,Ls)])]),G(O,{ref_key:"scriptLogRef",ref:M,compact:"",mode:"text",items:s($)},null,8,["items"])])]))}};export{Es as default}; diff --git a/ui/assets/web/assets/SettingsHeader-CRhKwNzV.js b/ui/assets/web/assets/SettingsHeader-CRhKwNzV.js new file mode 100644 index 0000000..3dc615b --- /dev/null +++ b/ui/assets/web/assets/SettingsHeader-CRhKwNzV.js @@ -0,0 +1 @@ +import{i as r,c as m,o as g,a as s,t as e,u as n,d as u}from"./index-Dc1DYgSA.js";const p={class:"page-header spaced"},v={class:"header-actions"},y=["disabled"],f=["disabled"],B={__name:"SettingsHeader",props:{settingsDirty:{type:Boolean,default:!1},settingsSaving:{type:Boolean,default:!1}},emits:["discard","save","open-manual-docs"],setup(o,{emit:c}){const a=r("t",i=>i),b=r("tr",i=>i),l=c;return(i,t)=>(g(),m("header",p,[s("div",null,[s("h2",null,e(n(a)("header.settings.title")),1),s("p",null,e(n(a)("header.settings.desc")),1)]),s("div",v,[s("button",{class:"btn btn-outline",type:"button",onClick:t[0]||(t[0]=d=>l("open-manual-docs"))},[t[3]||(t[3]=s("span",{class:"material-symbols-outlined"},"menu_book",-1)),u(e(n(b)("文档中心")),1)]),s("button",{class:"btn btn-outline",disabled:!o.settingsDirty,onClick:t[1]||(t[1]=d=>l("discard"))},e(n(a)("action.discardChanges")),9,y),s("button",{class:"btn btn-primary",disabled:!o.settingsDirty||o.settingsSaving,onClick:t[2]||(t[2]=d=>l("save"))},[t[4]||(t[4]=s("span",{class:"material-symbols-outlined"},"save",-1)),u(e(n(a)("action.saveChanges")),1)],8,f)])]))}};export{B as default}; diff --git a/ui/assets/web/assets/SettingsHeader-UIDTxUaK.js b/ui/assets/web/assets/SettingsHeader-UIDTxUaK.js new file mode 100644 index 0000000..fbcef29 --- /dev/null +++ b/ui/assets/web/assets/SettingsHeader-UIDTxUaK.js @@ -0,0 +1 @@ +import{i as c,c as b,o as m,a as e,t as n,u as a,d as r}from"./index-CY12nbn6.js";const g={class:"page-header spaced"},p={class:"header-actions"},v=["disabled"],y=["disabled"],k={__name:"SettingsHeader",props:{settingsDirty:{type:Boolean,default:!1},settingsSaving:{type:Boolean,default:!1}},emits:["discard","save","open-manual-docs"],setup(i,{emit:u}){const s=c("t",l=>l),o=u;return(l,t)=>(m(),b("header",g,[e("div",null,[e("h2",null,n(a(s)("header.settings.title")),1),e("p",null,n(a(s)("header.settings.desc")),1)]),e("div",p,[e("button",{class:"btn btn-outline",type:"button",onClick:t[0]||(t[0]=d=>o("open-manual-docs"))},[t[3]||(t[3]=e("span",{class:"material-symbols-outlined"},"menu_book",-1)),r(n(a(s)("action.docsCenter","文档中心")),1)]),e("button",{class:"btn btn-outline",disabled:!i.settingsDirty,onClick:t[1]||(t[1]=d=>o("discard"))},n(a(s)("action.discardChanges")),9,v),e("button",{class:"btn btn-primary",disabled:!i.settingsDirty||i.settingsSaving,onClick:t[2]||(t[2]=d=>o("save"))},[t[4]||(t[4]=e("span",{class:"material-symbols-outlined"},"save",-1)),r(n(a(s)("action.saveChanges")),1)],8,y)])]))}};export{k as default}; diff --git a/ui/assets/web/assets/SettingsPanels-DGYEalpE.js b/ui/assets/web/assets/SettingsPanels-DGYEalpE.js new file mode 100644 index 0000000..3f68a94 --- /dev/null +++ b/ui/assets/web/assets/SettingsPanels-DGYEalpE.js @@ -0,0 +1 @@ +import{_ as T}from"./DropdownSelect-DwmPnboD.js";import{i as O,k as w,l as f,c as d,o as g,a as e,n as r,t as l,u,b as k,d as b,e as I,F as L,r as P}from"./index-CY12nbn6.js";const x={class:"tab-strip secondary"},V={class:"settings-stack"},B={key:0,class:"panel"},F={class:"panel-title simple"},z={class:"form-grid"},N={class:"toggle-row spaced"},_={class:"switch"},D=["checked"],E={key:1,class:"panel"},W={class:"panel-title simple"},R={class:"file-row"},U={class:"section-title"},j={class:"file-row-controls"},M={class:"file-input"},q=["value"],G={class:"file-row"},H={class:"section-title"},J={class:"file-row-controls"},K={class:"file-input"},Q=["value"],X={class:"panel-title simple inline"},Y=["disabled"],Z={class:"plugin-filters"},tt={key:0,class:"plugin-list"},et={class:"plugin-title"},st={class:"plugin-meta"},lt={key:1,class:"empty-state muted"},nt={class:"panel-title simple inline"},at={class:"plugin-filters"},it={key:2,class:"plugin-list"},ot={class:"plugin-title"},ut={class:"plugin-meta"},rt={key:3,class:"empty-state muted"},dt={key:2,class:"panel"},gt={class:"panel-title simple"},vt={class:"empty-state muted"},ct={key:3,class:"panel"},pt={class:"panel-title simple"},bt={class:"empty-state muted"},ft={__name:"SettingsPanels",props:{settingsTab:{type:String,default:"general"},uiLanguage:{type:String,default:""},uiTheme:{type:String,default:""},autoConnectOnStart:{type:Boolean,default:!1},dslWorkspacePath:{type:String,default:""},pluginDirectory:{type:String,default:""},pluginItems:{type:Array,default:()=>[]},protocolItems:{type:Array,default:()=>[]},pluginsRefreshing:{type:Boolean,default:!1},languageOptions:{type:Array,default:()=>[]},themeOptions:{type:Array,default:()=>[]}},emits:["set-tab","choose-dsl-workspace","refresh-plugins","update:uiLanguage","update:uiTheme","update:autoConnectOnStart"],setup(i,{emit:A}){const o=O("t",n=>n),a=(n,t)=>o(n,t),m=i,p=A,v=w("all"),c=w("all"),C=f(()=>Array.isArray(m.pluginItems)?m.pluginItems.map(n=>{const t=String(n?.status||"available").toLowerCase(),s=t==="enabled",y=t==="error";return{id:String(n?.id||n?.name||""),name:String(n?.name||n?.id||"unknown"),version:String(n?.version||""),status:t,statusLabel:s?a("settings.filter.enabled","已启用"):y?a("filter.error","异常"):a("settings.filter.available","可用"),badgeClass:s?"badge-green":y?"badge-yellow":"badge-gray",meta:n?.version?`v${n.version}`:a("settings.meta.unversioned","未标注版本")}}):[]),h=f(()=>v.value==="all"?C.value:C.value.filter(n=>n.status===v.value)),S=f(()=>Array.isArray(m.protocolItems)?m.protocolItems.map(n=>{const t=String(n?.version||""),s=String(n?.category||""),y=s.startsWith("modbus")?"modbus":s==="tcp"?"tcp":"custom";return{id:String(n?.id||n?.key||n?.name||""),name:String(n?.name||n?.id||n?.key||"unknown"),meta:t?`v${t}`:a("settings.meta.unversioned","未标注版本"),statusLabel:a("settings.filter.available","可用"),badgeClass:"badge-blue",category:y}}):[]),$=f(()=>c.value==="all"?S.value:S.value.filter(n=>n.category===c.value));return(n,t)=>(g(),d("div",null,[e("div",x,[e("button",{class:r({active:i.settingsTab==="general"}),onClick:t[0]||(t[0]=s=>p("set-tab","general"))},l(u(o)("settings.tab.general")),3),e("button",{class:r({active:i.settingsTab==="plugins"}),onClick:t[1]||(t[1]=s=>p("set-tab","plugins"))},l(u(o)("settings.tab.plugins")),3),e("button",{class:r({active:i.settingsTab==="runtime"}),onClick:t[2]||(t[2]=s=>p("set-tab","runtime"))},l(u(o)("settings.tab.runtime")),3),e("button",{class:r({active:i.settingsTab==="logs"}),onClick:t[3]||(t[3]=s=>p("set-tab","logs"))},l(u(o)("settings.tab.logs")),3)]),e("div",V,[i.settingsTab==="general"?(g(),d("div",B,[e("div",F,[t[17]||(t[17]=e("span",{class:"material-symbols-outlined"},"tune",-1)),b(l(u(o)("settings.tab.general")),1)]),e("div",z,[e("label",null,[b(l(u(o)("settings.language"))+" ",1),I(T,{"model-value":i.uiLanguage,options:i.languageOptions,"onUpdate:modelValue":t[4]||(t[4]=s=>p("update:uiLanguage",s))},null,8,["model-value","options"])]),e("label",null,[b(l(u(o)("settings.theme"))+" ",1),I(T,{"model-value":i.uiTheme,options:i.themeOptions,"onUpdate:modelValue":t[5]||(t[5]=s=>p("update:uiTheme",s))},null,8,["model-value","options"])])]),e("div",N,[e("div",null,[e("strong",null,l(u(o)("settings.autoConnect.title")),1),e("p",null,l(u(o)("settings.autoConnect.desc")),1)]),e("label",_,[e("input",{checked:i.autoConnectOnStart,type:"checkbox",onChange:t[6]||(t[6]=s=>p("update:autoConnectOnStart",s.target.checked))},null,40,D),t[18]||(t[18]=e("span",null,null,-1))])])])):k("",!0),i.settingsTab==="plugins"?(g(),d("div",E,[e("div",W,[t[19]||(t[19]=e("span",{class:"material-symbols-outlined"},"extension",-1)),b(l(u(o)("settings.tab.plugins")),1)]),e("div",R,[e("span",U,l(u(o)("settings.workspace")),1),e("div",j,[e("div",M,[t[20]||(t[20]=e("span",{class:"material-symbols-outlined"},"folder_open",-1)),e("input",{value:i.dslWorkspacePath,type:"text",readonly:""},null,8,q)]),e("button",{class:"btn btn-outline",type:"button",onClick:t[7]||(t[7]=s=>p("choose-dsl-workspace"))},l(u(o)("settings.chooseFolder")),1)])]),e("div",G,[e("span",H,l(a("settings.plugins.directory","插件目录")),1),e("div",J,[e("div",K,[t[21]||(t[21]=e("span",{class:"material-symbols-outlined"},"folder_open",-1)),e("input",{value:i.pluginDirectory,type:"text",readonly:""},null,8,Q)])])]),t[23]||(t[23]=e("div",{class:"divider"},null,-1)),e("div",X,[b(l(u(o)("settings.plugins.title"))+" ",1),e("button",{class:"link-btn",type:"button",disabled:i.pluginsRefreshing,onClick:t[8]||(t[8]=s=>p("refresh-plugins"))},[t[22]||(t[22]=e("span",{class:"material-symbols-outlined"},"refresh",-1)),b(" "+l(u(o)("settings.plugins.refresh")),1)],8,Y)]),e("div",Z,[e("button",{class:r({active:v.value==="all"}),onClick:t[9]||(t[9]=s=>v.value="all")},l(a("filter.all","全部")),3),e("button",{class:r({active:v.value==="enabled"}),onClick:t[10]||(t[10]=s=>v.value="enabled")},l(a("settings.filter.enabled","已启用")),3),e("button",{class:r({active:v.value==="available"}),onClick:t[11]||(t[11]=s=>v.value="available")},l(a("settings.filter.available","可用")),3),e("button",{class:r({active:v.value==="error"}),onClick:t[12]||(t[12]=s=>v.value="error")},l(a("filter.error","异常")),3)]),h.value.length?(g(),d("div",tt,[(g(!0),d(L,null,P(h.value,s=>(g(),d("div",{key:s.id,class:"plugin-item"},[e("div",null,[e("div",et,l(s.name),1),e("div",st,l(s.meta),1)]),e("span",{class:r(["badge",s.badgeClass])},l(s.statusLabel),3)]))),128))])):(g(),d("div",lt,l(C.value.length?a("settings.empty.filtered","当前筛选无结果"):a("settings.empty.noPlugins","未发现可用插件")),1)),t[24]||(t[24]=e("div",{class:"divider"},null,-1)),e("div",nt,l(a("settings.protocols.title","协议包")),1),e("div",at,[e("button",{class:r({active:c.value==="all"}),onClick:t[13]||(t[13]=s=>c.value="all")},l(a("filter.all","全部")),3),e("button",{class:r({active:c.value==="modbus"}),onClick:t[14]||(t[14]=s=>c.value="modbus")},"Modbus",2),e("button",{class:r({active:c.value==="tcp"}),onClick:t[15]||(t[15]=s=>c.value="tcp")},"TCP",2),e("button",{class:r({active:c.value==="custom"}),onClick:t[16]||(t[16]=s=>c.value="custom")},l(a("protocol.tab.custom","自定义")),3)]),$.value.length?(g(),d("div",it,[(g(!0),d(L,null,P($.value,s=>(g(),d("div",{key:s.id,class:"plugin-item"},[e("div",null,[e("div",ot,l(s.name),1),e("div",ut,l(s.meta),1)]),e("span",{class:r(["badge",s.badgeClass])},l(s.statusLabel),3)]))),128))])):(g(),d("div",rt,l(S.value.length?a("settings.empty.filtered","当前筛选无结果"):a("settings.empty.noProtocols","未发现可用协议包")),1))])):k("",!0),i.settingsTab==="runtime"?(g(),d("div",dt,[e("div",gt,[t[25]||(t[25]=e("span",{class:"material-symbols-outlined"},"tune",-1)),b(l(u(o)("settings.tab.runtime")),1)]),e("div",vt,l(a("settings.runtime.placeholder","暂无可配置项,运行时设置将随着模块扩展开放。")),1)])):k("",!0),i.settingsTab==="logs"?(g(),d("div",ct,[e("div",pt,[t[26]||(t[26]=e("span",{class:"material-symbols-outlined"},"folder_open",-1)),b(l(u(o)("settings.tab.logs")),1)]),e("div",bt,l(a("settings.logs.placeholder","日志采集与归档策略将在后续版本中提供。")),1)])):k("",!0)])]))}};export{ft as default}; diff --git a/ui/assets/web/assets/SettingsPanels-EL5jW2Q-.js b/ui/assets/web/assets/SettingsPanels-EL5jW2Q-.js new file mode 100644 index 0000000..58e47a4 --- /dev/null +++ b/ui/assets/web/assets/SettingsPanels-EL5jW2Q-.js @@ -0,0 +1 @@ +import{_ as b}from"./DropdownSelect-C0USmkt8.js";import{i as v,c as g,o as r,a as t,n as p,t as n,u as e,b as m,d,e as y}from"./index-Dc1DYgSA.js";const f={class:"tab-strip secondary"},h={class:"settings-stack"},C={key:0,class:"panel"},T={class:"panel-title simple"},S={class:"form-grid"},O={class:"toggle-row spaced"},_={class:"switch"},w=["checked"],x={key:1,class:"panel"},V={class:"panel-title simple"},$={class:"file-row"},B={class:"file-input"},L=["value"],N={class:"panel-title simple inline"},P=["title"],U={class:"plugin-list"},A={class:"plugin-item"},M={class:"plugin-meta"},W={class:"badge badge-green"},j={class:"plugin-item muted"},z={class:"plugin-title"},D={class:"plugin-meta"},E={class:"badge badge-gray"},F={class:"toggle-row spaced"},Q={class:"switch"},R=["checked"],q={key:2,class:"panel"},G={class:"panel-title simple"},H={class:"empty-state muted"},I={key:3,class:"panel"},J={class:"panel-title simple"},K={class:"empty-state muted"},Z={__name:"SettingsPanels",props:{settingsTab:{type:String,default:"general"},uiLanguage:{type:String,default:""},uiTheme:{type:String,default:""},autoConnectOnStart:{type:Boolean,default:!1},dslWorkspacePath:{type:String,default:""},languageOptions:{type:Array,default:()=>[]},themeOptions:{type:Array,default:()=>[]}},emits:["set-tab","choose-dsl-workspace","update:uiLanguage","update:uiTheme","update:autoConnectOnStart"],setup(i,{emit:k}){const l=v("t",c=>c),u=v("tr",c=>c),o=k;return(c,s)=>(r(),g("div",null,[t("div",f,[t("button",{class:p({active:i.settingsTab==="general"}),onClick:s[0]||(s[0]=a=>o("set-tab","general"))},n(e(l)("settings.tab.general")),3),t("button",{class:p({active:i.settingsTab==="plugins"}),onClick:s[1]||(s[1]=a=>o("set-tab","plugins"))},n(e(l)("settings.tab.plugins")),3),t("button",{class:p({active:i.settingsTab==="runtime"}),onClick:s[2]||(s[2]=a=>o("set-tab","runtime"))},n(e(l)("settings.tab.runtime")),3),t("button",{class:p({active:i.settingsTab==="logs"}),onClick:s[3]||(s[3]=a=>o("set-tab","logs"))},n(e(l)("settings.tab.logs")),3)]),t("div",h,[i.settingsTab==="general"?(r(),g("div",C,[t("div",T,[s[9]||(s[9]=t("span",{class:"material-symbols-outlined"},"tune",-1)),d(n(e(l)("settings.tab.general")),1)]),t("div",S,[t("label",null,[d(n(e(l)("settings.language"))+" ",1),y(b,{"model-value":i.uiLanguage,options:i.languageOptions,"onUpdate:modelValue":s[4]||(s[4]=a=>o("update:uiLanguage",a))},null,8,["model-value","options"])]),t("label",null,[d(n(e(l)("settings.theme"))+" ",1),y(b,{"model-value":i.uiTheme,options:i.themeOptions,"onUpdate:modelValue":s[5]||(s[5]=a=>o("update:uiTheme",a))},null,8,["model-value","options"])])]),t("div",O,[t("div",null,[t("strong",null,n(e(l)("settings.autoConnect.title")),1),t("p",null,n(e(l)("settings.autoConnect.desc")),1)]),t("label",_,[t("input",{checked:i.autoConnectOnStart,type:"checkbox",onChange:s[6]||(s[6]=a=>o("update:autoConnectOnStart",a.target.checked))},null,40,w),s[10]||(s[10]=t("span",null,null,-1))])])])):m("",!0),i.settingsTab==="plugins"?(r(),g("div",x,[t("div",V,[s[11]||(s[11]=t("span",{class:"material-symbols-outlined"},"extension",-1)),d(n(e(l)("settings.tab.plugins")),1)]),t("label",$,[d(n(e(l)("settings.workspace"))+" ",1),t("div",B,[s[12]||(s[12]=t("span",{class:"material-symbols-outlined"},"folder_open",-1)),t("input",{value:i.dslWorkspacePath,type:"text",readonly:""},null,8,L)]),t("button",{class:"btn btn-outline",type:"button",onClick:s[7]||(s[7]=a=>o("choose-dsl-workspace"))},n(e(l)("settings.chooseFolder")),1)]),s[16]||(s[16]=t("div",{class:"divider"},null,-1)),t("div",N,[d(n(e(l)("settings.plugins.title"))+" ",1),t("button",{class:"link-btn",type:"button",disabled:"",title:e(u)("鎻掍欢甯傚満鍒锋柊鑳藉姏灏嗗湪鍚庣画鐗堟湰鎻愪緵")},[s[13]||(s[13]=t("span",{class:"material-symbols-outlined"},"refresh",-1)),d(" "+n(e(l)("settings.plugins.refresh")),1)],8,P)]),t("div",U,[t("div",A,[t("div",null,[s[14]||(s[14]=t("div",{class:"plugin-title"},"Modbus TCP/RTU",-1)),t("div",M,n(e(u)("v1.2.4 - 已启用")),1)]),t("span",W,n(e(u)("已启用")),1)]),t("div",j,[t("div",null,[t("div",z,n(e(u)("MQTT 适配器")),1),t("div",D,n(e(u)("v0.9.8 - 未安装")),1)]),t("span",E,n(e(u)("未安装")),1)])]),t("div",F,[t("div",null,[t("strong",null,n(e(l)("settings.autoConnect.title")),1),t("p",null,n(e(l)("settings.autoConnect.desc")),1)]),t("label",Q,[t("input",{checked:i.autoConnectOnStart,type:"checkbox",onChange:s[8]||(s[8]=a=>o("update:autoConnectOnStart",a.target.checked))},null,40,R),s[15]||(s[15]=t("span",null,null,-1))])])])):m("",!0),i.settingsTab==="runtime"?(r(),g("div",q,[t("div",G,[s[17]||(s[17]=t("span",{class:"material-symbols-outlined"},"tune",-1)),d(n(e(l)("settings.tab.runtime")),1)]),t("div",H,n(e(u)("暂无可配置项,运行时设置将随着模块扩展开放。")),1)])):m("",!0),i.settingsTab==="logs"?(r(),g("div",I,[t("div",J,[s[18]||(s[18]=t("span",{class:"material-symbols-outlined"},"folder_open",-1)),d(n(e(l)("settings.tab.logs")),1)]),t("div",K,n(e(u)("日志采集与归档策略将在后续版本中提供。")),1)])):m("",!0)])]))}};export{Z as default}; diff --git a/ui/assets/web/assets/UiYamlPreviewModal-C52QIjor.js b/ui/assets/web/assets/UiYamlPreviewModal-C52QIjor.js new file mode 100644 index 0000000..9a8ba93 --- /dev/null +++ b/ui/assets/web/assets/UiYamlPreviewModal-C52QIjor.js @@ -0,0 +1,2 @@ +import{y as c,l as C,c as d,o as i,b as x,a as l,z as w,t as o,n as _,F as j,r as L,i as I,u as y,A as U,x as P,B as p,e as W,h as V}from"./index-Dc1DYgSA.js";const M={class:"bg-white rounded-xl border border-slate-200 shadow-sm overflow-hidden"},O={key:0,class:"px-6 py-4 border-b border-slate-100 bg-slate-50/50 flex items-center justify-between"},R={class:"flex items-center gap-2"},A={class:"font-bold text-slate-700 text-sm"},z={class:"p-6"},J=c({__name:"PanelCard",props:{title:{},badgeText:{},badgeTone:{}},setup(e){const s=e,t=C(()=>{const n=s.badgeTone||"blue";return{blue:"bg-blue-100 text-blue-700",emerald:"bg-emerald-100 text-emerald-700",slate:"bg-slate-100 text-slate-600",rose:"bg-rose-100 text-rose-700"}[n]});return(n,m)=>(i(),d("section",M,[e.title?(i(),d("div",O,[l("div",R,[l("h3",A,o(e.title),1),e.badgeText?(i(),d("span",{key:0,class:_([t.value,"text-[10px] px-2 py-0.5 rounded font-bold"])},o(e.badgeText),3)):x("",!0)]),w(n.$slots,"headerExtra")])):x("",!0),l("div",z,[w(n.$slots,"default")])]))}}),D=c({__name:"SplitContainer",props:{orientation:{}},setup(e){return(s,t)=>(i(),d("div",{class:_(["flex gap-4",e.orientation==="vertical"?"flex-col":"flex-row"])},[w(s.$slots,"default")],2))}}),F={class:"space-y-2 block"},G={class:"text-xs font-bold text-slate-500"},Y=["placeholder","disabled","value"],q=c({__name:"TextInput",props:{label:{},modelValue:{},disabled:{type:Boolean},hint:{}},emits:["update:modelValue"],setup(e){return(s,t)=>(i(),d("label",F,[l("span",G,o(e.label),1),l("input",{class:"w-full h-10 px-3 rounded-lg border-slate-200 text-sm focus:border-primary focus:ring-4 focus:ring-primary/10 transition-all",type:"text",placeholder:e.hint,disabled:e.disabled,value:e.modelValue??"",onInput:t[0]||(t[0]=n=>s.$emit("update:modelValue",n.target.value))},null,40,Y)]))}}),H={class:"space-y-2 block"},K={class:"text-xs font-bold text-slate-500"},Q=["placeholder","disabled","value"],X=c({__name:"NumberInput",props:{label:{},modelValue:{},disabled:{type:Boolean},hint:{}},emits:["update:modelValue"],setup(e){return(s,t)=>(i(),d("label",H,[l("span",K,o(e.label),1),l("input",{class:"w-full h-10 px-3 rounded-lg border-slate-200 text-sm focus:border-primary focus:ring-4 focus:ring-primary/10",type:"number",placeholder:e.hint,disabled:e.disabled,value:e.modelValue,onInput:t[0]||(t[0]=n=>s.$emit("update:modelValue",Number(n.target.value)))},null,40,Q)]))}}),Z={class:"flex items-center justify-between p-3 bg-slate-50 rounded-lg"},ee={class:"text-sm font-medium text-slate-700"},te=["disabled"],se=c({__name:"SwitchInput",props:{label:{},modelValue:{type:Boolean},disabled:{type:Boolean},hint:{}},emits:["update:modelValue"],setup(e){return(s,t)=>(i(),d("div",Z,[l("label",ee,o(e.label),1),l("button",{class:_(["relative inline-flex h-6 w-11 items-center rounded-full transition",e.modelValue?"bg-primary":"bg-slate-300"]),disabled:e.disabled,onClick:t[0]||(t[0]=n=>s.$emit("update:modelValue",!e.modelValue))},[l("span",{class:_(["inline-block h-4 w-4 transform rounded-full bg-white transition",e.modelValue?"translate-x-6":"translate-x-1"])},null,2)],10,te)]))}}),le={class:"space-y-2 block"},ne={class:"text-xs font-bold text-slate-500"},oe=["placeholder","disabled","value"],ae=c({__name:"TextareaInput",props:{label:{},modelValue:{},disabled:{type:Boolean},hint:{}},emits:["update:modelValue"],setup(e){return(s,t)=>(i(),d("label",le,[l("span",ne,o(e.label),1),l("textarea",{class:"w-full p-3 rounded-lg border-slate-200 text-sm focus:border-primary focus:ring-4 focus:ring-primary/10",rows:"3",placeholder:e.hint,disabled:e.disabled,value:e.modelValue,onInput:t[0]||(t[0]=n=>s.$emit("update:modelValue",n.target.value))},null,40,oe)]))}}),re={class:"space-y-2 block"},ie={class:"text-xs font-bold text-slate-500"},de=["disabled","value"],ue=["value"],ce=c({__name:"SelectInput",props:{label:{},modelValue:{},options:{},disabled:{type:Boolean},hint:{}},emits:["update:modelValue"],setup(e){return(s,t)=>(i(),d("label",re,[l("span",ie,o(e.label),1),l("select",{class:"w-full h-10 px-3 rounded-lg border-slate-200 text-sm bg-slate-50",disabled:e.disabled,value:e.modelValue,onChange:t[0]||(t[0]=n=>s.$emit("update:modelValue",n.target.value))},[(i(!0),d(j,null,L(e.options,n=>(i(),d("option",{key:n.value,value:n.value},o(n.label),9,ue))),128))],40,de)]))}}),me=c({__name:"PrimaryButton",emits:["click"],setup(e){return(s,t)=>(i(),d("button",{class:"w-full py-2.5 bg-primary text-white font-bold text-sm rounded-lg hover:bg-blue-700 transition-all shadow-sm",onClick:t[0]||(t[0]=n=>s.$emit("click"))},[w(s.$slots,"default")]))}});async function B(e){if(!e)return!0;try{if(navigator.clipboard&&navigator.clipboard.writeText)return await navigator.clipboard.writeText(e),!0}catch{}try{const s=document.createElement("textarea");s.value=e,s.setAttribute("readonly","true"),s.style.position="fixed",s.style.opacity="0",s.style.pointerEvents="none",s.style.left="-9999px",document.body.appendChild(s),s.focus(),s.select();const t=document.execCommand("copy");return document.body.removeChild(s),t}catch{return!1}}const pe={class:"bg-slate-900 rounded-xl p-6 text-slate-300"},be={class:"flex items-center justify-between mb-3"},fe={class:"flex items-center gap-2"},ye={class:"text-sm font-bold text-white"},ge={class:"text-[10px] font-mono leading-relaxed bg-slate-800/50 p-3 rounded-lg border border-slate-700"},xe=c({__name:"EventLogPanel",props:{title:{},value:{}},setup(e){const s=e,t=C(()=>{if(typeof s.value=="string")return s.value;try{return JSON.stringify(s.value,null,2)}catch{return String(s.value)}});async function n(){await B(t.value)}return(m,a)=>(i(),d("div",pe,[l("div",be,[l("div",fe,[a[0]||(a[0]=l("span",{class:"material-symbols-outlined text-primary"},"terminal",-1)),l("h4",ye,o(e.title),1)]),l("button",{class:"text-xs text-slate-400 hover:text-white",onClick:n},"Copy")]),l("pre",ge,o(t.value),1)]))}}),he={class:"bg-white rounded-xl border border-slate-200 shadow-sm p-5"},ve={class:"flex items-center justify-between mb-3"},$e={class:"text-sm font-bold text-slate-700"},we={class:"text-[10px] font-mono leading-relaxed bg-slate-50 p-3 rounded-lg border border-slate-200 text-slate-600 min-h-[160px]"},_e=c({__name:"InspectorJSON",props:{title:{},value:{}},setup(e){const s=e,t=I("tr",a=>a),n=C(()=>{if(s.value==null)return t("未选择任何组件");try{return JSON.stringify(s.value,null,2)}catch{return String(s.value)}});async function m(){await B(n.value)}return(a,b)=>(i(),d("div",he,[l("div",ve,[l("h3",$e,o(e.title),1),l("button",{class:"text-xs text-slate-400 hover:text-slate-600",onClick:m},o(y(t)("Copy")),1)]),l("pre",we,""+o(n.value)+` + `,1)]))}}),ke={class:"border border-dashed border-slate-300 bg-slate-50 rounded-lg p-4 text-xs text-slate-500"},Ve=c({__name:"UnknownWidget",props:{widgetId:{},widgetType:{}},setup(e){return(s,t)=>(i(),d("div",ke,[t[0]||(t[0]=l("div",{class:"font-bold text-slate-700"},"Unknown Widget",-1)),l("div",null,"ID: "+o(e.widgetId),1),l("div",null,"Type: "+o(e.widgetType),1)]))}}),Ce={"input.text":q,"input.number":X,"input.switch":se,"input.textarea":ae,"input.select":ce,"action.button":me,"log.viewer":xe,"inspector.json":_e};function Ie(e){return Ce[e]||Ve}const Be=c({__name:"LayoutRenderer",props:{config:{},widgetsById:{}},setup(e){const s=e,t=U(),n=I("tr",a=>a),m=c({name:"LayoutNodeRenderer",props:{node:{type:Object,required:!0}},setup(a){return()=>{const b=a.node;return b.type==="split"?p(D,{orientation:b.orientation},{default:()=>b.children.map(k=>p(m,{node:k}))}):p(J,{title:b.title},{default:()=>b.widgets.map(k=>{const r=s.widgetsById[k];if(!r)return null;const h=Ie(r.type),T=r.type.startsWith("input."),E=r.type.startsWith("action."),S=r.type==="log.viewer",N=t.getInputValue(r.id,r.props?.default),v=["rounded-lg","p-2","transition","cursor-pointer",t.selectedWidgetId===r.id?"ring-2 ring-primary/40":"hover:bg-slate-50"].filter(Boolean).join(" "),$=()=>t.selectWidget(r.id),u={...r.props||{}},f={...u,label:u.label?n(u.label):u.label,title:u.title?n(u.title):u.title,hint:u.hint?n(u.hint):u.hint,placeholder:u.placeholder?n(u.placeholder):u.placeholder};if(S){const g=r.bind?t.dataBus[r.bind]||[]:[];return p("div",{class:v,onClick:$},[p(h,{...f,title:f.title||r.id,value:g.slice(-50)})])}return E?p("div",{class:v,onClick:$},[p(h,{...f,onClick:()=>{if(r.type==="action.button"){const g=r.props?.payload||{source:r.id};t.dispatchEvent({emit:r.emit||"action.unknown",payload:g,source:r.id})}}},{default:()=>f.label||n("动作")})]):T?p("div",{class:v,onClick:$},[p(h,{...f,modelValue:N,"onUpdate:modelValue":g=>t.setInputValue(r.id,g,r.bind)})]):p("div",{class:v,onClick:$},[p(h,{...f,widgetId:r.id,widgetType:r.type})])})})}}});return(a,b)=>(i(),P(y(m),{node:e.config.ui.layout},null,8,["node"]))}}),Te={class:"modal-header"},Ee={class:"modal-body ui-yaml-body"},Se={key:0,class:"ui-yaml-error"},Ne={key:0,class:"muted"},je={key:1,class:"muted"},Le={key:1},Ue={key:2,class:"empty-state muted"},We={__name:"UiYamlPreviewModal",props:{open:{type:Boolean,default:!1},runtime:{type:Object,default:()=>({})}},emits:["close"],setup(e,{emit:s}){const t=I("tr",m=>m),n=s;return(m,a)=>e.open?(i(),d("div",{key:0,class:"modal-backdrop",onMousedown:a[3]||(a[3]=V(b=>n("close"),["self"]))},[l("div",{class:"channel-modal ui-yaml-modal",onMousedown:a[1]||(a[1]=V(()=>{},["stop"])),onClick:a[2]||(a[2]=V(()=>{},["stop"]))},[l("div",Te,[l("div",null,[l("h3",null,o(y(t)("UI YAML 预览")),1),l("p",null,o(y(t)("脚本运行中展示 UI 渲染结果")),1)]),l("button",{class:"icon-btn",type:"button",onClick:a[0]||(a[0]=b=>n("close"))},[...a[4]||(a[4]=[l("span",{class:"material-symbols-outlined"},"close",-1)])])]),l("div",Ee,[e.runtime.parseError?(i(),d("div",Se,[l("strong",null,o(y(t)("解析失败")),1),l("div",null,o(e.runtime.parseError.message),1),e.runtime.parseError.path?(i(),d("div",Ne,"Path: "+o(e.runtime.parseError.path),1)):x("",!0),e.runtime.parseError.line?(i(),d("div",je," Line "+o(e.runtime.parseError.line)+", Column "+o(e.runtime.parseError.column||0),1)):x("",!0)])):e.runtime.lastGoodConfig?(i(),d("div",Le,[W(Be,{config:e.runtime.lastGoodConfig,widgetsById:e.runtime.widgetsById},null,8,["config","widgetsById"])])):(i(),d("div",Ue,o(y(t)("暂无可渲染的 UI 配置")),1))])],32)],32)):x("",!0)}};export{We as default}; diff --git a/ui/assets/web/assets/UiYamlPreviewModal-Ds7DIyOM.js b/ui/assets/web/assets/UiYamlPreviewModal-Ds7DIyOM.js new file mode 100644 index 0000000..15efa34 --- /dev/null +++ b/ui/assets/web/assets/UiYamlPreviewModal-Ds7DIyOM.js @@ -0,0 +1,2 @@ +import{y as c,l as C,c as d,o as i,b as x,a as l,z as w,t as o,n as _,F as j,r as L,i as I,u as y,A as U,x as P,B as p,e as W,h as V}from"./index-CY12nbn6.js";const M={class:"bg-white rounded-xl border border-slate-200 shadow-sm overflow-hidden"},O={key:0,class:"px-6 py-4 border-b border-slate-100 bg-slate-50/50 flex items-center justify-between"},R={class:"flex items-center gap-2"},A={class:"font-bold text-slate-700 text-sm"},z={class:"p-6"},J=c({__name:"PanelCard",props:{title:{},badgeText:{},badgeTone:{}},setup(e){const s=e,t=C(()=>{const n=s.badgeTone||"blue";return{blue:"bg-blue-100 text-blue-700",emerald:"bg-emerald-100 text-emerald-700",slate:"bg-slate-100 text-slate-600",rose:"bg-rose-100 text-rose-700"}[n]});return(n,m)=>(i(),d("section",M,[e.title?(i(),d("div",O,[l("div",R,[l("h3",A,o(e.title),1),e.badgeText?(i(),d("span",{key:0,class:_([t.value,"text-[10px] px-2 py-0.5 rounded font-bold"])},o(e.badgeText),3)):x("",!0)]),w(n.$slots,"headerExtra")])):x("",!0),l("div",z,[w(n.$slots,"default")])]))}}),D=c({__name:"SplitContainer",props:{orientation:{}},setup(e){return(s,t)=>(i(),d("div",{class:_(["flex gap-4",e.orientation==="vertical"?"flex-col":"flex-row"])},[w(s.$slots,"default")],2))}}),F={class:"space-y-2 block"},G={class:"text-xs font-bold text-slate-500"},Y=["placeholder","disabled","value"],q=c({__name:"TextInput",props:{label:{},modelValue:{},disabled:{type:Boolean},hint:{}},emits:["update:modelValue"],setup(e){return(s,t)=>(i(),d("label",F,[l("span",G,o(e.label),1),l("input",{class:"w-full h-10 px-3 rounded-lg border-slate-200 text-sm focus:border-primary focus:ring-4 focus:ring-primary/10 transition-all",type:"text",placeholder:e.hint,disabled:e.disabled,value:e.modelValue??"",onInput:t[0]||(t[0]=n=>s.$emit("update:modelValue",n.target.value))},null,40,Y)]))}}),H={class:"space-y-2 block"},K={class:"text-xs font-bold text-slate-500"},Q=["placeholder","disabled","value"],X=c({__name:"NumberInput",props:{label:{},modelValue:{},disabled:{type:Boolean},hint:{}},emits:["update:modelValue"],setup(e){return(s,t)=>(i(),d("label",H,[l("span",K,o(e.label),1),l("input",{class:"w-full h-10 px-3 rounded-lg border-slate-200 text-sm focus:border-primary focus:ring-4 focus:ring-primary/10",type:"number",placeholder:e.hint,disabled:e.disabled,value:e.modelValue,onInput:t[0]||(t[0]=n=>s.$emit("update:modelValue",Number(n.target.value)))},null,40,Q)]))}}),Z={class:"flex items-center justify-between p-3 bg-slate-50 rounded-lg"},ee={class:"text-sm font-medium text-slate-700"},te=["disabled"],se=c({__name:"SwitchInput",props:{label:{},modelValue:{type:Boolean},disabled:{type:Boolean},hint:{}},emits:["update:modelValue"],setup(e){return(s,t)=>(i(),d("div",Z,[l("label",ee,o(e.label),1),l("button",{class:_(["relative inline-flex h-6 w-11 items-center rounded-full transition",e.modelValue?"bg-primary":"bg-slate-300"]),disabled:e.disabled,onClick:t[0]||(t[0]=n=>s.$emit("update:modelValue",!e.modelValue))},[l("span",{class:_(["inline-block h-4 w-4 transform rounded-full bg-white transition",e.modelValue?"translate-x-6":"translate-x-1"])},null,2)],10,te)]))}}),le={class:"space-y-2 block"},ne={class:"text-xs font-bold text-slate-500"},oe=["placeholder","disabled","value"],ae=c({__name:"TextareaInput",props:{label:{},modelValue:{},disabled:{type:Boolean},hint:{}},emits:["update:modelValue"],setup(e){return(s,t)=>(i(),d("label",le,[l("span",ne,o(e.label),1),l("textarea",{class:"w-full p-3 rounded-lg border-slate-200 text-sm focus:border-primary focus:ring-4 focus:ring-primary/10",rows:"3",placeholder:e.hint,disabled:e.disabled,value:e.modelValue,onInput:t[0]||(t[0]=n=>s.$emit("update:modelValue",n.target.value))},null,40,oe)]))}}),re={class:"space-y-2 block"},ie={class:"text-xs font-bold text-slate-500"},de=["disabled","value"],ue=["value"],ce=c({__name:"SelectInput",props:{label:{},modelValue:{},options:{},disabled:{type:Boolean},hint:{}},emits:["update:modelValue"],setup(e){return(s,t)=>(i(),d("label",re,[l("span",ie,o(e.label),1),l("select",{class:"w-full h-10 px-3 rounded-lg border-slate-200 text-sm bg-slate-50",disabled:e.disabled,value:e.modelValue,onChange:t[0]||(t[0]=n=>s.$emit("update:modelValue",n.target.value))},[(i(!0),d(j,null,L(e.options,n=>(i(),d("option",{key:n.value,value:n.value},o(n.label),9,ue))),128))],40,de)]))}}),me=c({__name:"PrimaryButton",emits:["click"],setup(e){return(s,t)=>(i(),d("button",{class:"w-full py-2.5 bg-primary text-white font-bold text-sm rounded-lg hover:bg-blue-700 transition-all shadow-sm",onClick:t[0]||(t[0]=n=>s.$emit("click"))},[w(s.$slots,"default")]))}});async function B(e){if(!e)return!0;try{if(navigator.clipboard&&navigator.clipboard.writeText)return await navigator.clipboard.writeText(e),!0}catch{}try{const s=document.createElement("textarea");s.value=e,s.setAttribute("readonly","true"),s.style.position="fixed",s.style.opacity="0",s.style.pointerEvents="none",s.style.left="-9999px",document.body.appendChild(s),s.focus(),s.select();const t=document.execCommand("copy");return document.body.removeChild(s),t}catch{return!1}}const pe={class:"bg-slate-900 rounded-xl p-6 text-slate-300"},be={class:"flex items-center justify-between mb-3"},fe={class:"flex items-center gap-2"},ye={class:"text-sm font-bold text-white"},ge={class:"text-[10px] font-mono leading-relaxed bg-slate-800/50 p-3 rounded-lg border border-slate-700"},xe=c({__name:"EventLogPanel",props:{title:{},value:{}},setup(e){const s=e,t=C(()=>{if(typeof s.value=="string")return s.value;try{return JSON.stringify(s.value,null,2)}catch{return String(s.value)}});async function n(){await B(t.value)}return(m,a)=>(i(),d("div",pe,[l("div",be,[l("div",fe,[a[0]||(a[0]=l("span",{class:"material-symbols-outlined text-primary"},"terminal",-1)),l("h4",ye,o(e.title),1)]),l("button",{class:"text-xs text-slate-400 hover:text-white",onClick:n},"Copy")]),l("pre",ge,o(t.value),1)]))}}),he={class:"bg-white rounded-xl border border-slate-200 shadow-sm p-5"},ve={class:"flex items-center justify-between mb-3"},$e={class:"text-sm font-bold text-slate-700"},we={class:"text-[10px] font-mono leading-relaxed bg-slate-50 p-3 rounded-lg border border-slate-200 text-slate-600 min-h-[160px]"},_e=c({__name:"InspectorJSON",props:{title:{},value:{}},setup(e){const s=e,t=I("tr",a=>a),n=C(()=>{if(s.value==null)return t("未选择任何组件");try{return JSON.stringify(s.value,null,2)}catch{return String(s.value)}});async function m(){await B(n.value)}return(a,b)=>(i(),d("div",he,[l("div",ve,[l("h3",$e,o(e.title),1),l("button",{class:"text-xs text-slate-400 hover:text-slate-600",onClick:m},o(y(t)("Copy")),1)]),l("pre",we,""+o(n.value)+` + `,1)]))}}),ke={class:"border border-dashed border-slate-300 bg-slate-50 rounded-lg p-4 text-xs text-slate-500"},Ve=c({__name:"UnknownWidget",props:{widgetId:{},widgetType:{}},setup(e){return(s,t)=>(i(),d("div",ke,[t[0]||(t[0]=l("div",{class:"font-bold text-slate-700"},"Unknown Widget",-1)),l("div",null,"ID: "+o(e.widgetId),1),l("div",null,"Type: "+o(e.widgetType),1)]))}}),Ce={"input.text":q,"input.number":X,"input.switch":se,"input.textarea":ae,"input.select":ce,"action.button":me,"log.viewer":xe,"inspector.json":_e};function Ie(e){return Ce[e]||Ve}const Be=c({__name:"LayoutRenderer",props:{config:{},widgetsById:{}},setup(e){const s=e,t=U(),n=I("tr",a=>a),m=c({name:"LayoutNodeRenderer",props:{node:{type:Object,required:!0}},setup(a){return()=>{const b=a.node;return b.type==="split"?p(D,{orientation:b.orientation},{default:()=>b.children.map(k=>p(m,{node:k}))}):p(J,{title:b.title},{default:()=>b.widgets.map(k=>{const r=s.widgetsById[k];if(!r)return null;const h=Ie(r.type),T=r.type.startsWith("input."),E=r.type.startsWith("action."),S=r.type==="log.viewer",N=t.getInputValue(r.id,r.props?.default),v=["rounded-lg","p-2","transition","cursor-pointer",t.selectedWidgetId===r.id?"ring-2 ring-primary/40":"hover:bg-slate-50"].filter(Boolean).join(" "),$=()=>t.selectWidget(r.id),u={...r.props||{}},f={...u,label:u.label?n(u.label):u.label,title:u.title?n(u.title):u.title,hint:u.hint?n(u.hint):u.hint,placeholder:u.placeholder?n(u.placeholder):u.placeholder};if(S){const g=r.bind?t.dataBus[r.bind]||[]:[];return p("div",{class:v,onClick:$},[p(h,{...f,title:f.title||r.id,value:g.slice(-50)})])}return E?p("div",{class:v,onClick:$},[p(h,{...f,onClick:()=>{if(r.type==="action.button"){const g=r.props?.payload||{source:r.id};t.dispatchEvent({emit:r.emit||"action.unknown",payload:g,source:r.id})}}},{default:()=>f.label||n("动作")})]):T?p("div",{class:v,onClick:$},[p(h,{...f,modelValue:N,"onUpdate:modelValue":g=>t.setInputValue(r.id,g,r.bind)})]):p("div",{class:v,onClick:$},[p(h,{...f,widgetId:r.id,widgetType:r.type})])})})}}});return(a,b)=>(i(),P(y(m),{node:e.config.ui.layout},null,8,["node"]))}}),Te={class:"modal-header"},Ee={class:"modal-body ui-yaml-body"},Se={key:0,class:"ui-yaml-error"},Ne={key:0,class:"muted"},je={key:1,class:"muted"},Le={key:1},Ue={key:2,class:"empty-state muted"},We={__name:"UiYamlPreviewModal",props:{open:{type:Boolean,default:!1},runtime:{type:Object,default:()=>({})}},emits:["close"],setup(e,{emit:s}){const t=I("tr",m=>m),n=s;return(m,a)=>e.open?(i(),d("div",{key:0,class:"modal-backdrop",onMousedown:a[3]||(a[3]=V(b=>n("close"),["self"]))},[l("div",{class:"channel-modal ui-yaml-modal",onMousedown:a[1]||(a[1]=V(()=>{},["stop"])),onClick:a[2]||(a[2]=V(()=>{},["stop"]))},[l("div",Te,[l("div",null,[l("h3",null,o(y(t)("UI YAML 预览")),1),l("p",null,o(y(t)("脚本运行中展示 UI 渲染结果")),1)]),l("button",{class:"icon-btn",type:"button",onClick:a[0]||(a[0]=b=>n("close"))},[...a[4]||(a[4]=[l("span",{class:"material-symbols-outlined"},"close",-1)])])]),l("div",Ee,[e.runtime.parseError?(i(),d("div",Se,[l("strong",null,o(y(t)("解析失败")),1),l("div",null,o(e.runtime.parseError.message),1),e.runtime.parseError.path?(i(),d("div",Ne,"Path: "+o(e.runtime.parseError.path),1)):x("",!0),e.runtime.parseError.line?(i(),d("div",je," Line "+o(e.runtime.parseError.line)+", Column "+o(e.runtime.parseError.column||0),1)):x("",!0)])):e.runtime.lastGoodConfig?(i(),d("div",Le,[W(Be,{config:e.runtime.lastGoodConfig,widgetsById:e.runtime.widgetsById},null,8,["config","widgetsById"])])):(i(),d("div",Ue,o(y(t)("暂无可渲染的 UI 配置")),1))])],32)],32)):x("",!0)}};export{We as default}; diff --git a/ui/assets/web/assets/index-1CbRHFUW.js b/ui/assets/web/assets/index-1CbRHFUW.js new file mode 100644 index 0000000..e305201 --- /dev/null +++ b/ui/assets/web/assets/index-1CbRHFUW.js @@ -0,0 +1,5 @@ +let re=[],Ee=[];(()=>{let l="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(e=>e?parseInt(e,36):1);for(let e=0,t=0;e>1;if(l=Ee[n])e=n+1;else return!0;if(e==t)return!1}}function ke(l){return l>=127462&&l<=127487}const ye=8205;function je(l,e,t=!0,n=!0){return(t?Oe:Ze)(l,e,n)}function Oe(l,e,t){if(e==l.length)return e;e&&Me(l.charCodeAt(e))&&Re(l.charCodeAt(e-1))&&e--;let n=ie(l,e);for(e+=Se(n);e=0&&ke(ie(l,r));)s++,r-=2;if(s%2==0)break;e+=2}else break}return e}function Ze(l,e,t){for(;e>0;){let n=Oe(l,e-2,t);if(n=56320&&l<57344}function Re(l){return l>=55296&&l<56320}function Se(l){return l<65536?1:2}class x{lineAt(e){if(e<0||e>this.length)throw new RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw new RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,t,n){[e,t]=J(this,e,t);let i=[];return this.decompose(0,e,i,2),n.length&&n.decompose(0,n.length,i,3),this.decompose(t,this.length,i,1),C.from(i,this.length-(t-e)+n.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,t=this.length){[e,t]=J(this,e,t);let n=[];return this.decompose(e,t,n,0),C.from(n,t-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let t=this.scanIdentical(e,1),n=this.length-this.scanIdentical(e,-1),i=new N(this),s=new N(e);for(let r=t,h=t;;){if(i.next(r),s.next(r),r=0,i.lineBreak!=s.lineBreak||i.done!=s.done||i.value!=s.value)return!1;if(h+=i.value.length,i.done||h>=n)return!0}}iter(e=1){return new N(this,e)}iterRange(e,t=this.length){return new Te(this,e,t)}iterLines(e,t){let n;if(e==null)n=this.iter();else{t==null&&(t=this.lines+1);let i=this.line(e).from;n=this.iterRange(i,Math.max(i,t==this.lines+1?this.length:t<=1?0:this.line(t-1).to))}return new Be(n)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(e){if(e.length==0)throw new RangeError("A document must have at least one line");return e.length==1&&!e[0]?x.empty:e.length<=32?new m(e):C.from(m.split(e,[]))}}class m extends x{constructor(e,t=Ke(e)){super(),this.text=e,this.length=t}get lines(){return this.text.length}get children(){return null}lineInner(e,t,n,i){for(let s=0;;s++){let r=this.text[s],h=i+r.length;if((t?n:h)>=e)return new Qe(i,h,n,r);i=h+1,n++}}decompose(e,t,n,i){let s=e<=0&&t>=this.length?this:new m(Ie(this.text,e,t),Math.min(t,this.length)-Math.max(0,e));if(i&1){let r=n.pop(),h=Z(s.text,r.text.slice(),0,s.length);if(h.length<=32)n.push(new m(h,r.length+s.length));else{let o=h.length>>1;n.push(new m(h.slice(0,o)),new m(h.slice(o)))}}else n.push(s)}replace(e,t,n){if(!(n instanceof m))return super.replace(e,t,n);[e,t]=J(this,e,t);let i=Z(this.text,Z(n.text,Ie(this.text,0,e)),t),s=this.length+n.length-(t-e);return i.length<=32?new m(i,s):C.from(m.split(i,[]),s)}sliceString(e,t=this.length,n=` +`){[e,t]=J(this,e,t);let i="";for(let s=0,r=0;s<=t&&re&&r&&(i+=n),es&&(i+=h.slice(Math.max(0,e-s),t-s)),s=o+1}return i}flatten(e){for(let t of this.text)e.push(t)}scanIdentical(){return 0}static split(e,t){let n=[],i=-1;for(let s of e)n.push(s),i+=s.length+1,n.length==32&&(t.push(new m(n,i)),n=[],i=-1);return i>-1&&t.push(new m(n,i)),t}}class C extends x{constructor(e,t){super(),this.children=e,this.length=t,this.lines=0;for(let n of e)this.lines+=n.lines}lineInner(e,t,n,i){for(let s=0;;s++){let r=this.children[s],h=i+r.length,o=n+r.lines-1;if((t?o:h)>=e)return r.lineInner(e,t,n,i);i=h+1,n=o+1}}decompose(e,t,n,i){for(let s=0,r=0;r<=t&&s=r){let a=i&((r<=e?1:0)|(o>=t?2:0));r>=e&&o<=t&&!a?n.push(h):h.decompose(e-r,t-r,n,a)}r=o+1}}replace(e,t,n){if([e,t]=J(this,e,t),n.lines=s&&t<=h){let o=r.replace(e-s,t-s,n),a=this.lines-r.lines+o.lines;if(o.lines>4&&o.lines>a>>6){let u=this.children.slice();return u[i]=o,new C(u,this.length-(t-e)+n.length)}return super.replace(s,h,o)}s=h+1}return super.replace(e,t,n)}sliceString(e,t=this.length,n=` +`){[e,t]=J(this,e,t);let i="";for(let s=0,r=0;se&&s&&(i+=n),er&&(i+=h.sliceString(e-r,t-r,n)),r=o+1}return i}flatten(e){for(let t of this.children)t.flatten(e)}scanIdentical(e,t){if(!(e instanceof C))return 0;let n=0,[i,s,r,h]=t>0?[0,0,this.children.length,e.children.length]:[this.children.length-1,e.children.length-1,-1,-1];for(;;i+=t,s+=t){if(i==r||s==h)return n;let o=this.children[i],a=e.children[s];if(o!=a)return n+o.scanIdentical(a,t);n+=o.length+1}}static from(e,t=e.reduce((n,i)=>n+i.length+1,-1)){let n=0;for(let c of e)n+=c.lines;if(n<32){let c=[];for(let g of e)g.flatten(c);return new m(c,t)}let i=Math.max(32,n>>5),s=i<<1,r=i>>1,h=[],o=0,a=-1,u=[];function f(c){let g;if(c.lines>s&&c instanceof C)for(let b of c.children)f(b);else c.lines>r&&(o>r||!o)?(d(),h.push(c)):c instanceof m&&o&&(g=u[u.length-1])instanceof m&&c.lines+g.lines<=32?(o+=c.lines,a+=c.length+1,u[u.length-1]=new m(g.text.concat(c.text),g.length+1+c.length)):(o+c.lines>i&&d(),o+=c.lines,a+=c.length+1,u.push(c))}function d(){o!=0&&(h.push(u.length==1?u[0]:C.from(u,a)),a=-1,o=u.length=0)}for(let c of e)f(c);return d(),h.length==1?h[0]:new C(h,t)}}x.empty=new m([""],0);function Ke(l){let e=-1;for(let t of l)e+=t.length+1;return e}function Z(l,e,t=0,n=1e9){for(let i=0,s=0,r=!0;s=t&&(o>n&&(h=h.slice(0,n-i)),i0?1:(e instanceof m?e.text.length:e.children.length)<<1]}nextInner(e,t){for(this.done=this.lineBreak=!1;;){let n=this.nodes.length-1,i=this.nodes[n],s=this.offsets[n],r=s>>1,h=i instanceof m?i.text.length:i.children.length;if(r==(t>0?h:0)){if(n==0)return this.done=!0,this.value="",this;t>0&&this.offsets[n-1]++,this.nodes.pop(),this.offsets.pop()}else if((s&1)==(t>0?0:1)){if(this.offsets[n]+=t,e==0)return this.lineBreak=!0,this.value=` +`,this;e--}else if(i instanceof m){let o=i.text[r+(t<0?-1:0)];if(this.offsets[n]+=t,o.length>Math.max(0,e))return this.value=e==0?o:t>0?o.slice(e):o.slice(0,o.length-e),this;e-=o.length}else{let o=i.children[r+(t<0?-1:0)];e>o.length?(e-=o.length,this.offsets[n]+=t):(t<0&&this.offsets[n]--,this.nodes.push(o),this.offsets.push(t>0?1:(o instanceof m?o.text.length:o.children.length)<<1))}}}next(e=0){return e<0&&(this.nextInner(-e,-this.dir),e=this.value.length),this.nextInner(e,this.dir)}}class Te{constructor(e,t,n){this.value="",this.done=!1,this.cursor=new N(e,t>n?-1:1),this.pos=t>n?e.length:0,this.from=Math.min(t,n),this.to=Math.max(t,n)}nextInner(e,t){if(t<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;e+=Math.max(0,t<0?this.pos-this.to:this.from-this.pos);let n=t<0?this.pos-this.from:this.to-this.pos;e>n&&(e=n),n-=e;let{value:i}=this.cursor.next(e);return this.pos+=(i.length+e)*t,this.value=i.length<=n?i:t<0?i.slice(i.length-n):i.slice(0,n),this.done=!this.value,this}next(e=0){return e<0?e=Math.max(e,this.from-this.pos):e>0&&(e=Math.min(e,this.to-this.pos)),this.nextInner(e,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=""}}class Be{constructor(e){this.inner=e,this.afterBreak=!0,this.value="",this.done=!1}next(e=0){let{done:t,lineBreak:n,value:i}=this.inner.next(e);return t&&this.afterBreak?(this.value="",this.afterBreak=!1):t?(this.done=!0,this.value=""):n?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=i,this.afterBreak=!1),this}get lineBreak(){return!1}}typeof Symbol<"u"&&(x.prototype[Symbol.iterator]=function(){return this.iter()},N.prototype[Symbol.iterator]=Te.prototype[Symbol.iterator]=Be.prototype[Symbol.iterator]=function(){return this});class Qe{constructor(e,t,n,i){this.from=e,this.to=t,this.number=n,this.text=i}get length(){return this.to-this.from}}function J(l,e,t){return e=Math.max(0,Math.min(l.length,e)),[e,Math.max(e,Math.min(l.length,t))]}function Q(l,e,t=!0,n=!0){return je(l,e,t,n)}function Xe(l){return l>=56320&&l<57344}function Ye(l){return l>=55296&&l<56320}function ft(l,e){let t=l.charCodeAt(e);if(!Ye(t)||e+1==l.length)return t;let n=l.charCodeAt(e+1);return Xe(n)?(t-55296<<10)+(n-56320)+65536:t}function ct(l){return l<=65535?String.fromCharCode(l):(l-=65536,String.fromCharCode((l>>10)+55296,(l&1023)+56320))}function dt(l){return l<65536?1:2}const le=/\r\n?|\n/;var O=(function(l){return l[l.Simple=0]="Simple",l[l.TrackDel=1]="TrackDel",l[l.TrackBefore=2]="TrackBefore",l[l.TrackAfter=3]="TrackAfter",l})(O||(O={}));class E{constructor(e){this.sections=e}get length(){let e=0;for(let t=0;te)return s+(e-i);s+=h}else{if(n!=O.Simple&&a>=e&&(n==O.TrackDel&&ie||n==O.TrackBefore&&ie))return null;if(a>e||a==e&&t<0&&!h)return e==i||t<0?s:s+o;s+=o}i=a}if(e>i)throw new RangeError(`Position ${e} is out of range for changeset of length ${i}`);return s}touchesRange(e,t=e){for(let n=0,i=0;n=0&&i<=t&&h>=e)return it?"cover":!0;i=h}return!1}toString(){let e="";for(let t=0;t=0?":"+i:"")}return e}toJSON(){return this.sections}static fromJSON(e){if(!Array.isArray(e)||e.length%2||e.some(t=>typeof t!="number"))throw new RangeError("Invalid JSON representation of ChangeDesc");return new E(e)}static create(e){return new E(e)}}class k extends E{constructor(e,t){super(e),this.inserted=t}apply(e){if(this.length!=e.length)throw new RangeError("Applying change set to a document with the wrong length");return he(this,(t,n,i,s,r)=>e=e.replace(i,i+(n-t),r),!1),e}mapDesc(e,t=!1){return oe(this,e,t,!0)}invert(e){let t=this.sections.slice(),n=[];for(let i=0,s=0;i=0){t[i]=h,t[i+1]=r;let o=i>>1;for(;n.length0&&M(n,t,s.text),s.forward(u),h+=u}let a=e[r++];for(;h>1].toJSON()))}return e}static of(e,t,n){let i=[],s=[],r=0,h=null;function o(u=!1){if(!u&&!i.length)return;rd||f<0||d>t)throw new RangeError(`Invalid change range ${f} to ${d} (in doc of length ${t})`);let g=c?typeof c=="string"?x.of(c.split(n||le)):c:x.empty,b=g.length;if(f==d&&b==0)return;fr&&y(i,f-r,-1),y(i,d-f,b),M(s,i,g),r=d}}return a(e),o(!h),h}static empty(e){return new k(e?[e,-1]:[],[])}static fromJSON(e){if(!Array.isArray(e))throw new RangeError("Invalid JSON representation of ChangeSet");let t=[],n=[];for(let i=0;ih&&typeof r!="string"))throw new RangeError("Invalid JSON representation of ChangeSet");if(s.length==1)t.push(s[0],0);else{for(;n.length=0&&t<=0&&t==l[i+1]?l[i]+=e:i>=0&&e==0&&l[i]==0?l[i+1]+=t:n?(l[i]+=e,l[i+1]+=t):l.push(e,t)}function M(l,e,t){if(t.length==0)return;let n=e.length-2>>1;if(n>1])),!(t||r==l.sections.length||l.sections[r+1]<0);)h=l.sections[r++],o=l.sections[r++];e(i,a,s,u,f),i=a,s=u}}}function oe(l,e,t,n=!1){let i=[],s=n?[]:null,r=new q(l),h=new q(e);for(let o=-1;;){if(r.done&&h.len||h.done&&r.len)throw new Error("Mismatched change set lengths");if(r.ins==-1&&h.ins==-1){let a=Math.min(r.len,h.len);y(i,a,-1),r.forward(a),h.forward(a)}else if(h.ins>=0&&(r.ins<0||o==r.i||r.off==0&&(h.len=0&&o=0){let a=0,u=r.len;for(;u;)if(h.ins==-1){let f=Math.min(u,h.len);a+=f,u-=f,h.forward(f)}else if(h.ins==0&&h.leno||r.ins>=0&&r.len>o)&&(h||n.length>a),s.forward2(o),r.forward(o)}}}}class q{constructor(e){this.set=e,this.i=0,this.next()}next(){let{sections:e}=this.set;this.i>1;return t>=e.length?x.empty:e[t]}textBit(e){let{inserted:t}=this.set,n=this.i-2>>1;return n>=t.length&&!e?x.empty:t[n].slice(this.off,e==null?void 0:this.off+e)}forward(e){e==this.len?this.next():(this.len-=e,this.off+=e)}forward2(e){this.ins==-1?this.forward(e):e==this.ins?this.next():(this.ins-=e,this.off+=e)}}class B{constructor(e,t,n){this.from=e,this.to=t,this.flags=n}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get bidiLevel(){let e=this.flags&7;return e==7?null:e}get goalColumn(){let e=this.flags>>6;return e==16777215?void 0:e}map(e,t=-1){let n,i;return this.empty?n=i=e.mapPos(this.from,t):(n=e.mapPos(this.from,1),i=e.mapPos(this.to,-1)),n==this.from&&i==this.to?this:new B(n,i,this.flags)}extend(e,t=e){if(e<=this.anchor&&t>=this.anchor)return p.range(e,t);let n=Math.abs(e-this.anchor)>Math.abs(t-this.anchor)?e:t;return p.range(this.anchor,n)}eq(e,t=!1){return this.anchor==e.anchor&&this.head==e.head&&(!t||!this.empty||this.assoc==e.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(e){if(!e||typeof e.anchor!="number"||typeof e.head!="number")throw new RangeError("Invalid JSON representation for SelectionRange");return p.range(e.anchor,e.head)}static create(e,t,n){return new B(e,t,n)}}class p{constructor(e,t){this.ranges=e,this.mainIndex=t}map(e,t=-1){return e.empty?this:p.create(this.ranges.map(n=>n.map(e,t)),this.mainIndex)}eq(e,t=!1){if(this.ranges.length!=e.ranges.length||this.mainIndex!=e.mainIndex)return!1;for(let n=0;ne.toJSON()),main:this.mainIndex}}static fromJSON(e){if(!e||!Array.isArray(e.ranges)||typeof e.main!="number"||e.main>=e.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new p(e.ranges.map(t=>B.fromJSON(t)),e.main)}static single(e,t=e){return new p([p.range(e,t)],0)}static create(e,t=0){if(e.length==0)throw new RangeError("A selection needs at least one range");for(let n=0,i=0;ie?8:0)|s)}static normalized(e,t=0){let n=e[t];e.sort((i,s)=>i.from-s.from),t=e.indexOf(n);for(let i=1;is.head?p.range(o,h):p.range(h,o))}}return new p(e,t)}}function Je(l,e){for(let t of l.ranges)if(t.to>e)throw new RangeError("Selection points outside of document")}let me=0;class A{constructor(e,t,n,i,s){this.combine=e,this.compareInput=t,this.compare=n,this.isStatic=i,this.id=me++,this.default=e([]),this.extensions=typeof s=="function"?s(this):s}get reader(){return this}static define(e={}){return new A(e.combine||(t=>t),e.compareInput||((t,n)=>t===n),e.compare||(e.combine?(t,n)=>t===n:we),!!e.static,e.enables)}of(e){return new K([],this,0,e)}compute(e,t){if(this.isStatic)throw new Error("Can't compute a static facet");return new K(e,this,1,t)}computeN(e,t){if(this.isStatic)throw new Error("Can't compute a static facet");return new K(e,this,2,t)}from(e,t){return t||(t=n=>n),this.compute([e],n=>t(n.field(e)))}}function we(l,e){return l==e||l.length==e.length&&l.every((t,n)=>t===e[n])}class K{constructor(e,t,n,i){this.dependencies=e,this.facet=t,this.type=n,this.value=i,this.id=me++}dynamicSlot(e){var t;let n=this.value,i=this.facet.compareInput,s=this.id,r=e[s]>>1,h=this.type==2,o=!1,a=!1,u=[];for(let f of this.dependencies)f=="doc"?o=!0:f=="selection"?a=!0:(((t=e[f.id])!==null&&t!==void 0?t:1)&1)==0&&u.push(e[f.id]);return{create(f){return f.values[r]=n(f),1},update(f,d){if(o&&d.docChanged||a&&(d.docChanged||d.selection)||ae(f,u)){let c=n(f);if(h?!Pe(c,f.values[r],i):!i(c,f.values[r]))return f.values[r]=c,1}return 0},reconfigure:(f,d)=>{let c,g=d.config.address[s];if(g!=null){let b=Y(d,g);if(this.dependencies.every(v=>v instanceof A?d.facet(v)===f.facet(v):v instanceof L?d.field(v,!1)==f.field(v,!1):!0)||(h?Pe(c=n(f),b,i):i(c=n(f),b)))return f.values[r]=b,0}else c=n(f);return f.values[r]=c,1}}}}function Pe(l,e,t){if(l.length!=e.length)return!1;for(let n=0;nl[o.id]),i=t.map(o=>o.type),s=n.filter(o=>!(o&1)),r=l[e.id]>>1;function h(o){let a=[];for(let u=0;un===i),e);return e.provide&&(t.provides=e.provide(t)),t}create(e){let t=e.facet(U).find(n=>n.field==this);return(t?.create||this.createF)(e)}slot(e){let t=e[this.id]>>1;return{create:n=>(n.values[t]=this.create(n),1),update:(n,i)=>{let s=n.values[t],r=this.updateF(s,i);return this.compareF(s,r)?0:(n.values[t]=r,1)},reconfigure:(n,i)=>{let s=n.facet(U),r=i.facet(U),h;return(h=s.find(o=>o.field==this))&&h!=r.find(o=>o.field==this)?(n.values[t]=h.create(n),1):i.config.address[this.id]!=null?(n.values[t]=i.field(this),0):(n.values[t]=this.create(n),1)}}}init(e){return[this,U.of({field:this,create:e})]}get extension(){return this}}const T={lowest:4,low:3,default:2,high:1,highest:0};function D(l){return e=>new Le(e,l)}const gt={highest:D(T.highest),high:D(T.high),default:D(T.default),low:D(T.low),lowest:D(T.lowest)};class Le{constructor(e,t){this.inner=e,this.prec=t}}class te{of(e){return new ue(this,e)}reconfigure(e){return te.reconfigure.of({compartment:this,extension:e})}get(e){return e.config.compartments.get(this)}}class ue{constructor(e,t){this.compartment=e,this.inner=t}}class X{constructor(e,t,n,i,s,r){for(this.base=e,this.compartments=t,this.dynamicSlots=n,this.address=i,this.staticValues=s,this.facets=r,this.statusTemplate=[];this.statusTemplate.length>1]}static resolve(e,t,n){let i=[],s=Object.create(null),r=new Map;for(let d of et(e,t,r))d instanceof L?i.push(d):(s[d.facet.id]||(s[d.facet.id]=[])).push(d);let h=Object.create(null),o=[],a=[];for(let d of i)h[d.id]=a.length<<1,a.push(c=>d.slot(c));let u=n?.config.facets;for(let d in s){let c=s[d],g=c[0].facet,b=u&&u[d]||[];if(c.every(v=>v.type==0))if(h[g.id]=o.length<<1|1,we(b,c))o.push(n.facet(g));else{let v=g.combine(c.map(ne=>ne.value));o.push(n&&g.compare(v,n.facet(g))?n.facet(g):v)}else{for(let v of c)v.type==0?(h[v.id]=o.length<<1|1,o.push(v.value)):(h[v.id]=a.length<<1,a.push(ne=>v.dynamicSlot(ne)));h[g.id]=a.length<<1,a.push(v=>_e(v,g,c))}}let f=a.map(d=>d(h));return new X(e,r,f,h,o,s)}}function et(l,e,t){let n=[[],[],[],[],[]],i=new Map;function s(r,h){let o=i.get(r);if(o!=null){if(o<=h)return;let a=n[o].indexOf(r);a>-1&&n[o].splice(a,1),r instanceof ue&&t.delete(r.compartment)}if(i.set(r,h),Array.isArray(r))for(let a of r)s(a,h);else if(r instanceof ue){if(t.has(r.compartment))throw new RangeError("Duplicate use of compartment in extensions");let a=e.get(r.compartment)||r.inner;t.set(r.compartment,a),s(a,h)}else if(r instanceof Le)s(r.inner,r.prec);else if(r instanceof L)n[h].push(r),r.provides&&s(r.provides,h);else if(r instanceof K)n[h].push(r),r.facet.extensions&&s(r.facet.extensions,T.default);else{let a=r.extension;if(!a)throw new Error(`Unrecognized extension value in extension set (${r}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);s(a,h)}}return s(l,T.default),n.reduce((r,h)=>r.concat(h))}function $(l,e){if(e&1)return 2;let t=e>>1,n=l.status[t];if(n==4)throw new Error("Cyclic dependency between fields and/or facets");if(n&2)return n;l.status[t]=4;let i=l.computeSlot(l,l.config.dynamicSlots[t]);return l.status[t]=2|i}function Y(l,e){return e&1?l.config.staticValues[e>>1]:l.values[e>>1]}const De=A.define(),fe=A.define({combine:l=>l.some(e=>e),static:!0}),Ve=A.define({combine:l=>l.length?l[0]:void 0,static:!0}),Ne=A.define(),$e=A.define(),qe=A.define(),ze=A.define({combine:l=>l.length?l[0]:!1});class H{constructor(e,t){this.type=e,this.value=t}static define(){return new tt}}class tt{of(e){return new H(this,e)}}class nt{constructor(e){this.map=e}of(e){return new I(this,e)}}class I{constructor(e,t){this.type=e,this.value=t}map(e){let t=this.type.map(this.value,e);return t===void 0?void 0:t==this.value?this:new I(this.type,t)}is(e){return this.type==e}static define(e={}){return new nt(e.map||(t=>t))}static mapEffects(e,t){if(!e.length)return e;let n=[];for(let i of e){let s=i.map(t);s&&n.push(s)}return n}}I.reconfigure=I.define();I.appendConfig=I.define();class P{constructor(e,t,n,i,s,r){this.startState=e,this.changes=t,this.selection=n,this.effects=i,this.annotations=s,this.scrollIntoView=r,this._doc=null,this._state=null,n&&Je(n,t.newLength),s.some(h=>h.type==P.time)||(this.annotations=s.concat(P.time.of(Date.now())))}static create(e,t,n,i,s,r){return new P(e,t,n,i,s,r)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(e){for(let t of this.annotations)if(t.type==e)return t.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(e){let t=this.annotation(P.userEvent);return!!(t&&(t==e||t.length>e.length&&t.slice(0,e.length)==e&&t[e.length]=="."))}}P.time=H.define();P.userEvent=H.define();P.addToHistory=H.define();P.remote=H.define();function it(l,e){let t=[];for(let n=0,i=0;;){let s,r;if(n=l[n]))s=l[n++],r=l[n++];else if(i=0;i--){let s=n[i](l);s instanceof P?l=s:Array.isArray(s)&&s.length==1&&s[0]instanceof P?l=s[0]:l=He(e,F(s),!1)}return l}function rt(l){let e=l.startState,t=e.facet(qe),n=l;for(let i=t.length-1;i>=0;i--){let s=t[i](l);s&&Object.keys(s).length&&(n=We(n,ce(e,s,l.changes.newLength),!0))}return n==l?l:P.create(e,l.changes,l.selection,n.effects,n.annotations,n.scrollIntoView)}const lt=[];function F(l){return l==null?lt:Array.isArray(l)?l:[l]}var R=(function(l){return l[l.Word=0]="Word",l[l.Space=1]="Space",l[l.Other=2]="Other",l})(R||(R={}));const ht=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;let de;try{de=new RegExp("[\\p{Alphabetic}\\p{Number}_]","u")}catch{}function ot(l){if(de)return de.test(l);for(let e=0;e"€"&&(t.toUpperCase()!=t.toLowerCase()||ht.test(t)))return!0}return!1}function at(l){return e=>{if(!/\S/.test(e))return R.Space;if(ot(e))return R.Word;for(let t=0;t-1)return R.Word;return R.Other}}class w{constructor(e,t,n,i,s,r){this.config=e,this.doc=t,this.selection=n,this.values=i,this.status=e.statusTemplate.slice(),this.computeSlot=s,r&&(r._state=this);for(let h=0;hi.set(a,o)),t=null),i.set(h.value.compartment,h.value.extension)):h.is(I.reconfigure)?(t=null,n=h.value):h.is(I.appendConfig)&&(t=null,n=F(n).concat(h.value));let s;t?s=e.startState.values.slice():(t=X.resolve(n,i,this),s=new w(t,this.doc,this.selection,t.dynamicSlots.map(()=>null),(o,a)=>a.reconfigure(o,this),null).values);let r=e.startState.facet(fe)?e.newSelection:e.newSelection.asSingle();new w(t,e.newDoc,r,s,(h,o)=>o.update(h,e),e)}replaceSelection(e){return typeof e=="string"&&(e=this.toText(e)),this.changeByRange(t=>({changes:{from:t.from,to:t.to,insert:e},range:p.cursor(t.from+e.length)}))}changeByRange(e){let t=this.selection,n=e(t.ranges[0]),i=this.changes(n.changes),s=[n.range],r=F(n.effects);for(let h=1;hr.spec.fromJSON(h,o)))}}return w.create({doc:e.doc,selection:p.fromJSON(e.selection),extensions:t.extensions?i.concat([t.extensions]):i})}static create(e={}){let t=X.resolve(e.extensions||[],new Map),n=e.doc instanceof x?e.doc:x.of((e.doc||"").split(t.staticFacet(w.lineSeparator)||le)),i=e.selection?e.selection instanceof p?e.selection:p.single(e.selection.anchor,e.selection.head):p.single(0);return Je(i,n.length),t.staticFacet(fe)||(i=i.asSingle()),new w(t,n,i,t.dynamicSlots.map(()=>null),(s,r)=>r.create(s),null)}get tabSize(){return this.facet(w.tabSize)}get lineBreak(){return this.facet(w.lineSeparator)||` +`}get readOnly(){return this.facet(ze)}phrase(e,...t){for(let n of this.facet(w.phrases))if(Object.prototype.hasOwnProperty.call(n,e)){e=n[e];break}return t.length&&(e=e.replace(/\$(\$|\d*)/g,(n,i)=>{if(i=="$")return"$";let s=+(i||1);return!s||s>t.length?n:t[s-1]})),e}languageDataAt(e,t,n=-1){let i=[];for(let s of this.facet(De))for(let r of s(this,t,n))Object.prototype.hasOwnProperty.call(r,e)&&i.push(r[e]);return i}charCategorizer(e){let t=this.languageDataAt("wordChars",e);return at(t.length?t[0]:"")}wordAt(e){let{text:t,from:n,length:i}=this.doc.lineAt(e),s=this.charCategorizer(e),r=e-n,h=e-n;for(;r>0;){let o=Q(t,r,!1);if(s(t.slice(o,r))!=R.Word)break;r=o}for(;hl.length?l[0]:4});w.lineSeparator=Ve;w.readOnly=ze;w.phrases=A.define({compare(l,e){let t=Object.keys(l),n=Object.keys(e);return t.length==n.length&&t.every(i=>l[i]==e[i])}});w.languageData=De;w.changeFilter=Ne;w.transactionFilter=$e;w.transactionExtender=qe;te.reconfigure=I.define();function pt(l,e,t={}){let n={};for(let i of l)for(let s of Object.keys(i)){let r=i[s],h=n[s];if(h===void 0)n[s]=r;else if(!(h===r||r===void 0))if(Object.hasOwnProperty.call(t,s))n[s]=t[s](h,r);else throw new Error("Config merge conflict for field "+s)}for(let i in e)n[i]===void 0&&(n[i]=e[i]);return n}class _{eq(e){return this==e}range(e,t=e){return z.create(e,t,this)}}_.prototype.startSide=_.prototype.endSide=0;_.prototype.point=!1;_.prototype.mapMode=O.TrackDel;function ve(l,e){return l==e||l.constructor==e.constructor&&l.eq(e)}class z{constructor(e,t,n){this.from=e,this.to=t,this.value=n}static create(e,t,n){return new z(e,t,n)}}function ge(l,e){return l.from-e.from||l.value.startSide-e.value.startSide}class xe{constructor(e,t,n,i){this.from=e,this.to=t,this.value=n,this.maxPoint=i}get length(){return this.to[this.to.length-1]}findIndex(e,t,n,i=0){let s=n?this.to:this.from;for(let r=i,h=s.length;;){if(r==h)return r;let o=r+h>>1,a=s[o]-e||(n?this.value[o].endSide:this.value[o].startSide)-t;if(o==r)return a>=0?r:h;a>=0?h=o:r=o+1}}between(e,t,n,i){for(let s=this.findIndex(t,-1e9,!0),r=this.findIndex(n,1e9,!1,s);sc||d==c&&a.startSide>0&&a.endSide<=0)continue;(c-d||a.endSide-a.startSide)<0||(r<0&&(r=d),a.point&&(h=Math.max(h,c-d)),n.push(a),i.push(d-r),s.push(c-r))}return{mapped:n.length?new xe(i,s,n,h):null,pos:r}}}class S{constructor(e,t,n,i){this.chunkPos=e,this.chunk=t,this.nextLayer=n,this.maxPoint=i}static create(e,t,n,i){return new S(e,t,n,i)}get length(){let e=this.chunk.length-1;return e<0?0:Math.max(this.chunkEnd(e),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let e=this.nextLayer.size;for(let t of this.chunk)e+=t.value.length;return e}chunkEnd(e){return this.chunkPos[e]+this.chunk[e].length}update(e){let{add:t=[],sort:n=!1,filterFrom:i=0,filterTo:s=this.length}=e,r=e.filter;if(t.length==0&&!r)return this;if(n&&(t=t.slice().sort(ge)),this.isEmpty)return t.length?S.of(t):this;let h=new Ue(this,null,-1).goto(0),o=0,a=[],u=new ee;for(;h.value||o=0){let f=t[o++];u.addInner(f.from,f.to,f.value)||a.push(f)}else h.rangeIndex==1&&h.chunkIndexthis.chunkEnd(h.chunkIndex)||sh.to||s=s&&e<=s+r.length&&r.between(s,e-s,t-s,n)===!1)return}this.nextLayer.between(e,t,n)}}iter(e=0){return W.from([this]).goto(e)}get isEmpty(){return this.nextLayer==this}static iter(e,t=0){return W.from(e).goto(t)}static compare(e,t,n,i,s=-1){let r=e.filter(f=>f.maxPoint>0||!f.isEmpty&&f.maxPoint>=s),h=t.filter(f=>f.maxPoint>0||!f.isEmpty&&f.maxPoint>=s),o=Ae(r,h,n),a=new V(r,o,s),u=new V(h,o,s);n.iterGaps((f,d,c)=>be(a,f,u,d,c,i)),n.empty&&n.length==0&&be(a,0,u,0,0,i)}static eq(e,t,n=0,i){i==null&&(i=999999999);let s=e.filter(u=>!u.isEmpty&&t.indexOf(u)<0),r=t.filter(u=>!u.isEmpty&&e.indexOf(u)<0);if(s.length!=r.length)return!1;if(!s.length)return!0;let h=Ae(s,r),o=new V(s,h,0).goto(n),a=new V(r,h,0).goto(n);for(;;){if(o.to!=a.to||!pe(o.active,a.active)||o.point&&(!a.point||!ve(o.point,a.point)))return!1;if(o.to>i)return!0;o.next(),a.next()}}static spans(e,t,n,i,s=-1){let r=new V(e,null,s).goto(t),h=t,o=r.openStart;for(;;){let a=Math.min(r.to,n);if(r.point){let u=r.activeForPoint(r.to),f=r.pointFromh&&(i.span(h,a,r.active,o),o=r.openEnd(a));if(r.to>n)return o+(r.point&&r.to>n?1:0);h=r.to,r.next()}}static of(e,t=!1){let n=new ee;for(let i of e instanceof z?[e]:t?ut(e):e)n.add(i.from,i.to,i.value);return n.finish()}static join(e){if(!e.length)return S.empty;let t=e[e.length-1];for(let n=e.length-2;n>=0;n--)for(let i=e[n];i!=S.empty;i=i.nextLayer)t=new S(i.chunkPos,i.chunk,t,Math.max(i.maxPoint,t.maxPoint));return t}}S.empty=new S([],[],null,-1);function ut(l){if(l.length>1)for(let e=l[0],t=1;t0)return l.slice().sort(ge);e=n}return l}S.empty.nextLayer=S.empty;class ee{finishChunk(e){this.chunks.push(new xe(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,e&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(e,t,n){this.addInner(e,t,n)||(this.nextLayer||(this.nextLayer=new ee)).add(e,t,n)}addInner(e,t,n){let i=e-this.lastTo||n.startSide-this.last.endSide;if(i<=0&&(e-this.lastFrom||n.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return i<0?!1:(this.from.length==250&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=e),this.from.push(e-this.chunkStart),this.to.push(t-this.chunkStart),this.last=n,this.lastFrom=e,this.lastTo=t,this.value.push(n),n.point&&(this.maxPoint=Math.max(this.maxPoint,t-e)),!0)}addChunk(e,t){if((e-this.lastTo||t.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,t.maxPoint),this.chunks.push(t),this.chunkPos.push(e);let n=t.value.length-1;return this.last=t.value[n],this.lastFrom=t.from[n]+e,this.lastTo=t.to[n]+e,!0}finish(){return this.finishInner(S.empty)}finishInner(e){if(this.from.length&&this.finishChunk(!1),this.chunks.length==0)return e;let t=S.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(e):e,this.setMaxPoint);return this.from=null,t}}function Ae(l,e,t){let n=new Map;for(let s of l)for(let r=0;r=this.minPoint)break}}setRangeIndex(e){if(e==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex=n&&i.push(new Ue(r,t,n,s));return i.length==1?i[0]:new W(i)}get startSide(){return this.value?this.value.startSide:0}goto(e,t=-1e9){for(let n of this.heap)n.goto(e,t);for(let n=this.heap.length>>1;n>=0;n--)se(this.heap,n);return this.next(),this}forward(e,t){for(let n of this.heap)n.forward(e,t);for(let n=this.heap.length>>1;n>=0;n--)se(this.heap,n);(this.to-e||this.value.endSide-t)<0&&this.next()}next(){if(this.heap.length==0)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let e=this.heap[0];this.from=e.from,this.to=e.to,this.value=e.value,this.rank=e.rank,e.value&&e.next(),se(this.heap,0)}}}function se(l,e){for(let t=l[e];;){let n=(e<<1)+1;if(n>=l.length)break;let i=l[n];if(n+1=0&&(i=l[n+1],n++),t.compare(i)<0)break;l[n]=t,l[e]=i,e=n}}class V{constructor(e,t,n){this.minPoint=n,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=W.from(e,t,n)}goto(e,t=-1e9){return this.cursor.goto(e,t),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=e,this.endSide=t,this.openStart=-1,this.next(),this}forward(e,t){for(;this.minActive>-1&&(this.activeTo[this.minActive]-e||this.active[this.minActive].endSide-t)<0;)this.removeActive(this.minActive);this.cursor.forward(e,t)}removeActive(e){G(this.active,e),G(this.activeTo,e),G(this.activeRank,e),this.minActive=Ce(this.active,this.activeTo)}addActive(e){let t=0,{value:n,to:i,rank:s}=this.cursor;for(;t0;)t++;j(this.active,t,n),j(this.activeTo,t,i),j(this.activeRank,t,s),e&&j(e,t,this.cursor.from),this.minActive=Ce(this.active,this.activeTo)}next(){let e=this.to,t=this.point;this.point=null;let n=this.openStart<0?[]:null;for(;;){let i=this.minActive;if(i>-1&&(this.activeTo[i]-this.cursor.from||this.active[i].endSide-this.cursor.startSide)<0){if(this.activeTo[i]>e){this.to=this.activeTo[i],this.endSide=this.active[i].endSide;break}this.removeActive(i),n&&G(n,i)}else if(this.cursor.value)if(this.cursor.from>e){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}else{let s=this.cursor.value;if(!s.point)this.addActive(n),this.cursor.next();else if(t&&this.cursor.to==this.to&&this.cursor.from=0&&n[i]=0&&!(this.activeRank[n]e||this.activeTo[n]==e&&this.active[n].endSide>=this.point.endSide)&&t.push(this.active[n]);return t.reverse()}openEnd(e){let t=0;for(let n=this.activeTo.length-1;n>=0&&this.activeTo[n]>e;n--)t++;return t}}function be(l,e,t,n,i,s){l.goto(e),t.goto(n);let r=n+i,h=n,o=n-e,a=!!s.boundChange;for(let u=!1;;){let f=l.to+o-t.to,d=f||l.endSide-t.endSide,c=d<0?l.to+o:t.to,g=Math.min(c,r);if(l.point||t.point?(l.point&&t.point&&ve(l.point,t.point)&&pe(l.activeForPoint(l.to),t.activeForPoint(t.to))||s.comparePoint(h,g,l.point,t.point),u=!1):(u&&s.boundChange(h),g>h&&!pe(l.active,t.active)&&s.compareRange(h,g,l.active,t.active),a&&gr)break;h=c,d<=0&&l.next(),d>=0&&t.next()}}function pe(l,e){if(l.length!=e.length)return!1;for(let t=0;t=e;n--)l[n+1]=l[n];l[e]=t}function Ce(l,e){let t=-1,n=1e9;for(let i=0;i=e)return i;if(i==l.length)break;s+=l.charCodeAt(i)==9?t-s%t:1,i=Q(l,i)}return n===!0?-1:l.length}export{H as Annotation,tt as AnnotationType,E as ChangeDesc,k as ChangeSet,R as CharCategory,te as Compartment,p as EditorSelection,w as EditorState,A as Facet,Qe as Line,O as MapMode,gt as Prec,z as Range,S as RangeSet,ee as RangeSetBuilder,_ as RangeValue,B as SelectionRange,I as StateEffect,nt as StateEffectType,L as StateField,x as Text,P as Transaction,ft as codePointAt,dt as codePointSize,pt as combineConfig,mt as countColumn,Q as findClusterBreak,wt as findColumn,ct as fromCodePoint}; diff --git a/ui/assets/web/assets/index-B9CtIV-P.js b/ui/assets/web/assets/index-B9CtIV-P.js new file mode 100644 index 0000000..ce4c452 --- /dev/null +++ b/ui/assets/web/assets/index-B9CtIV-P.js @@ -0,0 +1 @@ +import{P as de,a as pe,b as Pe,D as ge,N as I,T as y,I as ke,s as ie,t as d,p as Qe}from"./index-CQY7N6SN.js";import{LRLanguage as re,LanguageSupport as W,indentNodeProp as me,foldNodeProp as xe,delimitedIndent as _,foldInside as be}from"./index-CkqoOxGF.js";import"./index-1CbRHFUW.js";import"./index-DocLX96z.js";var M={};class w{constructor(e,t,i,r,a,n,h,o,l,f=0,O){this.p=e,this.stack=t,this.state=i,this.reducePos=r,this.pos=a,this.score=n,this.buffer=h,this.bufferBase=o,this.curContext=l,this.lookAhead=f,this.parent=O}toString(){return`[${this.stack.filter((e,t)=>t%3==0).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(e,t,i=0){let r=e.parser.context;return new w(e,[],t,i,i,0,[],0,r?new F(r,r.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(e,t){this.stack.push(this.state,t,this.bufferBase+this.buffer.length),this.state=e}reduce(e){var t;let i=e>>19,r=e&65535,{parser:a}=this.p,n=this.reducePos=2e3&&!(!((t=this.p.parser.nodeSet.types[r])===null||t===void 0)&&t.isAnonymous)&&(l==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=f):this.p.lastBigReductionSizeo;)this.stack.pop();this.reduceContext(r,l)}storeNode(e,t,i,r=4,a=!1){if(e==0&&(!this.stack.length||this.stack[this.stack.length-1]0&&n.buffer[h-4]==0&&n.buffer[h-1]>-1){if(t==i)return;if(n.buffer[h-2]>=t){n.buffer[h-2]=i;return}}}if(!a||this.pos==i)this.buffer.push(e,t,i,r);else{let n=this.buffer.length;if(n>0&&(this.buffer[n-4]!=0||this.buffer[n-1]<0)){let h=!1;for(let o=n;o>0&&this.buffer[o-2]>i;o-=4)if(this.buffer[o-1]>=0){h=!0;break}if(h)for(;n>0&&this.buffer[n-2]>i;)this.buffer[n]=this.buffer[n-4],this.buffer[n+1]=this.buffer[n-3],this.buffer[n+2]=this.buffer[n-2],this.buffer[n+3]=this.buffer[n-1],n-=4,r>4&&(r-=4)}this.buffer[n]=e,this.buffer[n+1]=t,this.buffer[n+2]=i,this.buffer[n+3]=r}}shift(e,t,i,r){if(e&131072)this.pushState(e&65535,this.pos);else if((e&262144)==0){let a=e,{parser:n}=this.p;(r>this.pos||t<=n.maxNode)&&(this.pos=r,n.stateFlag(a,1)||(this.reducePos=r)),this.pushState(a,i),this.shiftContext(t,i),t<=n.maxNode&&this.buffer.push(t,i,r,4)}else this.pos=r,this.shiftContext(t,i),t<=this.p.parser.maxNode&&this.buffer.push(t,i,r,4)}apply(e,t,i,r){e&65536?this.reduce(e):this.shift(e,t,i,r)}useNode(e,t){let i=this.p.reused.length-1;(i<0||this.p.reused[i]!=e)&&(this.p.reused.push(e),i++);let r=this.pos;this.reducePos=this.pos=r+e.length,this.pushState(t,r),this.buffer.push(i,r,this.reducePos,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,e,this,this.p.stream.reset(this.pos-e.length)))}split(){let e=this,t=e.buffer.length;for(;t>0&&e.buffer[t-2]>e.reducePos;)t-=4;let i=e.buffer.slice(t),r=e.bufferBase+t;for(;e&&r==e.bufferBase;)e=e.parent;return new w(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,i,r,this.curContext,this.lookAhead,e)}recoverByDelete(e,t){let i=e<=this.p.parser.maxNode;i&&this.storeNode(e,this.pos,t,4),this.storeNode(0,this.pos,t,i?8:4),this.pos=this.reducePos=t,this.score-=190}canShift(e){for(let t=new Se(this);;){let i=this.p.parser.stateSlot(t.state,4)||this.p.parser.hasAction(t.state,e);if(i==0)return!1;if((i&65536)==0)return!0;t.reduce(i)}}recoverByInsert(e){if(this.stack.length>=300)return[];let t=this.p.parser.nextStates(this.state);if(t.length>8||this.stack.length>=120){let r=[];for(let a=0,n;ao&1&&h==n)||r.push(t[a],n)}t=r}let i=[];for(let r=0;r>19,r=t&65535,a=this.stack.length-i*3;if(a<0||e.getGoto(this.stack[a],r,!1)<0){let n=this.findForcedReduction();if(n==null)return!1;t=n}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(t),!0}findForcedReduction(){let{parser:e}=this.p,t=[],i=(r,a)=>{if(!t.includes(r))return t.push(r),e.allActions(r,n=>{if(!(n&393216))if(n&65536){let h=(n>>19)-a;if(h>1){let o=n&65535,l=this.stack.length-h*3;if(l>=0&&e.getGoto(this.stack[l],o,!1)>=0)return h<<19|65536|o}}else{let h=i(n,a+1);if(h!=null)return h}})};return i(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(this.stack.length!=3)return!1;let{parser:e}=this.p;return e.data[e.stateSlot(this.state,1)]==65535&&!e.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(e){if(this.state!=e.state||this.stack.length!=e.stack.length)return!1;for(let t=0;t0&&this.emitLookAhead()}}class F{constructor(e,t){this.tracker=e,this.context=t,this.hash=e.strict?e.hash(t):0}}class Se{constructor(e){this.start=e,this.state=e.state,this.stack=e.stack,this.base=this.stack.length}reduce(e){let t=e&65535,i=e>>19;i==0?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=(i-1)*3;let r=this.start.p.parser.getGoto(this.stack[this.base-3],t,!0);this.state=r}}class ${constructor(e,t,i){this.stack=e,this.pos=t,this.index=i,this.buffer=e.buffer,this.index==0&&this.maybeNext()}static create(e,t=e.bufferBase+e.buffer.length){return new $(e,t,t-e.bufferBase)}maybeNext(){let e=this.stack.parent;e!=null&&(this.index=this.stack.bufferBase-e.bufferBase,this.stack=e,this.buffer=e.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,this.index==0&&this.maybeNext()}fork(){return new $(this.stack,this.pos,this.index)}}function C(s,e=Uint16Array){if(typeof s!="string")return s;let t=null;for(let i=0,r=0;i=92&&n--,n>=34&&n--;let o=n-32;if(o>=46&&(o-=46,h=!0),a+=o,h)break;a*=46}t?t[r++]=a:t=new e(a)}return t}class D{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}}const E=new D;class Re{constructor(e,t){this.input=e,this.ranges=t,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=E,this.rangeIndex=0,this.pos=this.chunkPos=t[0].from,this.range=t[0],this.end=t[t.length-1].to,this.readNext()}resolveOffset(e,t){let i=this.range,r=this.rangeIndex,a=this.pos+e;for(;ai.to:a>=i.to;){if(r==this.ranges.length-1)return null;let n=this.ranges[++r];a+=n.from-i.to,i=n}return a}clipPos(e){if(e>=this.range.from&&ee)return Math.max(e,t.from);return this.end}peek(e){let t=this.chunkOff+e,i,r;if(t>=0&&t=this.chunk2Pos&&ih.to&&(this.chunk2=this.chunk2.slice(0,h.to-i)),r=this.chunk2.charCodeAt(0)}}return i>=this.token.lookAhead&&(this.token.lookAhead=i+1),r}acceptToken(e,t=0){let i=t?this.resolveOffset(t,-1):this.pos;if(i==null||i=this.chunk2Pos&&this.posthis.range.to?e.slice(0,this.range.to-this.pos):e,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(e=1){for(this.chunkOff+=e;this.pos+e>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();e-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=e,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(e,t){if(t?(this.token=t,t.start=e,t.lookAhead=e+1,t.value=t.extended=-1):this.token=E,this.pos!=e){if(this.pos=e,e==this.end)return this.setDone(),this;for(;e=this.range.to;)this.range=this.ranges[++this.rangeIndex];e>=this.chunkPos&&e=this.chunkPos&&t<=this.chunkPos+this.chunk.length)return this.chunk.slice(e-this.chunkPos,t-this.chunkPos);if(e>=this.chunk2Pos&&t<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(e-this.chunk2Pos,t-this.chunk2Pos);if(e>=this.range.from&&t<=this.range.to)return this.input.read(e,t);let i="";for(let r of this.ranges){if(r.from>=t)break;r.to>e&&(i+=this.input.read(Math.max(r.from,e),Math.min(r.to,t)))}return i}}class b{constructor(e,t){this.data=e,this.id=t}token(e,t){let{parser:i}=t.p;Xe(this.data,e,t,this.id,i.data,i.tokenPrecTable)}}b.prototype.contextual=b.prototype.fallback=b.prototype.extend=!1;b.prototype.fallback=b.prototype.extend=!1;class z{constructor(e,t={}){this.token=e,this.contextual=!!t.contextual,this.fallback=!!t.fallback,this.extend=!!t.extend}}function Xe(s,e,t,i,r,a){let n=0,h=1<0){let p=s[c];if(o.allows(p)&&(e.token.value==-1||e.token.value==p||ve(p,e.token.value,r,a))){e.acceptToken(p);break}}let f=e.next,O=0,u=s[n+2];if(e.next<0&&u>O&&s[l+u*3-3]==65535){n=s[l+u*3-1];continue e}for(;O>1,p=l+c+(c<<1),T=s[p],ue=s[p+1]||65536;if(f=ue)O=c+1;else{n=s[p+2],e.advance();continue e}}break}}function j(s,e,t){for(let i=e,r;(r=s[i])!=65535;i++)if(r==t)return i-e;return-1}function ve(s,e,t,i){let r=j(t,i,e);return r<0||j(t,i,s)e)&&!i.type.isError)return t<0?Math.max(0,Math.min(i.to-1,e-25)):Math.min(s.length,Math.max(i.from+1,e+25));if(t<0?i.prevSibling():i.nextSibling())break;if(!i.parent())return t<0?0:s.length}}class Te{constructor(e,t){this.fragments=e,this.nodeSet=t,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.nextFragment()}nextFragment(){let e=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(e){for(this.safeFrom=e.openStart?H(e.tree,e.from+e.offset,1)-e.offset:e.from,this.safeTo=e.openEnd?H(e.tree,e.to+e.offset,-1)-e.offset:e.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(e.tree),this.start.push(-e.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(e){if(ee)return this.nextStart=n,null;if(a instanceof y){if(n==e){if(n=Math.max(this.safeFrom,e)&&(this.trees.push(a),this.start.push(n),this.index.push(0))}else this.index[t]++,this.nextStart=n+a.length}}}class Ce{constructor(e,t){this.stream=t,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=e.tokenizers.map(i=>new D)}getActions(e){let t=0,i=null,{parser:r}=e.p,{tokenizers:a}=r,n=r.stateSlot(e.state,3),h=e.curContext?e.curContext.hash:0,o=0;for(let l=0;lO.end+25&&(o=Math.max(O.lookAhead,o)),O.value!=0)){let u=t;if(O.extended>-1&&(t=this.addActions(e,O.extended,O.end,t)),t=this.addActions(e,O.value,O.end,t),!f.extend&&(i=O,t>u))break}}for(;this.actions.length>t;)this.actions.pop();return o&&e.setLookAhead(o),!i&&e.pos==this.stream.end&&(i=new D,i.value=e.p.parser.eofTerm,i.start=i.end=e.pos,t=this.addActions(e,i.value,i.end,t)),this.mainToken=i,this.actions}getMainToken(e){if(this.mainToken)return this.mainToken;let t=new D,{pos:i,p:r}=e;return t.start=i,t.end=Math.min(i+1,r.stream.end),t.value=i==r.stream.end?r.parser.eofTerm:0,t}updateCachedToken(e,t,i){let r=this.stream.clipPos(i.pos);if(t.token(this.stream.reset(r,e),i),e.value>-1){let{parser:a}=i.p;for(let n=0;n=0&&i.p.parser.dialect.allows(h>>1)){(h&1)==0?e.value=h>>1:e.extended=h>>1;break}}}else e.value=0,e.end=this.stream.clipPos(r+1)}putAction(e,t,i,r){for(let a=0;ae.bufferLength*4?new Te(i,e.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let e=this.stacks,t=this.minStackPos,i=this.stacks=[],r,a;if(this.bigReductionCount>300&&e.length==1){let[n]=e;for(;n.forceReduce()&&n.stack.length&&n.stack[n.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let n=0;nt)i.push(h);else{if(this.advanceStack(h,i,e))continue;{r||(r=[],a=[]),r.push(h);let o=this.tokens.getMainToken(h);a.push(o.value,o.end)}}break}}if(!i.length){let n=r&&$e(r);if(n)return P&&console.log("Finish with "+this.stackID(n)),this.stackToTree(n);if(this.parser.strict)throw P&&r&&console.log("Stuck with token "+(this.tokens.mainToken?this.parser.getName(this.tokens.mainToken.value):"none")),new SyntaxError("No parse at "+t);this.recovering||(this.recovering=5)}if(this.recovering&&r){let n=this.stoppedAt!=null&&r[0].pos>this.stoppedAt?r[0]:this.runRecovery(r,a,i);if(n)return P&&console.log("Force-finish "+this.stackID(n)),this.stackToTree(n.forceAll())}if(this.recovering){let n=this.recovering==1?1:this.recovering*3;if(i.length>n)for(i.sort((h,o)=>o.score-h.score);i.length>n;)i.pop();i.some(h=>h.reducePos>t)&&this.recovering--}else if(i.length>1){e:for(let n=0;n500&&l.buffer.length>500)if((h.score-l.score||h.buffer.length-l.buffer.length)>0)i.splice(o--,1);else{i.splice(n--,1);continue e}}}i.length>12&&(i.sort((n,h)=>h.score-n.score),i.splice(12,i.length-12))}this.minStackPos=i[0].pos;for(let n=1;n ":"";if(this.stoppedAt!=null&&r>this.stoppedAt)return e.forceReduce()?e:null;if(this.fragments){let l=e.curContext&&e.curContext.tracker.strict,f=l?e.curContext.hash:0;for(let O=this.fragments.nodeAt(r);O;){let u=this.parser.nodeSet.types[O.type.id]==O.type?a.getGoto(e.state,O.type.id):-1;if(u>-1&&O.length&&(!l||(O.prop(I.contextHash)||0)==f))return e.useNode(O,u),P&&console.log(n+this.stackID(e)+` (via reuse of ${a.getName(O.type.id)})`),!0;if(!(O instanceof y)||O.children.length==0||O.positions[0]>0)break;let c=O.children[0];if(c instanceof y&&O.positions[0]==0)O=c;else break}}let h=a.stateSlot(e.state,4);if(h>0)return e.reduce(h),P&&console.log(n+this.stackID(e)+` (via always-reduce ${a.getName(h&65535)})`),!0;if(e.stack.length>=8400)for(;e.stack.length>6e3&&e.forceReduce(););let o=this.tokens.getActions(e);for(let l=0;lr?t.push(p):i.push(p)}return!1}advanceFully(e,t){let i=e.pos;for(;;){if(!this.advanceStack(e,null,null))return!1;if(e.pos>i)return K(e,t),!0}}runRecovery(e,t,i){let r=null,a=!1;for(let n=0;n ":"";if(h.deadEnd&&(a||(a=!0,h.restart(),P&&console.log(f+this.stackID(h)+" (restarted)"),this.advanceFully(h,i))))continue;let O=h.split(),u=f;for(let c=0;c<10&&O.forceReduce()&&(P&&console.log(u+this.stackID(O)+" (via force-reduce)"),!this.advanceFully(O,i));c++)P&&(u=this.stackID(O)+" -> ");for(let c of h.recoverByInsert(o))P&&console.log(f+this.stackID(c)+" (via recover-insert)"),this.advanceFully(c,i);this.stream.end>h.pos?(l==h.pos&&(l++,o=0),h.recoverByDelete(o,l),P&&console.log(f+this.stackID(h)+` (via recover-delete ${this.parser.getName(o)})`),K(h,i)):(!r||r.scores;class we{constructor(e){this.start=e.start,this.shift=e.shift||Y,this.reduce=e.reduce||Y,this.reuse=e.reuse||Y,this.hash=e.hash||(()=>0),this.strict=e.strict!==!1}}class X extends de{constructor(e){if(super(),this.wrappers=[],e.version!=14)throw new RangeError(`Parser version (${e.version}) doesn't match runtime version (14)`);let t=e.nodeNames.split(" ");this.minRepeatTerm=t.length;for(let h=0;he.topRules[h][1]),r=[];for(let h=0;h=0)a(f,o,h[l++]);else{let O=h[l+-f];for(let u=-f;u>0;u--)a(h[l++],o,O);l++}}}this.nodeSet=new pe(t.map((h,o)=>Pe.define({name:o>=this.minRepeatTerm?void 0:h,id:o,props:r[o],top:i.indexOf(o)>-1,error:o==0,skipped:e.skippedNodes&&e.skippedNodes.indexOf(o)>-1}))),e.propSources&&(this.nodeSet=this.nodeSet.extend(...e.propSources)),this.strict=!1,this.bufferLength=ge;let n=C(e.tokenData);this.context=e.context,this.specializerSpecs=e.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let h=0;htypeof h=="number"?new b(n,h):h),this.topRules=e.topRules,this.dialects=e.dialects||{},this.dynamicPrecedences=e.dynamicPrecedences||null,this.tokenPrecTable=e.tokenPrec,this.termNames=e.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(e,t,i){let r=new ye(this,e,t,i);for(let a of this.wrappers)r=a(r,e,t,i);return r}getGoto(e,t,i=!1){let r=this.goto;if(t>=r[0])return-1;for(let a=r[t+1];;){let n=r[a++],h=n&1,o=r[a++];if(h&&i)return o;for(let l=a+(n>>1);a0}validAction(e,t){return!!this.allActions(e,i=>i==t?!0:null)}allActions(e,t){let i=this.stateSlot(e,4),r=i?t(i):void 0;for(let a=this.stateSlot(e,1);r==null;a+=3){if(this.data[a]==65535)if(this.data[a+1]==1)a=g(this.data,a+2);else break;r=t(g(this.data,a+1))}return r}nextStates(e){let t=[];for(let i=this.stateSlot(e,1);;i+=3){if(this.data[i]==65535)if(this.data[i+1]==1)i=g(this.data,i+2);else break;if((this.data[i+2]&1)==0){let r=this.data[i+1];t.some((a,n)=>n&1&&a==r)||t.push(this.data[i],r)}}return t}configure(e){let t=Object.assign(Object.create(X.prototype),this);if(e.props&&(t.nodeSet=this.nodeSet.extend(...e.props)),e.top){let i=this.topRules[e.top];if(!i)throw new RangeError(`Invalid top rule name ${e.top}`);t.top=i}return e.tokenizers&&(t.tokenizers=this.tokenizers.map(i=>{let r=e.tokenizers.find(a=>a.from==i);return r?r.to:i})),e.specializers&&(t.specializers=this.specializers.slice(),t.specializerSpecs=this.specializerSpecs.map((i,r)=>{let a=e.specializers.find(h=>h.from==i.external);if(!a)return i;let n=Object.assign(Object.assign({},i),{external:a.to});return t.specializers[r]=J(n),n})),e.contextTracker&&(t.context=e.contextTracker),e.dialect&&(t.dialect=this.parseDialect(e.dialect)),e.strict!=null&&(t.strict=e.strict),e.wrap&&(t.wrappers=t.wrappers.concat(e.wrap)),e.bufferLength!=null&&(t.bufferLength=e.bufferLength),t}hasWrappers(){return this.wrappers.length>0}getName(e){return this.termNames?this.termNames[e]:String(e<=this.maxNode&&this.nodeSet.types[e].name||e)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(e){let t=this.dynamicPrecedences;return t==null?0:t[e]||0}parseDialect(e){let t=Object.keys(this.dialects),i=t.map(()=>!1);if(e)for(let a of e.split(" ")){let n=t.indexOf(a);n>=0&&(i[n]=!0)}let r=null;for(let a=0;ai)&&t.p.parser.stateFlag(t.state,2)&&(!e||e.scores.external(t,i)<<1|e}return s.get}const x=63,ee=64,Ae=1,ze=2,ne=3,qe=4,ae=5,Ye=6,Ue=7,he=65,We=66,Ne=8,Be=9,Ge=10,Ze=11,Ie=12,oe=13,Le=19,Ve=20,_e=29,Me=33,Fe=34,Ee=47,je=0,L=1,N=2,v=3,B=4;class Q{constructor(e,t,i){this.parent=e,this.depth=t,this.type=i,this.hash=(e?e.hash+e.hash<<8:0)+t+(t<<4)+i}}Q.top=new Q(null,-1,je);function R(s,e){for(let t=0,i=e-s.pos-1;;i--,t++){let r=s.peek(i);if(k(r)||r==-1)return t}}function G(s){return s==32||s==9}function k(s){return s==10||s==13}function le(s){return G(s)||k(s)}function m(s){return s<0||le(s)}const He=new we({start:Q.top,reduce(s,e){return s.type==v&&(e==Ve||e==Fe)?s.parent:s},shift(s,e,t,i){if(e==ne)return new Q(s,R(i,i.pos),L);if(e==he||e==ae)return new Q(s,R(i,i.pos),N);if(e==x)return s.parent;if(e==Le||e==Me)return new Q(s,0,v);if(e==oe&&s.type==B)return s.parent;if(e==Ee){let r=/[1-9]/.exec(i.read(i.pos,t.pos));if(r)return new Q(s,s.depth+ +r[0],B)}return s},hash(s){return s.hash}});function S(s,e,t=0){return s.peek(t)==e&&s.peek(t+1)==e&&s.peek(t+2)==e&&m(s.peek(t+3))}const Ke=new z((s,e)=>{if(s.next==-1&&e.canShift(ee))return s.acceptToken(ee);let t=s.peek(-1);if((k(t)||t<0)&&e.context.type!=v){if(S(s,45))if(e.canShift(x))s.acceptToken(x);else return s.acceptToken(Ae,3);if(S(s,46))if(e.canShift(x))s.acceptToken(x);else return s.acceptToken(ze,3);let i=0;for(;s.next==32;)i++,s.advance();(i{if(e.context.type==v){s.next==63&&(s.advance(),m(s.next)&&s.acceptToken(Ue));return}if(s.next==45)s.advance(),m(s.next)&&s.acceptToken(e.context.type==L&&e.context.depth==R(s,s.pos-1)?qe:ne);else if(s.next==63)s.advance(),m(s.next)&&s.acceptToken(e.context.type==N&&e.context.depth==R(s,s.pos-1)?Ye:ae);else{let t=s.pos;for(;;)if(G(s.next)){if(s.pos==t)return;s.advance()}else if(s.next==33)Oe(s);else if(s.next==38)Z(s);else if(s.next==42){Z(s);break}else if(s.next==39||s.next==34){if(V(s,!0))break;return}else if(s.next==91||s.next==123){if(!tt(s))return;break}else{fe(s,!0,!1,0);break}for(;G(s.next);)s.advance();if(s.next==58){if(s.pos==t&&e.canShift(_e))return;let i=s.peek(1);m(i)&&s.acceptTokenTo(e.context.type==N&&e.context.depth==R(s,t)?We:he,t)}}},{contextual:!0});function et(s){return s>32&&s<127&&s!=34&&s!=37&&s!=44&&s!=60&&s!=62&&s!=92&&s!=94&&s!=96&&s!=123&&s!=124&&s!=125}function te(s){return s>=48&&s<=57||s>=97&&s<=102||s>=65&&s<=70}function se(s,e){return s.next==37?(s.advance(),te(s.next)&&s.advance(),te(s.next)&&s.advance(),!0):et(s.next)||e&&s.next==44?(s.advance(),!0):!1}function Oe(s){if(s.advance(),s.next==60){for(s.advance();;)if(!se(s,!0)){s.next==62&&s.advance();break}}else for(;se(s,!1););}function Z(s){for(s.advance();!m(s.next)&&A(s.tag)!="f";)s.advance()}function V(s,e){let t=s.next,i=!1,r=s.pos;for(s.advance();;){let a=s.next;if(a<0)break;if(s.advance(),a==t)if(a==39)if(s.next==39)s.advance();else break;else break;else if(a==92&&t==34)s.next>=0&&s.advance();else if(k(a)){if(e)return!1;i=!0}else if(e&&s.pos>=r+1024)return!1}return!i}function tt(s){for(let e=[],t=s.pos+1024;;)if(s.next==91||s.next==123)e.push(s.next),s.advance();else if(s.next==39||s.next==34){if(!V(s,!0))return!1}else if(s.next==93||s.next==125){if(e[e.length-1]!=s.next-2)return!1;if(e.pop(),s.advance(),!e.length)return!0}else{if(s.next<0||s.pos>t||k(s.next))return!1;s.advance()}}const st="iiisiiissisfissssssssssssisssiiissssssssssssssssssssssssssfsfssissssssssssssssssssssssssssfif";function A(s){return s<33?"u":s>125?"s":st[s-33]}function U(s,e){let t=A(s);return t!="u"&&!(e&&t=="f")}function fe(s,e,t,i){if(A(s.next)=="s"||(s.next==63||s.next==58||s.next==45)&&U(s.peek(1),t))s.advance();else return!1;let r=s.pos;for(;;){let a=s.next,n=0,h=i+1;for(;le(a);){if(k(a)){if(e)return!1;h=0}else h++;a=s.peek(++n)}if(!(a>=0&&(a==58?U(s.peek(n+1),t):a==35?s.peek(n-1)!=32:U(a,t)))||!t&&h<=i||h==0&&!t&&(S(s,45,n)||S(s,46,n)))break;if(e&&A(a)=="f")return!1;for(let l=n;l>=0;l--)s.advance();if(e&&s.pos>r+1024)return!1}return!0}const it=new z((s,e)=>{if(s.next==33)Oe(s),s.acceptToken(Ie);else if(s.next==38||s.next==42){let t=s.next==38?Ge:Ze;Z(s),s.acceptToken(t)}else s.next==39||s.next==34?(V(s,!1),s.acceptToken(Be)):fe(s,!1,e.context.type==v,e.context.depth)&&s.acceptToken(Ne)}),rt=new z((s,e)=>{let t=e.context.type==B?e.context.depth:-1,i=s.pos;e:for(;;){let r=0,a=s.next;for(;a==32;)a=s.peek(++r);if(!r&&(S(s,45,r)||S(s,46,r))||!k(a)&&(t<0&&(t=Math.max(e.context.depth+1,r)),rYAN>Y",stateData:";S~O!fOS!gOS^OS~OP_OQbORSOTUOWROXROYYOZZO[XOcPOqQO!PVO!V[O!cTO~O`cO~P]OVkOWROXROYeOZfO[dOcPOmhOqQO~OboO~P!bOVtOWROXROYeOZfO[dOcPOmrOqQO~OpwO~P#WORSOTUOWROXROYYOZZO[XOcPOqQO!PVO!cTO~OSvP!avP!bvP~P#|OWROXROYeOZfO[dOcPOqQO~OmzO~P%OOm!OOUzP!azP!bzP!dzP~P#|O^!SO!b!QO!f!TO!g!RO~ORSOTUOWROXROcPOqQO!PVO!cTO~OY!UOP!QXQ!QX!V!QX!`!QXS!QX!a!QX!b!QXU!QXm!QX!d!QX~P&aO[!WOP!SXQ!SX!V!SX!`!SXS!SX!a!SX!b!SXU!SXm!SX!d!SX~P&aO^!ZO!W![O!b!YO!f!]O!g!YO~OP!_O!V[OQaX!`aX~OPaXQaX!VaX!`aX~P#|OP!bOQ!cO!V[O~OP_O!V[O~P#|OWROXROY!fOcPOqQObfXmfXofXpfX~OWROXRO[!hOcPOqQObhXmhXohXphX~ObeXmlXoeX~ObkXokX~P%OOm!kO~Om!lObnPonP~P%OOb!pOo!oO~Ob!pO~P!bOm!sOosXpsX~OosXpsX~P%OOm!uOotPptP~P%OOo!xOp!yO~Op!yO~P#WOS!|O!a#OO!b#OO~OUyX!ayX!byX!dyX~P#|Om#QO~OU#SO!a#UO!b#UO!d#RO~Om#WOUzX!azX!bzX!dzX~O]#XO~O!b#XO!g#YO~O^#ZO!b#XO!g#YO~OP!RXQ!RX!V!RX!`!RXS!RX!a!RX!b!RXU!RXm!RX!d!RX~P&aOP!TXQ!TX!V!TX!`!TXS!TX!a!TX!b!TXU!TXm!TX!d!TX~P&aO!b#^O!g#^O~O^#_O!b#^O!f#`O!g#^O~O^#_O!W#aO!b#^O!g#^O~OPaaQaa!Vaa!`aa~P#|OP#cO!V[OQ!XX!`!XX~OP!XXQ!XX!V!XX!`!XX~P#|OP_O!V[OQ!_X!`!_X~P#|OWROXROcPOqQObgXmgXogXpgX~OWROXROcPOqQObiXmiXoiXpiX~Obkaoka~P%OObnXonX~P%OOm#kO~Ob#lOo!oO~Oosapsa~P%OOotXptX~P%OOm#pO~Oo!xOp#qO~OSwP!awP!bwP~P#|OS!|O!a#vO!b#vO~OUya!aya!bya!dya~P#|Om#xO~P%OOm#{OU}P!a}P!b}P!d}P~P#|OU#SO!a$OO!b$OO!d#RO~O]$QO~O!b$QO!g$RO~O!b$SO!g$SO~O^$TO!b$SO!g$SO~O^$TO!b$SO!f$UO!g$SO~OP!XaQ!Xa!V!Xa!`!Xa~P#|Obnaona~P%OOotapta~P%OOo!xO~OU|X!a|X!b|X!d|X~P#|Om$ZO~Om$]OU}X!a}X!b}X!d}X~O]$^O~O!b$_O!g$_O~O^$`O!b$_O!g$_O~OU|a!a|a!b|a!d|a~P#|O!b$cO!g$cO~O",goto:",]!mPPPPPPPPPPPPPPPPP!nPP!v#v#|$`#|$c$f$j$nP%VPPP!v%Y%^%a%{&O%a&R&U&X&_&b%aP&e&{&e'O'RPP']'a'g'm's'y(XPPPPPPPP(_)e*X+c,VUaObcR#e!c!{ROPQSTUXY_bcdehknrtvz!O!U!W!_!b!c!f!h!k!l!s!u!|#Q#R#S#W#c#k#p#x#{$Z$]QmPR!qnqfPQThknrtv!k!l!s!u#R#k#pR!gdR!ieTlPnTjPnSiPnSqQvQ{TQ!mkQ!trQ!vtR#y#RR!nkTsQvR!wt!RWOSUXY_bcz!O!U!W!_!b!c!|#Q#S#W#c#x#{$Z$]RySR#t!|R|TR|UQ!PUR#|#SR#z#RR#z#SyZOSU_bcz!O!_!b!c!|#Q#S#W#c#x#{$Z$]R!VXR!XYa]O^abc!a!c!eT!da!eQnPR!rnQvQR!{vQ!}yR#u!}Q#T|R#}#TW^Obc!cS!^^!aT!aa!eQ!eaR#f!eW`Obc!cQxSS}U#SQ!`_Q#PzQ#V!OQ#b!_Q#d!bQ#s!|Q#w#QQ$P#WQ$V#cQ$Y#xQ$[#{Q$a$ZR$b$]xZOSU_bcz!O!_!b!c!|#Q#S#W#c#x#{$Z$]Q!VXQ!XYQ#[!UR#]!W!QWOSUXY_bcz!O!U!W!_!b!c!|#Q#S#W#c#x#{$Z$]pfPQThknrtv!k!l!s!u#R#k#pQ!gdQ!ieQ#g!fR#h!hSgPn^pQTkrtv#RQ!jhQ#i!kQ#j!lQ#n!sQ#o!uQ$W#kR$X#pQuQR!zv",nodeNames:"⚠ DirectiveEnd DocEnd - - ? ? ? Literal QuotedLiteral Anchor Alias Tag BlockLiteralContent Comment Stream BOM Document ] [ FlowSequence Item Tagged Anchored Anchored Tagged FlowMapping Pair Key : Pair , } { FlowMapping Pair Pair BlockSequence Item Item BlockMapping Pair Pair Key Pair Pair BlockLiteral BlockLiteralHeader Tagged Anchored Anchored Tagged Directive DirectiveName DirectiveContent Document",maxTerm:74,context:He,nodeProps:[["isolate",-3,8,9,14,""],["openedBy",18,"[",32,"{"],["closedBy",19,"]",33,"}"]],propSources:[nt],skippedNodes:[0],repeatNodeCount:6,tokenData:"-Y~RnOX#PXY$QYZ$]Z]#P]^$]^p#Ppq$Qqs#Pst$btu#Puv$yv|#P|}&e}![#P![!]'O!]!`#P!`!a'i!a!}#P!}#O*g#O#P#P#P#Q+Q#Q#o#P#o#p+k#p#q'i#q#r,U#r;'S#P;'S;=`#z<%l?HT#P?HT?HU,o?HUO#PQ#UU!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PQ#kTOY#PZs#Pt;'S#P;'S;=`#z<%lO#PQ#}P;=`<%l#P~$VQ!f~XY$Qpq$Q~$bO!g~~$gS^~OY$bZ;'S$b;'S;=`$s<%lO$b~$vP;=`<%l$bR%OX!WQOX%kXY#PZ]%k]^#P^p%kpq#hq;'S%k;'S;=`&_<%lO%kR%rX!WQ!VPOX%kXY#PZ]%k]^#P^p%kpq#hq;'S%k;'S;=`&_<%lO%kR&bP;=`<%l%kR&lUoP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR'VUmP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR'p[!PP!WQOY#PZp#Ppq#hq{#P{|(f|}#P}!O(f!O!R#P!R![)p![;'S#P;'S;=`#z<%lO#PR(mW!PP!WQOY#PZp#Ppq#hq!R#P!R![)V![;'S#P;'S;=`#z<%lO#PR)^U!PP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR)wY!PP!WQOY#PZp#Ppq#hq{#P{|)V|}#P}!O)V!O;'S#P;'S;=`#z<%lO#PR*nUcP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR+XUbP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR+rUqP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR,]UpP!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#PR,vU`P!WQOY#PZp#Ppq#hq;'S#P;'S;=`#z<%lO#P",tokenizers:[Ke,Je,it,rt,0,1],topRules:{Stream:[0,15]},tokenPrec:0}),ht=X.deserialize({version:14,states:"!vOQOPOOO]OPO'#C_OhOPO'#C^OOOO'#Cc'#CcOpOPO'#CaQOOOOOO{OPOOOOOO'#Cb'#CbO!WOPO'#C`O!`OPO,58xOOOO-E6a-E6aOOOO-E6`-E6`OOOO'#C_'#C_OOOO1G.d1G.d",stateData:"!h~OXPOYROWTP~OWVXXRXYRX~OYVOXSP~OXROYROWTX~OXROYROWTP~OYVOXSX~OX[O~OXY~",goto:"vWPPX[beioRUOQQOR]XRXQTTOUQWQRZWSSOURYS",nodeNames:"⚠ Document Frontmatter DashLine FrontmatterContent Body",maxTerm:10,skippedNodes:[0],repeatNodeCount:2,tokenData:"$z~RXOYnYZ!^Z]n]^!^^}n}!O!i!O;'Sn;'S;=`!c<%lOn~qXOYnYZ!^Z]n]^!^^;'Sn;'S;=`!c<%l~n~On~~!^~!cOY~~!fP;=`<%ln~!lZOYnYZ!^Z]n]^!^^}n}!O#_!O;'Sn;'S;=`!c<%l~n~On~~!^~#bZOYnYZ!^Z]n]^!^^}n}!O$T!O;'Sn;'S;=`!c<%l~n~On~~!^~$WXOYnYZ$sZ]n]^$s^;'Sn;'S;=`!c<%l~n~On~~$s~$zOX~Y~",tokenizers:[0],topRules:{Document:[0,1]},tokenPrec:67}),ce=re.define({name:"yaml",parser:at.configure({props:[me.add({Stream:s=>{for(let e=s.node.resolve(s.pos,-1);e&&e.to>=s.pos;e=e.parent){if(e.name=="BlockLiteralContent"&&e.froms.pos)return null}}return null},FlowMapping:_({closing:"}"}),FlowSequence:_({closing:"]"})}),xe.add({"FlowMapping FlowSequence":be,"Item Pair BlockLiteral":(s,e)=>({from:e.doc.lineAt(s.from).to,to:s.to})})]}),languageData:{commentTokens:{line:"#"},indentOnInput:/^\s*[\]\}]$/}});function ut(){return new W(ce)}const ot=re.define({name:"yaml-frontmatter",parser:ht.configure({props:[ie({DashLine:d.meta})]})});function dt(s){let{language:e,support:t}=s.content instanceof W?s.content:{language:s.content,support:[]};return new W(ot.configure({wrap:Qe(i=>i.name=="FrontmatterContent"?{parser:ce.parser}:i.name=="Body"?{parser:e.parser}:null)}),t)}export{ut as yaml,dt as yamlFrontmatter,ce as yamlLanguage}; diff --git a/ui/assets/web/assets/index-CQY7N6SN.js b/ui/assets/web/assets/index-CQY7N6SN.js new file mode 100644 index 0000000..d818e86 --- /dev/null +++ b/ui/assets/web/assets/index-CQY7N6SN.js @@ -0,0 +1,2 @@ +const pt=1024;let Je=0;class H{constructor(e,t){this.from=e,this.to=t}}class A{constructor(e={}){this.id=Je++,this.perNode=!!e.perNode,this.deserialize=e.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")}),this.combine=e.combine||null}add(e){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof e!="function"&&(e=L.match(e)),t=>{let r=e(t);return r===void 0?null:[this,r]}}}A.closedBy=new A({deserialize:s=>s.split(" ")});A.openedBy=new A({deserialize:s=>s.split(" ")});A.group=new A({deserialize:s=>s.split(" ")});A.isolate=new A({deserialize:s=>{if(s&&s!="rtl"&&s!="ltr"&&s!="auto")throw new RangeError("Invalid value for isolate: "+s);return s||"auto"}});A.contextHash=new A({perNode:!0});A.lookAhead=new A({perNode:!0});A.mounted=new A({perNode:!0});class re{constructor(e,t,r,i=!1){this.tree=e,this.overlay=t,this.parser=r,this.bracketed=i}static get(e){return e&&e.props&&e.props[A.mounted.id]}}const Ke=Object.create(null);class L{constructor(e,t,r,i=0){this.name=e,this.props=t,this.id=r,this.flags=i}static define(e){let t=e.props&&e.props.length?Object.create(null):Ke,r=(e.top?1:0)|(e.skipped?2:0)|(e.error?4:0)|(e.name==null?8:0),i=new L(e.name||"",t,e.id,r);if(e.props){for(let n of e.props)if(Array.isArray(n)||(n=n(i)),n){if(n[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");t[n[0].id]=n[1]}}return i}prop(e){return this.props[e.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(e){if(typeof e=="string"){if(this.name==e)return!0;let t=this.prop(A.group);return t?t.indexOf(e)>-1:!1}return this.id==e}static match(e){let t=Object.create(null);for(let r in e)for(let i of r.split(" "))t[i]=e[r];return r=>{for(let i=r.prop(A.group),n=-1;n<(i?i.length:0);n++){let l=t[n<0?r.name:i[n]];if(l)return l}}}}L.none=new L("",Object.create(null),0,8);class je{constructor(e){this.types=e;for(let t=0;t0;for(let a=this.cursor(l|v.IncludeAnonymous);;){let f=!1;if(a.from<=n&&a.to>=i&&(!o&&a.type.isAnonymous||t(a)!==!1)){if(a.firstChild())continue;f=!0}for(;f&&r&&(o||!a.type.isAnonymous)&&r(a),!a.nextSibling();){if(!a.parent())return;f=!0}}}prop(e){return e.perNode?this.props?this.props[e.id]:void 0:this.type.prop(e)}get propValues(){let e=[];if(this.props)for(let t in this.props)e.push([+t,this.props[t]]);return e}balance(e={}){return this.children.length<=8?this:Ae(L.none,this.children,this.positions,0,this.children.length,0,this.length,(t,r,i)=>new T(this.type,t,r,i,this.propValues),e.makeTree||((t,r,i)=>new T(L.none,t,r,i)))}static build(e){return Qe(e)}}T.empty=new T(L.none,[],[],0);class ke{constructor(e,t){this.buffer=e,this.index=t}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new ke(this.buffer,this.index)}}class X{constructor(e,t,r){this.buffer=e,this.length=t,this.set=r}get type(){return L.none}toString(){let e=[];for(let t=0;t0));a=l[a+3]);return o}slice(e,t,r){let i=this.buffer,n=new Uint16Array(t-e),l=0;for(let o=e,a=0;o=e&&te;case 1:return t<=e&&r>e;case 2:return r>e;case 4:return!0}}function se(s,e,t,r){for(var i;s.from==s.to||(t<1?s.from>=e:s.from>e)||(t>-1?s.to<=e:s.to0?a.length:-1;e!=p;e+=t){let u=a[e],c=f[e]+o.from;if(!(!(n&v.EnterBracketed&&u instanceof T&&((l=re.get(u))===null||l===void 0?void 0:l.overlay)===null&&(c>=r||c+u.length<=r))&&!Fe(i,r,c,c+u.length))){if(u instanceof X){if(n&v.ExcludeBuffers)continue;let m=u.findChild(0,u.buffer.length,t,r-c,i);if(m>-1)return new Q(new Ve(o,u,e,c),null,m)}else if(n&v.IncludeAnonymous||!u.type.isAnonymous||ve(u)){let m;if(!(n&v.IgnoreMounts)&&(m=re.get(u))&&!m.overlay)return new R(m.tree,c,e,o);let w=new R(u,c,e,o);return n&v.IncludeAnonymous||!w.type.isAnonymous?w:w.nextChild(t<0?u.children.length-1:0,t,r,i,n)}}}if(n&v.IncludeAnonymous||!o.type.isAnonymous||(o.index>=0?e=o.index+t:e=t<0?-1:o._parent._tree.children.length,o=o._parent,!o))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(e){return this.nextChild(0,1,e,2)}childBefore(e){return this.nextChild(this._tree.children.length-1,-1,e,-2)}prop(e){return this._tree.prop(e)}enter(e,t,r=0){let i;if(!(r&v.IgnoreOverlays)&&(i=re.get(this._tree))&&i.overlay){let n=e-this.from,l=r&v.EnterBracketed&&i.bracketed;for(let{from:o,to:a}of i.overlay)if((t>0||l?o<=n:o=n:a>n))return new R(i.tree,i.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,e,t,r)}nextSignificantParent(){let e=this;for(;e.type.isAnonymous&&e._parent;)e=e._parent;return e}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}}function _e(s,e,t,r){let i=s.cursor(),n=[];if(!i.firstChild())return n;if(t!=null){for(let l=!1;!l;)if(l=i.type.is(t),!i.nextSibling())return n}for(;;){if(r!=null&&i.type.is(r))return n;if(i.type.is(e)&&n.push(i.node),!i.nextSibling())return r==null?n:[]}}function be(s,e,t=e.length-1){for(let r=s;t>=0;r=r.parent){if(!r)return!1;if(!r.type.isAnonymous){if(e[t]&&e[t]!=r.name)return!1;t--}}return!0}class Ve{constructor(e,t,r,i){this.parent=e,this.buffer=t,this.index=r,this.start=i}}class Q extends De{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(e,t,r){super(),this.context=e,this._parent=t,this.index=r,this.type=e.buffer.set.types[e.buffer.buffer[r]]}child(e,t,r){let{buffer:i}=this.context,n=i.findChild(this.index+4,i.buffer[this.index+3],e,t-this.context.start,r);return n<0?null:new Q(this.context,this,n)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(e){return this.child(1,e,2)}childBefore(e){return this.child(-1,e,-2)}prop(e){return this.type.prop(e)}enter(e,t,r=0){if(r&v.ExcludeBuffers)return null;let{buffer:i}=this.context,n=i.findChild(this.index+4,i.buffer[this.index+3],t>0?1:-1,e-this.context.start,t);return n<0?null:new Q(this.context,this,n)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(e){return this._parent?null:this.context.parent.nextChild(this.context.index+e,e,0,4)}get nextSibling(){let{buffer:e}=this.context,t=e.buffer[this.index+3];return t<(this._parent?e.buffer[this._parent.index+3]:e.buffer.length)?new Q(this.context,this._parent,t):this.externalSibling(1)}get prevSibling(){let{buffer:e}=this.context,t=this._parent?this._parent.index+4:0;return this.index==t?this.externalSibling(-1):new Q(this.context,this._parent,e.findChild(t,this.index,-1,0,4))}get tree(){return null}toTree(){let e=[],t=[],{buffer:r}=this.context,i=this.index+4,n=r.buffer[this.index+3];if(n>i){let l=r.buffer[this.index+1];e.push(r.slice(i,n,l)),t.push(0)}return new T(this.type,e,t,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}}function He(s){if(!s.length)return null;let e=0,t=s[0];for(let n=1;nt.from||l.to=e){let o=new R(l.tree,l.overlay[0].from+n.from,-1,n);(i||(i=[r])).push(se(o,e,t,!1))}}return i?He(i):r}class ge{get name(){return this.type.name}constructor(e,t=0){if(this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,this.mode=t&~v.EnterBracketed,e instanceof R)this.yieldNode(e);else{this._tree=e.context.parent,this.buffer=e.context;for(let r=e._parent;r;r=r._parent)this.stack.unshift(r.index);this.bufferNode=e,this.yieldBuf(e.index)}}yieldNode(e){return e?(this._tree=e,this.type=e.type,this.from=e.from,this.to=e.to,!0):!1}yieldBuf(e,t){this.index=e;let{start:r,buffer:i}=this.buffer;return this.type=t||i.set.types[i.buffer[e]],this.from=r+i.buffer[e+1],this.to=r+i.buffer[e+2],!0}yield(e){return e?e instanceof R?(this.buffer=null,this.yieldNode(e)):(this.buffer=e.context,this.yieldBuf(e.index,e.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(e,t,r){if(!this.buffer)return this.yield(this._tree.nextChild(e<0?this._tree._tree.children.length-1:0,e,t,r,this.mode));let{buffer:i}=this.buffer,n=i.findChild(this.index+4,i.buffer[this.index+3],e,t-this.buffer.start,r);return n<0?!1:(this.stack.push(this.index),this.yieldBuf(n))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(e){return this.enterChild(1,e,2)}childBefore(e){return this.enterChild(-1,e,-2)}enter(e,t,r=this.mode){return this.buffer?r&v.ExcludeBuffers?!1:this.enterChild(1,e,t):this.yield(this._tree.enter(e,t,r))}parent(){if(!this.buffer)return this.yieldNode(this.mode&v.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let e=this.mode&v.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(e)}sibling(e){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+e,e,0,4,this.mode)):!1;let{buffer:t}=this.buffer,r=this.stack.length-1;if(e<0){let i=r<0?0:this.stack[r]+4;if(this.index!=i)return this.yieldBuf(t.findChild(i,this.index,-1,0,4))}else{let i=t.buffer[this.index+3];if(i<(r<0?t.buffer.length:t.buffer[this.stack[r]+3]))return this.yieldBuf(i)}return r<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+e,e,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(e){let t,r,{buffer:i}=this;if(i){if(e>0){if(this.index-1)for(let n=t+e,l=e<0?-1:r._tree.children.length;n!=l;n+=e){let o=r._tree.children[n];if(this.mode&v.IncludeAnonymous||o instanceof X||!o.type.isAnonymous||ve(o))return!1}return!0}move(e,t){if(t&&this.enterChild(e,0,4))return!0;for(;;){if(this.sibling(e))return!0;if(this.atLastNode(e)||!this.parent())return!1}}next(e=!0){return this.move(1,e)}prev(e=!0){return this.move(-1,e)}moveTo(e,t=0){for(;(this.from==this.to||(t<1?this.from>=e:this.from>e)||(t>-1?this.to<=e:this.to=0;){for(let l=e;l;l=l._parent)if(l.index==i){if(i==this.index)return l;t=l,r=n+1;break e}i=this.stack[--n]}for(let i=r;i=0;n--){if(n<0)return be(this._tree,e,i);let l=r[t.buffer[this.stack[n]]];if(!l.isAnonymous){if(e[i]&&e[i]!=l.name)return!1;i--}}return!0}}function ve(s){return s.children.some(e=>e instanceof X||!e.type.isAnonymous||ve(e))}function Qe(s){var e;let{buffer:t,nodeSet:r,maxBufferLength:i=1024,reused:n=[],minRepeatType:l=r.types.length}=s,o=Array.isArray(t)?new ke(t,t.length):t,a=r.types,f=0,p=0;function u(x,N,d,I,k,B){let{id:b,start:g,end:S,size:_}=o,O=p,V=f;if(_<0)if(o.next(),_==-1){let K=n[b];d.push(K),I.push(g-x);return}else if(_==-3){f=b;return}else if(_==-4){p=b;return}else throw new RangeError(`Unrecognized record size: ${_}`);let ie=a[b],ae,Y,Ce=g-x;if(S-g<=i&&(Y=M(o.pos-N,k))){let K=new Uint16Array(Y.size-Y.skip),D=o.pos-Y.size,U=K.length;for(;o.pos>D;)U=E(Y.start,K,U);ae=new X(K,S-Y.start,r),Ce=Y.start-x}else{let K=o.pos-_;o.next();let D=[],U=[],Z=b>=l?b:-1,te=0,he=S;for(;o.pos>K;)Z>=0&&o.id==Z&&o.size>=0?(o.end<=he-i&&(w(D,U,g,te,o.end,he,Z,O,V),te=D.length,he=o.end),o.next()):B>2500?c(g,K,D,U):u(g,K,D,U,Z,B+1);if(Z>=0&&te>0&&te-1&&te>0){let Se=m(ie,V);ae=Ae(ie,D,U,0,D.length,0,S-g,Se,Se)}else ae=P(ie,D,U,S-g,O-S,V)}d.push(ae),I.push(Ce)}function c(x,N,d,I){let k=[],B=0,b=-1;for(;o.pos>N;){let{id:g,start:S,end:_,size:O}=o;if(O>4)o.next();else{if(b>-1&&S=0;_-=3)g[O++]=k[_],g[O++]=k[_+1]-S,g[O++]=k[_+2]-S,g[O++]=O;d.push(new X(g,k[2]-S,r)),I.push(S-x)}}function m(x,N){return(d,I,k)=>{let B=0,b=d.length-1,g,S;if(b>=0&&(g=d[b])instanceof T){if(!b&&g.type==x&&g.length==k)return g;(S=g.prop(A.lookAhead))&&(B=I[b]+g.length+S)}return P(x,d,I,k,B,N)}}function w(x,N,d,I,k,B,b,g,S){let _=[],O=[];for(;x.length>I;)_.push(x.pop()),O.push(N.pop()+d-k);x.push(P(r.types[b],_,O,B-k,g-B,S)),N.push(k-d)}function P(x,N,d,I,k,B,b){if(B){let g=[A.contextHash,B];b=b?[g].concat(b):[g]}if(k>25){let g=[A.lookAhead,k];b=b?[g].concat(b):[g]}return new T(x,N,d,I,b)}function M(x,N){let d=o.fork(),I=0,k=0,B=0,b=d.end-i,g={size:0,start:0,skip:0};e:for(let S=d.pos-x;d.pos>S;){let _=d.size;if(d.id==N&&_>=0){g.size=I,g.start=k,g.skip=B,B+=4,I+=4,d.next();continue}let O=d.pos-_;if(_<0||O=l?4:0,ie=d.start;for(d.next();d.pos>O;){if(d.size<0)if(d.size==-3||d.size==-4)V+=4;else break e;else d.id>=l&&(V+=4);d.next()}k=ie,I+=_,B+=V}return(N<0||I==x)&&(g.size=I,g.start=k,g.skip=B),g.size>4?g:void 0}function E(x,N,d){let{id:I,start:k,end:B,size:b}=o;if(o.next(),b>=0&&I4){let S=o.pos-(b-4);for(;o.pos>S;)d=E(x,N,d)}N[--d]=g,N[--d]=B-x,N[--d]=k-x,N[--d]=I}else b==-3?f=I:b==-4&&(p=I);return d}let z=[],C=[];for(;o.pos>0;)u(s.start||0,s.bufferStart||0,z,C,-1,0);let F=(e=s.length)!==null&&e!==void 0?e:z.length?C[0]+z[0].length:0;return new T(a[s.topID],z.reverse(),C.reverse(),F)}const Ie=new WeakMap;function de(s,e){if(!s.isAnonymous||e instanceof X||e.type!=s)return 1;let t=Ie.get(e);if(t==null){t=1;for(let r of e.children){if(r.type!=s||!(r instanceof T)){t=1;break}t+=de(s,r)}Ie.set(e,t)}return t}function Ae(s,e,t,r,i,n,l,o,a){let f=0;for(let w=r;w=p)break;N+=d}if(C==F+1){if(N>p){let d=w[F];m(d.children,d.positions,0,d.children.length,P[F]+z);continue}u.push(w[F])}else{let d=P[C-1]+w[C-1].length-x;u.push(Ae(s,w,P,F,C,x,d,null,a))}c.push(x+z-n)}}return m(e,t,r,i,0),(o||a)(u,c,l)}class le{constructor(e,t,r,i,n=!1,l=!1){this.from=e,this.to=t,this.tree=r,this.offset=i,this.open=(n?1:0)|(l?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(e,t=[],r=!1){let i=[new le(0,e.length,e,0,!1,r)];for(let n of t)n.to>e.length&&i.push(n);return i}static applyChanges(e,t,r=128){if(!t.length)return e;let i=[],n=1,l=e.length?e[0]:null;for(let o=0,a=0,f=0;;o++){let p=o=r)for(;l&&l.from=c.from||u<=c.to||f){let m=Math.max(c.from,a)-f,w=Math.min(c.to,u)-f;c=m>=w?null:new le(m,w,c.tree,c.offset+f,o>0,!!p)}if(c&&i.push(c),l.to>u)break;l=nnew H(i.from,i.to)):[new H(0,0)]:[new H(0,e.length)],this.createParse(e,t||[],r)}parse(e,t,r){let i=this.startParse(e,t,r);for(;;){let n=i.advance();if(n)return n}}}class Xe{constructor(e){this.string=e}get length(){return this.string.length}chunk(e){return this.string.slice(e)}get lineChunks(){return!1}read(e,t){return this.string.slice(e,t)}}function gt(s){return(e,t,r,i)=>new Ze(e,s,t,r,i)}class Be{constructor(e,t,r,i,n,l){this.parser=e,this.parse=t,this.overlay=r,this.bracketed=i,this.target=n,this.from=l}}function Pe(s){if(!s.length||s.some(e=>e.from>=e.to))throw new RangeError("Invalid inner parse ranges given: "+JSON.stringify(s))}class Ye{constructor(e,t,r,i,n,l,o,a){this.parser=e,this.predicate=t,this.mounts=r,this.index=i,this.start=n,this.bracketed=l,this.target=o,this.prev=a,this.depth=0,this.ranges=[]}}const xe=new A({perNode:!0});class Ze{constructor(e,t,r,i,n){this.nest=t,this.input=r,this.fragments=i,this.ranges=n,this.inner=[],this.innerDone=0,this.baseTree=null,this.stoppedAt=null,this.baseParse=e}advance(){if(this.baseParse){let r=this.baseParse.advance();if(!r)return null;if(this.baseParse=null,this.baseTree=r,this.startInner(),this.stoppedAt!=null)for(let i of this.inner)i.parse.stopAt(this.stoppedAt)}if(this.innerDone==this.inner.length){let r=this.baseTree;return this.stoppedAt!=null&&(r=new T(r.type,r.children,r.positions,r.length,r.propValues.concat([[xe,this.stoppedAt]]))),r}let e=this.inner[this.innerDone],t=e.parse.advance();if(t){this.innerDone++;let r=Object.assign(Object.create(null),e.target.props);r[A.mounted.id]=new re(t,e.overlay,e.parser,e.bracketed),e.target.props=r}return null}get parsedPos(){if(this.baseParse)return 0;let e=this.input.length;for(let t=this.innerDone;t=this.stoppedAt)o=!1;else if(e.hasNode(i)){if(t){let f=t.mounts.find(p=>p.frag.from<=i.from&&p.frag.to>=i.to&&p.mount.overlay);if(f)for(let p of f.mount.overlay){let u=p.from+f.pos,c=p.to+f.pos;u>=i.from&&c<=i.to&&!t.ranges.some(m=>m.fromu)&&t.ranges.push({from:u,to:c})}}o=!1}else if(r&&(l=et(r.ranges,i.from,i.to)))o=l!=2;else if(!i.type.isAnonymous&&(n=this.nest(i,this.input))&&(i.fromnew H(u.from-i.from,u.to-i.from)):null,!!n.bracketed,i.tree,p.length?p[0].from:i.from)),n.overlay?p.length&&(r={ranges:p,depth:0,prev:r}):o=!1}}else if(t&&(a=t.predicate(i))&&(a===!0&&(a=new H(i.from,i.to)),a.from=0&&t.ranges[f].to==a.from?t.ranges[f]={from:t.ranges[f].from,to:a.to}:t.ranges.push(a)}if(o&&i.firstChild())t&&t.depth++,r&&r.depth++;else for(;!i.nextSibling();){if(!i.parent())break e;if(t&&!--t.depth){let f=Ee(this.ranges,t.ranges);f.length&&(Pe(f),this.inner.splice(t.index,0,new Be(t.parser,t.parser.startParse(this.input,Oe(t.mounts,f),f),t.ranges.map(p=>new H(p.from-t.start,p.to-t.start)),t.bracketed,t.target,f[0].from))),t=t.prev}r&&!--r.depth&&(r=r.prev)}}}}function et(s,e,t){for(let r of s){if(r.from>=t)break;if(r.to>e)return r.from<=e&&r.to>=t?2:1}return 0}function Me(s,e,t,r,i,n){if(e=e&&t.enter(r,1,v.IgnoreOverlays|v.ExcludeBuffers)||t.next(!1)||(this.done=!0)}hasNode(e){if(this.moveTo(e.from),!this.done&&this.cursor.from+this.offset==e.from&&this.cursor.tree)for(let t=this.cursor.tree;;){if(t==e.tree)return!0;if(t.children.length&&t.positions[0]==0&&t.children[0]instanceof T)t=t.children[0];else break}return!1}}class rt{constructor(e){var t;if(this.fragments=e,this.curTo=0,this.fragI=0,e.length){let r=this.curFrag=e[0];this.curTo=(t=r.tree.prop(xe))!==null&&t!==void 0?t:r.to,this.inner=new ze(r.tree,-r.offset)}else this.curFrag=this.inner=null}hasNode(e){for(;this.curFrag&&e.from>=this.curTo;)this.nextFrag();return this.curFrag&&this.curFrag.from<=e.from&&this.curTo>=e.to&&this.inner.hasNode(e)}nextFrag(){var e;if(this.fragI++,this.fragI==this.fragments.length)this.curFrag=this.inner=null;else{let t=this.curFrag=this.fragments[this.fragI];this.curTo=(e=t.tree.prop(xe))!==null&&e!==void 0?e:t.to,this.inner=new ze(t.tree,-t.offset)}}findMounts(e,t){var r;let i=[];if(this.inner){this.inner.cursor.moveTo(e,1);for(let n=this.inner.cursor.node;n;n=n.parent){let l=(r=n.tree)===null||r===void 0?void 0:r.prop(A.mounted);if(l&&l.parser==t)for(let o=this.fragI;o=n.to)break;a.tree==this.curFrag.tree&&i.push({frag:a,pos:n.from-a.offset,mount:l})}}}return i}}function Ee(s,e){let t=null,r=e;for(let i=1,n=0;i=o)break;a.to<=l||(t||(r=t=e.slice()),a.fromo&&t.splice(n+1,0,new H(o,a.to))):a.to>o?t[n--]=new H(o,a.to):t.splice(n--,1))}}return r}function it(s,e,t,r){let i=0,n=0,l=!1,o=!1,a=-1e9,f=[];for(;;){let p=i==s.length?1e9:l?s[i].to:s[i].from,u=n==e.length?1e9:o?e[n].to:e[n].from;if(l!=o){let c=Math.max(a,t),m=Math.min(p,u,r);cnew H(c.from+r,c.to+r)),u=it(e,p,a,f);for(let c=0,m=a;;c++){let w=c==u.length,P=w?f:u[c].from;if(P>m&&t.push(new le(m,P,i.tree,-l,n.from>=m||n.openStart,n.to<=P||n.openEnd)),w)break;m=u[c].to}}else t.push(new le(a,f,i.tree,-l,n.from>=l||n.openStart,n.to<=o||n.openEnd))}return t}let nt=0;class j{constructor(e,t,r,i){this.name=e,this.set=t,this.base=r,this.modified=i,this.id=nt++}toString(){let{name:e}=this;for(let t of this.modified)t.name&&(e=`${t.name}(${e})`);return e}static define(e,t){let r=typeof e=="string"?e:"?";if(e instanceof j&&(t=e),t?.base)throw new Error("Can not derive from a modified tag");let i=new j(r,[],null,[]);if(i.set.push(i),t)for(let n of t.set)i.set.push(n);return i}static defineModifier(e){let t=new me(e);return r=>r.modified.indexOf(t)>-1?r:me.get(r.base||r,r.modified.concat(t).sort((i,n)=>i.id-n.id))}}let st=0;class me{constructor(e){this.name=e,this.instances=[],this.id=st++}static get(e,t){if(!t.length)return e;let r=t[0].instances.find(o=>o.base==e&<(t,o.modified));if(r)return r;let i=[],n=new j(e.name,i,e,t);for(let o of t)o.instances.push(n);let l=ot(t);for(let o of e.set)if(!o.modified.length)for(let a of l)i.push(me.get(o,a));return n}}function lt(s,e){return s.length==e.length&&s.every((t,r)=>t==e[r])}function ot(s){let e=[[]];for(let t=0;tr.length-t.length)}function at(s){let e=Object.create(null);for(let t in s){let r=s[t];Array.isArray(r)||(r=[r]);for(let i of t.split(" "))if(i){let n=[],l=2,o=i;for(let u=0;;){if(o=="..."&&u>0&&u+3==i.length){l=1;break}let c=/^"(?:[^"\\]|\\.)*?"|[^\/!]+/.exec(o);if(!c)throw new RangeError("Invalid path: "+i);if(n.push(c[0]=="*"?"":c[0][0]=='"'?JSON.parse(c[0]):c[0]),u+=c[0].length,u==i.length)break;let m=i[u++];if(u==i.length&&m=="!"){l=0;break}if(m!="/")throw new RangeError("Invalid path: "+i);o=i.slice(u)}let a=n.length-1,f=n[a];if(!f)throw new RangeError("Invalid path: "+i);let p=new oe(r,l,a>0?n.slice(0,a):null);e[f]=p.sort(e[f])}}return Le.add(e)}const Le=new A({combine(s,e){let t,r,i;for(;s||e;){if(!s||e&&s.depth>=e.depth?(i=e,e=e.next):(i=s,s=s.next),t&&t.mode==i.mode&&!i.context&&!t.context)continue;let n=new oe(i.tags,i.mode,i.context);t?t.next=n:r=n,t=n}return r}});class oe{constructor(e,t,r,i){this.tags=e,this.mode=t,this.context=r,this.next=i}get opaque(){return this.mode==0}get inherit(){return this.mode==1}sort(e){return!e||e.depth{let l=i;for(let o of n)for(let a of o.set){let f=t[a.id];if(f){l=l?l+" "+f:f;break}}return l},scope:r}}function ht(s,e){let t=null;for(let r of s){let i=r.style(e);i&&(t=t?t+" "+i:i)}return t}function We(s,e,t,r=0,i=s.length){let n=new ut(r,Array.isArray(e)?e:[e],t);n.highlightRange(s.cursor(),r,i,"",n.highlighters),n.flush(i)}function ft(s,e,t,r,i,n=0,l=s.length){let o=n;function a(f,p){if(!(f<=o)){for(let u=s.slice(o,f),c=0;;){let m=u.indexOf(` +`,c),w=m<0?u.length:m;if(w>c&&r(u.slice(c,w),p),m<0)break;i(),c=m+1}o=f}}We(e,t,(f,p,u)=>{a(f,""),a(p,u)},n,l),a(l,"")}class ut{constructor(e,t,r){this.at=e,this.highlighters=t,this.span=r,this.class=""}startSpan(e,t){t!=this.class&&(this.flush(e),e>this.at&&(this.at=e),this.class=t)}flush(e){e>this.at&&this.class&&this.span(this.at,e,this.class)}highlightRange(e,t,r,i,n){let{type:l,from:o,to:a}=e;if(o>=r||a<=t)return;l.isTop&&(n=this.highlighters.filter(m=>!m.scope||m.scope(l)));let f=i,p=qe(e)||oe.empty,u=ht(n,p.tags);if(u&&(f&&(f+=" "),f+=u,p.mode==1&&(i+=(i?" ":"")+u)),this.startSpan(Math.max(t,o),f),p.opaque)return;let c=e.tree&&e.tree.prop(A.mounted);if(c&&c.overlay){let m=e.node.enter(c.overlay[0].from+o,1),w=this.highlighters.filter(M=>!M.scope||M.scope(c.tree.type)),P=e.firstChild();for(let M=0,E=o;;M++){let z=M=C||!e.nextSibling())););if(!z||C>r)break;E=z.to+o,E>t&&(this.highlightRange(m.cursor(),Math.max(t,z.from+o),Math.min(r,E),"",w),this.startSpan(Math.min(r,E),f))}P&&e.parent()}else if(e.firstChild()){c&&(i="");do if(!(e.to<=t)){if(e.from>=r)break;this.highlightRange(e,t,r,i,n),this.startSpan(Math.min(r,e.to),f)}while(e.nextSibling());e.parent()}}}function qe(s){let e=s.type.prop(Le);for(;e&&e.context&&!s.matchContext(e.context);)e=e.next;return e||null}const h=j.define,ue=h(),$=h(),Te=h($),Re=h($),G=h(),ce=h(G),ye=h(G),J=h(),ee=h(J),W=h(),q=h(),we=h(),ne=h(we),pe=h(),y={comment:ue,lineComment:h(ue),blockComment:h(ue),docComment:h(ue),name:$,variableName:h($),typeName:Te,tagName:h(Te),propertyName:Re,attributeName:h(Re),className:h($),labelName:h($),namespace:h($),macroName:h($),literal:G,string:ce,docString:h(ce),character:h(ce),attributeValue:h(ce),number:ye,integer:h(ye),float:h(ye),bool:h(G),regexp:h(G),escape:h(G),color:h(G),url:h(G),keyword:W,self:h(W),null:h(W),atom:h(W),unit:h(W),modifier:h(W),operatorKeyword:h(W),controlKeyword:h(W),definitionKeyword:h(W),moduleKeyword:h(W),operator:q,derefOperator:h(q),arithmeticOperator:h(q),logicOperator:h(q),bitwiseOperator:h(q),compareOperator:h(q),updateOperator:h(q),definitionOperator:h(q),typeOperator:h(q),controlOperator:h(q),punctuation:we,separator:h(we),bracket:ne,angleBracket:h(ne),squareBracket:h(ne),paren:h(ne),brace:h(ne),content:J,heading:ee,heading1:h(ee),heading2:h(ee),heading3:h(ee),heading4:h(ee),heading5:h(ee),heading6:h(ee),contentSeparator:h(J),list:h(J),quote:h(J),emphasis:h(J),strong:h(J),link:h(J),monospace:h(J),strikethrough:h(J),inserted:h(),deleted:h(),changed:h(),invalid:h(),meta:pe,documentMeta:h(pe),annotation:h(pe),processingInstruction:h(pe),definition:j.defineModifier("definition"),constant:j.defineModifier("constant"),function:j.defineModifier("function"),standard:j.defineModifier("standard"),local:j.defineModifier("local"),special:j.defineModifier("special")};for(let s in y){let e=y[s];e instanceof j&&(e.name=s)}const ct=Ue([{tag:y.link,class:"tok-link"},{tag:y.heading,class:"tok-heading"},{tag:y.emphasis,class:"tok-emphasis"},{tag:y.strong,class:"tok-strong"},{tag:y.keyword,class:"tok-keyword"},{tag:y.atom,class:"tok-atom"},{tag:y.bool,class:"tok-bool"},{tag:y.url,class:"tok-url"},{tag:y.labelName,class:"tok-labelName"},{tag:y.inserted,class:"tok-inserted"},{tag:y.deleted,class:"tok-deleted"},{tag:y.literal,class:"tok-literal"},{tag:y.string,class:"tok-string"},{tag:y.number,class:"tok-number"},{tag:[y.regexp,y.escape,y.special(y.string)],class:"tok-string2"},{tag:y.variableName,class:"tok-variableName"},{tag:y.local(y.variableName),class:"tok-variableName tok-local"},{tag:y.definition(y.variableName),class:"tok-variableName tok-definition"},{tag:y.special(y.variableName),class:"tok-variableName2"},{tag:y.definition(y.propertyName),class:"tok-propertyName tok-definition"},{tag:y.typeName,class:"tok-typeName"},{tag:y.namespace,class:"tok-namespace"},{tag:y.className,class:"tok-className"},{tag:y.macroName,class:"tok-macroName"},{tag:y.propertyName,class:"tok-propertyName"},{tag:y.operator,class:"tok-operator"},{tag:y.comment,class:"tok-comment"},{tag:y.meta,class:"tok-meta"},{tag:y.invalid,class:"tok-invalid"},{tag:y.punctuation,class:"tok-punctuation"}]),mt=Object.freeze(Object.defineProperty({__proto__:null,Tag:j,classHighlighter:ct,getStyleTags:qe,highlightCode:ft,highlightTree:We,styleTags:at,tagHighlighter:Ue,tags:y},Symbol.toStringTag,{value:"Module"}));export{pt as D,v as I,A as N,dt as P,T,je as a,L as b,Ue as c,le as d,We as h,mt as i,gt as p,at as s,y as t}; diff --git a/ui/assets/web/assets/index-CRR-Ve-Q.css b/ui/assets/web/assets/index-CRR-Ve-Q.css new file mode 100644 index 0000000..6ff5f34 --- /dev/null +++ b/ui/assets/web/assets/index-CRR-Ve-Q.css @@ -0,0 +1 @@ +@import"https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap";*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.pointer-events-none{pointer-events:none}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.-bottom-1{bottom:-.25rem}.-top-12{top:-3rem}.bottom-0{bottom:0}.left-1\/2{left:50%}.left-\[20\%\]{left:20%}.top-0{top:0}.z-10{z-index:10}.z-50{z-index:50}.col-span-12{grid-column:span 12 / span 12}.col-span-3{grid-column:span 3 / span 3}.col-span-4{grid-column:span 4 / span 4}.col-span-5{grid-column:span 5 / span 5}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-auto{margin-left:auto;margin-right:auto}.-ml-4{margin-left:-1rem}.-mt-1{margin-top:-.25rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.ml-1{margin-left:.25rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.size-10{width:2.5rem;height:2.5rem}.size-2{width:.5rem;height:.5rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-2{height:.5rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-6{height:1.5rem}.h-full{height:100%}.h-screen{height:100vh}.min-h-\[160px\]{min-height:160px}.min-h-\[40px\]{min-height:40px}.min-h-\[520px\]{min-height:520px}.min-h-screen{min-height:100vh}.w-11{width:2.75rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-4{width:1rem}.w-64{width:16rem}.w-72{width:18rem}.w-\[1px\]{width:1px}.w-\[450px\]{width:450px}.w-\[5\%\]{width:5%}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.max-w-\[1600px\]{max-width:1600px}.max-w-\[240px\]{max-width:240px}.max-w-\[280px\]{max-width:280px}.flex-1{flex:1 1 0%}.flex-\[2\]{flex:2}.shrink-0{flex-shrink:0}.border-separate{border-collapse:separate}.border-spacing-0{--tw-border-spacing-x: 0px;--tw-border-spacing-y: 0px;border-spacing:var(--tw-border-spacing-x) var(--tw-border-spacing-y)}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-1{--tw-translate-x: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-6{--tw-translate-x: 1.5rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-45{--tw-rotate: 45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.resize{resize:both}.list-none{list-style-type:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-x{border-left-width:1px;border-right-width:1px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-l-4{border-left-width:4px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-blue-200{--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1))}.border-rose-200{--tw-border-opacity: 1;border-color:rgb(254 205 211 / var(--tw-border-opacity, 1))}.border-slate-100{--tw-border-opacity: 1;border-color:rgb(241 245 249 / var(--tw-border-opacity, 1))}.border-slate-200{--tw-border-opacity: 1;border-color:rgb(226 232 240 / var(--tw-border-opacity, 1))}.border-slate-300{--tw-border-opacity: 1;border-color:rgb(203 213 225 / var(--tw-border-opacity, 1))}.border-slate-700{--tw-border-opacity: 1;border-color:rgb(51 65 85 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.border-white\/50{border-color:#ffffff80}.border-l-orange-400{--tw-border-opacity: 1;border-left-color:rgb(251 146 60 / var(--tw-border-opacity, 1))}.bg-\[var\(--bg-light\)\]{background-color:var(--bg-light)}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-emerald-100{--tw-bg-opacity: 1;background-color:rgb(209 250 229 / var(--tw-bg-opacity, 1))}.bg-emerald-50{--tw-bg-opacity: 1;background-color:rgb(236 253 245 / var(--tw-bg-opacity, 1))}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-emerald-600{--tw-bg-opacity: 1;background-color:rgb(5 150 105 / var(--tw-bg-opacity, 1))}.bg-orange-100{--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1))}.bg-orange-50\/20{background-color:#fff7ed33}.bg-orange-50\/40{background-color:#fff7ed66}.bg-primary{--tw-bg-opacity: 1;background-color:rgb(36 99 235 / var(--tw-bg-opacity, 1))}.bg-rose-100{--tw-bg-opacity: 1;background-color:rgb(255 228 230 / var(--tw-bg-opacity, 1))}.bg-rose-50{--tw-bg-opacity: 1;background-color:rgb(255 241 242 / var(--tw-bg-opacity, 1))}.bg-slate-100{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.bg-slate-100\/50{background-color:#f1f5f980}.bg-slate-200{--tw-bg-opacity: 1;background-color:rgb(226 232 240 / var(--tw-bg-opacity, 1))}.bg-slate-300{--tw-bg-opacity: 1;background-color:rgb(203 213 225 / var(--tw-bg-opacity, 1))}.bg-slate-400{--tw-bg-opacity: 1;background-color:rgb(148 163 184 / var(--tw-bg-opacity, 1))}.bg-slate-50{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.bg-slate-50\/50{background-color:#f8fafc80}.bg-slate-700{--tw-bg-opacity: 1;background-color:rgb(51 65 85 / var(--tw-bg-opacity, 1))}.bg-slate-800{--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity, 1))}.bg-slate-800\/50{background-color:#1e293b80}.bg-slate-900{--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/20{background-color:#fff3}.bg-white\/80{background-color:#fffc}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pl-2{padding-left:.5rem}.pl-4{padding-left:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.\!text-2xl{font-size:1.5rem!important;line-height:2rem!important}.\!text-3xl{font-size:1.875rem!important;line-height:2.25rem!important}.\!text-\[12px\]{font-size:12px!important}.\!text-lg{font-size:1.125rem!important;line-height:1.75rem!important}.\!text-sm{font-size:.875rem!important;line-height:1.25rem!important}.\!text-xs{font-size:.75rem!important;line-height:1rem!important}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-black{font-weight:900}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.leading-6{line-height:1.5rem}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.tracking-tight{letter-spacing:-.025em}.tracking-tighter{letter-spacing:-.05em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.text-amber-500{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-blue-800{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.text-emerald-500{--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity, 1))}.text-emerald-700{--tw-text-opacity: 1;color:rgb(4 120 87 / var(--tw-text-opacity, 1))}.text-orange-600{--tw-text-opacity: 1;color:rgb(234 88 12 / var(--tw-text-opacity, 1))}.text-primary{--tw-text-opacity: 1;color:rgb(36 99 235 / var(--tw-text-opacity, 1))}.text-rose-500{--tw-text-opacity: 1;color:rgb(244 63 94 / var(--tw-text-opacity, 1))}.text-rose-600{--tw-text-opacity: 1;color:rgb(225 29 72 / var(--tw-text-opacity, 1))}.text-rose-700{--tw-text-opacity: 1;color:rgb(190 18 60 / var(--tw-text-opacity, 1))}.text-slate-300{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.text-slate-600{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.text-slate-700{--tw-text-opacity: 1;color:rgb(51 65 85 / var(--tw-text-opacity, 1))}.text-slate-800{--tw-text-opacity: 1;color:rgb(30 41 59 / var(--tw-text-opacity, 1))}.text-slate-900{--tw-text-opacity: 1;color:rgb(15 23 42 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.placeholder-slate-500::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(100 116 139 / var(--tw-placeholder-opacity, 1))}.placeholder-slate-500::placeholder{--tw-placeholder-opacity: 1;color:rgb(100 116 139 / var(--tw-placeholder-opacity, 1))}.accent-primary{accent-color:#2463eb}.opacity-80{opacity:.8}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-inner{--tw-shadow: inset 0 2px 4px 0 rgb(0 0 0 / .05);--tw-shadow-colored: inset 0 2px 4px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-primary\/40{--tw-ring-color: rgb(36 99 235 / .4)}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-md{--tw-backdrop-blur: blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}@font-face{font-family:Material Symbols Outlined;font-style:normal;font-weight:100 700;font-display:swap;src:url(./MaterialSymbolsOutlined-DvxE0gZD.ttf) format("truetype")}.packet-modal{--bg-light: #f8fafc;--bg-dark: #0f172a;font-family:Inter,Microsoft YaHei,sans-serif}.hex-font{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.timeline-heatmap{background:linear-gradient(to right,#10b981 0% 15%,#ef4444 15% 17%,#10b981 17% 45%,#ef4444 45% 46%,#10b981 46% 80%,#f59e0b 80% 82%,#10b981 82% 100%)}.tree-line:before{content:"";position:absolute;left:-12px;top:0;bottom:10px;width:1px;background:#e2e8f0}.protocol-tooltip{visibility:hidden;position:absolute;z-index:50;bottom:125%;left:50%;transform:translate(-50%);transition:opacity .2s;opacity:0}.protocol-badge:hover .protocol-tooltip{visibility:visible;opacity:1}:root{color-scheme:light;font-family:Space Grotesk,Noto Sans SC,Noto Sans,sans-serif;line-height:1.5;font-weight:400;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--titlebar-height: 36px;--primary: #195de6;--bg: #f3f4f6;--surface: #ffffff;--surface-subtle: #f8fafc;--border: #e2e8f0;--text: #0f172a;--muted: #64748b;--shadow: 0 8px 24px rgba(15, 23, 42, .08);--radius: 12px;--sidebar-width: 240px;--control-bg: #ffffff;--control-border: #d0d7e2;--control-border-hover: #b7c4dd;--control-ring: rgba(25, 93, 230, .14);--menu-shadow: 0 14px 28px rgba(15, 23, 42, .1);--hover-bg: #f1f5f9;--accent-soft: rgba(37, 99, 235, .14);--accent-soft-strong: rgba(37, 99, 235, .2);--success: #16a34a;--danger: #dc2626}:root[data-theme=dark]{color-scheme:dark;--bg: #0f172a;--surface: #111827;--surface-subtle: #1f2937;--border: #334155;--text: #e2e8f0;--muted: #94a3b8;--shadow: 0 10px 26px rgba(2, 6, 23, .45);--control-bg: #111827;--control-border: #334155;--control-border-hover: #475569;--control-ring: rgba(59, 130, 246, .24);--menu-shadow: 0 18px 34px rgba(2, 6, 23, .55);--hover-bg: #1f2937;--accent-soft: rgba(59, 130, 246, .22);--accent-soft-strong: rgba(59, 130, 246, .3);--success: #22c55e;--danger: #ef4444}*{box-sizing:border-box}body.resizing,body.dragging-window{-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:default}body.resizing *,body.resizing *:before,body.resizing *:after,body.dragging-window *,body.dragging-window *:before,body.dragging-window *:after{transition:none!important;animation:none!important}body.resizing .panel,body.resizing .card,body.resizing .modal,body.resizing .sidebar,body.resizing .app-titlebar,body.dragging-window .panel,body.dragging-window .card,body.dragging-window .modal,body.dragging-window .sidebar,body.dragging-window .app-titlebar{box-shadow:none!important}body.resizing .page-header,body.dragging-window .page-header{opacity:.85}body.resizing .log-line{content-visibility:visible!important}body.resizing .log-stream,body.resizing .card-list,body.resizing .page{contain:layout paint}body.modal-open *,body.modal-open *:before,body.modal-open *:after,body.dropdown-open *,body.dropdown-open *:before,body.dropdown-open *:after{transition:none!important;animation:none!important}body.modal-open{overflow:hidden}body.modal-open .app-shell{pointer-events:none}body.modal-open .modal-backdrop,body.modal-open .modal-backdrop *,body.modal-open .proxy-modal-backdrop,body.modal-open .proxy-modal-backdrop *{pointer-events:auto}body.proxy-modal-open{overflow:hidden}body.proxy-modal-open .app-shell{pointer-events:none}body.proxy-modal-open .proxy-modal-backdrop,body.proxy-modal-open .proxy-modal-backdrop *,body.proxy-modal-open .proxy-modal-overlay,body.proxy-modal-open .proxy-modal-overlay *{pointer-events:auto}html,body{margin:0;height:100%;background:var(--bg);color:var(--text);overflow:hidden}body{font-family:Noto Sans,Noto Sans SC,sans-serif}button,input,select,textarea{font-family:inherit}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:4px}::-webkit-scrollbar-thumb:hover{background:#94a3b8}#app{height:100%}.app{display:flex;flex-direction:column;height:100%;background:var(--bg)}.app-titlebar{height:var(--titlebar-height);display:flex;align-items:center;justify-content:flex-start;padding:0 10px;background:var(--surface);border-bottom:1px solid var(--border);-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:20}.app-icon{height:22px;width:22px;border:none;background:transparent;border-radius:6px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;margin-right:8px}.app-icon:hover{background:#0f172a14}.app-icon-dot{width:10px;height:10px;border-radius:3px;background:#2563eb}.app-title{font-size:12px;font-weight:600;color:var(--text);letter-spacing:.2px;flex:1}.title-actions{display:flex;gap:4px;margin-left:auto}.title-btn{height:24px;width:32px;border:none;background:transparent;border-radius:6px;cursor:pointer;color:var(--text);display:inline-flex;align-items:center;justify-content:center;padding:0}.title-btn:hover{background:var(--hover-bg)}.title-btn.close:hover{background:#e11d48;color:#fff}:root[data-theme=dark] .app-icon:hover{background:var(--hover-bg)}.material-symbols-outlined{font-family:Material Symbols Outlined;font-size:20px;line-height:1;display:inline-flex;align-items:center;justify-content:center;font-variation-settings:"FILL" 0,"wght" 500,"GRAD" 0,"opsz" 20}.material-symbols-outlined.fill-1{font-variation-settings:"FILL" 1,"wght" 500,"GRAD" 0,"opsz" 20}.app-shell{display:grid;grid-template-columns:var(--sidebar-width) 1fr;flex:1;min-height:0;height:calc(100vh - var(--titlebar-height))}.resize-handle{position:fixed;z-index:10000;background:transparent}.resize-handle.top,.resize-handle.bottom{left:6px;right:6px}.resize-handle.top{height:1px}.resize-handle.bottom{height:6px}.resize-handle.left,.resize-handle.right{top:var(--titlebar-height);bottom:6px;width:6px}.resize-handle.top{top:0;cursor:n-resize}.resize-handle.bottom{bottom:0;cursor:s-resize}.resize-handle.left{left:0;cursor:w-resize}.resize-handle.right{right:0;cursor:e-resize}.resize-handle.top-left,.resize-handle.top-right,.resize-handle.bottom-left,.resize-handle.bottom-right{width:10px;height:10px}.resize-handle.top-left{top:0;left:0;cursor:nw-resize}.resize-handle.top-right{top:0;right:0;cursor:ne-resize}.resize-handle.bottom-left{bottom:0;left:0;cursor:sw-resize}.resize-handle.bottom-right{bottom:0;right:0;cursor:se-resize}.snap-overlay{position:fixed;top:var(--titlebar-height);left:0;right:0;bottom:0;border:2px solid rgba(25,93,230,.55);background:#195de61f;pointer-events:none;z-index:9999}.snap-left{right:50%}.snap-right{left:50%}.snap-max{left:0;right:0}.sidebar{background:var(--surface);border-right:1px solid var(--border);display:flex;flex-direction:column;padding:18px 16px;gap:16px}.sidebar-header{display:flex;gap:12px;align-items:center}.brand-mark{width:36px;height:36px;border-radius:10px;background:var(--primary);color:#fff;display:inline-flex;align-items:center;justify-content:center}.brand-name{font-size:18px;font-weight:700}.brand-meta{font-size:11px;color:var(--muted);font-family:Space Grotesk,Noto Sans SC,sans-serif}.sidebar-nav{display:flex;flex-direction:column;gap:6px;flex:1;overflow-y:auto;overscroll-behavior:contain;overflow-anchor:none;padding-right:4px;scrollbar-gutter:stable}.nav-item{border:none;background:transparent;display:flex;gap:10px;align-items:center;padding:10px 12px;border-radius:10px;color:var(--muted);cursor:pointer;font-size:14px;transition:all .2s ease}.nav-item:hover{background:#f1f5f9;color:var(--text)}.nav-item.active{background:var(--primary);color:#fff;box-shadow:0 12px 24px #195de633}.nav-item.active .material-symbols-outlined{font-variation-settings:"FILL" 1,"wght" 500,"GRAD" 0,"opsz" 20}.nav-divider{height:1px;background:var(--border);margin:6px 4px}.sidebar-footer{display:flex;align-items:center;gap:10px;padding-top:10px;border-top:1px solid var(--border)}.user-avatar{width:34px;height:34px;border-radius:50%;background:linear-gradient(135deg,#6366f1,#7c3aed);border:1px solid #e2e8f0}.user-name{font-size:13px;font-weight:600}.user-meta{font-size:11px;color:var(--muted)}.main{flex:1;background:var(--surface-subtle);overflow:hidden;display:flex;flex-direction:column;min-width:0}.page{display:flex;flex-direction:column;gap:20px;padding:24px 28px 30px;overflow-y:auto;overflow-anchor:none;overscroll-behavior:contain;flex:1;min-height:0;height:100%}.page-header{display:flex;justify-content:space-between;align-items:center;gap:20px;background:var(--surface);border:1px solid var(--border);padding:18px 20px;border-radius:14px;box-shadow:0 12px 40px #0f172a14}.page-header.spaced{align-items:flex-start;background:var(--surface);border-radius:16px;box-shadow:0 12px 40px #0f172a14}.page-header.spaced .header-actions{align-items:center}.page-header>div:first-child{flex:1;min-width:0}.page-header.compact{padding:16px 18px}.page-header h2{margin:0;font-size:24px}.page-header p{margin:4px 0 0;color:var(--muted);font-size:13px}.page-header .header-actions{display:flex;align-items:center;gap:12px}.page-header .header-actions .btn{display:inline-flex;align-items:center;justify-content:center;height:40px;padding:0 18px;line-height:1}.terminal-config-panel{margin:0 0 12px;padding:18px 20px;border:1px solid var(--border);border-radius:16px;background:var(--surface);box-shadow:0 12px 40px #0f172a14}.terminal-config-panel .config-title{margin:0;font-size:24px;font-weight:700;color:var(--text)}.terminal-config-panel .config-description{margin:6px 0 0;font-size:13px;color:var(--muted)}.terminal-config-panel .config-status{display:flex;align-items:center;gap:12px}.terminal-config-actions{flex-wrap:nowrap;gap:6px;justify-content:flex-end;align-items:center}.terminal-port-picker{min-width:200px;max-width:260px;flex:0 1 240px;gap:0;margin-right:6px}.terminal-port-picker .icon-btn{align-self:center}.terminal-config-controls{gap:10px;align-items:center;flex-wrap:wrap}.terminal-config-panel .select-wrap{height:36px;align-items:center;min-width:180px;max-width:240px}.terminal-config-panel .select-trigger{height:100%;align-items:center}.terminal-config-panel .status-pill{height:32px}.terminal-config-panel .btn{height:36px;padding:0 14px}.terminal-config-panel .icon-btn{width:32px;height:32px}.terminal-config-panel .refresh-icon{margin-left:-6px}.channel-config-panel{margin-bottom:16px;padding:20px;border:1px solid var(--border);border-radius:16px;background:var(--surface);box-shadow:0 12px 40px #0f172a14}.config-main{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap}.config-title{margin:0;font-size:20px;font-weight:700;color:var(--text)}.config-description{margin-top:6px;font-size:13px;color:var(--muted);max-width:320px}.config-status{display:flex;align-items:center;gap:12px}.status-pill{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;border-radius:999px;border:1px solid var(--border);font-size:11px;font-weight:600;color:#475569}.status-pill .dot{width:6px;height:6px;border-radius:50%;background:#94a3b8}.status-pill.connected{color:#047857;border-color:#bbf7d0}.status-pill.error{color:#b91c1c;border-color:#fecaca}.port-picker{display:inline-flex;align-items:center;gap:4px}.config-actions{display:inline-flex;gap:8px}.header-actions{display:flex;align-items:center;gap:12px;flex-wrap:nowrap}.status-indicator{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border-radius:999px;font-size:11px;font-weight:700;border:1px solid transparent;color:#64748b;background:#f1f5f9}.status-indicator .dot{width:6px;height:6px;border-radius:50%;background:currentColor}.status-indicator.connected{background:#dcfce7;color:#166534;border-color:#bbf7d0}.status-indicator.error{background:#fef2f2;color:#b91c1c;border-color:#fecaca}.btn{border:1px solid transparent;border-radius:10px;padding:10px 16px;font-size:13px;font-weight:600;cursor:pointer;display:inline-flex;align-items:center;gap:8px;transition:border-color .2s ease,background-color .2s ease,color .2s ease,transform .16s ease}.btn-primary{background:var(--primary);color:#fff;box-shadow:0 8px 18px #195de633}.btn-primary:hover{background:#1d4ed8;transform:translateY(-1px)}.btn-success{background:var(--success);color:#fff;box-shadow:0 8px 18px #16a34a33}.btn-success:hover{background:#15803d;transform:translateY(-1px)}.btn-outline{background:var(--control-bg);color:var(--text);border-color:var(--control-border)}.btn-outline:hover{border-color:var(--control-border-hover);color:var(--primary);background:var(--hover-bg)}.btn-muted{background:var(--hover-bg);color:var(--muted);cursor:not-allowed}.btn-danger{background:var(--danger);color:#fff;box-shadow:0 8px 18px #ef444433}.btn-danger:hover{background:#b91c1c;transform:translateY(-1px)}.btn-ghost{background:transparent;color:#475569;border:1px solid transparent;padding:6px 10px;font-size:12px}.btn-ghost:hover{border-color:var(--control-border);background:var(--hover-bg);color:var(--primary)}.icon-btn{border:none;background:transparent;color:#94a3b8;width:30px;height:30px;border-radius:8px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:all .2s ease}.icon-btn:hover{background:var(--hover-bg);color:var(--primary)}.icon-btn.active{background:var(--accent-soft);color:var(--primary)}.link-btn{border:none;background:transparent;color:var(--primary);font-size:12px;font-weight:600;cursor:pointer;display:inline-flex;align-items:center;gap:6px}.select-wrap{position:relative;display:inline-flex;align-items:center;gap:6px;border:1px solid var(--control-border);border-radius:14px;padding:2px 12px;background:var(--control-bg);min-width:200px;max-width:280px;box-shadow:none;transition:border-color .18s ease,box-shadow .18s ease}.proxy-select.select-wrap{width:100%;max-width:100%;min-width:0}.select-trigger{border:none;background:transparent;padding:8px 28px 8px 2px;font-size:14px;color:var(--text);outline:none;width:100%;cursor:pointer;display:inline-flex;align-items:center;gap:8px}.select-value{flex:1;text-align:left;font-weight:600}.select-wrap .expand{position:absolute;right:10px;color:var(--muted);pointer-events:none}.select-wrap:hover{border-color:var(--control-border-hover)}.select-wrap:focus-within{border-color:#195de6;box-shadow:0 0 0 3px var(--control-ring)}.select-menu{position:fixed;background:var(--surface);border:1px solid var(--control-border);border-radius:12px;box-shadow:var(--menu-shadow);padding:6px;z-index:3000;max-height:240px;overflow-y:auto;overscroll-behavior:contain;overflow-anchor:none}.select-option{border:none;background:transparent;width:100%;text-align:left;padding:10px 12px;border-radius:10px;font-size:14px;color:var(--text);cursor:pointer;display:inline-flex;align-items:center;gap:10px;transition:background .15s ease,color .15s ease}.select-option:hover{background:var(--surface-subtle);color:var(--text)}.select-option.selected{background:#2563eb26;color:#1d4ed8;font-weight:700}.select-option.selected .material-symbols-outlined{color:#1d4ed8}:root[data-theme=dark] .select-option.selected{background:#3b82f63d;color:#bfdbfe}:root[data-theme=dark] .select-option.selected .material-symbols-outlined{color:#bfdbfe}.select-option:disabled{color:var(--muted);cursor:not-allowed}.panel{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);padding:16px}.panel.manual-monitor,.panel.manual-console,.panel.log-panel{box-shadow:0 4px 10px #0f172a0d}.panel.stack{display:flex;flex-direction:column;gap:14px}.panel-title{display:flex;align-items:center;gap:8px;font-weight:700;font-size:14px}.panel-title.simple{justify-content:space-between;font-size:13px}.panel-title.inline{justify-content:space-between}.panel-title.bar{justify-content:space-between;padding-bottom:10px;border-bottom:1px solid var(--border)}.panel-title-left,.panel-actions{display:flex;align-items:center;gap:8px}.divider{width:1px;height:18px;background:var(--border)}.segmented{display:inline-flex;padding:3px;background:var(--hover-bg);border-radius:10px;margin-left:auto;gap:4px;border:1px solid var(--control-border)}.segmented button{border:none;background:transparent;padding:4px 10px;border-radius:8px;font-size:11px;font-weight:600;color:var(--muted);cursor:pointer}.segmented button.active{background:var(--surface);color:var(--primary);box-shadow:0 1px 2px #0f172a0f}.segmented.small button{font-size:10px;padding:2px 8px}.manual-grid{display:grid;grid-template-columns:minmax(280px,320px) minmax(520px,1fr);gap:16px;align-items:start}.manual-left,.manual-right{display:flex;flex-direction:column;gap:16px}.manual-right .monitor{min-height:260px}.manual-right .console{min-height:220px}.manual-send,.manual-quick,.manual-monitor,.manual-console{height:300px}.manual-send .text-area{min-height:140px}.manual-monitor .log-stream,.manual-console .log-stream{max-height:200px}.manual-quick,.manual-console{display:flex;flex-direction:column}.manual-quick .quick-list,.manual-console .log-stream{flex:1;min-height:0}.text-area{width:100%;min-height:160px;border:1px solid var(--border);border-radius:12px;padding:12px;font-size:13px;font-family:Noto Sans,Noto Sans SC,sans-serif;background:var(--control-bg);outline:none;resize:none}.text-area:focus{border-color:var(--primary);box-shadow:0 0 0 2px #195de61a}.toggle-row{display:flex;gap:12px;align-items:center;flex-wrap:wrap}.toggle-row.spaced{justify-content:space-between;margin-top:12px;gap:20px;padding:10px 0 6px}.toggle-row.spaced+.toggle-row.spaced{margin-top:8px;padding-top:14px;border-top:1px solid var(--border)}.toggle-row p{margin:4px 0 0;font-size:12px;color:var(--muted)}.check{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--muted)}.check input{accent-color:var(--primary)}.quick-list{display:flex;flex-direction:column;gap:8px;max-height:208px;min-height:208px;overflow-y:auto;overscroll-behavior:contain;overflow-anchor:none;padding-right:4px}.quick-item{border:1px solid transparent;background:#f8fafc;border-radius:10px;padding:10px 12px;font-size:12px;font-family:Space Grotesk,Noto Sans SC,sans-serif;display:flex;align-items:center;justify-content:space-between;color:#475569;cursor:pointer}.quick-item:hover{border-color:var(--border);color:var(--primary)}.quick-info{display:flex;flex-direction:column;gap:2px;text-align:left}.quick-title{font-weight:600;color:#1e293b}.quick-meta{font-size:10px;color:#94a3b8}.quick-item-actions{display:inline-flex;align-items:center;gap:6px}.icon-btn.small{width:24px;height:24px;border-radius:6px}.monitor-stack{display:grid;grid-template-columns:minmax(300px,1fr) minmax(280px,360px);gap:16px}.pill{padding:2px 8px;border-radius:999px;font-size:10px;font-weight:700;border:1px solid transparent}.pill.live{background:#dcfce7;color:#166534;border-color:#bbf7d0}.log-stream{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:12px;color:#334155;display:flex;flex-direction:column;gap:6px;padding:12px 6px 6px;overflow-y:auto;contain:paint;overscroll-behavior:contain;overflow-anchor:none;max-height:320px;min-height:180px}.log-stream.compact{max-height:200px;font-size:11px;min-height:120px}.log-line{line-height:1.5;display:flex;align-items:flex-start;gap:8px;content-visibility:auto;contain-intrinsic-size:0 22px}.log-time{min-width:70px;font-size:10px;color:#94a3b8}.log-kind{min-width:36px;font-size:10px;font-weight:700;text-transform:uppercase;color:#64748b}.kind-tx{color:#2563eb}.kind-rx{color:#16a34a}.kind-frame{color:#7c3aed}.log-text{flex:1;word-break:break-word}.log-text.text-status{color:#0f172a}.log-text.text-tx{color:#2563eb}.log-text.text-rx{color:#16a34a}.tab-strip{display:flex;align-items:center;gap:6px;border-bottom:1px solid var(--border);padding-bottom:6px;flex-wrap:wrap}.tab-strip button{border:1px solid transparent;background:transparent;padding:7px 12px;font-size:12px;font-weight:600;color:var(--muted);border-radius:10px;cursor:pointer}.tab-strip button.active{color:var(--primary);border-color:var(--control-border);background:var(--surface);box-shadow:0 1px 2px #0f172a0d}.tab-strip.secondary{border-bottom:1px solid var(--border);padding-left:4px;padding-bottom:12px;margin-bottom:14px}.tab-strip button:hover:not(.active){background:var(--hover-bg);color:var(--text)}.search{margin-left:auto;position:relative;display:inline-flex;align-items:center}.search input{border:1px solid var(--control-border);border-radius:10px;padding:6px 10px 6px 28px;font-size:12px;outline:none;background:var(--control-bg)}.search span{position:absolute;left:8px;color:#94a3b8}.panel-footer{display:flex;justify-content:space-between;align-items:center;font-size:11px;color:var(--muted);border-top:1px solid var(--border);padding-top:10px}.scripts-grid{display:grid;grid-template-columns:minmax(320px,1fr) 320px;gap:18px}.scripts-side{display:flex;flex-direction:column;gap:18px;min-height:0}.scripts-side>.panel.stack{flex:1 1 auto;min-height:360px}.editor textarea{min-height:360px}.code-area{width:100%;min-height:360px;border:none;background:var(--surface);font-size:13px;border-radius:0 0 var(--radius) var(--radius);outline:none;overflow:hidden}.code-area.collapsed{max-height:360px;height:360px}.code-area:not(.collapsed){max-height:640px;height:640px}.code-area .cm-editor{height:100%}.code-area .cm-scroller{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.code-area .cm-focused{outline:none}.code-area .cm-line.yaml-indent-1{box-shadow:inset 2px 0 #60a5fa;color:#1d4ed8}.code-area .cm-line.yaml-indent-2{box-shadow:inset 2px 0 #34d399;color:#047857}.code-area .cm-line.yaml-indent-3{box-shadow:inset 2px 0 #fbbf24;color:#b45309}.code-area .cm-line.yaml-indent-4{box-shadow:inset 2px 0 #f472b6;color:#be185d}.code-area .cm-line.yaml-indent-5{box-shadow:inset 2px 0 #a78bfa;color:#6d28d9}.file-info{display:flex;flex-direction:column;gap:4px}.file-title{font-size:15px;font-weight:700;display:flex;gap:10px;align-items:center}.file-path{font-size:12px;color:var(--muted);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.scripts-title{display:flex;align-items:center;gap:10px;margin:0}.scripts-path{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.badge{background:#f1f5f9;color:#64748b;border:1px solid #e2e8f0;padding:3px 10px;border-radius:999px;font-size:10px;font-weight:700;min-width:44px;text-align:center;white-space:nowrap}.status-pill{display:inline-flex;align-items:center;gap:8px;padding:6px 10px;border-radius:999px;background:#dcfce7;color:#166534;border:1px solid #bbf7d0;font-size:12px;font-weight:700}.status-pill.idle{background:#f1f5f9;color:#64748b;border-color:#e2e8f0}.status-pill.running{background:#dcfce7;color:#166534;border-color:#bbf7d0}.pulse{width:8px;height:8px;border-radius:50%;background:#22c55e;position:relative}.pulse:after{content:"";position:absolute;inset:0;border-radius:50%;background:#22c55e80;animation:pulse 1.4s infinite}@keyframes pulse{0%{transform:scale(1);opacity:.6}to{transform:scale(2.4);opacity:0}}.button-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}.progress-block{display:flex;flex-direction:column;gap:10px}.progress-row{display:flex;justify-content:space-between;font-size:12px;color:var(--muted)}.progress-bar{height:8px;border-radius:999px;background:#e2e8f0;overflow:hidden}.progress{height:100%;background:var(--primary);border-radius:999px}.progress-stats{display:flex;justify-content:space-between;font-size:12px;color:var(--muted)}.mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.mini-table{width:100%;border-collapse:collapse;font-size:12px}.mini-table th,.mini-table td{padding:8px 10px;border-bottom:1px solid #f1f5f9;text-align:left}.mini-table th{background:#f8fafc;color:var(--muted);font-weight:600}.mini-table td.right{text-align:right}.mini-table .primary{color:var(--primary)}.mini-table .green{color:#16a34a}.log-panel .log-stream{max-height:200px}.card-list{display:flex;flex-direction:column;gap:16px}.card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:16px;display:flex;justify-content:space-between;align-items:center;gap:20px;box-shadow:var(--shadow)}.card.empty-card{border:1px dashed #cbd5e1;box-shadow:none;color:var(--muted)}.modal-backdrop{position:fixed;inset:0;background:#0f172a66;-webkit-backdrop-filter:none;backdrop-filter:none;display:flex;align-items:center;justify-content:center;padding:24px;z-index:2000;will-change:opacity}.channel-modal,.quick-modal{width:min(680px,92vw);background:#fff;border-radius:18px;box-shadow:0 24px 60px #0f172a33;border:1px solid #e2e8f0;display:flex;flex-direction:column;max-height:90vh;overflow:hidden}.ui-yaml-modal{width:min(1100px,94vw);max-width:1100px;height:min(86vh,900px)}.ui-yaml-body{padding:0;background:#f8fafc}.ui-yaml-body>div{padding:18px 22px}.ui-yaml-error{border:1px solid #fecaca;background:#fff1f2;color:#9f1239;border-radius:12px;display:grid;gap:6px}.quick-modal{width:min(560px,92vw)}.quick-modal.quick-modal-sm{width:min(420px,92vw)}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:18px 22px;border-bottom:1px solid var(--border);background:#f8fafc}.modal-header h3{margin:0;font-size:18px}.modal-header p{margin:4px 0 0;font-size:12px;color:var(--muted)}.modal-body{padding:20px 22px;overflow-y:auto;overscroll-behavior:contain;overflow-anchor:none;display:flex;flex-direction:column;gap:18px}.modal-section{padding-top:8px;border-top:1px solid #f1f5f9}.modal-section.first{padding-top:0;border-top:none}.channel-type-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.channel-type-card{border:1px solid #e2e8f0;border-radius:14px;padding:12px 14px;display:inline-flex;align-items:center;gap:10px;background:#fff;color:#64748b;font-weight:600;cursor:pointer;transition:all .2s ease}.channel-type-card.active{border-color:#195de6;background:#195de614;color:#195de6}.channel-type-card:hover{border-color:#9db3ff;background:#f8fafc}.channel-toggle{display:inline-flex;align-items:center;gap:10px;font-size:13px;color:var(--muted)}.channel-toggle input{accent-color:var(--primary)}.modal-footer{padding:16px 22px;border-top:1px solid var(--border);display:flex;justify-content:flex-end;gap:10px;background:#f8fafc}.quick-field{display:flex;flex-direction:column;gap:8px}.quick-field label{font-size:12px;color:var(--muted);font-weight:600}.quick-field input,.quick-textarea{border:1px solid var(--border);border-radius:12px;padding:10px 12px;font-size:13px;background:#fff;outline:none}.quick-field input:focus,.quick-textarea:focus{border-color:var(--primary);box-shadow:0 0 0 2px #195de61a}.quick-textarea{min-height:110px;resize:none;font-family:Noto Sans,Noto Sans SC,sans-serif}.quick-field-header{display:flex;align-items:center;justify-content:space-between;gap:12px}.quick-mode{display:inline-flex;align-items:center;gap:8px}.quick-mode-label{font-size:11px;color:var(--muted)}.quick-counter{margin:0;text-align:right;font-size:11px;color:var(--muted)}.quick-options{display:flex;flex-direction:column;gap:12px}.quick-delete-summary{display:flex;align-items:center;gap:12px;padding:14px 16px;border-radius:12px;border:1px solid #fee2e2;background:#fef2f2;color:#991b1b}.quick-delete-summary .material-symbols-outlined{font-size:22px}.quick-delete-title{margin:0;font-size:14px;font-weight:600;color:#7f1d1d}.quick-delete-meta{margin:4px 0 0;font-size:12px;color:#b91c1c}.card-main{display:flex;align-items:center;gap:16px}.card-icon{width:46px;height:46px;border-radius:12px;background:#eef2ff;color:#4338ca;display:inline-flex;align-items:center;justify-content:center}.card-title{display:flex;align-items:center;gap:10px;font-weight:700;font-size:14px}.chip{padding:2px 6px;background:#f1f5f9;border-radius:8px;font-size:10px;color:var(--muted);border:1px solid var(--border)}.card-meta{display:flex;align-items:center;gap:8px;font-size:11px;color:var(--muted);margin-top:4px}.card-meta .dot{width:4px;height:4px;border-radius:50%;background:#cbd5e1}.card-side{display:flex;align-items:center;gap:16px}.traffic{text-align:right;font-size:10px;color:var(--muted)}.traffic strong{display:block;font-size:12px;color:#334155}.status{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:600;padding:6px 10px;border-radius:10px;border:1px solid transparent}.status .dot{width:6px;height:6px;border-radius:50%;background:currentColor}.status-ok{background:#ecfdf3;color:#15803d;border-color:#bbf7d0}.status-warn{background:#fff7ed;color:#b45309;border-color:#fed7aa}.status-idle{background:#f1f5f9;color:#64748b;border-color:#e2e8f0}.status-error{background:#fef2f2;color:#b91c1c;border-color:#fecaca}.protocol-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:16px}.protocol-cards-section .protocol-grid{margin-top:12px}.protocol-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:16px;box-shadow:var(--shadow);display:flex;flex-direction:column;gap:12px}.protocol-card.empty{border:1px dashed #cbd5e1;align-items:center;justify-content:center;text-align:center;padding:26px;background:#f8fafc}.protocol-header{display:flex;justify-content:space-between;align-items:flex-start;gap:12px}.protocol-title{font-weight:700;font-size:14px}.protocol-sub{font-size:11px;color:var(--muted)}.protocol-rows{display:flex;flex-direction:column;gap:8px}.protocol-row{display:flex;justify-content:space-between;font-size:12px;color:var(--muted)}.protocol-row strong{color:var(--text);font-weight:600}.protocol-actions{display:flex;gap:6px;align-items:center}.empty-icon{width:48px;height:48px;border-radius:999px;background:#fff;display:inline-flex;align-items:center;justify-content:center;color:var(--primary);border:1px solid var(--border);margin-bottom:8px}.settings-stack{display:flex;flex-direction:column;gap:20px;margin-top:6px}.empty-state{padding:12px 0;font-size:13px;color:var(--muted)}.muted{color:var(--muted)}.form-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.form-grid.triple{grid-template-columns:repeat(auto-fit,minmax(160px,1fr))}.form-grid.quad{grid-template-columns:repeat(auto-fit,minmax(150px,1fr))}.form-grid label{display:flex;flex-direction:column;gap:6px;font-size:12px;color:var(--muted)}.form-grid input,.form-grid select{border:1px solid var(--control-border);border-radius:10px;padding:10px 12px;font-size:13px;background:var(--control-bg);outline:none}.form-grid input:focus,.form-grid select:focus{border-color:var(--primary);box-shadow:0 0 0 2px #195de61a}.protocol-modal-body{gap:20px}.protocol-modal .modal-header h3{font-size:18px}.protocol-grid{grid-template-columns:repeat(2,minmax(240px,1fr))}.protocol-textarea{display:flex;flex-direction:column;gap:6px;font-size:12px;color:var(--muted)}.protocol-textarea textarea{border:1px solid var(--control-border);border-radius:12px;padding:12px 14px;font-size:13px;background:var(--control-bg);min-height:96px;resize:vertical;outline:none}.protocol-textarea textarea:focus{border-color:var(--primary);box-shadow:0 0 0 2px #195de61a}.protocol-driver{background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px;padding:12px}.section-title{font-size:12px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.08em}.file-row{display:flex;flex-direction:column;gap:8px;align-items:stretch}.file-row-controls{display:flex;align-items:center;gap:10px}.file-row-controls .btn{flex:0 0 auto}.file-input{display:flex;align-items:center;gap:8px;border:1px solid var(--control-border);border-radius:10px;padding:8px 10px;background:var(--control-bg);flex:1 1 auto;min-width:0}.file-input input{border:none;background:transparent;font-size:12px;width:100%;outline:none}.plugin-list{display:flex;flex-direction:column;gap:10px}.plugin-filters{display:inline-flex;align-items:center;flex-wrap:wrap;gap:8px}.plugin-filters button{border:1px solid var(--control-border);background:var(--control-bg);color:var(--muted);border-radius:999px;padding:4px 10px;font-size:12px;font-weight:600;cursor:pointer}.plugin-filters button.active{background:var(--accent-soft);color:var(--primary);border-color:var(--accent-soft-strong)}.plugin-filters button:hover:not(.active){background:var(--hover-bg);color:var(--text)}.plugin-item{border:1px solid var(--border);border-radius:10px;padding:10px 12px;display:flex;align-items:center;justify-content:space-between;gap:10px}.plugin-item.muted{background:#f8fafc}.plugin-title{font-weight:600;font-size:13px}.plugin-meta{font-size:11px;color:var(--muted)}.badge-green{background:#dcfce7;color:#166534;border-color:#bbf7d0}.badge-gray{background:#f1f5f9;color:#64748b;border-color:#e2e8f0}.badge-yellow{background:#fef9c3;color:#a16207;border-color:#fde68a}.badge-blue{background:#dbeafe;color:#1d4ed8;border-color:#bfdbfe}@media(max-width:1100px){.file-row-controls{flex-direction:column;align-items:stretch}.file-row-controls .btn{width:100%;justify-content:center}}.switch{position:relative;width:44px;height:24px}.switch input{opacity:0;width:0;height:0}.switch span{position:absolute;cursor:pointer;inset:0;background:#e2e8f0;border-radius:999px;transition:.2s}.switch span:before{content:"";position:absolute;height:18px;width:18px;left:3px;top:3px;background:#fff;border-radius:50%;transition:.2s;box-shadow:0 2px 6px #0f172a33}.switch input:checked+span{background:var(--primary)}.switch input:checked+span:before{transform:translate(20px)}.proxy-page{gap:18px}.proxy-hero{border-radius:18px}.proxy-filters{display:flex;flex-wrap:wrap;gap:10px;padding-left:4px}.proxy-filter{border:1px solid var(--border);background:#fff;color:var(--muted);padding:6px 16px;border-radius:999px;font-size:11px;font-weight:700;cursor:pointer;transition:all .2s ease}.proxy-filter:hover{border-color:#c7d2fe;color:#1e293b}.proxy-filter.active{background:#0f172a;color:#fff;border-color:#0f172a;box-shadow:0 10px 20px #0f172a33}.proxy-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:16px}.proxy-card{border:1px solid var(--border);border-radius:18px;background:#fff;padding:18px;display:flex;flex-direction:column;gap:14px;box-shadow:0 12px 30px #0f172a14;transition:transform .2s ease,box-shadow .2s ease}.proxy-card:hover{transform:translateY(-2px);box-shadow:0 18px 36px #0f172a1f}.proxy-card-header{display:flex;justify-content:space-between;align-items:flex-start;gap:12px}.proxy-title{display:flex;gap:12px;align-items:center}.proxy-title h3{margin:0;font-size:15px;font-weight:700;color:var(--text)}.proxy-subtitle{margin:2px 0 0;font-size:11px;color:#94a3b8;font-family:Space Grotesk,Noto Sans SC,sans-serif;letter-spacing:.04em}.proxy-icon{width:40px;height:40px;border-radius:12px;display:inline-flex;align-items:center;justify-content:center;background:#e0e7ff;color:#4338ca}.proxy-icon.accent-running{background:#dbeafe;color:#1d4ed8}.proxy-icon.accent-stopped{background:#f1f5f9;color:#64748b}.proxy-icon.accent-error{background:#fee2e2;color:#dc2626}.proxy-status{display:inline-flex;align-items:center;gap:6px;font-size:10px;font-weight:800;padding:4px 10px;border-radius:999px;border:1px solid transparent}.proxy-status .dot{width:6px;height:6px;border-radius:50%;background:currentColor}.proxy-status.running{background:#ecfdf3;color:#15803d;border-color:#bbf7d0}.proxy-status.stopped{background:#f1f5f9;color:#64748b;border-color:#e2e8f0}.proxy-status.error{background:#fef2f2;color:#b91c1c;border-color:#fecaca}.proxy-route{display:flex;flex-direction:column;gap:6px;padding:10px 12px;border-radius:12px;border:1px dashed #e2e8f0;background:#f8fafc;font-size:11px;color:var(--muted)}.proxy-route-label{text-transform:uppercase;letter-spacing:.08em;font-size:9px;font-weight:700;color:#64748b}.proxy-route-line{display:flex;align-items:center;flex-wrap:wrap;gap:6px}.proxy-route-chip{padding:2px 8px;border-radius:999px;border:1px solid #e2e8f0;background:#fff;font-size:10px;font-weight:600;color:#1e293b;letter-spacing:.04em}.proxy-route-arrow{font-size:10px;color:#94a3b8}.proxy-card-body{display:flex;justify-content:space-between;align-items:center;gap:12px;border-top:1px solid #f1f5f9;border-bottom:1px solid #f1f5f9;background:#f8fafc;border-radius:12px;padding:12px}.proxy-metric{display:flex;flex-direction:column;gap:4px;font-size:11px;color:var(--muted)}.proxy-metric strong{font-size:13px;color:#1e293b}.proxy-sparkline{width:90px;height:32px;display:flex;align-items:flex-end;justify-content:flex-end}.proxy-sparkline path{fill:none;stroke-width:1.6;stroke-linejoin:round}.proxy-sparkline.running path{stroke:#2563eb}.proxy-sparkline.stopped path{stroke:#64748b}.proxy-sparkline.error path{stroke:#ef4444}.proxy-card-footer{display:flex;align-items:center;justify-content:space-between;gap:12px}.proxy-toggle-wrap{display:inline-flex;align-items:center;gap:8px}.proxy-toggle{position:relative;width:34px;height:18px;display:inline-block;cursor:pointer}.proxy-toggle-track{position:absolute;inset:0;background:#e2e8f0;border-radius:999px;transition:.2s}.proxy-toggle-track:before{content:"";position:absolute;height:14px;width:14px;left:2px;top:2px;border-radius:50%;background:#fff;box-shadow:0 2px 6px #0f172a33;transition:.2s}.proxy-toggle.active .proxy-toggle-track{background:#2563eb}.proxy-toggle.active .proxy-toggle-track:before{transform:translate(16px)}.proxy-toggle-label{font-size:10px;font-weight:700;color:#94a3b8;text-transform:uppercase;letter-spacing:.04em}.proxy-actions{display:inline-flex;gap:6px}.proxy-card-add{border:2px dashed #cbd5e1;background:#f8fafc;align-items:center;justify-content:center;text-align:center;cursor:pointer}.proxy-card-add:hover{border-color:#93c5fd;color:#1d4ed8}.proxy-add-icon{width:46px;height:46px;border-radius:999px;background:#e2e8f0;display:inline-flex;align-items:center;justify-content:center;color:#64748b;transition:all .2s ease}.proxy-card-add:hover .proxy-add-icon{background:#2563eb;color:#fff}.proxy-add-title{margin-top:12px;font-size:13px;font-weight:700}.proxy-add-sub{margin-top:6px;font-size:11px;color:#94a3b8}.proxy-modal-backdrop{position:fixed;inset:0;background:#0f172a73;display:flex;align-items:center;justify-content:center;padding:20px;z-index:2500}.proxy-modal{width:min(1200px,92vw);height:min(85vh,860px);background:#fff;border-radius:20px;border:1px solid var(--border);box-shadow:0 30px 80px #0f172a2e;display:flex;flex-direction:column;overflow:hidden}.proxy-modal-header{padding:16px 22px;border-bottom:1px solid var(--border);background:#fff;display:flex;align-items:center;justify-content:space-between;gap:16px}.proxy-modal-title{display:flex;align-items:center;gap:14px;color:var(--text)}.proxy-modal-title h3{margin:0;font-size:18px;font-weight:700}.proxy-modal-icon{width:40px;height:40px;border-radius:14px;background:#e0e7ff;color:#1d4ed8;display:inline-flex;align-items:center;justify-content:center}.proxy-modal-meta{margin-top:4px;font-size:11px;color:#64748b;display:inline-flex;align-items:center;gap:8px;text-transform:uppercase;letter-spacing:.08em}.pulse-dot{width:6px;height:6px;border-radius:50%;background:#22c55e;position:relative}.pulse-dot:after{content:"";position:absolute;inset:0;border-radius:50%;background:#22c55e99;animation:pulse 1.4s infinite}.proxy-modal-actions{display:flex;align-items:center;gap:10px}.proxy-modal-select{display:flex;align-items:center;gap:10px;padding:6px 10px;border-radius:12px;border:1px solid var(--border);background:#f8fafc}.proxy-modal-select label{font-size:10px;font-weight:700;color:#64748b;text-transform:uppercase;letter-spacing:.06em}.proxy-modal-select select{background:transparent;border:none;color:#0f172a;font-size:12px;font-weight:600;outline:none}.proxy-modal-body{display:grid;grid-template-columns:1fr 260px;flex:1;min-height:0}.proxy-modal-stream{display:flex;flex-direction:column;min-width:0;background:#fff}.proxy-modal-toolbar{padding:10px 16px;background:#f8fafc;border-bottom:1px solid var(--border);display:flex;justify-content:space-between;align-items:center;gap:12px;color:#64748b;font-size:11px;text-transform:uppercase;letter-spacing:.08em}.proxy-modal-toolbar-left,.proxy-modal-toolbar-right{display:inline-flex;align-items:center;gap:8px}.proxy-modal-toolbar-right span{font-size:10px}.proxy-modal-toggle{display:inline-flex;background:#fff;border:1px solid var(--border);border-radius:8px;padding:2px;gap:4px}.proxy-modal-toggle button{border:none;background:transparent;color:#64748b;font-size:9px;font-weight:700;padding:2px 8px;border-radius:6px;cursor:pointer}.proxy-modal-toggle button.active{background:#0f172a;color:#fff}.proxy-modal-list{flex:1;overflow-y:auto;padding:14px 16px 10px;font-family:JetBrains Mono,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace;font-size:12px;color:#334155;overscroll-behavior:contain;overflow-anchor:none}.proxy-modal-list-header{display:grid;grid-template-columns:80px 1fr 160px;gap:12px;padding-bottom:10px;margin-bottom:12px;border-bottom:1px solid var(--border);color:#94a3b8;font-size:10px;text-transform:uppercase;letter-spacing:.14em;position:sticky;top:0;background:#fff;z-index:2}.proxy-frame{border:1px solid var(--border);border-radius:12px;background:#fff;margin-bottom:10px}.proxy-frame.error{border-color:#fecaca;background:#fef2f2}.proxy-frame-row{display:grid;grid-template-columns:80px 1fr 160px;gap:12px;align-items:center;padding:10px 12px;cursor:pointer}.proxy-frame .note{color:#2563eb;border-left:2px solid rgba(37,99,235,.4);padding-left:8px}.proxy-frame .col-summary{text-align:right;font-style:italic;color:#16a34a;font-size:11px}.proxy-frame .col-summary.error{color:#f87171;font-weight:700;font-style:normal}.proxy-chip{padding:2px 6px;border-radius:6px;border:1px solid transparent;font-size:11px;font-weight:700}.proxy-chip[data-warn=true]{-webkit-text-decoration:underline wavy rgba(248,113,113,.6);text-decoration:underline wavy rgba(248,113,113,.6)}.proxy-chip.tone-amber{border-color:#f59e0b66;color:#fbbf24;background:#f59e0b1a}.proxy-chip.tone-blue{border-color:#3b82f666;color:#60a5fa;background:#3b82f61f}.proxy-chip.tone-green{border-color:#10b98166;color:#34d399;background:#10b9811f}.proxy-chip.tone-rose{border-color:#f43f5e66;color:#fb7185;background:#f43f5e1f}.proxy-chip.tone-red{border-color:#ef444499;color:#f87171;background:#ef444466}.proxy-frame-detail{margin:0 12px 12px 24px;padding:12px;border-top:1px solid var(--border);background:#f8fafc;border-radius:0 0 10px 10px;color:#334155;font-size:12px;display:flex;flex-direction:column;gap:6px}.proxy-detail-row{display:flex;align-items:center;gap:10px}.proxy-detail-row span:first-child{color:#64748b;min-width:120px}.proxy-detail-row .tone-amber{color:#fbbf24}.proxy-detail-row .tone-blue{color:#60a5fa}.proxy-detail-row .tone-green{color:#34d399}.proxy-confirm-text{font-size:14px;color:#475569;margin:0;line-height:1.6}.proxy-modal-footer{padding:12px 16px;border-top:1px solid var(--border);background:#f8fafc;display:flex;align-items:center;justify-content:space-between;gap:12px}.proxy-footer-actions{display:inline-flex;gap:8px}.proxy-btn{border:none;border-radius:8px;padding:6px 12px;display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:700;cursor:pointer}.proxy-btn.primary{background:#2563eb;color:#fff;box-shadow:0 10px 20px #2563eb4d}.proxy-btn.warning{background:#fff7ed;color:#b45309}.proxy-btn.ghost{background:#e2e8f0;color:#475569}.proxy-modal-side{padding:18px;background:#f8fafc;border-left:1px solid var(--border);color:#475569;display:flex;flex-direction:column;gap:16px}.proxy-capture .proxy-modal-body{background:#0b1220;border-top:1px solid #1f2937;display:grid!important;grid-template-columns:minmax(0,1fr) 320px!important;align-items:stretch}.proxy-capture .proxy-modal-stream{background:#0b1220;color:#cbd5f5;padding:0}.proxy-capture .proxy-modal-toolbar{background:#0f172a;border-color:#1f2937;color:#94a3b8;padding:12px 16px}.proxy-capture .proxy-modal-toolbar.secondary{border-top:1px solid #1f2937}.proxy-capture .proxy-modal-list{background:#0b1220;color:#cbd5f5;padding:14px 16px}.proxy-capture .proxy-modal-list-header{background:#0b1220;border-color:#1f2937;color:#64748b;padding-bottom:12px}.proxy-capture .proxy-frame{background:#0f172a;border-color:#1f2937;border-radius:14px;box-shadow:0 8px 24px #02061773}.proxy-capture .proxy-frame.error{background:#2b1220;border-color:#7f1d1d}.proxy-capture .proxy-frame-detail{background:#0f172a;border-top-color:#1f2937;color:#cbd5f5}.proxy-capture .proxy-modal-footer{background:#0f172a;border-top-color:#1f2937;padding:14px 16px}.proxy-capture .proxy-modal-side{background:#0b1220;border-left-color:#1f2937;color:#cbd5f5;min-width:260px;padding:18px 16px;box-shadow:inset 1px 0 #94a3b814}.proxy-capture .proxy-modal-select{background:#0f172a;border:1px solid #1f2937;border-radius:12px;padding:6px 12px}.proxy-capture .proxy-modal-select label{display:block;font-size:10px;font-weight:700;color:#94a3b8;text-transform:uppercase;letter-spacing:.08em}.proxy-capture .proxy-modal-select select{background:transparent;border:none;color:#e2e8f0;font-size:12px;font-weight:600;outline:none;padding:0}.proxy-capture .proxy-modal-header{justify-content:space-between}.proxy-capture-actions{display:flex;align-items:center;gap:12px}.proxy-capture-sub{display:flex;align-items:center;gap:8px;margin-top:4px}.proxy-live-dot{width:6px;height:6px;border-radius:999px;background:#22c55e;box-shadow:0 0 0 4px #22c55e33;animation:proxy-pulse 1.6s infinite}.proxy-time{color:#94a3b8;font-size:11px;font-weight:600}.proxy-payload{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.proxy-summary{text-align:right;font-style:italic;color:#7dd3fc;font-size:11px}.proxy-summary.error{color:#f87171;font-weight:700;font-style:normal}.proxy-capture-header{background:#fff;border-bottom:1px solid #e2e8f0}.proxy-capture .proxy-modal{max-width:1200px;height:min(90vh,940px)}.proxy-capture-header{padding:14px 18px}.proxy-capture .proxy-modal-title h2{font-size:18px;line-height:1.2}.proxy-capture .proxy-subtitle{font-size:11px}.proxy-capture .proxy-modal-icon{width:38px;height:38px;border-radius:12px;background:#e0edff;color:#2563eb}.proxy-capture .proxy-modal-icon .material-symbols-outlined{font-size:18px}.proxy-capture .proxy-capture-actions{gap:10px}.proxy-capture .proxy-modal-select{padding:4px 10px}.proxy-capture .proxy-modal-select label{font-size:9px}.proxy-capture .proxy-modal-select select{font-size:11px}.proxy-capture .proxy-modal-close{width:28px;height:28px}.proxy-capture-header .proxy-modal-title h2{color:#0f172a}.proxy-capture-header .proxy-subtitle{color:#64748b;font-size:12px}.proxy-capture .proxy-modal-title h2{font-weight:700}.proxy-capture-footer{display:flex;align-items:center;justify-content:space-between;gap:12px}.proxy-footer-left,.proxy-footer-right{display:flex;align-items:center;gap:10px}.proxy-capture .proxy-btn.warning{background:#f59e0b26;color:#fbbf24}.proxy-capture .proxy-btn.ghost{background:#111827;color:#cbd5f5}.proxy-capture .proxy-btn.primary{background:#2563eb;color:#fff;box-shadow:0 10px 20px #2563eb4d}.proxy-capture .proxy-modal-toggle{background:#0b1220;border:1px solid #1f2937;border-radius:999px;padding:4px}.proxy-capture .proxy-modal-toggle button{font-size:10px;padding:4px 10px;border-radius:999px;font-weight:700}.proxy-capture .proxy-modal-toggle button.active{background:#1f2937;color:#e2e8f0}.proxy-capture .proxy-modal-list-header span{font-size:10px;text-transform:uppercase;letter-spacing:.12em}.proxy-capture .proxy-frame-row{padding:12px 14px}.proxy-capture .proxy-time{font-size:12px;font-weight:600;color:#94a3b8}.proxy-capture .proxy-payload .proxy-chip{border-radius:10px;padding:2px 8px;font-size:11px}.proxy-capture .proxy-summary{font-size:12px;font-weight:600;color:#7dd3fc}.proxy-capture .proxy-summary.error{color:#fb7185}.proxy-capture .proxy-modal-list{gap:10px}.proxy-capture .proxy-frame+.proxy-frame{margin-top:10px}.proxy-capture .proxy-modal-side h4,.proxy-capture .proxy-side-block h5{color:#94a3b8;letter-spacing:.12em}.proxy-capture .proxy-stat-card{background:#0f172a;border-color:#1f2937;border-radius:16px;padding:16px;box-shadow:inset 0 0 0 1px #94a3b80f}.proxy-capture .proxy-stat-card span{color:#94a3b8}.proxy-capture .proxy-stat-value strong{color:#e2e8f0}.proxy-capture .proxy-stat-value strong.danger{color:#fb7185}.proxy-capture .proxy-stat-value em{color:#22c55e}.proxy-capture .proxy-side-block{background:#0f172a;border-color:#1f2937;border-radius:16px;padding:14px}.proxy-capture .proxy-side-tip{background:#0b1b33;border-color:#1e3a8a;color:#93c5fd;border-radius:16px}@keyframes proxy-pulse{0%{transform:scale(.9);opacity:.8}70%{transform:scale(1.2);opacity:0}to{transform:scale(.9);opacity:0}}.proxy-modal-side h4{margin:0 0 12px;font-size:10px;font-weight:700;color:#94a3b8;letter-spacing:.12em;text-transform:uppercase}.proxy-stat-card{background:#fff;border:1px solid var(--border);border-radius:14px;padding:14px;margin-bottom:12px;position:relative;overflow:hidden}.proxy-stat-card span{font-size:10px;color:#94a3b8;text-transform:uppercase;letter-spacing:.1em;font-weight:700}.proxy-stat-value{margin-top:6px;display:flex;align-items:baseline;gap:8px}.proxy-stat-value strong{font-size:22px;color:#0f172a}.proxy-stat-value strong.danger{color:#fb7185}.proxy-stat-value em{font-size:10px;color:#22c55e;font-weight:700;font-style:normal}.proxy-stat-bar{position:absolute;left:0;right:40%;bottom:0;height:3px;background:#3b82f699}.proxy-side-block{background:#fff;border:1px solid var(--border);border-radius:14px;padding:14px;display:flex;flex-direction:column;gap:8px}.proxy-side-block h5{margin:0 0 6px;font-size:10px;color:#94a3b8;text-transform:uppercase;letter-spacing:.12em}.proxy-side-block label{display:flex;align-items:center;gap:8px;font-size:12px;color:#475569}.proxy-side-block input{accent-color:#2563eb}.proxy-side-tip{border-radius:14px;padding:14px;border:1px solid #bfdbfe;background:#eff6ff;color:#1d4ed8;font-size:11px}.proxy-side-tip-title{display:inline-flex;align-items:center;gap:6px;font-size:10px;text-transform:uppercase;letter-spacing:.12em;font-weight:700;margin-bottom:8px}@media(max-width:1024px){.proxy-modal{height:min(90vh,900px)}.proxy-modal-body{grid-template-columns:1fr}.proxy-capture .proxy-modal-body{grid-template-columns:minmax(0,1fr) 320px!important}.proxy-modal-side{border-left:none;border-top:1px solid rgba(148,163,184,.2);flex-direction:row;flex-wrap:wrap}.proxy-capture .proxy-modal-side{border-left:1px solid #1f2937;border-top:none;flex-direction:column}.proxy-modal-side>div,.proxy-side-block,.proxy-side-tip{flex:1 1 240px}}@media(max-width:1200px){.manual-grid,.monitor-stack,.scripts-grid{grid-template-columns:1fr}.scripts-side>.panel.stack{min-height:0}}@media(max-width:1360px){.manual-grid{grid-template-columns:1fr}.manual-left,.manual-right{display:contents}.manual-monitor,.manual-send,.manual-quick,.manual-console{width:100%}.manual-monitor{order:1}.manual-send{order:2}.manual-quick{order:3}.manual-console{order:4}.manual-monitor{min-height:220px}.manual-monitor .log-stream{min-height:140px;max-height:260px}.manual-send .text-area{min-height:140px}.manual-send{min-height:240px}.header-actions{gap:8px}}@media(max-width:1000px){.page-header{padding:14px 16px}}@media(max-width:1100px){.header-actions{gap:8px}}@media(max-width:900px){.header-actions{flex-wrap:wrap}.select-wrap{flex:1 1 220px}.status-indicator{order:1}}.proxy-dashboard{gap:24px}.proxy-dashboard-hero{display:flex;flex-direction:column;gap:16px}.proxy-hero-card{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:20px;padding:24px 26px;border-radius:24px;border:1px solid var(--border);background:#fffffff2;box-shadow:0 18px 40px #0f172a14}.proxy-hero-card h2{margin:0;font-size:26px;letter-spacing:-.02em}.proxy-hero-card p{margin:6px 0 0;color:var(--muted);font-size:13px}.proxy-hero-actions{display:inline-flex;align-items:center;gap:10px;flex-wrap:wrap}.proxy-hero-btn{display:inline-flex;align-items:center;gap:8px;padding:10px 18px;border-radius:16px;border:1px solid var(--border);background:#fff;font-size:13px;font-weight:600;cursor:pointer;transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease}.proxy-hero-btn:hover{border-color:#cbd5f5;box-shadow:0 10px 20px #2563eb1f;transform:translateY(-1px)}.proxy-hero-btn.primary{border-color:transparent;background:#2563eb;color:#fff;box-shadow:0 16px 30px #2563eb4d}.proxy-hero-btn.primary:hover{box-shadow:0 18px 36px #2563eb5c}.proxy-dashboard-filters{display:flex;flex-wrap:wrap;gap:8px}.proxy-filter-chip{border:1px solid var(--border);background:#fff;color:#64748b;padding:8px 18px;border-radius:999px;font-size:12px;font-weight:600;cursor:pointer;transition:border-color .18s ease,color .18s ease,background .18s ease}.proxy-filter-chip:hover{border-color:#cbd5f5}.proxy-filter-chip.active{background:#0f172a;color:#fff;border-color:#0f172a}.proxy-dashboard-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:18px;justify-content:start}.proxy-panel{display:flex;flex-direction:column;gap:14px;border-radius:22px;border:1px solid var(--border);background:#fff;box-shadow:0 16px 36px #0f172a14;overflow:hidden;transition:transform .2s ease,box-shadow .2s ease}.proxy-panel:hover{transform:translateY(-2px);box-shadow:0 20px 44px #0f172a1f}.proxy-panel.status-stopped{opacity:.75;filter:grayscale(.35)}.proxy-panel-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:20px 20px 0}.proxy-panel-title{display:flex;align-items:center;gap:14px}.proxy-panel-title h3{margin:0;font-size:16px;font-weight:700;color:var(--text)}.proxy-panel-title p{margin:4px 0 0;font-size:11px;color:#94a3b8;letter-spacing:.08em;text-transform:uppercase}.proxy-panel-icon{width:44px;height:44px;border-radius:16px;display:inline-flex;align-items:center;justify-content:center;background:#dbeafe;color:#2563eb}.proxy-panel-icon.status-stopped{background:#f1f5f9;color:#94a3b8}.proxy-panel-icon.status-error{background:#fee2e2;color:#ef4444}.proxy-status-pill{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;border-radius:999px;font-size:10px;font-weight:700;letter-spacing:.2em;text-transform:uppercase;border:1px solid transparent}.proxy-status-pill .dot{width:6px;height:6px;border-radius:50%;background:currentColor}.proxy-status-pill.status-running{color:#16a34a;background:#ecfdf3;border-color:#bbf7d0}.proxy-status-pill.status-stopped{color:#64748b;background:#f1f5f9;border-color:#e2e8f0}.proxy-status-pill.status-error{color:#ef4444;background:#fef2f2;border-color:#fecaca}.proxy-route-card{margin:0 20px;padding:12px 14px;border-radius:18px;border:1px dashed #d1d5db;background:#f8fafc;display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:12px}.proxy-route-card.status-error{border-color:#fecaca;background:#fff1f2}.proxy-route-col{display:flex;flex-direction:column;align-items:center;gap:6px;text-align:center;font-size:11px;color:#94a3b8}.proxy-route-chip{padding:4px 10px;border-radius:10px;border:1px solid #e2e8f0;background:#fff;font-size:12px;color:#1f2937;box-shadow:0 6px 12px #0f172a14}.proxy-route-state{display:inline-flex;flex-direction:column;align-items:center;gap:6px;font-size:10px;font-weight:700;letter-spacing:.12em;text-transform:uppercase}.proxy-route-state.primary{color:#2563eb}.proxy-route-state.muted{color:#94a3b8}.proxy-route-state.danger{color:#ef4444}.proxy-metrics{display:grid;grid-template-columns:1fr 1.4fr;gap:12px;padding:14px 20px;border-top:1px solid #f1f5f9;border-bottom:1px solid #f1f5f9}.proxy-metrics p{margin:0 0 6px;font-size:11px;color:#94a3b8}.proxy-metrics p.danger{color:#ef4444}.proxy-metrics strong{font-size:18px;color:#0f172a}.proxy-metrics strong span{font-size:11px;font-weight:500;color:#94a3b8;margin-left:4px}.proxy-metric-bandwidth{display:flex;justify-content:space-between;align-items:flex-end;gap:10px}.proxy-sparkline{width:90px;height:36px;display:flex;align-items:flex-end;justify-content:flex-end}.proxy-sparkline svg{width:100%;height:100%}.proxy-sparkline path{fill:none;stroke-width:2;stroke:#2563eb}.proxy-sparkline.status-error path{stroke:#ef4444}.proxy-sparkline.status-stopped path{stroke:#94a3b8}.proxy-sparkline-empty{width:100%;height:4px;border-radius:999px;background:#e2e8f0;align-self:center}.proxy-error-hint{margin:0 20px;padding:10px 12px;border-radius:12px;border:1px solid #fecaca;background:#fff1f2;display:flex;align-items:center;justify-content:space-between;gap:10px}.proxy-error-message{display:inline-flex;align-items:flex-start;gap:8px;color:#b91c1c;font-size:11px;line-height:1.4}.proxy-error-message .material-symbols-outlined{font-size:16px;line-height:1;margin-top:1px}.proxy-error-retry{display:inline-flex;align-items:center;gap:4px;border:1px solid #fda4af;color:#b91c1c;background:#fff;border-radius:10px;padding:4px 8px;font-size:11px;font-weight:700;cursor:pointer;transition:all .2s ease;flex-shrink:0}.proxy-error-retry:hover{background:#ffe4e6;border-color:#fb7185}.proxy-error-retry .material-symbols-outlined{font-size:15px}.proxy-panel-footer{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 20px 16px;background:#f8fafc}.proxy-panel-footer.status-error{background:#fff1f2}.proxy-footer-toggle{display:inline-flex;align-items:center;gap:10px}.proxy-toggle-text{font-size:10px;font-weight:700;letter-spacing:.2em;text-transform:uppercase;color:#64748b}.proxy-panel-footer.status-error .proxy-toggle-text{color:#ef4444}.proxy-footer-actions{display:inline-flex;align-items:center;gap:8px}.icon-btn.danger:hover{color:#ef4444;background:#fee2e2}.proxy-panel-add{border:2px dashed #cbd5f5;background:transparent;box-shadow:none;align-items:center;justify-content:center;gap:16px;min-height:300px;padding:24px;text-align:center;cursor:pointer}.proxy-panel-add:hover{border-color:#2563eb;background:#f8fafc}.proxy-add-icon{width:56px;height:56px;border-radius:50%;background:#f1f5f9;display:inline-flex;align-items:center;justify-content:center;color:#94a3b8;transition:all .2s ease}.proxy-panel-add:hover .proxy-add-icon{background:#2563eb;color:#fff}.proxy-add-copy h3{margin:0;font-size:16px;font-weight:700;color:#0f172a}.proxy-add-copy p{margin:6px 0 0;font-size:12px;color:#94a3b8}.proxy-add-tags{display:flex;gap:8px;flex-wrap:wrap;justify-content:center}.proxy-add-tags span{padding:4px 10px;border-radius:999px;background:#f1f5f9;font-size:10px;font-weight:700;color:#64748b}.proxy-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.proxy-modal-overlay{position:fixed;inset:0;background:#0f172a99;display:flex;align-items:center;justify-content:center;padding:20px;z-index:120;pointer-events:auto}body.proxy-edit-open{overflow:hidden}body.proxy-edit-open .main>:not(.proxy-modal-overlay){pointer-events:none}body.proxy-edit-open .proxy-modal-overlay{pointer-events:auto}.proxy-modal{width:min(820px,100%);background:#fff;border-radius:28px;border:1px solid var(--border);box-shadow:0 18px 40px #0f172a33;display:flex;flex-direction:column;overflow:hidden;max-height:90vh}.proxy-confirm-modal{width:min(520px,92vw);max-height:360px}.proxy-confirm-modal .proxy-modal-header{padding:16px 20px}.proxy-confirm-modal .proxy-modal-body{padding:16px 20px 10px}.proxy-confirm-modal .proxy-modal-footer{padding:12px 20px 16px}.proxy-modal-header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:24px 32px;border-bottom:1px solid #eef2f7;background:#fff}.proxy-modal-title{display:flex;align-items:center;gap:12px}.proxy-modal-title h2{margin:0;font-size:18px;font-weight:700;color:#0f172a}.proxy-modal-icon{width:40px;height:40px;border-radius:14px;display:inline-flex;align-items:center;justify-content:center;background:#dbeafe;color:#2563eb}.proxy-modal-close{width:40px;height:40px;border-radius:12px;border:none;background:transparent;color:#94a3b8;cursor:pointer;display:inline-flex;align-items:center;justify-content:center}.proxy-modal-close:hover{background:#f1f5f9;color:#475569}.proxy-modal-body{padding:32px;overflow-y:auto;max-height:85vh;display:flex;flex-direction:column;gap:28px}.proxy-modal-note{margin:0;font-size:14px;color:#64748b}.proxy-modal-stack{display:flex;flex-direction:column;gap:28px;align-items:stretch;width:100%}.proxy-modal-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}.proxy-field{display:flex;flex-direction:column;gap:8px;font-size:12px;color:#334155}.proxy-field label{font-weight:600;display:inline-flex;align-items:center;gap:6px}.proxy-field input,.proxy-field select{border:1px solid #e2e8f0;background:#f8fafc;border-radius:12px;padding:10px 12px;font-size:13px;color:#0f172a;width:100%}.proxy-port-map{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;align-items:end;padding:20px;border-radius:18px;border:1px solid #dbe4ff;background:#f5f8ff;width:100%}.proxy-section{display:flex;flex-direction:column;gap:12px;margin-bottom:18px}.proxy-section-title{display:flex;align-items:center;gap:8px;font-weight:700;font-size:13px;color:#1f2937;border-bottom:1px solid #eef2f7;padding-bottom:8px}.proxy-section-title span:last-child{font-weight:500;font-size:11px;color:#94a3b8}.proxy-section-title.muted{color:#64748b;border-bottom:none;padding-bottom:0}.proxy-section-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;padding:24px;border-radius:16px;border:1px solid #e2e8f0;background:#f8fafc;width:100%}.proxy-span-2{grid-column:span 2}.proxy-segmented{display:grid;grid-template-columns:repeat(auto-fit,minmax(48px,1fr));gap:6px;padding:6px;border-radius:14px;background:#e2e8f0}.proxy-segmented button{border:none;background:transparent;padding:8px;border-radius:10px;font-size:12px;font-weight:700;color:#64748b;cursor:pointer}.proxy-segmented button.active{background:#fff;color:#2563eb;box-shadow:0 4px 10px #0f172a14}.proxy-toggle-row{display:flex;flex-wrap:wrap;gap:18px;font-size:13px;color:#64748b}@media(max-width:900px){.proxy-modal-grid,.proxy-port-map,.proxy-section-grid{grid-template-columns:1fr}}.proxy-modal-advanced{border-top:1px solid #eef2f7;padding-top:16px}.proxy-toggle-row label{display:inline-flex;align-items:center;gap:10px;font-weight:600}.proxy-modal-footer{display:flex;justify-content:flex-end;gap:12px;padding:24px 32px 28px;border-top:1px solid #eef2f7;background:#f8fafc}@media(min-width:768px){.proxy-modal-grid,.proxy-port-map,.proxy-section-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(min-width:1024px){.proxy-section-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}.proxy-modal-btn{border-radius:14px;padding:10px 18px;font-size:13px;font-weight:700;border:1px solid #e2e8f0;background:#fff;color:#64748b;cursor:pointer;transition:transform .16s ease,box-shadow .16s ease}.proxy-modal-btn.ghost:hover{box-shadow:0 6px 12px #0f172a14;transform:translateY(-1px)}.proxy-modal-btn.primary{border:none;background:#2563eb;color:#fff;box-shadow:0 16px 30px #2563eb40}.proxy-capture .proxy-modal-body{background:#f8fafc;border-top:1px solid #e2e8f0}.proxy-capture .proxy-modal-stream{background:#f8fafc;color:#0f172a}.proxy-capture .proxy-modal-toolbar{background:#fff;border-color:#e2e8f0;color:#64748b}.proxy-capture .proxy-modal-list{background:#f8fafc;color:#0f172a}.proxy-capture .proxy-modal-list-header{background:#f8fafc;border-color:#e2e8f0;color:#94a3b8}.proxy-capture .proxy-frame{background:#fff;border-color:#e2e8f0;box-shadow:0 12px 24px #0f172a14}.proxy-capture .proxy-frame.error{background:#fef2f2;border-color:#fecaca}.proxy-capture .proxy-frame-detail{background:#f8fafc;border-top-color:#e2e8f0;color:#334155}.proxy-capture .proxy-modal-footer{background:#fff;border-top-color:#e2e8f0}.proxy-capture .proxy-modal-side{background:#f1f5f9;border-left-color:#e2e8f0;color:#0f172a;box-shadow:inset 1px 0 #94a3b81f}.proxy-capture .proxy-modal-select{background:#f1f5f9;border:1px solid #e2e8f0}.proxy-capture .proxy-modal-select label{color:#64748b}.proxy-capture .proxy-modal-select select{color:#0f172a}.proxy-capture .proxy-time{color:#64748b}.proxy-capture .proxy-summary{color:#2563eb}.proxy-capture .proxy-summary.error{color:#f43f5e}.proxy-capture .proxy-btn.warning{background:#fff7ed;color:#b45309}.proxy-capture .proxy-btn.ghost{background:#e2e8f0;color:#475569}.proxy-capture .proxy-modal-toggle{background:#f8fafc;border:1px solid #e2e8f0}.proxy-capture .proxy-modal-toggle button.active{background:#0f172a;color:#fff}.proxy-capture .proxy-stat-card{background:#fff;border-color:#e2e8f0;box-shadow:0 12px 24px #0f172a14}.proxy-capture .proxy-stat-value strong{color:#0f172a}.proxy-capture .proxy-stat-value strong.danger{color:#f43f5e}.proxy-capture .proxy-side-block{background:#fff;border-color:#e2e8f0}.proxy-capture .proxy-side-tip{background:#eff6ff;border-color:#bfdbfe;color:#2563eb}.packet-modal{max-width:1600px;height:95vh;border-radius:18px;overflow:hidden;pointer-events:auto}.proxy-capture .packet-header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;background:#fff;border-bottom:1px solid #e2e8f0}.packet-header-left{display:flex;align-items:center;gap:14px}.packet-icon{width:36px;height:36px;border-radius:10px;background:#dbeafe;color:#2563eb;display:inline-flex;align-items:center;justify-content:center}.packet-header h2{font-size:14px;font-weight:700;margin:0}.packet-subtitle{display:flex;align-items:center;gap:6px;margin-top:4px;font-size:11px;color:#64748b}.packet-dot{width:6px;height:6px;border-radius:999px;background:#22c55e;box-shadow:0 0 0 4px #22c55e33}.packet-header-actions{display:flex;align-items:center;gap:10px}.packet-header-right{display:flex;align-items:center;gap:10px;flex-wrap:wrap;justify-content:flex-end}.packet-search{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border:1px solid #e2e8f0;border-radius:10px;background:#f8fafc;min-width:240px}.packet-search input{border:none;outline:none;background:transparent;font-size:11px;width:100%}.packet-search .material-symbols-outlined{font-size:16px;color:#94a3b8}.packet-divider{width:1px;height:22px;background:#e2e8f0;margin:0 4px}.packet-action-btn{display:inline-flex;align-items:center;gap:6px;border:1px solid transparent;border-radius:10px;padding:6px 10px;font-size:11px;font-weight:600;cursor:pointer;background:#fff;color:#475569}.packet-action-btn.primary{background:#16a34a;color:#fff;border-color:#16a34a}.packet-action-btn.primary:hover{background:#15803d}.packet-action-btn.ghost{background:#f8fafc;color:#64748b;border-color:#e2e8f0}.packet-action-btn.ghost:hover{color:#0f172a;border-color:#cbd5e1}.packet-select{background:#f1f5f9;border:1px solid #e2e8f0;border-radius:12px;padding:6px 12px}.packet-select label{display:block;font-size:9px;font-weight:700;color:#64748b;text-transform:uppercase;letter-spacing:.08em}.packet-select select{background:transparent;border:none;color:#0f172a;font-size:12px;font-weight:600;outline:none;padding:0}.packet-close{width:28px;height:28px;border-radius:10px;border:none;background:transparent;color:#94a3b8}.packet-close:hover{background:#f1f5f9;color:#475569}.stitch-modal{background:#f8fafc;border:1px solid #e2e8f0;box-shadow:0 20px 50px #0f172a33;display:flex;flex-direction:column}.stitch-header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:12px 16px;background:#fff;border-bottom:1px solid #e2e8f0}.stitch-header-left{display:flex;align-items:center;gap:12px}.stitch-icon{width:34px;height:34px;border-radius:10px;background:#dbeafe;color:#2563eb;display:inline-flex;align-items:center;justify-content:center}.stitch-header h2{margin:0;font-size:14px;font-weight:700;color:#0f172a}.stitch-subtitle{display:flex;align-items:center;gap:6px;font-size:11px;color:#64748b;margin-top:4px}.stitch-dot{width:6px;height:6px;border-radius:999px;background:#22c55e}.stitch-header-right{display:flex;align-items:center;gap:10px;flex-wrap:wrap;justify-content:flex-end}.stitch-search{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border-radius:10px;border:1px solid #e2e8f0;background:#f8fafc;min-width:240px}.stitch-search input{border:none;outline:none;background:transparent;font-size:11px;width:100%}.stitch-divider{width:1px;height:22px;background:#e2e8f0;margin:0 4px}.stitch-btn{display:inline-flex;align-items:center;gap:6px;border-radius:8px;padding:6px 10px;font-size:11px;font-weight:700;border:1px solid transparent;cursor:pointer}.stitch-btn-primary{background:#16a34a;color:#fff}.stitch-btn-ghost{background:#f8fafc;color:#94a3b8;border-color:#e2e8f0}.stitch-timeline{position:relative;height:6px;background:#e2e8f0}.stitch-heatmap{height:100%;background:linear-gradient(to right,#10b981 0% 15%,#ef4444 15% 17%,#10b981 17% 45%,#ef4444 45% 46%,#10b981 46% 80%,#f59e0b 80% 82%,#10b981 82% 100%);opacity:.85}.stitch-window{position:absolute;top:0;bottom:0;left:20%;width:5%;background:#fff6;border-left:1px solid rgba(255,255,255,.8);border-right:1px solid rgba(255,255,255,.8)}.stitch-body{display:grid;grid-template-columns:minmax(0,1fr) 450px;flex:1;min-height:0}.stitch-table-section{background:#fff;display:flex;flex-direction:column;min-width:0}.stitch-table-wrap{flex:1;overflow:auto}.stitch-table{width:100%;border-collapse:collapse;font-size:12px}.stitch-table thead th{position:sticky;top:0;z-index:5;background:#f8fafc;font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:#94a3b8;padding:10px 12px;border-bottom:1px solid #e2e8f0}.stitch-table tbody tr{border-bottom:1px solid #f1f5f9;cursor:pointer}.stitch-table tbody tr.warn{background:#fff7ed99}.stitch-table tbody tr:hover{background:#f8fafc}.stitch-table td{padding:10px 12px;color:#475569}.stitch-dir{font-size:18px}.stitch-dir.rx{color:#10b981}.stitch-dir.tx{color:#3b82f6}.stitch-proto-pill{display:inline-flex;align-items:center;gap:6px;padding:3px 10px;border-radius:999px;font-size:10px;font-weight:700}.stitch-proto-pill.modbus{background:#dbeafe;color:#1d4ed8;border:1px solid #bfdbfe}.stitch-proto-pill.unknown{background:#f1f5f9;color:#64748b;border:1px dashed #cbd5e1}.stitch-proto-pill .pill-dot{width:14px;height:14px;border-radius:999px;background:#2563eb;color:#fff;display:inline-flex;align-items:center;justify-content:center;font-size:9px;font-weight:800}.stitch-proto-pill.unknown .pill-dot{background:#94a3b8}.stitch-side{background:#f8fafc;border-left:1px solid #e2e8f0;display:flex;flex-direction:column;min-height:0}.stitch-side-header{padding:12px 16px;border-bottom:1px solid #e2e8f0;background:#fff;display:flex;align-items:center;justify-content:space-between}.stitch-side-header h3{display:flex;align-items:center;gap:6px;font-size:11px;font-weight:700;text-transform:uppercase;color:#64748b}.stitch-side-actions button{border:none;background:transparent;color:#94a3b8;cursor:pointer}.stitch-side-scroll{flex:1;overflow-y:auto}.stitch-unknown{padding:20px;text-align:center;border-bottom:1px solid #e2e8f0;background:#fff7ed80}.stitch-unknown h4{margin:6px 0 0;font-size:12px;font-weight:700;color:#1e293b}.stitch-unknown p{font-size:11px;color:#64748b;margin:8px auto 0;max-width:280px;line-height:1.5}.unknown-icon{width:42px;height:42px;border-radius:999px;background:#ffedd5;color:#f97316;display:inline-flex;align-items:center;justify-content:center;margin:0 auto 8px}.unknown-actions{display:flex;justify-content:center;gap:8px;margin-top:12px}.unknown-actions .ghost{border:1px solid #e2e8f0;background:#fff;border-radius:8px;padding:6px 10px;font-size:11px;font-weight:700}.unknown-actions .primary{border:none;background:#2563eb;color:#fff;border-radius:8px;padding:6px 10px;font-size:11px;font-weight:700;display:inline-flex;align-items:center;gap:4px}.stitch-hex{padding:16px;border-bottom:1px solid #e2e8f0;background:#fff}.stitch-tree{padding:16px}.stitch-metrics{padding:16px;background:#f1f5f9;border-top:1px solid #e2e8f0;margin-top:auto}.stitch-metrics .metrics-title{font-size:10px;font-weight:700;text-transform:uppercase;color:#94a3b8;margin-bottom:10px}.stitch-footer{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:10px 14px;background:#f8fafc;border-top:1px solid #e2e8f0}.stitch-footer .footer-left{display:flex;align-items:center;gap:16px;font-size:11px;color:#64748b}.stitch-footer .footer-right{display:flex;align-items:center;gap:10px}.stitch-footer .pager{display:inline-flex;align-items:center;gap:4px;border:1px solid #e2e8f0;background:#fff;padding:4px;border-radius:10px}.stitch-footer .pager-btn{border:none;background:transparent;cursor:pointer;padding:4px;color:#64748b}.stitch-footer .pager-info{font-size:11px;font-weight:700;color:#475569;padding:0 6px}.packet-timeline{position:relative;height:8px;background:#e2e8f0}.packet-heatmap{height:100%;background:linear-gradient(to right,#10b981 0% 15%,#ef4444 15% 17%,#10b981 17% 45%,#ef4444 45% 46%,#10b981 46% 80%,#f59e0b 80% 82%,#10b981 82% 100%);opacity:.85}.packet-window{position:absolute;top:0;bottom:0;left:20%;width:12%;background:#fff6;border-left:1px solid rgba(255,255,255,.8);border-right:1px solid rgba(255,255,255,.8)}.packet-body{display:grid;grid-template-columns:minmax(0,1fr) 520px;background:#f8fafc;height:calc(95vh - 72px);min-height:0}.packet-body-tight{border-top:1px solid #e2e8f0}.packet-table{display:flex;flex-direction:column;min-width:0;border-right:1px solid #e2e8f0;background:#fff;min-height:0}.packet-toolbar{display:flex;align-items:center;justify-content:space-between;padding:10px 16px;border-bottom:1px solid #e2e8f0;background:#f8fafc;font-size:11px;color:#64748b}.packet-toolbar.secondary{background:#fff}.packet-toggle{display:inline-flex;background:#f1f5f9;border:1px solid #e2e8f0;border-radius:999px;padding:2px;gap:4px}.packet-toggle button{border:none;background:transparent;font-size:10px;font-weight:700;padding:4px 10px;border-radius:999px;color:#64748b;cursor:pointer}.packet-toggle button.active{background:#0f172a;color:#fff}.packet-table-wrap{flex:1;overflow:auto}.packet-table table{width:100%;border-collapse:collapse;font-size:12px}.packet-table thead th{position:sticky;top:0;z-index:5;background:#f8fafc;text-transform:none;letter-spacing:.02em;font-size:11px;color:#64748b;border-bottom:1px solid #e2e8f0;padding:10px 12px}.packet-table tbody tr{border-bottom:1px solid #f1f5f9;cursor:pointer}.packet-table tbody tr:hover{background:#f1f5f9}.packet-table tbody tr.active{background:#3b82f614;border-left:2px solid #2563eb}.packet-table td{padding:10px 12px;color:#475569}.packet-table-clean tbody tr.warn{background:#fff7ed}.packet-table-clean tbody tr.warn:hover{background:#ffedd5}.dir-icon{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:999px;font-weight:700;font-size:12px}.dir-icon.rx{background:#dcfce7;color:#16a34a}.dir-icon.tx{background:#dbeafe;color:#2563eb}.proto-pill{display:inline-flex;align-items:center;gap:6px;padding:3px 10px;border-radius:999px;font-size:10px;font-weight:700;border:1px solid #dbeafe;background:#eff6ff;color:#2563eb}.proto-pill.red{border-color:#fed7aa;background:#fff7ed;color:#ea580c}.packet-footer{display:flex;justify-content:space-between;align-items:center;gap:16px;padding:10px 14px;border-top:1px solid #e2e8f0;background:#f8fafc}.packet-footer-left{display:flex;align-items:center;gap:16px;font-size:11px;color:#64748b}.packet-progress{display:inline-flex;align-items:center;gap:8px}.packet-progress .progress-bar{width:160px;height:8px;background:#e2e8f0;border-radius:999px;overflow:hidden}.packet-progress .progress-bar span{display:block;width:85%;height:100%;background:#f59e0b}.packet-footer-right{display:inline-flex;align-items:center;gap:8px}.pager-btn{border:1px solid #e2e8f0;background:#fff;border-radius:8px;padding:4px 8px;font-size:11px;color:#475569;cursor:pointer}.pager-info{font-size:11px;color:#475569;padding:0 6px}.export-btn{display:inline-flex;align-items:center;gap:6px;border:1px solid #e2e8f0;background:#fff;border-radius:10px;padding:6px 10px;font-size:11px;font-weight:600;color:#475569;cursor:pointer}.export-btn .material-symbols-outlined{font-size:16px}.col-index{width:60px;font-family:JetBrains Mono,monospace;color:#94a3b8}.col-time{width:120px;font-family:JetBrains Mono,monospace;color:#64748b}.col-dir{width:70px;text-align:center}.col-proto{width:120px;font-weight:600;color:#2563eb}.col-key{width:160px;font-weight:600;color:#0f172a}.col-len{width:80px}.col-raw{max-width:220px;font-family:JetBrains Mono,monospace;color:#64748b}.col-summary{font-style:italic;color:#2563eb}.dir-chip{display:inline-flex;align-items:center;justify-content:center;padding:2px 8px;border-radius:999px;font-size:10px;font-weight:700}.dir-chip.rx{background:#10b9811a;color:#10b981}.dir-chip.tx{background:#3b82f61a;color:#3b82f6}.packet-side{background:#f1f5f9;padding:16px;display:flex;flex-direction:column;gap:16px;min-height:0;overflow:auto}.packet-side-header{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;background:#fff;border:1px solid #e2e8f0;border-radius:12px}.packet-side-title{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:700;color:#2563eb}.packet-side-header h3{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:#64748b}.packet-side-actions button{border:none;background:transparent;color:#94a3b8;cursor:pointer}.packet-side-section{background:#fff;border:1px solid #e2e8f0;border-radius:14px;padding:14px;color:#475569}.packet-side-section h4{font-size:12px;font-weight:700;margin-bottom:8px;color:#0f172a}.packet-side-section p{font-size:11px;color:#64748b}.packet-metrics{display:grid;gap:10px}.metric-card{border:1px solid #e2e8f0;background:#fff;border-radius:12px;padding:10px 12px;display:flex;flex-direction:column;gap:6px;font-size:11px;color:#64748b}.metric-card strong{color:#16a34a;font-size:14px}.packet-side-section.highlight{background:#fff7ed;border-color:#fed7aa;text-align:center}.highlight-icon{width:42px;height:42px;border-radius:999px;background:#ffedd5;color:#f97316;display:inline-flex;align-items:center;justify-content:center;margin:0 auto 8px}.highlight-actions{display:flex;justify-content:center;gap:8px;margin-top:12px}.highlight-actions .ghost{background:#fff;border:1px solid #e2e8f0;border-radius:10px;padding:6px 10px;font-size:11px}.highlight-actions .primary{background:#2563eb;color:#fff;border:none;border-radius:10px;padding:6px 10px;font-size:11px;display:inline-flex;align-items:center;gap:6px}.section-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}.section-header h4{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:#94a3b8}.section-header .badge{font-size:10px;background:#e2e8f0;color:#475569;padding:2px 6px;border-radius:6px}.hex-dump{display:flex;border:1px solid #e2e8f0;border-radius:10px;overflow:hidden}.hex-index{width:50px;background:#f8fafc;border-right:1px solid #e2e8f0;font-size:10px;color:#94a3b8;text-align:right;padding:6px;line-height:18px}.hex-grid{flex:1;display:grid;grid-template-columns:repeat(8,minmax(0,1fr));gap:4px;padding:6px;font-family:JetBrains Mono,monospace;font-size:11px}.hex-ascii{width:70px;background:#f8fafc;border-left:1px solid #e2e8f0;font-size:10px;color:#94a3b8;padding:6px;line-height:18px}.hex-cell{padding:2px 4px;border-radius:6px;text-align:center;font-weight:600}.hex-cell.primary{background:#dbeafe;color:#2563eb}.hex-cell.success{background:#dcfce7;color:#16a34a}.hex-cell.warn{background:#fef3c7;color:#d97706}.hex-cell.muted{background:#f1f5f9;color:#94a3b8}.hex-cell.placeholder{color:#cbd5f5}.packet-tree{display:flex;flex-direction:column;gap:8px;font-size:11px}.tree-item{padding:6px 8px;border-radius:8px;background:#f8fafc;color:#475569}.tree-item.active{background:#3b82f61a;border-left:2px solid #2563eb;color:#1d4ed8}.tree-branch{border-left:1px solid #e2e8f0;padding-left:8px}.tree-detail{display:grid;gap:6px;margin-top:8px}.tree-detail span{color:#94a3b8;font-size:10px}.tree-detail strong{color:#0f172a;font-weight:600}.hover\:border-blue-500:hover{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.hover\:bg-blue-50:hover{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-700:hover{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.hover\:bg-emerald-700:hover{--tw-bg-opacity: 1;background-color:rgb(4 120 87 / var(--tw-bg-opacity, 1))}.hover\:bg-rose-100:hover{--tw-bg-opacity: 1;background-color:rgb(255 228 230 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-100:hover{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-200:hover{--tw-bg-opacity: 1;background-color:rgb(226 232 240 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-300:hover{--tw-bg-opacity: 1;background-color:rgb(203 213 225 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-50:hover{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.hover\:text-slate-600:hover{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.hover\:text-slate-700:hover{--tw-text-opacity: 1;color:rgb(51 65 85 / var(--tw-text-opacity, 1))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:ring-2:hover{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.hover\:ring-primary\/50:hover{--tw-ring-color: rgb(36 99 235 / .5)}.focus\:border-primary:focus{--tw-border-opacity: 1;border-color:rgb(36 99 235 / var(--tw-border-opacity, 1))}.focus\:ring-0:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-4:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-primary\/10:focus{--tw-ring-color: rgb(36 99 235 / .1)}.focus\:ring-primary\/20:focus{--tw-ring-color: rgb(36 99 235 / .2)}.group[open] .group-open\:rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:flex{display:flex}.group:hover .group-hover\:text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:opacity-100{opacity:1}@media(min-width:768px){.md\:h-\[96vh\]{height:96vh}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:rounded-xl{border-radius:.75rem}}@media(min-width:1024px){.lg\:col-span-5{grid-column:span 5 / span 5}.lg\:col-span-7{grid-column:span 7 / span 7}.lg\:w-96{width:24rem}} diff --git a/ui/assets/web/assets/index-CWdEPjyK.js b/ui/assets/web/assets/index-CWdEPjyK.js new file mode 100644 index 0000000..c88705f --- /dev/null +++ b/ui/assets/web/assets/index-CWdEPjyK.js @@ -0,0 +1,2 @@ +import{E as k,D as zt,V as tt,g as ae,a as v,s as nt,c as x,r as oi,b as Ht,d as ri,l as Ge,k as it,h as si,W as li,e as ci,f as ai,i as Kt,j as Gt,m as fi,n as hi,o as ui,p as di}from"./index-DocLX96z.js";import{StateField as ne,Facet as ie,EditorSelection as m,countColumn as ot,Text as Jt,Annotation as rt,Transaction as Ne,combineConfig as pe,findClusterBreak as J,StateEffect as L,ChangeSet as mi,ChangeDesc as pi,Prec as st,codePointAt as O,fromCodePoint as lt,codePointSize as U,CharCategory as w,EditorState as jt,RangeSetBuilder as Qt,RangeSet as gi,MapMode as yi,RangeValue as xi}from"./index-1CbRHFUW.js";import{IndentContext as _t,getIndentation as Yt,indentString as Ae,syntaxTree as oe,matchBrackets as _,getIndentUnit as Je,indentUnit as bi,foldGutter as Si,indentOnInput as ki,syntaxHighlighting as Xt,bracketMatching as Ci,foldKeymap as vi,defaultHighlightStyle as Zt}from"./index-CkqoOxGF.js";import{N as je}from"./index-CQY7N6SN.js";const Ai=t=>{let{state:e}=t,n=e.doc.lineAt(e.selection.main.from),i=at(t.state,n.from);return i.line?Mi(t):i.block?Di(t):!1};function ct(t,e){return({state:n,dispatch:i})=>{if(n.readOnly)return!1;let o=t(e,n);return o?(i(n.update(o)),!0):!1}}const Mi=ct(Ii,0),Li=ct(en,0),Di=ct((t,e)=>en(t,e,Bi(e)),0);function at(t,e){let n=t.languageDataAt("commentTokens",e,1);return n.length?n[0]:{}}const le=50;function wi(t,{open:e,close:n},i,o){let r=t.sliceDoc(i-le,i),s=t.sliceDoc(o,o+le),l=/\s*$/.exec(r)[0].length,c=/^\s*/.exec(s)[0].length,f=r.length-l;if(r.slice(f-e.length,f)==e&&s.slice(c,c+n.length)==n)return{open:{pos:i-l,margin:l&&1},close:{pos:o+c,margin:c&&1}};let a,h;o-i<=2*le?a=h=t.sliceDoc(i,o):(a=t.sliceDoc(i,i+le),h=t.sliceDoc(o-le,o));let u=/^\s*/.exec(a)[0].length,d=/\s*$/.exec(h)[0].length,p=h.length-d-n.length;return a.slice(u,u+e.length)==e&&h.slice(p,p+n.length)==n?{open:{pos:i+u+e.length,margin:/\s/.test(a.charAt(u+e.length))?1:0},close:{pos:o-d-n.length,margin:/\s/.test(h.charAt(p-1))?1:0}}:null}function Bi(t){let e=[];for(let n of t.selection.ranges){let i=t.doc.lineAt(n.from),o=n.to<=i.to?i:t.doc.lineAt(n.to);o.from>i.from&&o.from==n.to&&(o=n.to==i.to+1?i:t.doc.lineAt(n.to-1));let r=e.length-1;r>=0&&e[r].to>i.from?e[r].to=o.to:e.push({from:i.from+/^\s*/.exec(i.text)[0].length,to:o.to})}return e}function en(t,e,n=e.selection.ranges){let i=n.map(r=>at(e,r.from).block);if(!i.every(r=>r))return null;let o=n.map((r,s)=>wi(e,i[s],r.from,r.to));if(t!=2&&!o.every(r=>r))return{changes:e.changes(n.map((r,s)=>o[s]?[]:[{from:r.from,insert:i[s].open+" "},{from:r.to,insert:" "+i[s].close}]))};if(t!=1&&o.some(r=>r)){let r=[];for(let s=0,l;so&&(r==s||s>h.from)){o=h.from;let u=/^\s*/.exec(h.text)[0].length,d=u==h.length,p=h.text.slice(u,u+f.length)==f?u:-1;ur.comment<0&&(!r.empty||r.single))){let r=[];for(let{line:l,token:c,indent:f,empty:a,single:h}of i)(h||!a)&&r.push({from:l.from+f,insert:c+" "});let s=e.changes(r);return{changes:s,selection:e.selection.map(s,1)}}else if(t!=1&&i.some(r=>r.comment>=0)){let r=[];for(let{line:s,comment:l,token:c}of i)if(l>=0){let f=s.from+l,a=f+c.length;s.text[a-s.from]==" "&&a++,r.push({from:f,to:a})}return{changes:r}}return null}const Qe=rt.define(),Ri=rt.define(),Ei=ie.define(),tn=ie.define({combine(t){return pe(t,{minDepth:100,newGroupDelay:500,joinToEvent:(e,n)=>n},{minDepth:Math.max,newGroupDelay:Math.min,joinToEvent:(e,n)=>(i,o)=>e(i,o)||n(i,o)})}}),nn=ne.define({create(){return q.empty},update(t,e){let n=e.state.facet(tn),i=e.annotation(Qe);if(i){let c=I.fromTransaction(e,i.selection),f=i.side,a=f==0?t.undone:t.done;return c?a=Me(a,a.length,n.minDepth,c):a=ln(a,e.startState.selection),new q(f==0?i.rest:a,f==0?a:i.rest)}let o=e.annotation(Ri);if((o=="full"||o=="before")&&(t=t.isolate()),e.annotation(Ne.addToHistory)===!1)return e.changes.empty?t:t.addMapping(e.changes.desc);let r=I.fromTransaction(e),s=e.annotation(Ne.time),l=e.annotation(Ne.userEvent);return r?t=t.addChanges(r,s,l,n,e):e.selection&&(t=t.addSelection(e.startState.selection,s,l,n.newGroupDelay)),(o=="full"||o=="after")&&(t=t.isolate()),t},toJSON(t){return{done:t.done.map(e=>e.toJSON()),undone:t.undone.map(e=>e.toJSON())}},fromJSON(t){return new q(t.done.map(I.fromJSON),t.undone.map(I.fromJSON))}});function on(t={}){return[nn,tn.of(t),k.domEventHandlers({beforeinput(e,n){let i=e.inputType=="historyUndo"?rn:e.inputType=="historyRedo"?_e:null;return i?(e.preventDefault(),i(n)):!1}})]}function Te(t,e){return function({state:n,dispatch:i}){if(!e&&n.readOnly)return!1;let o=n.field(nn,!1);if(!o)return!1;let r=o.pop(t,n,e);return r?(i(r),!0):!1}}const rn=Te(0,!1),_e=Te(1,!1),Ti=Te(0,!0),Oi=Te(1,!0);class I{constructor(e,n,i,o,r){this.changes=e,this.effects=n,this.mapped=i,this.startSelection=o,this.selectionsAfter=r}setSelAfter(e){return new I(this.changes,this.effects,this.mapped,this.startSelection,e)}toJSON(){var e,n,i;return{changes:(e=this.changes)===null||e===void 0?void 0:e.toJSON(),mapped:(n=this.mapped)===null||n===void 0?void 0:n.toJSON(),startSelection:(i=this.startSelection)===null||i===void 0?void 0:i.toJSON(),selectionsAfter:this.selectionsAfter.map(o=>o.toJSON())}}static fromJSON(e){return new I(e.changes&&mi.fromJSON(e.changes),[],e.mapped&&pi.fromJSON(e.mapped),e.startSelection&&m.fromJSON(e.startSelection),e.selectionsAfter.map(m.fromJSON))}static fromTransaction(e,n){let i=P;for(let o of e.startState.facet(Ei)){let r=o(e);r.length&&(i=i.concat(r))}return!i.length&&e.changes.empty?null:new I(e.changes.invert(e.startState.doc),i,void 0,n||e.startState.selection,P)}static selection(e){return new I(void 0,P,void 0,void 0,e)}}function Me(t,e,n,i){let o=e+1>n+20?e-n-1:0,r=t.slice(o,e);return r.push(i),r}function Pi(t,e){let n=[],i=!1;return t.iterChangedRanges((o,r)=>n.push(o,r)),e.iterChangedRanges((o,r,s,l)=>{for(let c=0;c=f&&s<=a&&(i=!0)}}),i}function Fi(t,e){return t.ranges.length==e.ranges.length&&t.ranges.filter((n,i)=>n.empty!=e.ranges[i].empty).length===0}function sn(t,e){return t.length?e.length?t.concat(e):t:e}const P=[],Wi=200;function ln(t,e){if(t.length){let n=t[t.length-1],i=n.selectionsAfter.slice(Math.max(0,n.selectionsAfter.length-Wi));return i.length&&i[i.length-1].eq(e)?t:(i.push(e),Me(t,t.length-1,1e9,n.setSelAfter(i)))}else return[I.selection([e])]}function $i(t){let e=t[t.length-1],n=t.slice();return n[t.length-1]=e.setSelAfter(e.selectionsAfter.slice(0,e.selectionsAfter.length-1)),n}function qe(t,e){if(!t.length)return t;let n=t.length,i=P;for(;n;){let o=Ni(t[n-1],e,i);if(o.changes&&!o.changes.empty||o.effects.length){let r=t.slice(0,n);return r[n-1]=o,r}else e=o.mapped,n--,i=o.selectionsAfter}return i.length?[I.selection(i)]:P}function Ni(t,e,n){let i=sn(t.selectionsAfter.length?t.selectionsAfter.map(l=>l.map(e)):P,n);if(!t.changes)return I.selection(i);let o=t.changes.map(e),r=e.mapDesc(t.changes,!0),s=t.mapped?t.mapped.composeDesc(r):r;return new I(o,L.mapEffects(t.effects,e),s,t.startSelection.map(r),i)}const qi=/^(input\.type|delete)($|\.)/;class q{constructor(e,n,i=0,o=void 0){this.done=e,this.undone=n,this.prevTime=i,this.prevUserEvent=o}isolate(){return this.prevTime?new q(this.done,this.undone):this}addChanges(e,n,i,o,r){let s=this.done,l=s[s.length-1];return l&&l.changes&&!l.changes.empty&&e.changes&&(!i||qi.test(i))&&(!l.selectionsAfter.length&&n-this.prevTime0&&n-this.prevTimen.empty?t.moveByChar(n,e):Oe(n,e))}function D(t){return t.textDirectionAt(t.state.selection.main.head)==zt.LTR}const fn=t=>an(t,!D(t)),hn=t=>an(t,D(t));function un(t,e){return N(t,n=>n.empty?t.moveByGroup(n,e):Oe(n,e))}const Ui=t=>un(t,!D(t)),Vi=t=>un(t,D(t));function zi(t,e,n){if(e.type.prop(n))return!0;let i=e.to-e.from;return i&&(i>2||/[^\s,.;:]/.test(t.sliceDoc(e.from,e.to)))||e.firstChild}function Pe(t,e,n){let i=oe(t).resolveInner(e.head),o=n?je.closedBy:je.openedBy;for(let c=e.head;;){let f=n?i.childAfter(c):i.childBefore(c);if(!f)break;zi(t,f,o)?i=f:c=n?f.to:f.from}let r=i.type.prop(o),s,l;return r&&(s=n?_(t,i.from,1):_(t,i.to,-1))&&s.matched?l=n?s.end.to:s.end.from:l=n?i.to:i.from,m.cursor(l,n?-1:1)}const Hi=t=>N(t,e=>Pe(t.state,e,!D(t))),Ki=t=>N(t,e=>Pe(t.state,e,D(t)));function dn(t,e){return N(t,n=>{if(!n.empty)return Oe(n,e);let i=t.moveVertically(n,e);return i.head!=n.head?i:t.moveToLineBoundary(n,e)})}const mn=t=>dn(t,!1),pn=t=>dn(t,!0);function gn(t){let e=t.scrollDOM.clientHeights.empty?t.moveVertically(s,e,n.height):Oe(s,e));if(o.eq(i.selection))return!1;let r;if(n.selfScroll){let s=t.coordsAtPos(i.selection.main.head),l=t.scrollDOM.getBoundingClientRect(),c=l.top+n.marginTop,f=l.bottom-n.marginBottom;s&&s.top>c&&s.bottomyn(t,!1),Ye=t=>yn(t,!0);function z(t,e,n){let i=t.lineBlockAt(e.head),o=t.moveToLineBoundary(e,n);if(o.head==e.head&&o.head!=(n?i.to:i.from)&&(o=t.moveToLineBoundary(e,n,!1)),!n&&o.head==i.from&&i.length){let r=/^\s*/.exec(t.state.sliceDoc(i.from,Math.min(i.from+100,i.to)))[0].length;r&&e.head!=i.from+r&&(o=m.cursor(i.from+r))}return o}const Gi=t=>N(t,e=>z(t,e,!0)),Ji=t=>N(t,e=>z(t,e,!1)),ji=t=>N(t,e=>z(t,e,!D(t))),Qi=t=>N(t,e=>z(t,e,D(t))),_i=t=>N(t,e=>m.cursor(t.lineBlockAt(e.head).from,1)),Yi=t=>N(t,e=>m.cursor(t.lineBlockAt(e.head).to,-1));function Xi(t,e,n){let i=!1,o=re(t.selection,r=>{let s=_(t,r.head,-1)||_(t,r.head,1)||r.head>0&&_(t,r.head-1,1)||r.headXi(t,e);function W(t,e){let n=re(t.state.selection,i=>{let o=e(i);return m.range(i.anchor,o.head,o.goalColumn,o.bidiLevel||void 0)});return n.eq(t.state.selection)?!1:(t.dispatch($(t.state,n)),!0)}function xn(t,e){return W(t,n=>t.moveByChar(n,e))}const bn=t=>xn(t,!D(t)),Sn=t=>xn(t,D(t));function kn(t,e){return W(t,n=>t.moveByGroup(n,e))}const eo=t=>kn(t,!D(t)),to=t=>kn(t,D(t)),no=t=>W(t,e=>Pe(t.state,e,!D(t))),io=t=>W(t,e=>Pe(t.state,e,D(t)));function Cn(t,e){return W(t,n=>t.moveVertically(n,e))}const vn=t=>Cn(t,!1),An=t=>Cn(t,!0);function Mn(t,e){return W(t,n=>t.moveVertically(n,e,gn(t).height))}const St=t=>Mn(t,!1),kt=t=>Mn(t,!0),oo=t=>W(t,e=>z(t,e,!0)),ro=t=>W(t,e=>z(t,e,!1)),so=t=>W(t,e=>z(t,e,!D(t))),lo=t=>W(t,e=>z(t,e,D(t))),co=t=>W(t,e=>m.cursor(t.lineBlockAt(e.head).from)),ao=t=>W(t,e=>m.cursor(t.lineBlockAt(e.head).to)),Ct=({state:t,dispatch:e})=>(e($(t,{anchor:0})),!0),vt=({state:t,dispatch:e})=>(e($(t,{anchor:t.doc.length})),!0),At=({state:t,dispatch:e})=>(e($(t,{anchor:t.selection.main.anchor,head:0})),!0),Mt=({state:t,dispatch:e})=>(e($(t,{anchor:t.selection.main.anchor,head:t.doc.length})),!0),fo=({state:t,dispatch:e})=>(e(t.update({selection:{anchor:0,head:t.doc.length},userEvent:"select"})),!0),ho=({state:t,dispatch:e})=>{let n=Fe(t).map(({from:i,to:o})=>m.range(i,Math.min(o+1,t.doc.length)));return e(t.update({selection:m.create(n),userEvent:"select"})),!0},uo=({state:t,dispatch:e})=>{let n=re(t.selection,i=>{let o=oe(t),r=o.resolveStack(i.from,1);if(i.empty){let s=o.resolveStack(i.from,-1);s.node.from>=r.node.from&&s.node.to<=r.node.to&&(r=s)}for(let s=r;s;s=s.next){let{node:l}=s;if((l.from=i.to||l.to>i.to&&l.from<=i.from)&&s.next)return m.range(l.to,l.from)}return i});return n.eq(t.selection)?!1:(e($(t,n)),!0)};function Ln(t,e){let{state:n}=t,i=n.selection,o=n.selection.ranges.slice();for(let r of n.selection.ranges){let s=n.doc.lineAt(r.head);if(e?s.to0)for(let l=r;;){let c=t.moveVertically(l,e);if(c.heads.to){o.some(f=>f.head==c.head)||o.push(c);break}else{if(c.head==l.head)break;l=c}}}return o.length==i.ranges.length?!1:(t.dispatch($(n,m.create(o,o.length-1))),!0)}const mo=t=>Ln(t,!1),po=t=>Ln(t,!0),go=({state:t,dispatch:e})=>{let n=t.selection,i=null;return n.ranges.length>1?i=m.create([n.main]):n.main.empty||(i=m.create([m.cursor(n.main.head)])),i?(e($(t,i)),!0):!1};function ge(t,e){if(t.state.readOnly)return!1;let n="delete.selection",{state:i}=t,o=i.changeByRange(r=>{let{from:s,to:l}=r;if(s==l){let c=e(r);cs&&(n="delete.forward",c=be(t,c,!0)),s=Math.min(s,c),l=Math.max(l,c)}else s=be(t,s,!1),l=be(t,l,!0);return s==l?{range:r}:{changes:{from:s,to:l},range:m.cursor(s,so(t)))i.between(e,e,(o,r)=>{oe&&(e=n?r:o)});return e}const Dn=(t,e,n)=>ge(t,i=>{let o=i.from,{state:r}=t,s=r.doc.lineAt(o),l,c;if(n&&!e&&o>s.from&&oDn(t,!1,!0),wn=t=>Dn(t,!0,!1),Bn=(t,e)=>ge(t,n=>{let i=n.head,{state:o}=t,r=o.doc.lineAt(i),s=o.charCategorizer(i);for(let l=null;;){if(i==(e?r.to:r.from)){i==n.head&&r.number!=(e?o.doc.lines:1)&&(i+=e?1:-1);break}let c=J(r.text,i-r.from,e)+r.from,f=r.text.slice(Math.min(i,c)-r.from,Math.max(i,c)-r.from),a=s(f);if(l!=null&&a!=l)break;(f!=" "||i!=n.head)&&(l=a),i=c}return i}),In=t=>Bn(t,!1),yo=t=>Bn(t,!0),xo=t=>ge(t,e=>{let n=t.lineBlockAt(e.head).to;return e.headge(t,e=>{let n=t.moveToLineBoundary(e,!1).head;return e.head>n?n:Math.max(0,e.head-1)}),So=t=>ge(t,e=>{let n=t.moveToLineBoundary(e,!0).head;return e.head{if(t.readOnly)return!1;let n=t.changeByRange(i=>({changes:{from:i.from,to:i.to,insert:Jt.of(["",""])},range:m.cursor(i.from)}));return e(t.update(n,{scrollIntoView:!0,userEvent:"input"})),!0},Co=({state:t,dispatch:e})=>{if(t.readOnly)return!1;let n=t.changeByRange(i=>{if(!i.empty||i.from==0||i.from==t.doc.length)return{range:i};let o=i.from,r=t.doc.lineAt(o),s=o==r.from?o-1:J(r.text,o-r.from,!1)+r.from,l=o==r.to?o+1:J(r.text,o-r.from,!0)+r.from;return{changes:{from:s,to:l,insert:t.doc.slice(o,l).append(t.doc.slice(s,o))},range:m.cursor(l)}});return n.changes.empty?!1:(e(t.update(n,{scrollIntoView:!0,userEvent:"move.character"})),!0)};function Fe(t){let e=[],n=-1;for(let i of t.selection.ranges){let o=t.doc.lineAt(i.from),r=t.doc.lineAt(i.to);if(!i.empty&&i.to==r.from&&(r=t.doc.lineAt(i.to-1)),n>=o.number){let s=e[e.length-1];s.to=r.to,s.ranges.push(i)}else e.push({from:o.from,to:r.to,ranges:[i]});n=r.number+1}return e}function Rn(t,e,n){if(t.readOnly)return!1;let i=[],o=[];for(let r of Fe(t)){if(n?r.to==t.doc.length:r.from==0)continue;let s=t.doc.lineAt(n?r.to+1:r.from-1),l=s.length+1;if(n){i.push({from:r.to,to:s.to},{from:r.from,insert:s.text+t.lineBreak});for(let c of r.ranges)o.push(m.range(Math.min(t.doc.length,c.anchor+l),Math.min(t.doc.length,c.head+l)))}else{i.push({from:s.from,to:r.from},{from:r.to,insert:t.lineBreak+s.text});for(let c of r.ranges)o.push(m.range(c.anchor-l,c.head-l))}}return i.length?(e(t.update({changes:i,scrollIntoView:!0,selection:m.create(o,t.selection.mainIndex),userEvent:"move.line"})),!0):!1}const vo=({state:t,dispatch:e})=>Rn(t,e,!1),Ao=({state:t,dispatch:e})=>Rn(t,e,!0);function En(t,e,n){if(t.readOnly)return!1;let i=[];for(let r of Fe(t))n?i.push({from:r.from,insert:t.doc.slice(r.from,r.to)+t.lineBreak}):i.push({from:r.to,insert:t.lineBreak+t.doc.slice(r.from,r.to)});let o=t.changes(i);return e(t.update({changes:o,selection:t.selection.map(o,n?1:-1),scrollIntoView:!0,userEvent:"input.copyline"})),!0}const Mo=({state:t,dispatch:e})=>En(t,e,!1),Lo=({state:t,dispatch:e})=>En(t,e,!0),Do=t=>{if(t.state.readOnly)return!1;let{state:e}=t,n=e.changes(Fe(e).map(({from:o,to:r})=>(o>0?o--:r{let r;if(t.lineWrapping){let s=t.lineBlockAt(o.head),l=t.coordsAtPos(o.head,o.assoc||1);l&&(r=s.bottom+t.documentTop-l.bottom+t.defaultLineHeight/2)}return t.moveVertically(o,!0,r)}).map(n);return t.dispatch({changes:n,selection:i,scrollIntoView:!0,userEvent:"delete.line"}),!0};function wo(t,e){if(/\(\)|\[\]|\{\}/.test(t.sliceDoc(e-1,e+1)))return{from:e,to:e};let n=oe(t).resolveInner(e),i=n.childBefore(e),o=n.childAfter(e),r;return i&&o&&i.to<=e&&o.from>=e&&(r=i.type.prop(je.closedBy))&&r.indexOf(o.name)>-1&&t.doc.lineAt(i.to).from==t.doc.lineAt(o.from).from&&!/\S/.test(t.sliceDoc(i.to,o.from))?{from:i.to,to:o.from}:null}const Lt=Tn(!1),Bo=Tn(!0);function Tn(t){return({state:e,dispatch:n})=>{if(e.readOnly)return!1;let i=e.changeByRange(o=>{let{from:r,to:s}=o,l=e.doc.lineAt(r),c=!t&&r==s&&wo(e,r);t&&(r=s=(s<=l.to?l:e.doc.lineAt(s)).to);let f=new _t(e,{simulateBreak:r,simulateDoubleBreak:!!c}),a=Yt(f,r);for(a==null&&(a=ot(/^\s*/.exec(e.doc.lineAt(r).text)[0],e.tabSize));sl.from&&r{let o=[];for(let s=i.from;s<=i.to;){let l=t.doc.lineAt(s);l.number>n&&(i.empty||i.to>l.from)&&(e(l,o,i),n=l.number),s=l.to+1}let r=t.changes(o);return{changes:o,range:m.range(r.mapPos(i.anchor,1),r.mapPos(i.head,1))}})}const Io=({state:t,dispatch:e})=>{if(t.readOnly)return!1;let n=Object.create(null),i=new _t(t,{overrideIndentation:r=>{let s=n[r];return s??-1}}),o=ft(t,(r,s,l)=>{let c=Yt(i,r.from);if(c==null)return;/\S/.test(r.text)||(c=0);let f=/^\s*/.exec(r.text)[0],a=Ae(t,c);(f!=a||l.fromt.readOnly?!1:(e(t.update(ft(t,(n,i)=>{i.push({from:n.from,insert:t.facet(bi)})}),{userEvent:"input.indent"})),!0),Eo=({state:t,dispatch:e})=>t.readOnly?!1:(e(t.update(ft(t,(n,i)=>{let o=/^\s*/.exec(n.text)[0];if(!o)return;let r=ot(o,t.tabSize),s=0,l=Ae(t,Math.max(0,r-Je(t)));for(;s(t.setTabFocusMode(),!0),Oo=[{key:"Ctrl-b",run:fn,shift:bn,preventDefault:!0},{key:"Ctrl-f",run:hn,shift:Sn},{key:"Ctrl-p",run:mn,shift:vn},{key:"Ctrl-n",run:pn,shift:An},{key:"Ctrl-a",run:_i,shift:co},{key:"Ctrl-e",run:Yi,shift:ao},{key:"Ctrl-d",run:wn},{key:"Ctrl-h",run:Xe},{key:"Ctrl-k",run:xo},{key:"Ctrl-Alt-h",run:In},{key:"Ctrl-o",run:ko},{key:"Ctrl-t",run:Co},{key:"Ctrl-v",run:Ye}],Po=[{key:"ArrowLeft",run:fn,shift:bn,preventDefault:!0},{key:"Mod-ArrowLeft",mac:"Alt-ArrowLeft",run:Ui,shift:eo,preventDefault:!0},{mac:"Cmd-ArrowLeft",run:ji,shift:so,preventDefault:!0},{key:"ArrowRight",run:hn,shift:Sn,preventDefault:!0},{key:"Mod-ArrowRight",mac:"Alt-ArrowRight",run:Vi,shift:to,preventDefault:!0},{mac:"Cmd-ArrowRight",run:Qi,shift:lo,preventDefault:!0},{key:"ArrowUp",run:mn,shift:vn,preventDefault:!0},{mac:"Cmd-ArrowUp",run:Ct,shift:At},{mac:"Ctrl-ArrowUp",run:bt,shift:St},{key:"ArrowDown",run:pn,shift:An,preventDefault:!0},{mac:"Cmd-ArrowDown",run:vt,shift:Mt},{mac:"Ctrl-ArrowDown",run:Ye,shift:kt},{key:"PageUp",run:bt,shift:St},{key:"PageDown",run:Ye,shift:kt},{key:"Home",run:Ji,shift:ro,preventDefault:!0},{key:"Mod-Home",run:Ct,shift:At},{key:"End",run:Gi,shift:oo,preventDefault:!0},{key:"Mod-End",run:vt,shift:Mt},{key:"Enter",run:Lt,shift:Lt},{key:"Mod-a",run:fo},{key:"Backspace",run:Xe,shift:Xe,preventDefault:!0},{key:"Delete",run:wn,preventDefault:!0},{key:"Mod-Backspace",mac:"Alt-Backspace",run:In,preventDefault:!0},{key:"Mod-Delete",mac:"Alt-Delete",run:yo,preventDefault:!0},{mac:"Mod-Backspace",run:bo,preventDefault:!0},{mac:"Mod-Delete",run:So,preventDefault:!0}].concat(Oo.map(t=>({mac:t.key,run:t.run,shift:t.shift}))),On=[{key:"Alt-ArrowLeft",mac:"Ctrl-ArrowLeft",run:Hi,shift:no},{key:"Alt-ArrowRight",mac:"Ctrl-ArrowRight",run:Ki,shift:io},{key:"Alt-ArrowUp",run:vo},{key:"Shift-Alt-ArrowUp",run:Mo},{key:"Alt-ArrowDown",run:Ao},{key:"Shift-Alt-ArrowDown",run:Lo},{key:"Mod-Alt-ArrowUp",run:mo},{key:"Mod-Alt-ArrowDown",run:po},{key:"Escape",run:go},{key:"Mod-Enter",run:Bo},{key:"Alt-l",mac:"Ctrl-l",run:ho},{key:"Mod-i",run:uo,preventDefault:!0},{key:"Mod-[",run:Eo},{key:"Mod-]",run:Ro},{key:"Mod-Alt-\\",run:Io},{key:"Shift-Mod-k",run:Do},{key:"Shift-Mod-\\",run:Zi},{key:"Mod-/",run:Ai},{key:"Alt-A",run:Li},{key:"Ctrl-m",mac:"Shift-Alt-m",run:To}].concat(Po),Dt=typeof String.prototype.normalize=="function"?t=>t.normalize("NFKD"):t=>t;class ee{constructor(e,n,i=0,o=e.length,r,s){this.test=s,this.value={from:0,to:0},this.done=!1,this.matches=[],this.buffer="",this.bufferPos=0,this.iter=e.iterRange(i,o),this.bufferStart=i,this.normalize=r?l=>r(Dt(l)):Dt,this.query=this.normalize(n)}peek(){if(this.bufferPos==this.buffer.length){if(this.bufferStart+=this.buffer.length,this.iter.next(),this.iter.done)return-1;this.bufferPos=0,this.buffer=this.iter.value}return O(this.buffer,this.bufferPos)}next(){for(;this.matches.length;)this.matches.pop();return this.nextOverlapping()}nextOverlapping(){for(;;){let e=this.peek();if(e<0)return this.done=!0,this;let n=lt(e),i=this.bufferStart+this.bufferPos;this.bufferPos+=U(e);let o=this.normalize(n);if(o.length)for(let r=0,s=i;;r++){let l=o.charCodeAt(r),c=this.match(l,s,this.bufferPos+this.bufferStart);if(r==o.length-1){if(c)return this.value=c,this;break}s==i&&rthis.to&&(this.curLine=this.curLine.slice(0,this.to-this.curLineStart)),this.iter.next())}nextLine(){this.curLineStart=this.curLineStart+this.curLine.length+1,this.curLineStart>this.to?this.curLine="":this.getLine(0)}next(){for(let e=this.matchPos-this.curLineStart;;){this.re.lastIndex=e;let n=this.matchPos<=this.to&&this.re.exec(this.curLine);if(n){let i=this.curLineStart+n.index,o=i+n[0].length;if(this.matchPos=Le(this.text,o+(i==o?1:0)),i==this.curLineStart+this.curLine.length&&this.nextLine(),(ithis.value.to)&&(!this.test||this.test(i,o,n)))return this.value={from:i,to:o,match:n},this;e=this.matchPos-this.curLineStart}else if(this.curLineStart+this.curLine.length=i||o.to<=n){let l=new X(n,e.sliceString(n,i));return Ue.set(e,l),l}if(o.from==n&&o.to==i)return o;let{text:r,from:s}=o;return s>n&&(r=e.sliceString(n,s)+r,s=n),o.to=this.to?this.to:this.text.lineAt(e).to}next(){for(;;){let e=this.re.lastIndex=this.matchPos-this.flat.from,n=this.re.exec(this.flat.text);if(n&&!n[0]&&n.index==e&&(this.re.lastIndex=e+1,n=this.re.exec(this.flat.text)),n){let i=this.flat.from+n.index,o=i+n[0].length;if((this.flat.to>=this.to||n.index+n[0].length<=this.flat.text.length-10)&&(!this.test||this.test(i,o,n)))return this.value={from:i,to:o,match:n},this.matchPos=Le(this.text,o+(i==o?1:0)),this}if(this.flat.to==this.to)return this.done=!0,this;this.flat=X.get(this.text,this.flat.from,this.chunkEnd(this.flat.from+this.flat.text.length*2))}}}typeof Symbol<"u"&&(Fn.prototype[Symbol.iterator]=Wn.prototype[Symbol.iterator]=function(){return this});function Fo(t){try{return new RegExp(t,ht),!0}catch{return!1}}function Le(t,e){if(e>=t.length)return e;let n=t.lineAt(e),i;for(;e=56320&&i<57344;)e++;return e}function Ze(t){let e=String(t.state.doc.lineAt(t.state.selection.main.head).number),n=x("input",{class:"cm-textfield",name:"line",value:e}),i=x("form",{class:"cm-gotoLine",onkeydown:r=>{r.keyCode==27?(r.preventDefault(),t.dispatch({effects:ce.of(!1)}),t.focus()):r.keyCode==13&&(r.preventDefault(),o())},onsubmit:r=>{r.preventDefault(),o()}},x("label",t.state.phrase("Go to line"),": ",n)," ",x("button",{class:"cm-button",type:"submit"},t.state.phrase("go")),x("button",{name:"close",onclick:()=>{t.dispatch({effects:ce.of(!1)}),t.focus()},"aria-label":t.state.phrase("close"),type:"button"},["×"]));function o(){let r=/^([+-])?(\d+)?(:\d+)?(%)?$/.exec(n.value);if(!r)return;let{state:s}=t,l=s.doc.lineAt(s.selection.main.head),[,c,f,a,h]=r,u=a?+a.slice(1):0,d=f?+f:l.number;if(f&&h){let b=d/100;c&&(b=b*(c=="-"?-1:1)+l.number/s.doc.lines),d=Math.round(s.doc.lines*b)}else f&&c&&(d=d*(c=="-"?-1:1)+l.number);let p=s.doc.line(Math.max(1,Math.min(s.doc.lines,d))),g=m.cursor(p.from+Math.max(0,Math.min(u,p.length)));t.dispatch({effects:[ce.of(!1),k.scrollIntoView(g.from,{y:"center"})],selection:g}),t.focus()}return{dom:i}}const ce=L.define(),wt=ne.define({create(){return!0},update(t,e){for(let n of e.effects)n.is(ce)&&(t=n.value);return t},provide:t=>nt.from(t,e=>e?Ze:null)}),Wo=t=>{let e=ae(t,Ze);if(!e){let n=[ce.of(!0)];t.state.field(wt,!1)==null&&n.push(L.appendConfig.of([wt,$o])),t.dispatch({effects:n}),e=ae(t,Ze)}return e&&e.dom.querySelector("input").select(),!0},$o=k.baseTheme({".cm-panel.cm-gotoLine":{padding:"2px 6px 4px",position:"relative","& label":{fontSize:"80%"},"& [name=close]":{position:"absolute",top:"0",bottom:"0",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",padding:"0"}}}),No={highlightWordAroundCursor:!1,minSelectionLength:1,maxMatches:100,wholeWords:!1},qo=ie.define({combine(t){return pe(t,No,{highlightWordAroundCursor:(e,n)=>e||n,minSelectionLength:Math.min,maxMatches:Math.min})}});function Uo(t){return[Go,Ko]}const Vo=v.mark({class:"cm-selectionMatch"}),zo=v.mark({class:"cm-selectionMatch cm-selectionMatch-main"});function Bt(t,e,n,i){return(n==0||t(e.sliceDoc(n-1,n))!=w.Word)&&(i==e.doc.length||t(e.sliceDoc(i,i+1))!=w.Word)}function Ho(t,e,n,i){return t(e.sliceDoc(n,n+1))==w.Word&&t(e.sliceDoc(i-1,i))==w.Word}const Ko=tt.fromClass(class{constructor(t){this.decorations=this.getDeco(t)}update(t){(t.selectionSet||t.docChanged||t.viewportChanged)&&(this.decorations=this.getDeco(t.view))}getDeco(t){let e=t.state.facet(qo),{state:n}=t,i=n.selection;if(i.ranges.length>1)return v.none;let o=i.main,r,s=null;if(o.empty){if(!e.highlightWordAroundCursor)return v.none;let c=n.wordAt(o.head);if(!c)return v.none;s=n.charCategorizer(o.head),r=n.sliceDoc(c.from,c.to)}else{let c=o.to-o.from;if(c200)return v.none;if(e.wholeWords){if(r=n.sliceDoc(o.from,o.to),s=n.charCategorizer(o.head),!(Bt(s,n,o.from,o.to)&&Ho(s,n,o.from,o.to)))return v.none}else if(r=n.sliceDoc(o.from,o.to),!r)return v.none}let l=[];for(let c of t.visibleRanges){let f=new ee(n.doc,r,c.from,c.to);for(;!f.next().done;){let{from:a,to:h}=f.value;if((!s||Bt(s,n,a,h))&&(o.empty&&a<=o.from&&h>=o.to?l.push(zo.range(a,h)):(a>=o.to||h<=o.from)&&l.push(Vo.range(a,h)),l.length>e.maxMatches))return v.none}}return v.set(l)}},{decorations:t=>t.decorations}),Go=k.baseTheme({".cm-selectionMatch":{backgroundColor:"#99ff7780"},".cm-searchMatch .cm-selectionMatch":{backgroundColor:"transparent"}}),Jo=({state:t,dispatch:e})=>{let{selection:n}=t,i=m.create(n.ranges.map(o=>t.wordAt(o.head)||m.cursor(o.head)),n.mainIndex);return i.eq(n)?!1:(e(t.update({selection:i})),!0)};function jo(t,e){let{main:n,ranges:i}=t.selection,o=t.wordAt(n.head),r=o&&o.from==n.from&&o.to==n.to;for(let s=!1,l=new ee(t.doc,e,i[i.length-1].to);;)if(l.next(),l.done){if(s)return null;l=new ee(t.doc,e,0,Math.max(0,i[i.length-1].from-1)),s=!0}else{if(s&&i.some(c=>c.from==l.value.from))continue;if(r){let c=t.wordAt(l.value.from);if(!c||c.from!=l.value.from||c.to!=l.value.to)continue}return l.value}}const Qo=({state:t,dispatch:e})=>{let{ranges:n}=t.selection;if(n.some(r=>r.from===r.to))return Jo({state:t,dispatch:e});let i=t.sliceDoc(n[0].from,n[0].to);if(t.selection.ranges.some(r=>t.sliceDoc(r.from,r.to)!=i))return!1;let o=jo(t,i);return o?(e(t.update({selection:t.selection.addRange(m.range(o.from,o.to),!1),effects:k.scrollIntoView(o.to)})),!0):!1},se=ie.define({combine(t){return pe(t,{top:!1,caseSensitive:!1,literal:!1,regexp:!1,wholeWord:!1,createPanel:e=>new lr(e),scrollToMatch:e=>k.scrollIntoView(e)})}});class $n{constructor(e){this.search=e.search,this.caseSensitive=!!e.caseSensitive,this.literal=!!e.literal,this.regexp=!!e.regexp,this.replace=e.replace||"",this.valid=!!this.search&&(!this.regexp||Fo(this.search)),this.unquoted=this.unquote(this.search),this.wholeWord=!!e.wholeWord}unquote(e){return this.literal?e:e.replace(/\\([nrt\\])/g,(n,i)=>i=="n"?` +`:i=="r"?"\r":i=="t"?" ":"\\")}eq(e){return this.search==e.search&&this.replace==e.replace&&this.caseSensitive==e.caseSensitive&&this.regexp==e.regexp&&this.wholeWord==e.wholeWord}create(){return this.regexp?new Zo(this):new Yo(this)}getCursor(e,n=0,i){let o=e.doc?e:jt.create({doc:e});return i==null&&(i=o.doc.length),this.regexp?Q(this,o,n,i):j(this,o,n,i)}}class Nn{constructor(e){this.spec=e}}function j(t,e,n,i){return new ee(e.doc,t.unquoted,n,i,t.caseSensitive?void 0:o=>o.toLowerCase(),t.wholeWord?_o(e.doc,e.charCategorizer(e.selection.main.head)):void 0)}function _o(t,e){return(n,i,o,r)=>((r>n||r+o.length=n)return null;o.push(i.value)}return o}highlight(e,n,i,o){let r=j(this.spec,e,Math.max(0,n-this.spec.unquoted.length),Math.min(i+this.spec.unquoted.length,e.doc.length));for(;!r.next().done;)o(r.value.from,r.value.to)}}function Q(t,e,n,i){return new Fn(e.doc,t.search,{ignoreCase:!t.caseSensitive,test:t.wholeWord?Xo(e.charCategorizer(e.selection.main.head)):void 0},n,i)}function De(t,e){return t.slice(J(t,e,!1),e)}function we(t,e){return t.slice(e,J(t,e))}function Xo(t){return(e,n,i)=>!i[0].length||(t(De(i.input,i.index))!=w.Word||t(we(i.input,i.index))!=w.Word)&&(t(we(i.input,i.index+i[0].length))!=w.Word||t(De(i.input,i.index+i[0].length))!=w.Word)}class Zo extends Nn{nextMatch(e,n,i){let o=Q(this.spec,e,i,e.doc.length).next();return o.done&&(o=Q(this.spec,e,0,n).next()),o.done?null:o.value}prevMatchInRange(e,n,i){for(let o=1;;o++){let r=Math.max(n,i-o*1e4),s=Q(this.spec,e,r,i),l=null;for(;!s.next().done;)l=s.value;if(l&&(r==n||l.from>r+10))return l;if(r==n)return null}}prevMatch(e,n,i){return this.prevMatchInRange(e,0,n)||this.prevMatchInRange(e,i,e.doc.length)}getReplacement(e){return this.spec.unquote(this.spec.replace).replace(/\$([$&]|\d+)/g,(n,i)=>{if(i=="&")return e.match[0];if(i=="$")return"$";for(let o=i.length;o>0;o--){let r=+i.slice(0,o);if(r>0&&r=n)return null;o.push(i.value)}return o}highlight(e,n,i,o){let r=Q(this.spec,e,Math.max(0,n-250),Math.min(i+250,e.doc.length));for(;!r.next().done;)o(r.value.from,r.value.to)}}const fe=L.define(),ut=L.define(),V=ne.define({create(t){return new Ve(et(t).create(),null)},update(t,e){for(let n of e.effects)n.is(fe)?t=new Ve(n.value.create(),t.panel):n.is(ut)&&(t=new Ve(t.query,n.value?dt:null));return t},provide:t=>nt.from(t,e=>e.panel)});class Ve{constructor(e,n){this.query=e,this.panel=n}}const er=v.mark({class:"cm-searchMatch"}),tr=v.mark({class:"cm-searchMatch cm-searchMatch-selected"}),nr=tt.fromClass(class{constructor(t){this.view=t,this.decorations=this.highlight(t.state.field(V))}update(t){let e=t.state.field(V);(e!=t.startState.field(V)||t.docChanged||t.selectionSet||t.viewportChanged)&&(this.decorations=this.highlight(e))}highlight({query:t,panel:e}){if(!e||!t.spec.valid)return v.none;let{view:n}=this,i=new Qt;for(let o=0,r=n.visibleRanges,s=r.length;or[o+1].from-500;)c=r[++o].to;t.highlight(n.state,l,c,(f,a)=>{let h=n.state.selection.ranges.some(u=>u.from==f&&u.to==a);i.add(f,a,h?tr:er)})}return i.finish()}},{decorations:t=>t.decorations});function ye(t){return e=>{let n=e.state.field(V,!1);return n&&n.query.spec.valid?t(e,n):Vn(e)}}const Be=ye((t,{query:e})=>{let{to:n}=t.state.selection.main,i=e.nextMatch(t.state,n,n);if(!i)return!1;let o=m.single(i.from,i.to),r=t.state.facet(se);return t.dispatch({selection:o,effects:[mt(t,i),r.scrollToMatch(o.main,t)],userEvent:"select.search"}),Un(t),!0}),Ie=ye((t,{query:e})=>{let{state:n}=t,{from:i}=n.selection.main,o=e.prevMatch(n,i,i);if(!o)return!1;let r=m.single(o.from,o.to),s=t.state.facet(se);return t.dispatch({selection:r,effects:[mt(t,o),s.scrollToMatch(r.main,t)],userEvent:"select.search"}),Un(t),!0}),ir=ye((t,{query:e})=>{let n=e.matchAll(t.state,1e3);return!n||!n.length?!1:(t.dispatch({selection:m.create(n.map(i=>m.range(i.from,i.to))),userEvent:"select.search.matches"}),!0)}),or=({state:t,dispatch:e})=>{let n=t.selection;if(n.ranges.length>1||n.main.empty)return!1;let{from:i,to:o}=n.main,r=[],s=0;for(let l=new ee(t.doc,t.sliceDoc(i,o));!l.next().done;){if(r.length>1e3)return!1;l.value.from==i&&(s=r.length),r.push(m.range(l.value.from,l.value.to))}return e(t.update({selection:m.create(r,s),userEvent:"select.search.matches"})),!0},It=ye((t,{query:e})=>{let{state:n}=t,{from:i,to:o}=n.selection.main;if(n.readOnly)return!1;let r=e.nextMatch(n,i,i);if(!r)return!1;let s=r,l=[],c,f,a=[];s.from==i&&s.to==o&&(f=n.toText(e.getReplacement(s)),l.push({from:s.from,to:s.to,insert:f}),s=e.nextMatch(n,s.from,s.to),a.push(k.announce.of(n.phrase("replaced match on line $",n.doc.lineAt(i).number)+".")));let h=t.state.changes(l);return s&&(c=m.single(s.from,s.to).map(h),a.push(mt(t,s)),a.push(n.facet(se).scrollToMatch(c.main,t))),t.dispatch({changes:h,selection:c,effects:a,userEvent:"input.replace"}),!0}),rr=ye((t,{query:e})=>{if(t.state.readOnly)return!1;let n=e.matchAll(t.state,1e9).map(o=>{let{from:r,to:s}=o;return{from:r,to:s,insert:e.getReplacement(o)}});if(!n.length)return!1;let i=t.state.phrase("replaced $ matches",n.length)+".";return t.dispatch({changes:n,effects:k.announce.of(i),userEvent:"input.replace.all"}),!0});function dt(t){return t.state.facet(se).createPanel(t)}function et(t,e){var n,i,o,r,s;let l=t.selection.main,c=l.empty||l.to>l.from+100?"":t.sliceDoc(l.from,l.to);if(e&&!c)return e;let f=t.facet(se);return new $n({search:((n=e?.literal)!==null&&n!==void 0?n:f.literal)?c:c.replace(/\n/g,"\\n"),caseSensitive:(i=e?.caseSensitive)!==null&&i!==void 0?i:f.caseSensitive,literal:(o=e?.literal)!==null&&o!==void 0?o:f.literal,regexp:(r=e?.regexp)!==null&&r!==void 0?r:f.regexp,wholeWord:(s=e?.wholeWord)!==null&&s!==void 0?s:f.wholeWord})}function qn(t){let e=ae(t,dt);return e&&e.dom.querySelector("[main-field]")}function Un(t){let e=qn(t);e&&e==t.root.activeElement&&e.select()}const Vn=t=>{let e=t.state.field(V,!1);if(e&&e.panel){let n=qn(t);if(n&&n!=t.root.activeElement){let i=et(t.state,e.query.spec);i.valid&&t.dispatch({effects:fe.of(i)}),n.focus(),n.select()}}else t.dispatch({effects:[ut.of(!0),e?fe.of(et(t.state,e.query.spec)):L.appendConfig.of(ar)]});return!0},zn=t=>{let e=t.state.field(V,!1);if(!e||!e.panel)return!1;let n=ae(t,dt);return n&&n.dom.contains(t.root.activeElement)&&t.focus(),t.dispatch({effects:ut.of(!1)}),!0},sr=[{key:"Mod-f",run:Vn,scope:"editor search-panel"},{key:"F3",run:Be,shift:Ie,scope:"editor search-panel",preventDefault:!0},{key:"Mod-g",run:Be,shift:Ie,scope:"editor search-panel",preventDefault:!0},{key:"Escape",run:zn,scope:"editor search-panel"},{key:"Mod-Shift-l",run:or},{key:"Mod-Alt-g",run:Wo},{key:"Mod-d",run:Qo,preventDefault:!0}];class lr{constructor(e){this.view=e;let n=this.query=e.state.field(V).query.spec;this.commit=this.commit.bind(this),this.searchField=x("input",{value:n.search,placeholder:E(e,"Find"),"aria-label":E(e,"Find"),class:"cm-textfield",name:"search",form:"","main-field":"true",onchange:this.commit,onkeyup:this.commit}),this.replaceField=x("input",{value:n.replace,placeholder:E(e,"Replace"),"aria-label":E(e,"Replace"),class:"cm-textfield",name:"replace",form:"",onchange:this.commit,onkeyup:this.commit}),this.caseField=x("input",{type:"checkbox",name:"case",form:"",checked:n.caseSensitive,onchange:this.commit}),this.reField=x("input",{type:"checkbox",name:"re",form:"",checked:n.regexp,onchange:this.commit}),this.wordField=x("input",{type:"checkbox",name:"word",form:"",checked:n.wholeWord,onchange:this.commit});function i(o,r,s){return x("button",{class:"cm-button",name:o,onclick:r,type:"button"},s)}this.dom=x("div",{onkeydown:o=>this.keydown(o),class:"cm-search"},[this.searchField,i("next",()=>Be(e),[E(e,"next")]),i("prev",()=>Ie(e),[E(e,"previous")]),i("select",()=>ir(e),[E(e,"all")]),x("label",null,[this.caseField,E(e,"match case")]),x("label",null,[this.reField,E(e,"regexp")]),x("label",null,[this.wordField,E(e,"by word")]),...e.state.readOnly?[]:[x("br"),this.replaceField,i("replace",()=>It(e),[E(e,"replace")]),i("replaceAll",()=>rr(e),[E(e,"replace all")])],x("button",{name:"close",onclick:()=>zn(e),"aria-label":E(e,"close"),type:"button"},["×"])])}commit(){let e=new $n({search:this.searchField.value,caseSensitive:this.caseField.checked,regexp:this.reField.checked,wholeWord:this.wordField.checked,replace:this.replaceField.value});e.eq(this.query)||(this.query=e,this.view.dispatch({effects:fe.of(e)}))}keydown(e){oi(this.view,e,"search-panel")?e.preventDefault():e.keyCode==13&&e.target==this.searchField?(e.preventDefault(),(e.shiftKey?Ie:Be)(this.view)):e.keyCode==13&&e.target==this.replaceField&&(e.preventDefault(),It(this.view))}update(e){for(let n of e.transactions)for(let i of n.effects)i.is(fe)&&!i.value.eq(this.query)&&this.setQuery(i.value)}setQuery(e){this.query=e,this.searchField.value=e.search,this.replaceField.value=e.replace,this.caseField.checked=e.caseSensitive,this.reField.checked=e.regexp,this.wordField.checked=e.wholeWord}mount(){this.searchField.select()}get pos(){return 80}get top(){return this.view.state.facet(se).top}}function E(t,e){return t.state.phrase(e)}const Se=30,ke=/[\s\.,:;?!]/;function mt(t,{from:e,to:n}){let i=t.state.doc.lineAt(e),o=t.state.doc.lineAt(n).to,r=Math.max(i.from,e-Se),s=Math.min(o,n+Se),l=t.state.sliceDoc(r,s);if(r!=i.from){for(let c=0;cl.length-Se;c--)if(!ke.test(l[c-1])&&ke.test(l[c])){l=l.slice(0,c);break}}return k.announce.of(`${t.state.phrase("current match")}. ${l} ${t.state.phrase("on line")} ${i.number}.`)}const cr=k.baseTheme({".cm-panel.cm-search":{padding:"2px 6px 4px",position:"relative","& [name=close]":{position:"absolute",top:"0",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",padding:0,margin:0},"& input, & button, & label":{margin:".2em .6em .2em 0"},"& input[type=checkbox]":{marginRight:".2em"},"& label":{fontSize:"80%",whiteSpace:"pre"}},"&light .cm-searchMatch":{backgroundColor:"#ffff0054"},"&dark .cm-searchMatch":{backgroundColor:"#00ffff8a"},"&light .cm-searchMatch-selected":{backgroundColor:"#ff6a0054"},"&dark .cm-searchMatch-selected":{backgroundColor:"#ff00ff8a"}}),ar=[V,st.low(nr),cr];class Hn{constructor(e,n,i,o){this.state=e,this.pos=n,this.explicit=i,this.view=o,this.abortListeners=[],this.abortOnDocChange=!1}tokenBefore(e){let n=oe(this.state).resolveInner(this.pos,-1);for(;n&&e.indexOf(n.name)<0;)n=n.parent;return n?{from:n.from,to:this.pos,text:this.state.sliceDoc(n.from,this.pos),type:n.type}:null}matchBefore(e){let n=this.state.doc.lineAt(this.pos),i=Math.max(n.from,this.pos-250),o=n.text.slice(i-n.from,this.pos-n.from),r=o.search(Kn(e,!1));return r<0?null:{from:i+r,to:this.pos,text:o.slice(r)}}get aborted(){return this.abortListeners==null}addEventListener(e,n,i){e=="abort"&&this.abortListeners&&(this.abortListeners.push(n),i&&i.onDocChange&&(this.abortOnDocChange=!0))}}function Rt(t){let e=Object.keys(t).join(""),n=/\w/.test(e);return n&&(e=e.replace(/\w/g,"")),`[${n?"\\w":""}${e.replace(/[^\w\s]/g,"\\$&")}]`}function fr(t){let e=Object.create(null),n=Object.create(null);for(let{label:o}of t){e[o[0]]=!0;for(let r=1;rtypeof o=="string"?{label:o}:o),[n,i]=e.every(o=>/^\w+$/.test(o.label))?[/\w*$/,/\w+$/]:fr(e);return o=>{let r=o.matchBefore(i);return r||o.explicit?{from:r?r.from:o.pos,options:e,validFor:n}:null}}class Et{constructor(e,n,i,o){this.completion=e,this.source=n,this.match=i,this.score=o}}function G(t){return t.selection.main.from}function Kn(t,e){var n;let{source:i}=t,o=e&&i[0]!="^",r=i[i.length-1]!="$";return!o&&!r?t:new RegExp(`${o?"^":""}(?:${i})${r?"$":""}`,(n=t.flags)!==null&&n!==void 0?n:t.ignoreCase?"i":"")}const Gn=rt.define();function ur(t,e,n,i){let{main:o}=t.selection,r=n-o.from,s=i-o.from;return{...t.changeByRange(l=>{if(l!=o&&n!=i&&t.sliceDoc(l.from+r,l.from+s)!=t.sliceDoc(n,i))return{range:l};let c=t.toText(e);return{changes:{from:l.from+r,to:i==o.from?l.to:l.from+s,insert:c},range:m.cursor(l.from+r+c.length)}}),scrollIntoView:!0,userEvent:"input.complete"}}const Tt=new WeakMap;function dr(t){if(!Array.isArray(t))return t;let e=Tt.get(t);return e||Tt.set(t,e=hr(t)),e}const Re=L.define(),he=L.define();class mr{constructor(e){this.pattern=e,this.chars=[],this.folded=[],this.any=[],this.precise=[],this.byWord=[],this.score=0,this.matched=[];for(let n=0;n=48&&M<=57||M>=97&&M<=122?2:M>=65&&M<=90?1:0:(xe=lt(M))!=xe.toLowerCase()?1:xe!=xe.toUpperCase()?2:0;(!S||$e==1&&b||C==0&&$e!=0)&&(n[h]==M||i[h]==M&&(u=!0)?s[h++]=S:s.length&&(R=!1)),C=$e,S+=U(M)}return h==c&&s[0]==0&&R?this.result(-100+(u?-200:0),s,e):d==c&&p==0?this.ret(-200-e.length+(g==e.length?0:-100),[0,g]):l>-1?this.ret(-700-e.length,[l,l+this.pattern.length]):d==c?this.ret(-900-e.length,[p,g]):h==c?this.result(-100+(u?-200:0)+-700+(R?0:-1100),s,e):n.length==2?null:this.result((o[0]?-700:0)+-200+-1100,o,e)}result(e,n,i){let o=[],r=0;for(let s of n){let l=s+(this.astral?U(O(i,s)):1);r&&o[r-1]==s?o[r-1]=l:(o[r++]=s,o[r++]=l)}return this.ret(e-i.length,o)}}class pr{constructor(e){this.pattern=e,this.matched=[],this.score=0,this.folded=e.toLowerCase()}match(e){if(e.length!1,activateOnTypingDelay:100,selectOnOpen:!0,override:null,closeOnBlur:!0,maxRenderedOptions:100,defaultKeymap:!0,tooltipClass:()=>"",optionClass:()=>"",aboveCursor:!1,icons:!0,addToOptions:[],positionInfo:gr,filterStrict:!1,compareCompletions:(e,n)=>(e.sortText||e.label).localeCompare(n.sortText||n.label),interactionDelay:75,updateSyncTime:100},{defaultKeymap:(e,n)=>e&&n,closeOnBlur:(e,n)=>e&&n,icons:(e,n)=>e&&n,tooltipClass:(e,n)=>i=>Ot(e(i),n(i)),optionClass:(e,n)=>i=>Ot(e(i),n(i)),addToOptions:(e,n)=>e.concat(n),filterStrict:(e,n)=>e||n})}});function Ot(t,e){return t?e?t+" "+e:t:e}function gr(t,e,n,i,o,r){let s=t.textDirection==zt.RTL,l=s,c=!1,f="top",a,h,u=e.left-o.left,d=o.right-e.right,p=i.right-i.left,g=i.bottom-i.top;if(l&&u=g||S>e.top?a=n.bottom-e.top:(f="bottom",a=e.bottom-n.top)}let b=(e.bottom-e.top)/r.offsetHeight,R=(e.right-e.left)/r.offsetWidth;return{style:`${f}: ${a/b}px; max-width: ${h/R}px`,class:"cm-completionInfo-"+(c?s?"left-narrow":"right-narrow":l?"left":"right")}}function yr(t){let e=t.addToOptions.slice();return t.icons&&e.push({render(n){let i=document.createElement("div");return i.classList.add("cm-completionIcon"),n.type&&i.classList.add(...n.type.split(/\s+/g).map(o=>"cm-completionIcon-"+o)),i.setAttribute("aria-hidden","true"),i},position:20}),e.push({render(n,i,o,r){let s=document.createElement("span");s.className="cm-completionLabel";let l=n.displayLabel||n.label,c=0;for(let f=0;fc&&s.appendChild(document.createTextNode(l.slice(c,a)));let u=s.appendChild(document.createElement("span"));u.appendChild(document.createTextNode(l.slice(a,h))),u.className="cm-completionMatchedText",c=h}return cn.position-i.position).map(n=>n.render)}function ze(t,e,n){if(t<=n)return{from:0,to:t};if(e<0&&(e=0),e<=t>>1){let o=Math.floor(e/n);return{from:o*n,to:(o+1)*n}}let i=Math.floor((t-e)/n);return{from:t-(i+1)*n,to:t-i*n}}class xr{constructor(e,n,i){this.view=e,this.stateField=n,this.applyCompletion=i,this.info=null,this.infoDestroy=null,this.placeInfoReq={read:()=>this.measureInfo(),write:c=>this.placeInfo(c),key:this},this.space=null,this.currentClass="";let o=e.state.field(n),{options:r,selected:s}=o.open,l=e.state.facet(A);this.optionContent=yr(l),this.optionClass=l.optionClass,this.tooltipClass=l.tooltipClass,this.range=ze(r.length,s,l.maxRenderedOptions),this.dom=document.createElement("div"),this.dom.className="cm-tooltip-autocomplete",this.updateTooltipClass(e.state),this.dom.addEventListener("mousedown",c=>{let{options:f}=e.state.field(n).open;for(let a=c.target,h;a&&a!=this.dom;a=a.parentNode)if(a.nodeName=="LI"&&(h=/-(\d+)$/.exec(a.id))&&+h[1]{let f=e.state.field(this.stateField,!1);f&&f.tooltip&&e.state.facet(A).closeOnBlur&&c.relatedTarget!=e.contentDOM&&e.dispatch({effects:he.of(null)})}),this.showOptions(r,o.id)}mount(){this.updateSel()}showOptions(e,n){this.list&&this.list.remove(),this.list=this.dom.appendChild(this.createListBox(e,n,this.range)),this.list.addEventListener("scroll",()=>{this.info&&this.view.requestMeasure(this.placeInfoReq)})}update(e){var n;let i=e.state.field(this.stateField),o=e.startState.field(this.stateField);if(this.updateTooltipClass(e.state),i!=o){let{options:r,selected:s,disabled:l}=i.open;(!o.open||o.open.options!=r)&&(this.range=ze(r.length,s,e.state.facet(A).maxRenderedOptions),this.showOptions(r,i.id)),this.updateSel(),l!=((n=o.open)===null||n===void 0?void 0:n.disabled)&&this.dom.classList.toggle("cm-tooltip-autocomplete-disabled",!!l)}}updateTooltipClass(e){let n=this.tooltipClass(e);if(n!=this.currentClass){for(let i of this.currentClass.split(" "))i&&this.dom.classList.remove(i);for(let i of n.split(" "))i&&this.dom.classList.add(i);this.currentClass=n}}positioned(e){this.space=e,this.info&&this.view.requestMeasure(this.placeInfoReq)}updateSel(){let e=this.view.state.field(this.stateField),n=e.open;(n.selected>-1&&n.selected=this.range.to)&&(this.range=ze(n.options.length,n.selected,this.view.state.facet(A).maxRenderedOptions),this.showOptions(n.options,e.id));let i=this.updateSelectedOption(n.selected);if(i){this.destroyInfo();let{completion:o}=n.options[n.selected],{info:r}=o;if(!r)return;let s=typeof r=="string"?document.createTextNode(r):r(o);if(!s)return;"then"in s?s.then(l=>{l&&this.view.state.field(this.stateField,!1)==e&&this.addInfoPane(l,o)}).catch(l=>Ge(this.view.state,l,"completion info")):(this.addInfoPane(s,o),i.setAttribute("aria-describedby",this.info.id))}}addInfoPane(e,n){this.destroyInfo();let i=this.info=document.createElement("div");if(i.className="cm-tooltip cm-completionInfo",i.id="cm-completionInfo-"+Math.floor(Math.random()*65535).toString(16),e.nodeType!=null)i.appendChild(e),this.infoDestroy=null;else{let{dom:o,destroy:r}=e;i.appendChild(o),this.infoDestroy=r||null}this.dom.appendChild(i),this.view.requestMeasure(this.placeInfoReq)}updateSelectedOption(e){let n=null;for(let i=this.list.firstChild,o=this.range.from;i;i=i.nextSibling,o++)i.nodeName!="LI"||!i.id?o--:o==e?i.hasAttribute("aria-selected")||(i.setAttribute("aria-selected","true"),n=i):i.hasAttribute("aria-selected")&&(i.removeAttribute("aria-selected"),i.removeAttribute("aria-describedby"));return n&&Sr(this.list,n),n}measureInfo(){let e=this.dom.querySelector("[aria-selected]");if(!e||!this.info)return null;let n=this.dom.getBoundingClientRect(),i=this.info.getBoundingClientRect(),o=e.getBoundingClientRect(),r=this.space;if(!r){let s=this.dom.ownerDocument.documentElement;r={left:0,top:0,right:s.clientWidth,bottom:s.clientHeight}}return o.top>Math.min(r.bottom,n.bottom)-10||o.bottom{s.target==o&&s.preventDefault()});let r=null;for(let s=i.from;si.from||i.from==0))if(r=u,typeof f!="string"&&f.header)o.appendChild(f.header(f));else{let d=o.appendChild(document.createElement("completion-section"));d.textContent=u}}const a=o.appendChild(document.createElement("li"));a.id=n+"-"+s,a.setAttribute("role","option");let h=this.optionClass(l);h&&(a.className=h);for(let u of this.optionContent){let d=u(l,this.view.state,this.view,c);d&&a.appendChild(d)}}return i.from&&o.classList.add("cm-completionListIncompleteTop"),i.tonew xr(n,t,e)}function Sr(t,e){let n=t.getBoundingClientRect(),i=e.getBoundingClientRect(),o=n.height/t.offsetHeight;i.topn.bottom&&(t.scrollTop+=(i.bottom-n.bottom)/o)}function Pt(t){return(t.boost||0)*100+(t.apply?10:0)+(t.info?5:0)+(t.type?1:0)}function kr(t,e){let n=[],i=null,o=null,r=a=>{n.push(a);let{section:h}=a.completion;if(h){i||(i=[]);let u=typeof h=="string"?h:h.name;i.some(d=>d.name==u)||i.push(typeof h=="string"?{name:u}:h)}},s=e.facet(A);for(let a of t)if(a.hasResult()){let h=a.result.getMatch;if(a.result.filter===!1)for(let u of a.result.options)r(new Et(u,a.source,h?h(u):[],1e9-n.length));else{let u=e.sliceDoc(a.from,a.to),d,p=s.filterStrict?new pr(u):new mr(u);for(let g of a.result.options)if(d=p.match(g.label)){let b=g.displayLabel?h?h(g,d.matched):[]:d.matched,R=d.score+(g.boost||0);if(r(new Et(g,a.source,b,R)),typeof g.section=="object"&&g.section.rank==="dynamic"){let{name:S}=g.section;o||(o=Object.create(null)),o[S]=Math.max(R,o[S]||-1e9)}}}}if(i){let a=Object.create(null),h=0,u=(d,p)=>(d.rank==="dynamic"&&p.rank==="dynamic"?o[p.name]-o[d.name]:0)||(typeof d.rank=="number"?d.rank:1e9)-(typeof p.rank=="number"?p.rank:1e9)||(d.nameu.score-h.score||f(h.completion,u.completion))){let h=a.completion;!c||c.label!=h.label||c.detail!=h.detail||c.type!=null&&h.type!=null&&c.type!=h.type||c.apply!=h.apply||c.boost!=h.boost?l.push(a):Pt(a.completion)>Pt(c)&&(l[l.length-1]=a),c=a.completion}return l}class Y{constructor(e,n,i,o,r,s){this.options=e,this.attrs=n,this.tooltip=i,this.timestamp=o,this.selected=r,this.disabled=s}setSelected(e,n){return e==this.selected||e>=this.options.length?this:new Y(this.options,Ft(n,e),this.tooltip,this.timestamp,e,this.disabled)}static build(e,n,i,o,r,s){if(o&&!s&&e.some(f=>f.isPending))return o.setDisabled();let l=kr(e,n);if(!l.length)return o&&e.some(f=>f.isPending)?o.setDisabled():null;let c=n.facet(A).selectOnOpen?0:-1;if(o&&o.selected!=c&&o.selected!=-1){let f=o.options[o.selected].completion;for(let a=0;aa.hasResult()?Math.min(f,a.from):f,1e8),create:Dr,above:r.aboveCursor},o?o.timestamp:Date.now(),c,!1)}map(e){return new Y(this.options,this.attrs,{...this.tooltip,pos:e.mapPos(this.tooltip.pos)},this.timestamp,this.selected,this.disabled)}setDisabled(){return new Y(this.options,this.attrs,this.tooltip,this.timestamp,this.selected,!0)}}class Ee{constructor(e,n,i){this.active=e,this.id=n,this.open=i}static start(){return new Ee(Mr,"cm-ac-"+Math.floor(Math.random()*2e6).toString(36),null)}update(e){let{state:n}=e,i=n.facet(A),r=(i.override||n.languageDataAt("autocomplete",G(n)).map(dr)).map(c=>(this.active.find(a=>a.source==c)||new F(c,this.active.some(a=>a.state!=0)?1:0)).update(e,i));r.length==this.active.length&&r.every((c,f)=>c==this.active[f])&&(r=this.active);let s=this.open,l=e.effects.some(c=>c.is(pt));s&&e.docChanged&&(s=s.map(e.changes)),e.selection||r.some(c=>c.hasResult()&&e.changes.touchesRange(c.from,c.to))||!Cr(r,this.active)||l?s=Y.build(r,n,this.id,s,i,l):s&&s.disabled&&!r.some(c=>c.isPending)&&(s=null),!s&&r.every(c=>!c.isPending)&&r.some(c=>c.hasResult())&&(r=r.map(c=>c.hasResult()?new F(c.source,0):c));for(let c of e.effects)c.is(jn)&&(s=s&&s.setSelected(c.value,this.id));return r==this.active&&s==this.open?this:new Ee(r,this.id,s)}get tooltip(){return this.open?this.open.tooltip:null}get attrs(){return this.open?this.open.attrs:this.active.length?vr:Ar}}function Cr(t,e){if(t==e)return!0;for(let n=0,i=0;;){for(;n-1&&(n["aria-activedescendant"]=t+"-"+e),n}const Mr=[];function Jn(t,e){if(t.isUserEvent("input.complete")){let i=t.annotation(Gn);if(i&&e.activateOnCompletion(i))return 12}let n=t.isUserEvent("input.type");return n&&e.activateOnTyping?5:n?1:t.isUserEvent("delete.backward")?2:t.selection?8:t.docChanged?16:0}class F{constructor(e,n,i=!1){this.source=e,this.state=n,this.explicit=i}hasResult(){return!1}get isPending(){return this.state==1}update(e,n){let i=Jn(e,n),o=this;(i&8||i&16&&this.touches(e))&&(o=new F(o.source,0)),i&4&&o.state==0&&(o=new F(this.source,1)),o=o.updateFor(e,i);for(let r of e.effects)if(r.is(Re))o=new F(o.source,1,r.value);else if(r.is(he))o=new F(o.source,0);else if(r.is(pt))for(let s of r.value)s.source==o.source&&(o=s);return o}updateFor(e,n){return this.map(e.changes)}map(e){return this}touches(e){return e.changes.touchesRange(G(e.state))}}class Z extends F{constructor(e,n,i,o,r,s){super(e,3,n),this.limit=i,this.result=o,this.from=r,this.to=s}hasResult(){return!0}updateFor(e,n){var i;if(!(n&3))return this.map(e.changes);let o=this.result;o.map&&!e.changes.empty&&(o=o.map(o,e.changes));let r=e.changes.mapPos(this.from),s=e.changes.mapPos(this.to,1),l=G(e.state);if(l>s||!o||n&2&&(G(e.startState)==this.from||ln.map(e))}}),jn=L.define(),B=ne.define({create(){return Ee.start()},update(t,e){return t.update(e)},provide:t=>[ri.from(t,e=>e.tooltip),k.contentAttributes.from(t,e=>e.attrs)]});function gt(t,e){const n=e.completion.apply||e.completion.label;let i=t.state.field(B).active.find(o=>o.source==e.source);return i instanceof Z?(typeof n=="string"?t.dispatch({...ur(t.state,n,i.from,i.to),annotations:Gn.of(e.completion)}):n(t,e.completion,i.from,i.to),!0):!1}const Dr=br(B,gt);function Ce(t,e="option"){return n=>{let i=n.state.field(B,!1);if(!i||!i.open||i.open.disabled||Date.now()-i.open.timestamp-1?i.open.selected+o*(t?1:-1):t?0:s-1;return l<0?l=e=="page"?0:s-1:l>=s&&(l=e=="page"?s-1:0),n.dispatch({effects:jn.of(l)}),!0}}const wr=t=>{let e=t.state.field(B,!1);return t.state.readOnly||!e||!e.open||e.open.selected<0||e.open.disabled||Date.now()-e.open.timestampt.state.field(B,!1)?(t.dispatch({effects:Re.of(!0)}),!0):!1,Br=t=>{let e=t.state.field(B,!1);return!e||!e.active.some(n=>n.state!=0)?!1:(t.dispatch({effects:he.of(null)}),!0)};class Ir{constructor(e,n){this.active=e,this.context=n,this.time=Date.now(),this.updates=[],this.done=void 0}}const Rr=50,Er=1e3,Tr=tt.fromClass(class{constructor(t){this.view=t,this.debounceUpdate=-1,this.running=[],this.debounceAccept=-1,this.pendingStart=!1,this.composing=0;for(let e of t.state.field(B).active)e.isPending&&this.startQuery(e)}update(t){let e=t.state.field(B),n=t.state.facet(A);if(!t.selectionSet&&!t.docChanged&&t.startState.field(B)==e)return;let i=t.transactions.some(r=>{let s=Jn(r,n);return s&8||(r.selection||r.docChanged)&&!(s&3)});for(let r=0;rRr&&Date.now()-s.time>Er){for(let l of s.context.abortListeners)try{l()}catch(c){Ge(this.view.state,c)}s.context.abortListeners=null,this.running.splice(r--,1)}else s.updates.push(...t.transactions)}this.debounceUpdate>-1&&clearTimeout(this.debounceUpdate),t.transactions.some(r=>r.effects.some(s=>s.is(Re)))&&(this.pendingStart=!0);let o=this.pendingStart?50:n.activateOnTypingDelay;if(this.debounceUpdate=e.active.some(r=>r.isPending&&!this.running.some(s=>s.active.source==r.source))?setTimeout(()=>this.startUpdate(),o):-1,this.composing!=0)for(let r of t.transactions)r.isUserEvent("input.type")?this.composing=2:this.composing==2&&r.selection&&(this.composing=3)}startUpdate(){this.debounceUpdate=-1,this.pendingStart=!1;let{state:t}=this.view,e=t.field(B);for(let n of e.active)n.isPending&&!this.running.some(i=>i.active.source==n.source)&&this.startQuery(n);this.running.length&&e.open&&e.open.disabled&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(A).updateSyncTime))}startQuery(t){let{state:e}=this.view,n=G(e),i=new Hn(e,n,t.explicit,this.view),o=new Ir(t,i);this.running.push(o),Promise.resolve(t.source(i)).then(r=>{o.context.aborted||(o.done=r||null,this.scheduleAccept())},r=>{this.view.dispatch({effects:he.of(null)}),Ge(this.view.state,r)})}scheduleAccept(){this.running.every(t=>t.done!==void 0)?this.accept():this.debounceAccept<0&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(A).updateSyncTime))}accept(){var t;this.debounceAccept>-1&&clearTimeout(this.debounceAccept),this.debounceAccept=-1;let e=[],n=this.view.state.facet(A),i=this.view.state.field(B);for(let o=0;ol.source==r.active.source);if(s&&s.isPending)if(r.done==null){let l=new F(r.active.source,0);for(let c of r.updates)l=l.update(c,n);l.isPending||e.push(l)}else this.startQuery(s)}(e.length||i.open&&i.open.disabled)&&this.view.dispatch({effects:pt.of(e)})}},{eventHandlers:{blur(t){let e=this.view.state.field(B,!1);if(e&&e.tooltip&&this.view.state.facet(A).closeOnBlur){let n=e.open&&Ht(this.view,e.open.tooltip);(!n||!n.dom.contains(t.relatedTarget))&&setTimeout(()=>this.view.dispatch({effects:he.of(null)}),10)}},compositionstart(){this.composing=1},compositionend(){this.composing==3&&setTimeout(()=>this.view.dispatch({effects:Re.of(!1)}),20),this.composing=0}}}),Or=typeof navigator=="object"&&/Win/.test(navigator.platform),Pr=st.highest(k.domEventHandlers({keydown(t,e){let n=e.state.field(B,!1);if(!n||!n.open||n.open.disabled||n.open.selected<0||t.key.length>1||t.ctrlKey&&!(Or&&t.altKey)||t.metaKey)return!1;let i=n.open.options[n.open.selected],o=n.active.find(s=>s.source==i.source),r=i.completion.commitCharacters||o.result.commitCharacters;return r&&r.indexOf(t.key)>-1&>(e,i),!1}})),Fr=k.baseTheme({".cm-tooltip.cm-tooltip-autocomplete":{"& > ul":{fontFamily:"monospace",whiteSpace:"nowrap",overflow:"hidden auto",maxWidth_fallback:"700px",maxWidth:"min(700px, 95vw)",minWidth:"250px",maxHeight:"10em",height:"100%",listStyle:"none",margin:0,padding:0,"& > li, & > completion-section":{padding:"1px 3px",lineHeight:1.2},"& > li":{overflowX:"hidden",textOverflow:"ellipsis",cursor:"pointer"},"& > completion-section":{display:"list-item",borderBottom:"1px solid silver",paddingLeft:"0.5em",opacity:.7}}},"&light .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#17c",color:"white"},"&light .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#777"},"&dark .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#347",color:"white"},"&dark .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#444"},".cm-completionListIncompleteTop:before, .cm-completionListIncompleteBottom:after":{content:'"···"',opacity:.5,display:"block",textAlign:"center"},".cm-tooltip.cm-completionInfo":{position:"absolute",padding:"3px 9px",width:"max-content",maxWidth:"400px",boxSizing:"border-box",whiteSpace:"pre-line"},".cm-completionInfo.cm-completionInfo-left":{right:"100%"},".cm-completionInfo.cm-completionInfo-right":{left:"100%"},".cm-completionInfo.cm-completionInfo-left-narrow":{right:"30px"},".cm-completionInfo.cm-completionInfo-right-narrow":{left:"30px"},"&light .cm-snippetField":{backgroundColor:"#00000022"},"&dark .cm-snippetField":{backgroundColor:"#ffffff22"},".cm-snippetFieldPosition":{verticalAlign:"text-top",width:0,height:"1.15em",display:"inline-block",margin:"0 -0.7px -.7em",borderLeft:"1.4px dotted #888"},".cm-completionMatchedText":{textDecoration:"underline"},".cm-completionDetail":{marginLeft:"0.5em",fontStyle:"italic"},".cm-completionIcon":{fontSize:"90%",width:".8em",display:"inline-block",textAlign:"center",paddingRight:".6em",opacity:"0.6",boxSizing:"content-box"},".cm-completionIcon-function, .cm-completionIcon-method":{"&:after":{content:"'ƒ'"}},".cm-completionIcon-class":{"&:after":{content:"'○'"}},".cm-completionIcon-interface":{"&:after":{content:"'◌'"}},".cm-completionIcon-variable":{"&:after":{content:"'𝑥'"}},".cm-completionIcon-constant":{"&:after":{content:"'𝐶'"}},".cm-completionIcon-type":{"&:after":{content:"'𝑡'"}},".cm-completionIcon-enum":{"&:after":{content:"'∪'"}},".cm-completionIcon-property":{"&:after":{content:"'□'"}},".cm-completionIcon-keyword":{"&:after":{content:"'🔑︎'"}},".cm-completionIcon-namespace":{"&:after":{content:"'▢'"}},".cm-completionIcon-text":{"&:after":{content:"'abc'",fontSize:"50%",verticalAlign:"middle"}}}),ue={brackets:["(","[","{","'",'"'],before:")]}:;>",stringPrefixes:[]},K=L.define({map(t,e){let n=e.mapPos(t,-1,yi.TrackAfter);return n??void 0}}),yt=new class extends xi{};yt.startSide=1;yt.endSide=-1;const Qn=ne.define({create(){return gi.empty},update(t,e){if(t=t.map(e.changes),e.selection){let n=e.state.doc.lineAt(e.selection.main.head);t=t.update({filter:i=>i>=n.from&&i<=n.to})}for(let n of e.effects)n.is(K)&&(t=t.update({add:[yt.range(n.value,n.value+1)]}));return t}});function Wr(){return[Nr,Qn]}const Ke="()[]{}<>«»»«[]{}";function _n(t){for(let e=0;e{if(($r?t.composing:t.compositionStarted)||t.state.readOnly)return!1;let o=t.state.selection.main;if(i.length>2||i.length==2&&U(O(i,0))==1||e!=o.from||n!=o.to)return!1;let r=Vr(t.state,i);return r?(t.dispatch(r),!0):!1}),qr=({state:t,dispatch:e})=>{if(t.readOnly)return!1;let i=Yn(t,t.selection.main.head).brackets||ue.brackets,o=null,r=t.changeByRange(s=>{if(s.empty){let l=zr(t.doc,s.head);for(let c of i)if(c==l&&We(t.doc,s.head)==_n(O(c,0)))return{changes:{from:s.head-c.length,to:s.head+c.length},range:m.cursor(s.head-c.length)}}return{range:o=s}});return o||e(t.update(r,{scrollIntoView:!0,userEvent:"delete.backward"})),!o},Ur=[{key:"Backspace",run:qr}];function Vr(t,e){let n=Yn(t,t.selection.main.head),i=n.brackets||ue.brackets;for(let o of i){let r=_n(O(o,0));if(e==o)return r==o?Gr(t,o,i.indexOf(o+o+o)>-1,n):Hr(t,o,r,n.before||ue.before);if(e==r&&Xn(t,t.selection.main.from))return Kr(t,o,r)}return null}function Xn(t,e){let n=!1;return t.field(Qn).between(0,t.doc.length,i=>{i==e&&(n=!0)}),n}function We(t,e){let n=t.sliceString(e,e+2);return n.slice(0,U(O(n,0)))}function zr(t,e){let n=t.sliceString(e-2,e);return U(O(n,0))==n.length?n:n.slice(1)}function Hr(t,e,n,i){let o=null,r=t.changeByRange(s=>{if(!s.empty)return{changes:[{insert:e,from:s.from},{insert:n,from:s.to}],effects:K.of(s.to+e.length),range:m.range(s.anchor+e.length,s.head+e.length)};let l=We(t.doc,s.head);return!l||/\s/.test(l)||i.indexOf(l)>-1?{changes:{insert:e+n,from:s.head},effects:K.of(s.head+e.length),range:m.cursor(s.head+e.length)}:{range:o=s}});return o?null:t.update(r,{scrollIntoView:!0,userEvent:"input.type"})}function Kr(t,e,n){let i=null,o=t.changeByRange(r=>r.empty&&We(t.doc,r.head)==n?{changes:{from:r.head,to:r.head+n.length,insert:n},range:m.cursor(r.head+n.length)}:i={range:r});return i?null:t.update(o,{scrollIntoView:!0,userEvent:"input.type"})}function Gr(t,e,n,i){let o=i.stringPrefixes||ue.stringPrefixes,r=null,s=t.changeByRange(l=>{if(!l.empty)return{changes:[{insert:e,from:l.from},{insert:e,from:l.to}],effects:K.of(l.to+e.length),range:m.range(l.anchor+e.length,l.head+e.length)};let c=l.head,f=We(t.doc,c),a;if(f==e){if(Wt(t,c))return{changes:{insert:e+e,from:c},effects:K.of(c+e.length),range:m.cursor(c+e.length)};if(Xn(t,c)){let u=n&&t.sliceDoc(c,c+e.length*3)==e+e+e?e+e+e:e;return{changes:{from:c,to:c+u.length,insert:u},range:m.cursor(c+u.length)}}}else{if(n&&t.sliceDoc(c-2*e.length,c)==e+e&&(a=$t(t,c-2*e.length,o))>-1&&Wt(t,a))return{changes:{insert:e+e+e+e,from:c},effects:K.of(c+e.length),range:m.cursor(c+e.length)};if(t.charCategorizer(c)(f)!=w.Word&&$t(t,c,o)>-1&&!Jr(t,c,e,o))return{changes:{insert:e+e,from:c},effects:K.of(c+e.length),range:m.cursor(c+e.length)}}return{range:r=l}});return r?null:t.update(s,{scrollIntoView:!0,userEvent:"input.type"})}function Wt(t,e){let n=oe(t).resolveInner(e+1);return n.parent&&n.from==e}function Jr(t,e,n,i){let o=oe(t).resolveInner(e,-1),r=i.reduce((s,l)=>Math.max(s,l.length),0);for(let s=0;s<5;s++){let l=t.sliceDoc(o.from,Math.min(o.to,o.from+n.length+r)),c=l.indexOf(n);if(!c||c>-1&&i.indexOf(l.slice(0,c))>-1){let a=o.firstChild;for(;a&&a.from==o.from&&a.to-a.from>n.length+c;){if(t.sliceDoc(a.to-n.length,a.to)==n)return!1;a=a.firstChild}return!0}let f=o.to==e&&o.parent;if(!f)break;o=f}return!1}function $t(t,e,n){let i=t.charCategorizer(e);if(i(t.sliceDoc(e-1,e))!=w.Word)return e;for(let o of n){let r=e-o.length;if(t.sliceDoc(r,e)==o&&i(t.sliceDoc(r-1,r))!=w.Word)return r}return-1}function jr(t={}){return[Pr,B,A.of(t),Tr,Qr,Fr]}const Zn=[{key:"Ctrl-Space",run:He},{mac:"Alt-`",run:He},{mac:"Alt-i",run:He},{key:"Escape",run:Br},{key:"ArrowDown",run:Ce(!0)},{key:"ArrowUp",run:Ce(!1)},{key:"PageDown",run:Ce(!0,"page")},{key:"PageUp",run:Ce(!1,"page")},{key:"Enter",run:wr}],Qr=st.highest(it.computeN([A],t=>t.facet(A).defaultKeymap?[Zn]:[]));class Nt{constructor(e,n,i){this.from=e,this.to=n,this.diagnostic=i}}class H{constructor(e,n,i){this.diagnostics=e,this.panel=n,this.selected=i}static init(e,n,i){let o=i.facet(de).markerFilter;o&&(e=o(e,i));let r=e.slice().sort((d,p)=>d.from-p.from||d.to-p.to),s=new Qt,l=[],c=0,f=i.doc.iter(),a=0,h=i.doc.length;for(let d=0;;){let p=d==r.length?null:r[d];if(!p&&!l.length)break;let g,b;if(l.length)g=c,b=l.reduce((y,C)=>Math.min(y,C.to),p&&p.from>g?p.from:1e8);else{if(g=p.from,g>h)break;b=p.to,l.push(p),d++}for(;dy.from||y.to==g))l.push(y),d++,b=Math.min(y.to,b);else{b=Math.min(y.from,b);break}}b=Math.min(b,h);let R=!1;if(l.some(y=>y.from==g&&(y.to==b||b==h))&&(R=g==b,!R&&b-g<10)){let y=g-(a+f.value.length);y>0&&(f.next(y),a=g);for(let C=g;;){if(C>=b){R=!0;break}if(!f.lineBreak&&a+f.value.length>C)break;C=a+f.value.length,a+=f.value.length,f.next()}}let S=cs(l);if(R)s.add(g,g,v.widget({widget:new os(S),diagnostics:l.slice()}));else{let y=l.reduce((C,M)=>M.markClass?C+" "+M.markClass:C,"");s.add(g,b,v.mark({class:"cm-lintRange cm-lintRange-"+S+y,diagnostics:l.slice(),inclusiveEnd:l.some(C=>C.to>b)}))}if(c=b,c==h)break;for(let y=0;y{if(!(e&&s.diagnostics.indexOf(e)<0))if(!i)i=new Nt(o,r,e||s.diagnostics[0]);else{if(s.diagnostics.indexOf(i.diagnostic)<0)return!1;i=new Nt(i.from,r,i.diagnostic)}}),i}function _r(t,e){let n=e.pos,i=e.end||n,o=t.state.facet(de).hideOn(t,n,i);if(o!=null)return o;let r=t.startState.doc.lineAt(e.pos);return!!(t.effects.some(s=>s.is(ei))||t.changes.touchesRange(r.from,Math.max(r.to,i)))}function Yr(t,e){return t.field(T,!1)?e:e.concat(L.appendConfig.of(as))}const ei=L.define(),xt=L.define(),ti=L.define(),T=ne.define({create(){return new H(v.none,null,null)},update(t,e){if(e.docChanged&&t.diagnostics.size){let n=t.diagnostics.map(e.changes),i=null,o=t.panel;if(t.selected){let r=e.changes.mapPos(t.selected.from,1);i=te(n,t.selected.diagnostic,r)||te(n,null,r)}!n.size&&o&&e.state.facet(de).autoPanel&&(o=null),t=new H(n,o,i)}for(let n of e.effects)if(n.is(ei)){let i=e.state.facet(de).autoPanel?n.value.length?me.open:null:t.panel;t=H.init(n.value,i,e.state)}else n.is(xt)?t=new H(t.diagnostics,n.value?me.open:null,t.selected):n.is(ti)&&(t=new H(t.diagnostics,t.panel,n.value));return t},provide:t=>[nt.from(t,e=>e.panel),k.decorations.from(t,e=>e.diagnostics)]}),Xr=v.mark({class:"cm-lintRange cm-lintRange-active"});function Zr(t,e,n){let{diagnostics:i}=t.state.field(T),o,r=-1,s=-1;i.between(e-(n<0?1:0),e+(n>0?1:0),(c,f,{spec:a})=>{if(e>=c&&e<=f&&(c==f||(e>c||n>0)&&(eii(t,n,!1)))}const ts=t=>{let e=t.state.field(T,!1);(!e||!e.panel)&&t.dispatch({effects:Yr(t.state,[xt.of(!0)])});let n=ae(t,me.open);return n&&n.dom.querySelector(".cm-panel-lint ul").focus(),!0},qt=t=>{let e=t.state.field(T,!1);return!e||!e.panel?!1:(t.dispatch({effects:xt.of(!1)}),!0)},ns=t=>{let e=t.state.field(T,!1);if(!e)return!1;let n=t.state.selection.main,i=e.diagnostics.iter(n.to+1);return!i.value&&(i=e.diagnostics.iter(0),!i.value||i.from==n.from&&i.to==n.to)?!1:(t.dispatch({selection:{anchor:i.from,head:i.to},scrollIntoView:!0}),!0)},is=[{key:"Mod-Shift-m",run:ts,preventDefault:!0},{key:"F8",run:ns}],de=ie.define({combine(t){return{sources:t.map(e=>e.source).filter(e=>e!=null),...pe(t.map(e=>e.config),{delay:750,markerFilter:null,tooltipFilter:null,needsRefresh:null,hideOn:()=>null},{delay:Math.max,markerFilter:Ut,tooltipFilter:Ut,needsRefresh:(e,n)=>e?n?i=>e(i)||n(i):e:n,hideOn:(e,n)=>e?n?(i,o,r)=>e(i,o,r)||n(i,o,r):e:n,autoPanel:(e,n)=>e||n})}}});function Ut(t,e){return t?e?(n,i)=>e(t(n,i),i):t:e}function ni(t){let e=[];if(t)e:for(let{name:n}of t){for(let i=0;ir.toLowerCase()==o.toLowerCase())){e.push(o);continue e}}e.push("")}return e}function ii(t,e,n){var i;let o=n?ni(e.actions):[];return x("li",{class:"cm-diagnostic cm-diagnostic-"+e.severity},x("span",{class:"cm-diagnosticText"},e.renderMessage?e.renderMessage(t):e.message),(i=e.actions)===null||i===void 0?void 0:i.map((r,s)=>{let l=!1,c=d=>{if(d.preventDefault(),l)return;l=!0;let p=te(t.state.field(T).diagnostics,e);p&&r.apply(t,p.from,p.to)},{name:f}=r,a=o[s]?f.indexOf(o[s]):-1,h=a<0?f:[f.slice(0,a),x("u",f.slice(a,a+1)),f.slice(a+1)],u=r.markClass?" "+r.markClass:"";return x("button",{type:"button",class:"cm-diagnosticAction"+u,onclick:c,onmousedown:c,"aria-label":` Action: ${f}${a<0?"":` (access key "${o[s]})"`}.`},h)}),e.source&&x("div",{class:"cm-diagnosticSource"},e.source))}class os extends li{constructor(e){super(),this.sev=e}eq(e){return e.sev==this.sev}toDOM(){return x("span",{class:"cm-lintPoint cm-lintPoint-"+this.sev})}}class Vt{constructor(e,n){this.diagnostic=n,this.id="item_"+Math.floor(Math.random()*4294967295).toString(16),this.dom=ii(e,n,!0),this.dom.id=this.id,this.dom.setAttribute("role","option")}}class me{constructor(e){this.view=e,this.items=[];let n=o=>{if(o.keyCode==27)qt(this.view),this.view.focus();else if(o.keyCode==38||o.keyCode==33)this.moveSelection((this.selectedIndex-1+this.items.length)%this.items.length);else if(o.keyCode==40||o.keyCode==34)this.moveSelection((this.selectedIndex+1)%this.items.length);else if(o.keyCode==36)this.moveSelection(0);else if(o.keyCode==35)this.moveSelection(this.items.length-1);else if(o.keyCode==13)this.view.focus();else if(o.keyCode>=65&&o.keyCode<=90&&this.selectedIndex>=0){let{diagnostic:r}=this.items[this.selectedIndex],s=ni(r.actions);for(let l=0;l{for(let r=0;rqt(this.view)},"×")),this.update()}get selectedIndex(){let e=this.view.state.field(T).selected;if(!e)return-1;for(let n=0;n{for(let a of f.diagnostics){if(s.has(a))continue;s.add(a);let h=-1,u;for(let d=i;di&&(this.items.splice(i,h-i),o=!0)),n&&u.diagnostic==n.diagnostic?u.dom.hasAttribute("aria-selected")||(u.dom.setAttribute("aria-selected","true"),r=u):u.dom.hasAttribute("aria-selected")&&u.dom.removeAttribute("aria-selected"),i++}});i({sel:r.dom.getBoundingClientRect(),panel:this.list.getBoundingClientRect()}),write:({sel:l,panel:c})=>{let f=c.height/this.list.offsetHeight;l.topc.bottom&&(this.list.scrollTop+=(l.bottom-c.bottom)/f)}})):this.selectedIndex<0&&this.list.removeAttribute("aria-activedescendant"),o&&this.sync()}sync(){let e=this.list.firstChild;function n(){let i=e;e=i.nextSibling,i.remove()}for(let i of this.items)if(i.dom.parentNode==this.list){for(;e!=i.dom;)n();e=i.dom.nextSibling}else this.list.insertBefore(i.dom,e);for(;e;)n()}moveSelection(e){if(this.selectedIndex<0)return;let n=this.view.state.field(T),i=te(n.diagnostics,this.items[e].diagnostic);i&&this.view.dispatch({selection:{anchor:i.from,head:i.to},scrollIntoView:!0,effects:ti.of(i)})}static open(e){return new me(e)}}function rs(t,e='viewBox="0 0 40 40"'){return`url('data:image/svg+xml,${encodeURIComponent(t)}')`}function ve(t){return rs(``,'width="6" height="3"')}const ss=k.baseTheme({".cm-diagnostic":{padding:"3px 6px 3px 8px",marginLeft:"-1px",display:"block",whiteSpace:"pre-wrap"},".cm-diagnostic-error":{borderLeft:"5px solid #d11"},".cm-diagnostic-warning":{borderLeft:"5px solid orange"},".cm-diagnostic-info":{borderLeft:"5px solid #999"},".cm-diagnostic-hint":{borderLeft:"5px solid #66d"},".cm-diagnosticAction":{font:"inherit",border:"none",padding:"2px 4px",backgroundColor:"#444",color:"white",borderRadius:"3px",marginLeft:"8px",cursor:"pointer"},".cm-diagnosticSource":{fontSize:"70%",opacity:.7},".cm-lintRange":{backgroundPosition:"left bottom",backgroundRepeat:"repeat-x",paddingBottom:"0.7px"},".cm-lintRange-error":{backgroundImage:ve("#d11")},".cm-lintRange-warning":{backgroundImage:ve("orange")},".cm-lintRange-info":{backgroundImage:ve("#999")},".cm-lintRange-hint":{backgroundImage:ve("#66d")},".cm-lintRange-active":{backgroundColor:"#ffdd9980"},".cm-tooltip-lint":{padding:0,margin:0},".cm-lintPoint":{position:"relative","&:after":{content:'""',position:"absolute",bottom:0,left:"-2px",borderLeft:"3px solid transparent",borderRight:"3px solid transparent",borderBottom:"4px solid #d11"}},".cm-lintPoint-warning":{"&:after":{borderBottomColor:"orange"}},".cm-lintPoint-info":{"&:after":{borderBottomColor:"#999"}},".cm-lintPoint-hint":{"&:after":{borderBottomColor:"#66d"}},".cm-panel.cm-panel-lint":{position:"relative","& ul":{maxHeight:"100px",overflowY:"auto","& [aria-selected]":{backgroundColor:"#ddd","& u":{textDecoration:"underline"}},"&:focus [aria-selected]":{background_fallback:"#bdf",backgroundColor:"Highlight",color_fallback:"white",color:"HighlightText"},"& u":{textDecoration:"none"},padding:0,margin:0},"& [name=close]":{position:"absolute",top:"0",right:"2px",background:"inherit",border:"none",font:"inherit",padding:0,margin:0}}});function ls(t){return t=="error"?4:t=="warning"?3:t=="info"?2:1}function cs(t){let e="hint",n=1;for(let i of t){let o=ls(i.severity);o>n&&(n=o,e=i.severity)}return e}const as=[T,k.decorations.compute([T],t=>{let{selected:e,panel:n}=t.field(T);return!e||!n||e.from==e.to?v.none:v.set([Xr.range(e.from,e.to)])}),si(Zr,{hideOn:_r}),ss],ms=[ci(),ai(),Kt(),on(),Si(),Gt(),fi(),jt.allowMultipleSelections.of(!0),ki(),Xt(Zt,{fallback:!0}),Ci(),Wr(),jr(),hi(),ui(),di(),Uo(),it.of([...Ur,...On,...sr,...cn,...vi,...Zn,...is])],ps=[Kt(),on(),Gt(),Xt(Zt,{fallback:!0}),it.of([...On,...cn])];export{k as EditorView,ms as basicSetup,ps as minimalSetup}; diff --git a/ui/assets/web/assets/index-CY12nbn6.js b/ui/assets/web/assets/index-CY12nbn6.js new file mode 100644 index 0000000..ff1c50c --- /dev/null +++ b/ui/assets/web/assets/index-CY12nbn6.js @@ -0,0 +1,42 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./ManualView-DJLo1BfX.js","./DropdownSelect-DwmPnboD.js","./LogStream-C7ftHG0R.js","./ScriptsView-1qSko5pB.js","./ChannelDialogModal-DzmGdCiS.js","./SettingsPanels-DGYEalpE.js","./index-CWdEPjyK.js","./index-DocLX96z.js","./index-1CbRHFUW.js","./index-CkqoOxGF.js","./index-CQY7N6SN.js","./index-B9CtIV-P.js"])))=>i.map(i=>d[i]); +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))r(s);new MutationObserver(s=>{for(const a of s)if(a.type==="childList")for(const i of a.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function n(s){const a={};return s.integrity&&(a.integrity=s.integrity),s.referrerPolicy&&(a.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?a.credentials="include":s.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function r(s){if(s.ep)return;s.ep=!0;const a=n(s);fetch(s.href,a)}})();function fa(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const pe={},Sn=[],pt=()=>{},go=()=>!1,Jr=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),ha=e=>e.startsWith("onUpdate:"),Ne=Object.assign,ga=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Fu=Object.prototype.hasOwnProperty,he=(e,t)=>Fu.call(e,t),Z=Array.isArray,Tn=e=>or(e)==="[object Map]",Xr=e=>or(e)==="[object Set]",pi=e=>or(e)==="[object Date]",J=e=>typeof e=="function",Te=e=>typeof e=="string",st=e=>typeof e=="symbol",me=e=>e!==null&&typeof e=="object",po=e=>(me(e)||J(e))&&J(e.then)&&J(e.catch),mo=Object.prototype.toString,or=e=>mo.call(e),Bu=e=>or(e).slice(8,-1),vo=e=>or(e)==="[object Object]",es=e=>Te(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,jn=fa(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),ts=e=>{const t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},ju=/-\w/g,Zt=ts(e=>e.replace(ju,t=>t.slice(1).toUpperCase())),Vu=/\B([A-Z])/g,gn=ts(e=>e.replace(Vu,"-$1").toLowerCase()),yo=ts(e=>e.charAt(0).toUpperCase()+e.slice(1)),Is=ts(e=>e?`on${yo(e)}`:""),Kt=(e,t)=>!Object.is(e,t),Ar=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},pa=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let mi;const ns=()=>mi||(mi=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function ma(e){if(Z(e)){const t={};for(let n=0;n{if(n){const r=n.split(Wu);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function an(e){let t="";if(Te(e))t=e;else if(Z(e))for(let n=0;nrs(n,t))}const ko=e=>!!(e&&e.__v_isRef===!0),bn=e=>Te(e)?e:e==null?"":Z(e)||me(e)&&(e.toString===mo||!J(e.toString))?ko(e)?bn(e.value):JSON.stringify(e,wo,2):String(e),wo=(e,t)=>ko(t)?wo(e,t.value):Tn(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,s],a)=>(n[Ls(r,a)+" =>"]=s,n),{})}:Xr(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Ls(n))}:st(t)?Ls(t):me(t)&&!Z(t)&&!vo(t)?String(t):t,Ls=(e,t="")=>{var n;return st(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};let Le;class So{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=Le,!t&&Le&&(this.index=(Le.scopes||(Le.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&&(Le=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,r;for(n=0,r=this.effects.length;n0)return;if($n){let t=$n;for($n=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Vn;){let t=Vn;for(Vn=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(r){e||(e=r)}t=n}}if(e)throw e}function Io(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Lo(e){let t,n=e.depsTail,r=n;for(;r;){const s=r.prevDep;r.version===-1?(r===n&&(n=s),ba(r),Qu(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=s}e.deps=t,e.depsTail=n}function Ws(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Ro(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Ro(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Qn)||(e.globalVersion=Qn,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Ws(e))))return;e.flags|=2;const t=e.dep,n=ve,r=rt;ve=e,rt=!0;try{Io(e);const s=e.fn(e._value);(t.version===0||Kt(s,e._value))&&(e.flags|=128,e._value=s,t.version++)}catch(s){throw t.version++,s}finally{ve=n,rt=r,Lo(e),e.flags&=-3}}function ba(e,t=!1){const{dep:n,prevSub:r,nextSub:s}=e;if(r&&(r.nextSub=s,e.prevSub=void 0),s&&(s.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let a=n.computed.deps;a;a=a.nextDep)ba(a,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Qu(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let rt=!0;const Mo=[];function Rt(){Mo.push(rt),rt=!1}function Mt(){const e=Mo.pop();rt=e===void 0?!0:e}function vi(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=ve;ve=void 0;try{t()}finally{ve=n}}}let Qn=0;class Ju{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 _a{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(!ve||!rt||ve===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==ve)n=this.activeLink=new Ju(ve,this),ve.deps?(n.prevDep=ve.depsTail,ve.depsTail.nextDep=n,ve.depsTail=n):ve.deps=ve.depsTail=n,Do(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const r=n.nextDep;r.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=r),n.prevDep=ve.depsTail,n.nextDep=void 0,ve.depsTail.nextDep=n,ve.depsTail=n,ve.deps===n&&(ve.deps=r)}return n}trigger(t){this.version++,Qn++,this.notify(t)}notify(t){va();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{ya()}}}function Do(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let r=t.deps;r;r=r.nextDep)Do(r)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const Rr=new WeakMap,ln=Symbol(""),Hs=Symbol(""),Jn=Symbol("");function Re(e,t,n){if(rt&&ve){let r=Rr.get(e);r||Rr.set(e,r=new Map);let s=r.get(n);s||(r.set(n,s=new _a),s.map=r,s.key=n),s.track()}}function Pt(e,t,n,r,s,a){const i=Rr.get(e);if(!i){Qn++;return}const o=l=>{l&&l.trigger()};if(va(),t==="clear")i.forEach(o);else{const l=Z(e),u=l&&es(n);if(l&&n==="length"){const c=Number(r);i.forEach((h,b)=>{(b==="length"||b===Jn||!st(b)&&b>=c)&&o(h)})}else switch((n!==void 0||i.has(void 0))&&o(i.get(n)),u&&o(i.get(Jn)),t){case"add":l?u&&o(i.get("length")):(o(i.get(ln)),Tn(e)&&o(i.get(Hs)));break;case"delete":l||(o(i.get(ln)),Tn(e)&&o(i.get(Hs)));break;case"set":Tn(e)&&o(i.get(ln));break}}ya()}function Xu(e,t){const n=Rr.get(e);return n&&n.get(t)}function vn(e){const t=ue(e);return t===e?t:(Re(t,"iterate",Jn),Je(e)?t:t.map(at))}function ss(e){return Re(e=ue(e),"iterate",Jn),e}function Vt(e,t){return Dt(e)?It(e)?En(at(t)):En(t):at(t)}const ed={__proto__:null,[Symbol.iterator](){return Ms(this,Symbol.iterator,e=>Vt(this,e))},concat(...e){return vn(this).concat(...e.map(t=>Z(t)?vn(t):t))},entries(){return Ms(this,"entries",e=>(e[1]=Vt(this,e[1]),e))},every(e,t){return wt(this,"every",e,t,void 0,arguments)},filter(e,t){return wt(this,"filter",e,t,n=>n.map(r=>Vt(this,r)),arguments)},find(e,t){return wt(this,"find",e,t,n=>Vt(this,n),arguments)},findIndex(e,t){return wt(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return wt(this,"findLast",e,t,n=>Vt(this,n),arguments)},findLastIndex(e,t){return wt(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return wt(this,"forEach",e,t,void 0,arguments)},includes(...e){return Ds(this,"includes",e)},indexOf(...e){return Ds(this,"indexOf",e)},join(e){return vn(this).join(e)},lastIndexOf(...e){return Ds(this,"lastIndexOf",e)},map(e,t){return wt(this,"map",e,t,void 0,arguments)},pop(){return On(this,"pop")},push(...e){return On(this,"push",e)},reduce(e,...t){return yi(this,"reduce",e,t)},reduceRight(e,...t){return yi(this,"reduceRight",e,t)},shift(){return On(this,"shift")},some(e,t){return wt(this,"some",e,t,void 0,arguments)},splice(...e){return On(this,"splice",e)},toReversed(){return vn(this).toReversed()},toSorted(e){return vn(this).toSorted(e)},toSpliced(...e){return vn(this).toSpliced(...e)},unshift(...e){return On(this,"unshift",e)},values(){return Ms(this,"values",e=>Vt(this,e))}};function Ms(e,t,n){const r=ss(e),s=r[t]();return r!==e&&!Je(e)&&(s._next=s.next,s.next=()=>{const a=s._next();return a.done||(a.value=n(a.value)),a}),s}const td=Array.prototype;function wt(e,t,n,r,s,a){const i=ss(e),o=i!==e&&!Je(e),l=i[t];if(l!==td[t]){const h=l.apply(e,a);return o?at(h):h}let u=n;i!==e&&(o?u=function(h,b){return n.call(this,Vt(e,h),b,e)}:n.length>2&&(u=function(h,b){return n.call(this,h,b,e)}));const c=l.call(i,u,r);return o&&s?s(c):c}function yi(e,t,n,r){const s=ss(e);let a=n;return s!==e&&(Je(e)?n.length>3&&(a=function(i,o,l){return n.call(this,i,o,l,e)}):a=function(i,o,l){return n.call(this,i,Vt(e,o),l,e)}),s[t](a,...r)}function Ds(e,t,n){const r=ue(e);Re(r,"iterate",Jn);const s=r[t](...n);return(s===-1||s===!1)&&is(n[0])?(n[0]=ue(n[0]),r[t](...n)):s}function On(e,t,n=[]){Rt(),va();const r=ue(e)[t].apply(e,n);return ya(),Mt(),r}const nd=fa("__proto__,__v_isRef,__isVue"),No=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(st));function rd(e){st(e)||(e=String(e));const t=ue(this);return Re(t,"has",e),t.hasOwnProperty(e)}class Oo{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){if(n==="__v_skip")return t.__v_skip;const s=this._isReadonly,a=this._isShallow;if(n==="__v_isReactive")return!s;if(n==="__v_isReadonly")return s;if(n==="__v_isShallow")return a;if(n==="__v_raw")return r===(s?a?hd:Bo:a?Fo:Uo).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const i=Z(t);if(!s){let l;if(i&&(l=ed[n]))return l;if(n==="hasOwnProperty")return rd}const o=Reflect.get(t,n,we(t)?t:r);if((st(n)?No.has(n):nd(n))||(s||Re(t,"get",n),a))return o;if(we(o)){const l=i&&es(n)?o:o.value;return s&&me(l)?Zs(l):l}return me(o)?s?Zs(o):as(o):o}}class zo extends Oo{constructor(t=!1){super(!1,t)}set(t,n,r,s){let a=t[n];const i=Z(t)&&es(n);if(!this._isShallow){const u=Dt(a);if(!Je(r)&&!Dt(r)&&(a=ue(a),r=ue(r)),!i&&we(a)&&!we(r))return u||(a.value=r),!0}const o=i?Number(n)e,wr=e=>Reflect.getPrototypeOf(e);function ld(e,t,n){return function(...r){const s=this.__v_raw,a=ue(s),i=Tn(a),o=e==="entries"||e===Symbol.iterator&&i,l=e==="keys"&&i,u=s[e](...r),c=n?Ks:t?En:at;return!t&&Re(a,"iterate",l?Hs:ln),{next(){const{value:h,done:b}=u.next();return b?{value:h,done:b}:{value:o?[c(h[0]),c(h[1])]:c(h),done:b}},[Symbol.iterator](){return this}}}}function Sr(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function cd(e,t){const n={get(s){const a=this.__v_raw,i=ue(a),o=ue(s);e||(Kt(s,o)&&Re(i,"get",s),Re(i,"get",o));const{has:l}=wr(i),u=t?Ks:e?En:at;if(l.call(i,s))return u(a.get(s));if(l.call(i,o))return u(a.get(o));a!==i&&a.get(s)},get size(){const s=this.__v_raw;return!e&&Re(ue(s),"iterate",ln),s.size},has(s){const a=this.__v_raw,i=ue(a),o=ue(s);return e||(Kt(s,o)&&Re(i,"has",s),Re(i,"has",o)),s===o?a.has(s):a.has(s)||a.has(o)},forEach(s,a){const i=this,o=i.__v_raw,l=ue(o),u=t?Ks:e?En:at;return!e&&Re(l,"iterate",ln),o.forEach((c,h)=>s.call(a,u(c),u(h),i))}};return Ne(n,e?{add:Sr("add"),set:Sr("set"),delete:Sr("delete"),clear:Sr("clear")}:{add(s){!t&&!Je(s)&&!Dt(s)&&(s=ue(s));const a=ue(this);return wr(a).has.call(a,s)||(a.add(s),Pt(a,"add",s,s)),this},set(s,a){!t&&!Je(a)&&!Dt(a)&&(a=ue(a));const i=ue(this),{has:o,get:l}=wr(i);let u=o.call(i,s);u||(s=ue(s),u=o.call(i,s));const c=l.call(i,s);return i.set(s,a),u?Kt(a,c)&&Pt(i,"set",s,a):Pt(i,"add",s,a),this},delete(s){const a=ue(this),{has:i,get:o}=wr(a);let l=i.call(a,s);l||(s=ue(s),l=i.call(a,s)),o&&o.call(a,s);const u=a.delete(s);return l&&Pt(a,"delete",s,void 0),u},clear(){const s=ue(this),a=s.size!==0,i=s.clear();return a&&Pt(s,"clear",void 0,void 0),i}}),["keys","values","entries",Symbol.iterator].forEach(s=>{n[s]=ld(s,e,t)}),n}function Ca(e,t){const n=cd(e,t);return(r,s,a)=>s==="__v_isReactive"?!e:s==="__v_isReadonly"?e:s==="__v_raw"?r:Reflect.get(he(n,s)&&s in r?n:r,s,a)}const ud={get:Ca(!1,!1)},dd={get:Ca(!1,!0)},fd={get:Ca(!0,!1)};const Uo=new WeakMap,Fo=new WeakMap,Bo=new WeakMap,hd=new WeakMap;function gd(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function pd(e){return e.__v_skip||!Object.isExtensible(e)?0:gd(Bu(e))}function as(e){return Dt(e)?e:ka(e,!1,ad,ud,Uo)}function md(e){return ka(e,!1,od,dd,Fo)}function Zs(e){return ka(e,!0,id,fd,Bo)}function ka(e,t,n,r,s){if(!me(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const a=pd(e);if(a===0)return e;const i=s.get(e);if(i)return i;const o=new Proxy(e,a===2?r:n);return s.set(e,o),o}function It(e){return Dt(e)?It(e.__v_raw):!!(e&&e.__v_isReactive)}function Dt(e){return!!(e&&e.__v_isReadonly)}function Je(e){return!!(e&&e.__v_isShallow)}function is(e){return e?!!e.__v_raw:!1}function ue(e){const t=e&&e.__v_raw;return t?ue(t):e}function wa(e){return!he(e,"__v_skip")&&Object.isExtensible(e)&&bo(e,"__v_skip",!0),e}const at=e=>me(e)?as(e):e,En=e=>me(e)?Zs(e):e;function we(e){return e?e.__v_isRef===!0:!1}function S(e){return vd(e,!1)}function vd(e,t){return we(e)?e:new yd(e,t)}class yd{constructor(t,n){this.dep=new _a,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:ue(t),this._value=n?t:at(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,r=this.__v_isShallow||Je(t)||Dt(t);t=r?t:ue(t),Kt(t,n)&&(this._rawValue=t,this._value=r?t:at(t),this.dep.trigger())}}function F(e){return we(e)?e.value:e}const bd={get:(e,t,n)=>t==="__v_raw"?e:F(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const s=e[t];return we(s)&&!we(n)?(s.value=n,!0):Reflect.set(e,t,n,r)}};function jo(e){return It(e)?e:new Proxy(e,bd)}function _d(e){const t=Z(e)?new Array(e.length):{};for(const n in e)t[n]=kd(e,n);return t}class Cd{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0,this._value=void 0,this._raw=ue(t);let s=!0,a=t;if(!Z(t)||!es(String(n)))do s=!is(a)||Je(a);while(s&&(a=a.__v_raw));this._shallow=s}get value(){let t=this._object[this._key];return this._shallow&&(t=F(t)),this._value=t===void 0?this._defaultValue:t}set value(t){if(this._shallow&&we(this._raw[this._key])){const n=this._object[this._key];if(we(n)){n.value=t;return}}this._object[this._key]=t}get dep(){return Xu(this._raw,this._key)}}function kd(e,t,n){return new Cd(e,t,n)}class wd{constructor(t,n,r){this.fn=t,this.setter=n,this._value=void 0,this.dep=new _a(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Qn-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=r}notify(){if(this.flags|=16,!(this.flags&8)&&ve!==this)return Eo(this,!0),!0}get value(){const t=this.dep.track();return Ro(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Sd(e,t,n=!1){let r,s;return J(e)?r=e:(r=e.get,s=e.set),new wd(r,s,n)}const Tr={},Mr=new WeakMap;let rn;function Td(e,t=!1,n=rn){if(n){let r=Mr.get(n);r||Mr.set(n,r=[]),r.push(e)}}function xd(e,t,n=pe){const{immediate:r,deep:s,once:a,scheduler:i,augmentJob:o,call:l}=n,u=N=>s?N:Je(N)||s===!1||s===0?At(N,1):At(N);let c,h,b,m,x=!1,v=!1;if(we(e)?(h=()=>e.value,x=Je(e)):It(e)?(h=()=>u(e),x=!0):Z(e)?(v=!0,x=e.some(N=>It(N)||Je(N)),h=()=>e.map(N=>{if(we(N))return N.value;if(It(N))return u(N);if(J(N))return l?l(N,2):N()})):J(e)?t?h=l?()=>l(e,2):e:h=()=>{if(b){Rt();try{b()}finally{Mt()}}const N=rn;rn=c;try{return l?l(e,3,[m]):e(m)}finally{rn=N}}:h=pt,t&&s){const N=h,Q=s===!0?1/0:s;h=()=>At(N(),Q)}const O=xo(),E=()=>{c.stop(),O&&O.active&&ga(O.effects,c)};if(a&&t){const N=t;t=(...Q)=>{N(...Q),E()}}let V=v?new Array(e.length).fill(Tr):Tr;const K=N=>{if(!(!(c.flags&1)||!c.dirty&&!N))if(t){const Q=c.run();if(s||x||(v?Q.some((W,oe)=>Kt(W,V[oe])):Kt(Q,V))){b&&b();const W=rn;rn=c;try{const oe=[Q,V===Tr?void 0:v&&V[0]===Tr?[]:V,m];V=Q,l?l(t,3,oe):t(...oe)}finally{rn=W}}}else c.run()};return o&&o(K),c=new Po(h),c.scheduler=i?()=>i(K,!1):K,m=N=>Td(N,!1,c),b=c.onStop=()=>{const N=Mr.get(c);if(N){if(l)l(N,4);else for(const Q of N)Q();Mr.delete(c)}},t?r?K(!0):V=c.run():i?i(K.bind(null,!0),!0):c.run(),E.pause=c.pause.bind(c),E.resume=c.resume.bind(c),E.stop=E,E}function At(e,t=1/0,n){if(t<=0||!me(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,we(e))At(e.value,t,n);else if(Z(e))for(let r=0;r{At(r,t,n)});else if(vo(e)){for(const r in e)At(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&At(e[r],t,n)}return e}function lr(e,t,n,r){try{return r?e(...r):e()}catch(s){cr(s,t,n)}}function vt(e,t,n,r){if(J(e)){const s=lr(e,t,n,r);return s&&po(s)&&s.catch(a=>{cr(a,t,n)}),s}if(Z(e)){const s=[];for(let a=0;a>>1,s=Be[r],a=Xn(s);a=Xn(n)?Be.push(e):Be.splice(Ad(t),0,e),e.flags|=1,$o()}}function $o(){Dr||(Dr=Vo.then(Ho))}function Ed(e){Z(e)?xn.push(...e):$t&&e.id===-1?$t.splice(_n+1,0,e):e.flags&1||(xn.push(e),e.flags|=1),$o()}function bi(e,t,n=ft+1){for(;nXn(n)-Xn(r));if(xn.length=0,$t){$t.push(...t);return}for($t=t,_n=0;_n<$t.length;_n++){const n=$t[_n];n.flags&4&&(n.flags&=-2),n.flags&8||n(),n.flags&=-2}$t=null,_n=0}}const Xn=e=>e.id==null?e.flags&2?-1:1/0:e.id;function Ho(e){try{for(ft=0;ft{r._d&&Ur(-1);const a=Nr(t);let i;try{i=e(...s)}finally{Nr(a),r._d&&Ur(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function vp(e,t){if(De===null)return e;const n=us(De),r=e.dirs||(e.dirs=[]);for(let s=0;s1)return n&&J(t)?t.call(r&&r.proxy):t}}function Ld(){return!!(bl()||cn)}const Rd=Symbol.for("v-scx"),Md=()=>Hn(Rd);function Ye(e,t,n){return Zo(e,t,n)}function Zo(e,t,n=pe){const{immediate:r,deep:s,flush:a,once:i}=n,o=Ne({},n),l=t&&r||!t&&a!=="post";let u;if(Ln){if(a==="sync"){const m=Md();u=m.__watcherHandles||(m.__watcherHandles=[])}else if(!l){const m=()=>{};return m.stop=pt,m.resume=pt,m.pause=pt,m}}const c=Me;o.call=(m,x,v)=>vt(m,c,x,v);let h=!1;a==="post"?o.scheduler=m=>{Fe(m,c&&c.suspense)}:a!=="sync"&&(h=!0,o.scheduler=(m,x)=>{x?m():Sa(m)}),o.augmentJob=m=>{t&&(m.flags|=4),h&&(m.flags|=2,c&&(m.id=c.uid,m.i=c))};const b=xd(e,t,o);return Ln&&(u?u.push(b):l&&b()),b}function Dd(e,t,n){const r=this.proxy,s=Te(e)?e.includes(".")?qo(r,e):()=>r[e]:e.bind(r,r);let a;J(t)?a=t:(a=t.handler,n=t);const i=ur(this),o=Zo(s,a.bind(r),n);return i(),o}function qo(e,t){const n=t.split(".");return()=>{let r=e;for(let s=0;se.__isTeleport,Kn=e=>e&&(e.disabled||e.disabled===""),_i=e=>e&&(e.defer||e.defer===""),Ci=e=>typeof SVGElement<"u"&&e instanceof SVGElement,ki=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,qs=(e,t)=>{const n=e&&e.to;return Te(n)?t?t(n):null:n},Go={name:"Teleport",__isTeleport:!0,process(e,t,n,r,s,a,i,o,l,u){const{mc:c,pc:h,pbc:b,o:{insert:m,querySelector:x,createText:v,createComment:O}}=u,E=Kn(t.props);let{shapeFlag:V,children:K,dynamicChildren:N}=t;if(e==null){const Q=t.el=v(""),W=t.anchor=v("");m(Q,n,r),m(W,n,r);const oe=(B,re)=>{V&16&&c(K,B,re,s,a,i,o,l)},z=()=>{const B=t.target=qs(t.props,x),re=Qo(B,t,v,m);B&&(i!=="svg"&&Ci(B)?i="svg":i!=="mathml"&&ki(B)&&(i="mathml"),s&&s.isCE&&(s.ce._teleportTargets||(s.ce._teleportTargets=new Set)).add(B),E||(oe(B,re),Er(t,!1)))};E&&(oe(n,W),Er(t,!0)),_i(t.props)?(t.el.__isMounted=!1,Fe(()=>{z(),delete t.el.__isMounted},a)):z()}else{if(_i(t.props)&&e.el.__isMounted===!1){Fe(()=>{Go.process(e,t,n,r,s,a,i,o,l,u)},a);return}t.el=e.el,t.targetStart=e.targetStart;const Q=t.anchor=e.anchor,W=t.target=e.target,oe=t.targetAnchor=e.targetAnchor,z=Kn(e.props),B=z?n:W,re=z?Q:oe;if(i==="svg"||Ci(W)?i="svg":(i==="mathml"||ki(W))&&(i="mathml"),N?(b(e.dynamicChildren,N,B,s,a,i,o),Ia(e,t,!0)):l||h(e,t,B,re,s,a,i,o,!1),E)z?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):xr(t,n,Q,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const H=t.target=qs(t.props,x);H&&xr(t,H,null,u,0)}else z&&xr(t,W,oe,u,1);Er(t,E)}},remove(e,t,n,{um:r,o:{remove:s}},a){const{shapeFlag:i,children:o,anchor:l,targetStart:u,targetAnchor:c,target:h,props:b}=e;if(h&&(s(u),s(c)),a&&s(l),i&16){const m=a||!Kn(b);for(let x=0;xZn(x,t&&(Z(t)?t[v]:t),n,r,s));return}if(Pn(r)&&!s){r.shapeFlag&512&&r.type.__asyncResolved&&r.component.subTree.component&&Zn(e,t,n,r.component.subTree);return}const a=r.shapeFlag&4?us(r.component):r.el,i=s?null:a,{i:o,r:l}=e,u=t&&t.r,c=o.refs===pe?o.refs={}:o.refs,h=o.setupState,b=ue(h),m=h===pe?go:x=>he(b,x);if(u!=null&&u!==l){if(Si(t),Te(u))c[u]=null,m(u)&&(h[u]=null);else if(we(u)){u.value=null;const x=t;x.k&&(c[x.k]=null)}}if(J(l))lr(l,o,12,[i,c]);else{const x=Te(l),v=we(l);if(x||v){const O=()=>{if(e.f){const E=x?m(l)?h[l]:c[l]:l.value;if(s)Z(E)&&ga(E,a);else if(Z(E))E.includes(a)||E.push(a);else if(x)c[l]=[a],m(l)&&(h[l]=c[l]);else{const V=[a];l.value=V,e.k&&(c[e.k]=V)}}else x?(c[l]=i,m(l)&&(h[l]=i)):v&&(l.value=i,e.k&&(c[e.k]=i))};if(i){const E=()=>{O(),Or.delete(e)};E.id=-1,Or.set(e,E),Fe(E,n)}else Si(e),O()}}}function Si(e){const t=Or.get(e);t&&(t.flags|=8,Or.delete(e))}const Ti=e=>e.nodeType===8;ns().requestIdleCallback;ns().cancelIdleCallback;function Fd(e,t){if(Ti(e)&&e.data==="["){let n=1,r=e.nextSibling;for(;r;){if(r.nodeType===1){if(t(r)===!1)break}else if(Ti(r))if(r.data==="]"){if(--n===0)break}else r.data==="["&&n++;r=r.nextSibling}}else t(e)}const Pn=e=>!!e.type.__asyncLoader;function ut(e){J(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:s=200,hydrate:a,timeout:i,suspensible:o=!0,onError:l}=e;let u=null,c,h=0;const b=()=>(h++,u=null,m()),m=()=>{let x;return u||(x=u=t().catch(v=>{if(v=v instanceof Error?v:new Error(String(v)),l)return new Promise((O,E)=>{l(v,()=>O(b()),()=>E(v),h+1)});throw v}).then(v=>x!==u&&u?u:(v&&(v.__esModule||v[Symbol.toStringTag]==="Module")&&(v=v.default),c=v,v)))};return Ud({name:"AsyncComponentWrapper",__asyncLoader:m,__asyncHydrate(x,v,O){let E=!1;(v.bu||(v.bu=[])).push(()=>E=!0);const V=()=>{E||O()},K=a?()=>{const N=a(V,Q=>Fd(x,Q));N&&(v.bum||(v.bum=[])).push(N)}:V;c?K():m().then(()=>!v.isUnmounted&&K())},get __asyncResolved(){return c},setup(){const x=Me;if(xa(x),c)return()=>Pr(c,x);const v=K=>{u=null,cr(K,x,13,!r)};if(o&&x.suspense||Ln)return m().then(K=>()=>Pr(K,x)).catch(K=>(v(K),()=>r?ye(r,{error:K}):null));const O=S(!1),E=S(),V=S(!!s);return s&&setTimeout(()=>{V.value=!1},s),i!=null&&setTimeout(()=>{if(!O.value&&!E.value){const K=new Error(`Async component timed out after ${i}ms.`);v(K),E.value=K}},i),m().then(()=>{O.value=!0,x.parent&&Pa(x.parent.vnode)&&x.parent.update()}).catch(K=>{v(K),E.value=K}),()=>{if(O.value&&c)return Pr(c,x);if(E.value&&r)return ye(r,{error:E.value});if(n&&!V.value)return Pr(n,x)}}})}function Pr(e,t){const{ref:n,props:r,children:s,ce:a}=t.vnode,i=ye(e,r,s);return i.ref=n,i.ce=a,delete t.vnode.ce,i}const Pa=e=>e.type.__isKeepAlive;function Bd(e,t){Jo(e,"a",t)}function jd(e,t){Jo(e,"da",t)}function Jo(e,t,n=Me){const r=e.__wdc||(e.__wdc=()=>{let s=n;for(;s;){if(s.isDeactivated)return;s=s.parent}return e()});if(os(t,r,n),n){let s=n.parent;for(;s&&s.parent;)Pa(s.parent.vnode)&&Vd(r,t,n,s),s=s.parent}}function Vd(e,t,n,r){const s=os(t,e,r,!0);el(()=>{ga(r[t],s)},n)}function os(e,t,n=Me,r=!1){if(n){const s=n[e]||(n[e]=[]),a=t.__weh||(t.__weh=(...i)=>{Rt();const o=ur(n),l=vt(t,n,e,i);return o(),Mt(),l});return r?s.unshift(a):s.push(a),a}}const zt=e=>(t,n=Me)=>{(!Ln||e==="sp")&&os(e,(...r)=>t(...r),n)},$d=zt("bm"),Xo=zt("m"),Wd=zt("bu"),Hd=zt("u"),Ys=zt("bum"),el=zt("um"),Kd=zt("sp"),Zd=zt("rtg"),qd=zt("rtc");function Yd(e,t=Me){os("ec",e,t)}const Gd=Symbol.for("v-ndc");function yp(e,t,n,r){let s;const a=n,i=Z(e);if(i||Te(e)){const o=i&&It(e);let l=!1,u=!1;o&&(l=!Je(e),u=Dt(e),e=ss(e)),s=new Array(e.length);for(let c=0,h=e.length;ct(o,l,void 0,a));else{const o=Object.keys(e);s=new Array(o.length);for(let l=0,u=o.length;l0;return t!=="default"&&(n.name=t),ht(),on(Ge,null,[ye("slot",n,r)],u?-2:64)}let a=e[t];a&&a._c&&(a._d=!1),ht();const i=a&&tl(a(n)),o=n.key||i&&i.key,l=on(Ge,{key:(o&&!st(o)?o:`_${t}`)+(!i&&r?"_fb":"")},i||[],i&&e._===1?64:-2);return l.scopeId&&(l.slotScopeIds=[l.scopeId+"-s"]),a&&a._c&&(a._d=!0),l}function tl(e){return e.some(t=>tr(t)?!(t.type===Nt||t.type===Ge&&!tl(t.children)):!0)?e:null}const Gs=e=>e?_l(e)?us(e):Gs(e.parent):null,qn=Ne(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=>Gs(e.parent),$root:e=>Gs(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>rl(e),$forceUpdate:e=>e.f||(e.f=()=>{Sa(e.update)}),$nextTick:e=>e.n||(e.n=Wn.bind(e.proxy)),$watch:e=>Dd.bind(e)}),Ns=(e,t)=>e!==pe&&!e.__isScriptSetup&&he(e,t),Qd={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:r,data:s,props:a,accessCache:i,type:o,appContext:l}=e;if(t[0]!=="$"){const b=i[t];if(b!==void 0)switch(b){case 1:return r[t];case 2:return s[t];case 4:return n[t];case 3:return a[t]}else{if(Ns(r,t))return i[t]=1,r[t];if(s!==pe&&he(s,t))return i[t]=2,s[t];if(he(a,t))return i[t]=3,a[t];if(n!==pe&&he(n,t))return i[t]=4,n[t];Qs&&(i[t]=0)}}const u=qn[t];let c,h;if(u)return t==="$attrs"&&Re(e.attrs,"get",""),u(e);if((c=o.__cssModules)&&(c=c[t]))return c;if(n!==pe&&he(n,t))return i[t]=4,n[t];if(h=l.config.globalProperties,he(h,t))return h[t]},set({_:e},t,n){const{data:r,setupState:s,ctx:a}=e;return Ns(s,t)?(s[t]=n,!0):r!==pe&&he(r,t)?(r[t]=n,!0):he(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(a[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:s,props:a,type:i}},o){let l;return!!(n[o]||e!==pe&&o[0]!=="$"&&he(e,o)||Ns(t,o)||he(a,o)||he(r,o)||he(qn,o)||he(s.config.globalProperties,o)||(l=i.__cssModules)&&l[o])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:he(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function xi(e){return Z(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Qs=!0;function Jd(e){const t=rl(e),n=e.proxy,r=e.ctx;Qs=!1,t.beforeCreate&&Pi(t.beforeCreate,e,"bc");const{data:s,computed:a,methods:i,watch:o,provide:l,inject:u,created:c,beforeMount:h,mounted:b,beforeUpdate:m,updated:x,activated:v,deactivated:O,beforeDestroy:E,beforeUnmount:V,destroyed:K,unmounted:N,render:Q,renderTracked:W,renderTriggered:oe,errorCaptured:z,serverPrefetch:B,expose:re,inheritAttrs:H,components:be,directives:_e,filters:it}=t;if(u&&Xd(u,r,null),i)for(const te in i){const de=i[te];J(de)&&(r[te]=de.bind(n))}if(s){const te=s.call(n,n);me(te)&&(e.data=as(te))}if(Qs=!0,a)for(const te in a){const de=a[te],tt=J(de)?de.bind(n,n):J(de.get)?de.get.bind(n,n):pt,Yt=!J(de)&&J(de.set)?de.set.bind(n):pt,ot=ge({get:tt,set:Yt});Object.defineProperty(r,te,{enumerable:!0,configurable:!0,get:()=>ot.value,set:Xe=>ot.value=Xe})}if(o)for(const te in o)nl(o[te],r,n,te);if(l){const te=J(l)?l.call(n):l;Reflect.ownKeys(te).forEach(de=>{Cn(de,te[de])})}c&&Pi(c,e,"c");function ae(te,de){Z(de)?de.forEach(tt=>te(tt.bind(n))):de&&te(de.bind(n))}if(ae($d,h),ae(Xo,b),ae(Wd,m),ae(Hd,x),ae(Bd,v),ae(jd,O),ae(Yd,z),ae(qd,W),ae(Zd,oe),ae(Ys,V),ae(el,N),ae(Kd,B),Z(re))if(re.length){const te=e.exposed||(e.exposed={});re.forEach(de=>{Object.defineProperty(te,de,{get:()=>n[de],set:tt=>n[de]=tt,enumerable:!0})})}else e.exposed||(e.exposed={});Q&&e.render===pt&&(e.render=Q),H!=null&&(e.inheritAttrs=H),be&&(e.components=be),_e&&(e.directives=_e),B&&xa(e)}function Xd(e,t,n=pt){Z(e)&&(e=Js(e));for(const r in e){const s=e[r];let a;me(s)?"default"in s?a=Hn(s.from||r,s.default,!0):a=Hn(s.from||r):a=Hn(s),we(a)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>a.value,set:i=>a.value=i}):t[r]=a}}function Pi(e,t,n){vt(Z(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function nl(e,t,n,r){let s=r.includes(".")?qo(n,r):()=>n[r];if(Te(e)){const a=t[e];J(a)&&Ye(s,a)}else if(J(e))Ye(s,e.bind(n));else if(me(e))if(Z(e))e.forEach(a=>nl(a,t,n,r));else{const a=J(e.handler)?e.handler.bind(n):t[e.handler];J(a)&&Ye(s,a,e)}}function rl(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:s,optionsCache:a,config:{optionMergeStrategies:i}}=e.appContext,o=a.get(t);let l;return o?l=o:!s.length&&!n&&!r?l=t:(l={},s.length&&s.forEach(u=>zr(l,u,i,!0)),zr(l,t,i)),me(t)&&a.set(t,l),l}function zr(e,t,n,r=!1){const{mixins:s,extends:a}=t;a&&zr(e,a,n,!0),s&&s.forEach(i=>zr(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const o=ef[i]||n&&n[i];e[i]=o?o(e[i],t[i]):t[i]}return e}const ef={data:Ai,props:Ei,emits:Ei,methods:Fn,computed:Fn,beforeCreate:Ue,created:Ue,beforeMount:Ue,mounted:Ue,beforeUpdate:Ue,updated:Ue,beforeDestroy:Ue,beforeUnmount:Ue,destroyed:Ue,unmounted:Ue,activated:Ue,deactivated:Ue,errorCaptured:Ue,serverPrefetch:Ue,components:Fn,directives:Fn,watch:nf,provide:Ai,inject:tf};function Ai(e,t){return t?e?function(){return Ne(J(e)?e.call(this,this):e,J(t)?t.call(this,this):t)}:t:e}function tf(e,t){return Fn(Js(e),Js(t))}function Js(e){if(Z(e)){const t={};for(let n=0;nt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Zt(t)}Modifiers`]||e[`${gn(t)}Modifiers`];function of(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||pe;let s=n;const a=t.startsWith("update:"),i=a&&af(r,t.slice(7));i&&(i.trim&&(s=n.map(c=>Te(c)?c.trim():c)),i.number&&(s=n.map(pa)));let o,l=r[o=Is(t)]||r[o=Is(Zt(t))];!l&&a&&(l=r[o=Is(gn(t))]),l&&vt(l,e,6,s);const u=r[o+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[o])return;e.emitted[o]=!0,vt(u,e,6,s)}}const lf=new WeakMap;function al(e,t,n=!1){const r=n?lf:t.emitsCache,s=r.get(e);if(s!==void 0)return s;const a=e.emits;let i={},o=!1;if(!J(e)){const l=u=>{const c=al(u,t,!0);c&&(o=!0,Ne(i,c))};!n&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!a&&!o?(me(e)&&r.set(e,null),null):(Z(a)?a.forEach(l=>i[l]=null):Ne(i,a),me(e)&&r.set(e,i),i)}function ls(e,t){return!e||!Jr(t)?!1:(t=t.slice(2).replace(/Once$/,""),he(e,t[0].toLowerCase()+t.slice(1))||he(e,gn(t))||he(e,t))}function Ii(e){const{type:t,vnode:n,proxy:r,withProxy:s,propsOptions:[a],slots:i,attrs:o,emit:l,render:u,renderCache:c,props:h,data:b,setupState:m,ctx:x,inheritAttrs:v}=e,O=Nr(e);let E,V;try{if(n.shapeFlag&4){const N=s||r,Q=N;E=gt(u.call(Q,N,c,h,m,b,x)),V=o}else{const N=t;E=gt(N.length>1?N(h,{attrs:o,slots:i,emit:l}):N(h,null)),V=t.props?o:cf(o)}}catch(N){Yn.length=0,cr(N,e,1),E=ye(Nt)}let K=E;if(V&&v!==!1){const N=Object.keys(V),{shapeFlag:Q}=K;N.length&&Q&7&&(a&&N.some(ha)&&(V=uf(V,a)),K=In(K,V,!1,!0))}return n.dirs&&(K=In(K,null,!1,!0),K.dirs=K.dirs?K.dirs.concat(n.dirs):n.dirs),n.transition&&Ta(K,n.transition),E=K,Nr(O),E}const cf=e=>{let t;for(const n in e)(n==="class"||n==="style"||Jr(n))&&((t||(t={}))[n]=e[n]);return t},uf=(e,t)=>{const n={};for(const r in e)(!ha(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function df(e,t,n){const{props:r,children:s,component:a}=e,{props:i,children:o,patchFlag:l}=t,u=a.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&l>=0){if(l&1024)return!0;if(l&16)return r?Li(r,i,u):!!i;if(l&8){const c=t.dynamicProps;for(let h=0;hObject.create(il),ll=e=>Object.getPrototypeOf(e)===il;function hf(e,t,n,r=!1){const s={},a=ol();e.propsDefaults=Object.create(null),cl(e,t,s,a);for(const i in e.propsOptions[0])i in s||(s[i]=void 0);n?e.props=r?s:md(s):e.type.props?e.props=s:e.props=a,e.attrs=a}function gf(e,t,n,r){const{props:s,attrs:a,vnode:{patchFlag:i}}=e,o=ue(s),[l]=e.propsOptions;let u=!1;if((r||i>0)&&!(i&16)){if(i&8){const c=e.vnode.dynamicProps;for(let h=0;h{l=!0;const[b,m]=ul(h,t,!0);Ne(i,b),m&&o.push(...m)};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}if(!a&&!l)return me(e)&&r.set(e,Sn),Sn;if(Z(a))for(let c=0;ce==="_"||e==="_ctx"||e==="$stable",Ea=e=>Z(e)?e.map(gt):[gt(e)],mf=(e,t,n)=>{if(t._n)return t;const r=Id((...s)=>Ea(t(...s)),n);return r._c=!1,r},dl=(e,t,n)=>{const r=e._ctx;for(const s in e){if(Aa(s))continue;const a=e[s];if(J(a))t[s]=mf(s,a,r);else if(a!=null){const i=Ea(a);t[s]=()=>i}}},fl=(e,t)=>{const n=Ea(t);e.slots.default=()=>n},hl=(e,t,n)=>{for(const r in t)(n||!Aa(r))&&(e[r]=t[r])},vf=(e,t,n)=>{const r=e.slots=ol();if(e.vnode.shapeFlag&32){const s=t._;s?(hl(r,t,n),n&&bo(r,"_",s,!0)):dl(t,r)}else t&&fl(e,t)},yf=(e,t,n)=>{const{vnode:r,slots:s}=e;let a=!0,i=pe;if(r.shapeFlag&32){const o=t._;o?n&&o===1?a=!1:hl(s,t,n):(a=!t.$stable,dl(t,s)),i=t}else t&&(fl(e,t),i={default:1});if(a)for(const o in s)!Aa(o)&&i[o]==null&&delete s[o]},Fe=wf;function bf(e){return _f(e)}function _f(e,t){const n=ns();n.__VUE__=!0;const{insert:r,remove:s,patchProp:a,createElement:i,createText:o,createComment:l,setText:u,setElementText:c,parentNode:h,nextSibling:b,setScopeId:m=pt,insertStaticContent:x}=e,v=(d,f,p,T=null,_=null,C=null,L=void 0,I=null,A=!!f.dynamicChildren)=>{if(d===f)return;d&&!zn(d,f)&&(T=Gt(d),Xe(d,_,C,!0),d=null),f.patchFlag===-2&&(A=!1,f.dynamicChildren=null);const{type:k,ref:$,shapeFlag:R}=f;switch(k){case cs:O(d,f,p,T);break;case Nt:E(d,f,p,T);break;case zs:d==null&&V(f,p,T,L);break;case Ge:be(d,f,p,T,_,C,L,I,A);break;default:R&1?Q(d,f,p,T,_,C,L,I,A):R&6?_e(d,f,p,T,_,C,L,I,A):(R&64||R&128)&&k.process(d,f,p,T,_,C,L,I,A,Jt)}$!=null&&_?Zn($,d&&d.ref,C,f||d,!f):$==null&&d&&d.ref!=null&&Zn(d.ref,null,C,d,!0)},O=(d,f,p,T)=>{if(d==null)r(f.el=o(f.children),p,T);else{const _=f.el=d.el;f.children!==d.children&&u(_,f.children)}},E=(d,f,p,T)=>{d==null?r(f.el=l(f.children||""),p,T):f.el=d.el},V=(d,f,p,T)=>{[d.el,d.anchor]=x(d.children,f,p,T,d.el,d.anchor)},K=({el:d,anchor:f},p,T)=>{let _;for(;d&&d!==f;)_=b(d),r(d,p,T),d=_;r(f,p,T)},N=({el:d,anchor:f})=>{let p;for(;d&&d!==f;)p=b(d),s(d),d=p;s(f)},Q=(d,f,p,T,_,C,L,I,A)=>{if(f.type==="svg"?L="svg":f.type==="math"&&(L="mathml"),d==null)W(f,p,T,_,C,L,I,A);else{const k=d.el&&d.el._isVueCE?d.el:null;try{k&&k._beginPatch(),B(d,f,_,C,L,I,A)}finally{k&&k._endPatch()}}},W=(d,f,p,T,_,C,L,I)=>{let A,k;const{props:$,shapeFlag:R,transition:j,dirs:q}=d;if(A=d.el=i(d.type,C,$&&$.is,$),R&8?c(A,d.children):R&16&&z(d.children,A,null,T,_,Os(d,C),L,I),q&&tn(d,null,T,"created"),oe(A,d,d.scopeId,L,T),$){for(const fe in $)fe!=="value"&&!jn(fe)&&a(A,fe,null,$[fe],C,T);"value"in $&&a(A,"value",null,$.value,C),(k=$.onVnodeBeforeMount)&&dt(k,T,d)}q&&tn(d,null,T,"beforeMount");const ne=Cf(_,j);ne&&j.beforeEnter(A),r(A,f,p),((k=$&&$.onVnodeMounted)||ne||q)&&Fe(()=>{k&&dt(k,T,d),ne&&j.enter(A),q&&tn(d,null,T,"mounted")},_)},oe=(d,f,p,T,_)=>{if(p&&m(d,p),T)for(let C=0;C{for(let k=A;k{const I=f.el=d.el;let{patchFlag:A,dynamicChildren:k,dirs:$}=f;A|=d.patchFlag&16;const R=d.props||pe,j=f.props||pe;let q;if(p&&nn(p,!1),(q=j.onVnodeBeforeUpdate)&&dt(q,p,f,d),$&&tn(f,d,p,"beforeUpdate"),p&&nn(p,!0),(R.innerHTML&&j.innerHTML==null||R.textContent&&j.textContent==null)&&c(I,""),k?re(d.dynamicChildren,k,I,p,T,Os(f,_),C):L||de(d,f,I,null,p,T,Os(f,_),C,!1),A>0){if(A&16)H(I,R,j,p,_);else if(A&2&&R.class!==j.class&&a(I,"class",null,j.class,_),A&4&&a(I,"style",R.style,j.style,_),A&8){const ne=f.dynamicProps;for(let fe=0;fe{q&&dt(q,p,f,d),$&&tn(f,d,p,"updated")},T)},re=(d,f,p,T,_,C,L)=>{for(let I=0;I{if(f!==p){if(f!==pe)for(const C in f)!jn(C)&&!(C in p)&&a(d,C,f[C],null,_,T);for(const C in p){if(jn(C))continue;const L=p[C],I=f[C];L!==I&&C!=="value"&&a(d,C,I,L,_,T)}"value"in p&&a(d,"value",f.value,p.value,_)}},be=(d,f,p,T,_,C,L,I,A)=>{const k=f.el=d?d.el:o(""),$=f.anchor=d?d.anchor:o("");let{patchFlag:R,dynamicChildren:j,slotScopeIds:q}=f;q&&(I=I?I.concat(q):q),d==null?(r(k,p,T),r($,p,T),z(f.children||[],p,$,_,C,L,I,A)):R>0&&R&64&&j&&d.dynamicChildren&&d.dynamicChildren.length===j.length?(re(d.dynamicChildren,j,p,_,C,L,I),(f.key!=null||_&&f===_.subTree)&&Ia(d,f,!0)):de(d,f,p,$,_,C,L,I,A)},_e=(d,f,p,T,_,C,L,I,A)=>{f.slotScopeIds=I,d==null?f.shapeFlag&512?_.ctx.activate(f,p,T,L,A):it(f,p,T,_,C,L,A):bt(d,f,A)},it=(d,f,p,T,_,C,L)=>{const I=d.component=Lf(d,T,_);if(Pa(d)&&(I.ctx.renderer=Jt),Rf(I,!1,L),I.asyncDep){if(_&&_.registerDep(I,ae,L),!d.el){const A=I.subTree=ye(Nt);E(null,A,f,p),d.placeholder=A.el}}else ae(I,d,f,p,_,C,L)},bt=(d,f,p)=>{const T=f.component=d.component;if(df(d,f,p))if(T.asyncDep&&!T.asyncResolved){te(T,f,p);return}else T.next=f,T.update();else f.el=d.el,T.vnode=f},ae=(d,f,p,T,_,C,L)=>{const I=()=>{if(d.isMounted){let{next:R,bu:j,u:q,parent:ne,vnode:fe}=d;{const He=gl(d);if(He){R&&(R.el=fe.el,te(d,R,L)),He.asyncDep.then(()=>{d.isUnmounted||I()});return}}let ie=R,Se;nn(d,!1),R?(R.el=fe.el,te(d,R,L)):R=fe,j&&Ar(j),(Se=R.props&&R.props.onVnodeBeforeUpdate)&&dt(Se,ne,R,fe),nn(d,!0);const Ee=Ii(d),We=d.subTree;d.subTree=Ee,v(We,Ee,h(We.el),Gt(We),d,_,C),R.el=Ee.el,ie===null&&ff(d,Ee.el),q&&Fe(q,_),(Se=R.props&&R.props.onVnodeUpdated)&&Fe(()=>dt(Se,ne,R,fe),_)}else{let R;const{el:j,props:q}=f,{bm:ne,m:fe,parent:ie,root:Se,type:Ee}=d,We=Pn(f);nn(d,!1),ne&&Ar(ne),!We&&(R=q&&q.onVnodeBeforeMount)&&dt(R,ie,f),nn(d,!0);{Se.ce&&Se.ce._def.shadowRoot!==!1&&Se.ce._injectChildStyle(Ee);const He=d.subTree=Ii(d);v(null,He,p,T,d,_,C),f.el=He.el}if(fe&&Fe(fe,_),!We&&(R=q&&q.onVnodeMounted)){const He=f;Fe(()=>dt(R,ie,He),_)}(f.shapeFlag&256||ie&&Pn(ie.vnode)&&ie.vnode.shapeFlag&256)&&d.a&&Fe(d.a,_),d.isMounted=!0,f=p=T=null}};d.scope.on();const A=d.effect=new Po(I);d.scope.off();const k=d.update=A.run.bind(A),$=d.job=A.runIfDirty.bind(A);$.i=d,$.id=d.uid,A.scheduler=()=>Sa($),nn(d,!0),k()},te=(d,f,p)=>{f.component=d;const T=d.vnode.props;d.vnode=f,d.next=null,gf(d,f.props,T,p),yf(d,f.children,p),Rt(),bi(d),Mt()},de=(d,f,p,T,_,C,L,I,A=!1)=>{const k=d&&d.children,$=d?d.shapeFlag:0,R=f.children,{patchFlag:j,shapeFlag:q}=f;if(j>0){if(j&128){Yt(k,R,p,T,_,C,L,I,A);return}else if(j&256){tt(k,R,p,T,_,C,L,I,A);return}}q&8?($&16&&Ft(k,_,C),R!==k&&c(p,R)):$&16?q&16?Yt(k,R,p,T,_,C,L,I,A):Ft(k,_,C,!0):($&8&&c(p,""),q&16&&z(R,p,T,_,C,L,I,A))},tt=(d,f,p,T,_,C,L,I,A)=>{d=d||Sn,f=f||Sn;const k=d.length,$=f.length,R=Math.min(k,$);let j;for(j=0;j$?Ft(d,_,C,!0,!1,R):z(f,p,T,_,C,L,I,A,R)},Yt=(d,f,p,T,_,C,L,I,A)=>{let k=0;const $=f.length;let R=d.length-1,j=$-1;for(;k<=R&&k<=j;){const q=d[k],ne=f[k]=A?Wt(f[k]):gt(f[k]);if(zn(q,ne))v(q,ne,p,null,_,C,L,I,A);else break;k++}for(;k<=R&&k<=j;){const q=d[R],ne=f[j]=A?Wt(f[j]):gt(f[j]);if(zn(q,ne))v(q,ne,p,null,_,C,L,I,A);else break;R--,j--}if(k>R){if(k<=j){const q=j+1,ne=q<$?f[q].el:T;for(;k<=j;)v(null,f[k]=A?Wt(f[k]):gt(f[k]),p,ne,_,C,L,I,A),k++}}else if(k>j)for(;k<=R;)Xe(d[k],_,C,!0),k++;else{const q=k,ne=k,fe=new Map;for(k=ne;k<=j;k++){const ze=f[k]=A?Wt(f[k]):gt(f[k]);ze.key!=null&&fe.set(ze.key,k)}let ie,Se=0;const Ee=j-ne+1;let We=!1,He=0;const Xt=new Array(Ee);for(k=0;k=Ee){Xe(ze,_,C,!0);continue}let Ve;if(ze.key!=null)Ve=fe.get(ze.key);else for(ie=ne;ie<=j;ie++)if(Xt[ie-ne]===0&&zn(ze,f[ie])){Ve=ie;break}Ve===void 0?Xe(ze,_,C,!0):(Xt[Ve-ne]=k+1,Ve>=He?He=Ve:We=!0,v(ze,f[Ve],p,null,_,C,L,I,A),Se++)}const dr=We?kf(Xt):Sn;for(ie=dr.length-1,k=Ee-1;k>=0;k--){const ze=ne+k,Ve=f[ze],en=f[ze+1],Dn=ze+1<$?en.el||pl(en):T;Xt[k]===0?v(null,Ve,p,Dn,_,C,L,I,A):We&&(ie<0||k!==dr[ie]?ot(Ve,p,Dn,2):ie--)}}},ot=(d,f,p,T,_=null)=>{const{el:C,type:L,transition:I,children:A,shapeFlag:k}=d;if(k&6){ot(d.component.subTree,f,p,T);return}if(k&128){d.suspense.move(f,p,T);return}if(k&64){L.move(d,f,p,Jt);return}if(L===Ge){r(C,f,p);for(let R=0;RI.enter(C),_);else{const{leave:R,delayLeave:j,afterLeave:q}=I,ne=()=>{d.ctx.isUnmounted?s(C):r(C,f,p)},fe=()=>{C._isLeaving&&C[zd](!0),R(C,()=>{ne(),q&&q()})};j?j(C,ne,fe):fe()}else r(C,f,p)},Xe=(d,f,p,T=!1,_=!1)=>{const{type:C,props:L,ref:I,children:A,dynamicChildren:k,shapeFlag:$,patchFlag:R,dirs:j,cacheIndex:q}=d;if(R===-2&&(_=!1),I!=null&&(Rt(),Zn(I,null,p,d,!0),Mt()),q!=null&&(f.renderCache[q]=void 0),$&256){f.ctx.deactivate(d);return}const ne=$&1&&j,fe=!Pn(d);let ie;if(fe&&(ie=L&&L.onVnodeBeforeUnmount)&&dt(ie,f,d),$&6)Oe(d.component,p,T);else{if($&128){d.suspense.unmount(p,T);return}ne&&tn(d,null,f,"beforeUnmount"),$&64?d.type.remove(d,f,p,Jt,T):k&&!k.hasOnce&&(C!==Ge||R>0&&R&64)?Ft(k,f,p,!1,!0):(C===Ge&&R&384||!_&&$&16)&&Ft(A,f,p),T&&Ut(d)}(fe&&(ie=L&&L.onVnodeUnmounted)||ne)&&Fe(()=>{ie&&dt(ie,f,d),ne&&tn(d,null,f,"unmounted")},p)},Ut=d=>{const{type:f,el:p,anchor:T,transition:_}=d;if(f===Ge){_t(p,T);return}if(f===zs){N(d);return}const C=()=>{s(p),_&&!_.persisted&&_.afterLeave&&_.afterLeave()};if(d.shapeFlag&1&&_&&!_.persisted){const{leave:L,delayLeave:I}=_,A=()=>L(p,C);I?I(d.el,C,A):A()}else C()},_t=(d,f)=>{let p;for(;d!==f;)p=b(d),s(d),d=p;s(f)},Oe=(d,f,p)=>{const{bum:T,scope:_,job:C,subTree:L,um:I,m:A,a:k}=d;Mi(A),Mi(k),T&&Ar(T),_.stop(),C&&(C.flags|=8,Xe(L,d,f,p)),I&&Fe(I,f),Fe(()=>{d.isUnmounted=!0},f)},Ft=(d,f,p,T=!1,_=!1,C=0)=>{for(let L=C;L{if(d.shapeFlag&6)return Gt(d.component.subTree);if(d.shapeFlag&128)return d.suspense.next();const f=b(d.anchor||d.el),p=f&&f[Yo];return p?b(p):f};let Qt=!1;const pn=(d,f,p)=>{let T;d==null?f._vnode&&(Xe(f._vnode,null,null,!0),T=f._vnode.component):v(f._vnode||null,d,f,null,null,null,p),f._vnode=d,Qt||(Qt=!0,bi(T),Wo(),Qt=!1)},Jt={p:v,um:Xe,m:ot,r:Ut,mt:it,mc:z,pc:de,pbc:re,n:Gt,o:e};return{render:pn,hydrate:void 0,createApp:sf(pn)}}function Os({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 nn({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Cf(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Ia(e,t,n=!1){const r=e.children,s=t.children;if(Z(r)&&Z(s))for(let a=0;a>1,e[n[o]]0&&(t[r]=n[a-1]),n[a]=r)}}for(a=n.length,i=n[a-1];a-- >0;)n[a]=i,i=t[i];return n}function gl(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:gl(t)}function Mi(e){if(e)for(let t=0;te.__isSuspense;function wf(e,t){t&&t.pendingBranch?Z(e)?t.effects.push(...e):t.effects.push(e):Ed(e)}const Ge=Symbol.for("v-fgt"),cs=Symbol.for("v-txt"),Nt=Symbol.for("v-cmt"),zs=Symbol.for("v-stc"),Yn=[];let Qe=null;function ht(e=!1){Yn.push(Qe=e?null:[])}function Sf(){Yn.pop(),Qe=Yn[Yn.length-1]||null}let er=1;function Ur(e,t=!1){er+=e,e<0&&Qe&&t&&(Qe.hasOnce=!0)}function vl(e){return e.dynamicChildren=er>0?Qe||Sn:null,Sf(),er>0&&Qe&&Qe.push(e),e}function Us(e,t,n,r,s,a){return vl(X(e,t,n,r,s,a,!0))}function on(e,t,n,r,s){return vl(ye(e,t,n,r,s,!0))}function tr(e){return e?e.__v_isVNode===!0:!1}function zn(e,t){return e.type===t.type&&e.key===t.key}const yl=({key:e})=>e??null,Ir=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?Te(e)||we(e)||J(e)?{i:De,r:e,k:t,f:!!n}:e:null);function X(e,t=null,n=null,r=0,s=null,a=e===Ge?0:1,i=!1,o=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&yl(t),ref:t&&Ir(t),scopeId:Ko,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:a,patchFlag:r,dynamicProps:s,dynamicChildren:null,appContext:null,ctx:De};return o?(La(l,n),a&128&&e.normalize(l)):n&&(l.shapeFlag|=Te(n)?8:16),er>0&&!i&&Qe&&(l.patchFlag>0||a&6)&&l.patchFlag!==32&&Qe.push(l),l}const ye=Tf;function Tf(e,t=null,n=null,r=0,s=null,a=!1){if((!e||e===Gd)&&(e=Nt),tr(e)){const o=In(e,t,!0);return n&&La(o,n),er>0&&!a&&Qe&&(o.shapeFlag&6?Qe[Qe.indexOf(e)]=o:Qe.push(o)),o.patchFlag=-2,o}if(Of(e)&&(e=e.__vccOpts),t){t=xf(t);let{class:o,style:l}=t;o&&!Te(o)&&(t.class=an(o)),me(l)&&(is(l)&&!Z(l)&&(l=Ne({},l)),t.style=ma(l))}const i=Te(e)?1:ml(e)?128:Nd(e)?64:me(e)?4:J(e)?2:0;return X(e,t,n,r,s,i,a,!0)}function xf(e){return e?is(e)||ll(e)?Ne({},e):e:null}function In(e,t,n=!1,r=!1){const{props:s,ref:a,patchFlag:i,children:o,transition:l}=e,u=t?Af(s||{},t):s,c={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&yl(u),ref:t&&t.ref?n&&a?Z(a)?a.concat(Ir(t)):[a,Ir(t)]:Ir(t):a,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:o,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ge?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:l,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&In(e.ssContent),ssFallback:e.ssFallback&&In(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return l&&r&&Ta(c,l.clone(c)),c}function Pf(e=" ",t=0){return ye(cs,null,e,t)}function _p(e="",t=!1){return t?(ht(),on(Nt,null,e)):ye(Nt,null,e)}function gt(e){return e==null||typeof e=="boolean"?ye(Nt):Z(e)?ye(Ge,null,e.slice()):tr(e)?Wt(e):ye(cs,null,String(e))}function Wt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:In(e)}function La(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(Z(t))n=16;else if(typeof t=="object")if(r&65){const s=t.default;s&&(s._c&&(s._d=!1),La(e,s()),s._c&&(s._d=!0));return}else{n=32;const s=t._;!s&&!ll(t)?t._ctx=De:s===3&&De&&(De.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else J(t)?(t={default:t,_ctx:De},n=32):(t=String(t),r&64?(n=16,t=[Pf(t)]):n=8);e.children=t,e.shapeFlag|=n}function Af(...e){const t={};for(let n=0;nMe||De;let Fr,ea;{const e=ns(),t=(n,r)=>{let s;return(s=e[n])||(s=e[n]=[]),s.push(r),a=>{s.length>1?s.forEach(i=>i(a)):s[0](a)}};Fr=t("__VUE_INSTANCE_SETTERS__",n=>Me=n),ea=t("__VUE_SSR_SETTERS__",n=>Ln=n)}const ur=e=>{const t=Me;return Fr(e),e.scope.on(),()=>{e.scope.off(),Fr(t)}},Di=()=>{Me&&Me.scope.off(),Fr(null)};function _l(e){return e.vnode.shapeFlag&4}let Ln=!1;function Rf(e,t=!1,n=!1){t&&ea(t);const{props:r,children:s}=e.vnode,a=_l(e);hf(e,r,a,t),vf(e,s,n||t);const i=a?Mf(e,t):void 0;return t&&ea(!1),i}function Mf(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Qd);const{setup:r}=n;if(r){Rt();const s=e.setupContext=r.length>1?Nf(e):null,a=ur(e),i=lr(r,e,0,[e.props,s]),o=po(i);if(Mt(),a(),(o||e.sp)&&!Pn(e)&&xa(e),o){if(i.then(Di,Di),t)return i.then(l=>{Ni(e,l)}).catch(l=>{cr(l,e,0)});e.asyncDep=i}else Ni(e,i)}else Cl(e)}function Ni(e,t,n){J(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:me(t)&&(e.setupState=jo(t)),Cl(e)}function Cl(e,t,n){const r=e.type;e.render||(e.render=r.render||pt);{const s=ur(e);Rt();try{Jd(e)}finally{Mt(),s()}}}const Df={get(e,t){return Re(e,"get",""),e[t]}};function Nf(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Df),slots:e.slots,emit:e.emit,expose:t}}function us(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(jo(wa(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in qn)return qn[n](e)},has(t,n){return n in t||n in qn}})):e.proxy}function Of(e){return J(e)&&"__vccOpts"in e}const ge=(e,t)=>Sd(e,t,Ln);function Cp(e,t,n){try{Ur(-1);const r=arguments.length;return r===2?me(t)&&!Z(t)?tr(t)?ye(e,null,[t]):ye(e,t):ye(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&tr(n)&&(n=[n]),ye(e,t,n))}finally{Ur(1)}}const zf="3.5.26";let ta;const Oi=typeof window<"u"&&window.trustedTypes;if(Oi)try{ta=Oi.createPolicy("vue",{createHTML:e=>e})}catch{}const kl=ta?e=>ta.createHTML(e):e=>e,Uf="http://www.w3.org/2000/svg",Ff="http://www.w3.org/1998/Math/MathML",xt=typeof document<"u"?document:null,zi=xt&&xt.createElement("template"),Bf={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const s=t==="svg"?xt.createElementNS(Uf,e):t==="mathml"?xt.createElementNS(Ff,e):n?xt.createElement(e,{is:n}):xt.createElement(e);return e==="select"&&r&&r.multiple!=null&&s.setAttribute("multiple",r.multiple),s},createText:e=>xt.createTextNode(e),createComment:e=>xt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>xt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,s,a){const i=n?n.previousSibling:t.lastChild;if(s&&(s===a||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===a||!(s=s.nextSibling)););else{zi.innerHTML=kl(r==="svg"?`${e}`:r==="mathml"?`${e}`:e);const o=zi.content;if(r==="svg"||r==="mathml"){const l=o.firstChild;for(;l.firstChild;)o.appendChild(l.firstChild);o.removeChild(l)}t.insertBefore(o,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},jf=Symbol("_vtc");function Vf(e,t,n){const r=e[jf];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Ui=Symbol("_vod"),$f=Symbol("_vsh"),Wf=Symbol(""),Hf=/(?:^|;)\s*display\s*:/;function Kf(e,t,n){const r=e.style,s=Te(n);let a=!1;if(n&&!s){if(t)if(Te(t))for(const i of t.split(";")){const o=i.slice(0,i.indexOf(":")).trim();n[o]==null&&Lr(r,o,"")}else for(const i in t)n[i]==null&&Lr(r,i,"");for(const i in n)i==="display"&&(a=!0),Lr(r,i,n[i])}else if(s){if(t!==n){const i=r[Wf];i&&(n+=";"+i),r.cssText=n,a=Hf.test(n)}}else t&&e.removeAttribute("style");Ui in e&&(e[Ui]=a?r.display:"",e[$f]&&(r.display="none"))}const Fi=/\s*!important$/;function Lr(e,t,n){if(Z(n))n.forEach(r=>Lr(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=Zf(e,t);Fi.test(n)?e.setProperty(gn(r),n.replace(Fi,""),"important"):e[r]=n}}const Bi=["Webkit","Moz","ms"],Fs={};function Zf(e,t){const n=Fs[t];if(n)return n;let r=Zt(t);if(r!=="filter"&&r in e)return Fs[t]=r;r=yo(r);for(let s=0;sBs||(Qf.then(()=>Bs=0),Bs=Date.now());function Xf(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;vt(eh(r,n.value),t,5,[r])};return n.value=e,n.attached=Jf(),n}function eh(e,t){if(Z(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>s=>!s._stopped&&r&&r(s))}else return t}const Ki=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,th=(e,t,n,r,s,a)=>{const i=s==="svg";t==="class"?Vf(e,r,i):t==="style"?Kf(e,n,r):Jr(t)?ha(t)||Yf(e,t,n,r,a):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):nh(e,t,r,i))?($i(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Vi(e,t,r,i,a,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!Te(r))?$i(e,Zt(t),r,a,t):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Vi(e,t,r,i))};function nh(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&Ki(t)&&J(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 s=e.tagName;if(s==="IMG"||s==="VIDEO"||s==="CANVAS"||s==="SOURCE")return!1}return Ki(t)&&Te(n)?!1:t in e}const Br=e=>{const t=e.props["onUpdate:modelValue"]||!1;return Z(t)?n=>Ar(t,n):t};function rh(e){e.target.composing=!0}function Zi(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const An=Symbol("_assign");function qi(e,t,n){return t&&(e=e.trim()),n&&(e=pa(e)),e}const kp={created(e,{modifiers:{lazy:t,trim:n,number:r}},s){e[An]=Br(s);const a=r||s.props&&s.props.type==="number";sn(e,t?"change":"input",i=>{i.target.composing||e[An](qi(e.value,n,a))}),(n||a)&&sn(e,"change",()=>{e.value=qi(e.value,n,a)}),t||(sn(e,"compositionstart",rh),sn(e,"compositionend",Zi),sn(e,"change",Zi))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:s,number:a}},i){if(e[An]=Br(i),e.composing)return;const o=(a||e.type==="number")&&!/^0\d/.test(e.value)?pa(e.value):e.value,l=t??"";o!==l&&(document.activeElement===e&&e.type!=="range"&&(r&&t===n||s&&e.value.trim()===l)||(e.value=l))}},wp={deep:!0,created(e,t,n){e[An]=Br(n),sn(e,"change",()=>{const r=e._modelValue,s=sh(e),a=e.checked,i=e[An];if(Z(r)){const o=Co(r,s),l=o!==-1;if(a&&!l)i(r.concat(s));else if(!a&&l){const u=[...r];u.splice(o,1),i(u)}}else if(Xr(r)){const o=new Set(r);a?o.add(s):o.delete(s),i(o)}else i(wl(e,a))})},mounted:Yi,beforeUpdate(e,t,n){e[An]=Br(n),Yi(e,t,n)}};function Yi(e,{value:t,oldValue:n},r){e._modelValue=t;let s;if(Z(t))s=Co(t,r.props.value)>-1;else if(Xr(t))s=t.has(r.props.value);else{if(t===n)return;s=rs(t,wl(e,!0))}e.checked!==s&&(e.checked=s)}function sh(e){return"_value"in e?e._value:e.value}function wl(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const ah=["ctrl","shift","alt","meta"],ih={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)=>ah.some(n=>e[`${n}Key`]&&!t.includes(n))},Pe=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=((s,...a)=>{for(let i=0;i{const t=lh().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=dh(r);if(!s)return;const a=t._component;!J(a)&&!a.render&&!a.template&&(a.template=s.innerHTML),s.nodeType===1&&(s.textContent="");const i=n(s,!1,uh(s));return s instanceof Element&&(s.removeAttribute("v-cloak"),s.setAttribute("data-v-app","")),i},t});function uh(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function dh(e){return Te(e)?document.querySelector(e):e}let Sl;const ds=e=>Sl=e,Tl=Symbol();function na(e){return e&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"&&typeof e.toJSON!="function"}var Gn;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(Gn||(Gn={}));function fh(){const e=To(!0),t=e.run(()=>S({}));let n=[],r=[];const s=wa({install(a){ds(s),s._a=a,a.provide(Tl,s),a.config.globalProperties.$pinia=s,r.forEach(i=>n.push(i)),r=[]},use(a){return this._a?n.push(a):r.push(a),this},_p:n,_a:null,_e:e,_s:new Map,state:t});return s}const xl=()=>{};function Qi(e,t,n,r=xl){e.push(t);const s=()=>{const a=e.indexOf(t);a>-1&&(e.splice(a,1),r())};return!n&&xo()&&Gu(s),s}function yn(e,...t){e.slice().forEach(n=>{n(...t)})}const hh=e=>e(),Ji=Symbol(),js=Symbol();function ra(e,t){e instanceof Map&&t instanceof Map?t.forEach((n,r)=>e.set(r,n)):e instanceof Set&&t instanceof Set&&t.forEach(e.add,e);for(const n in t){if(!t.hasOwnProperty(n))continue;const r=t[n],s=e[n];na(s)&&na(r)&&e.hasOwnProperty(n)&&!we(r)&&!It(r)?e[n]=ra(s,r):e[n]=r}return e}const gh=Symbol();function ph(e){return!na(e)||!e.hasOwnProperty(gh)}const{assign:jt}=Object;function mh(e){return!!(we(e)&&e.effect)}function vh(e,t,n,r){const{state:s,actions:a,getters:i}=t,o=n.state.value[e];let l;function u(){o||(n.state.value[e]=s?s():{});const c=_d(n.state.value[e]);return jt(c,a,Object.keys(i||{}).reduce((h,b)=>(h[b]=wa(ge(()=>{ds(n);const m=n._s.get(e);return i[b].call(m,m)})),h),{}))}return l=Pl(e,u,t,n,r,!0),l}function Pl(e,t,n={},r,s,a){let i;const o=jt({actions:{}},n),l={deep:!0};let u,c,h=[],b=[],m;const x=r.state.value[e];!a&&!x&&(r.state.value[e]={}),S({});let v;function O(z){let B;u=c=!1,typeof z=="function"?(z(r.state.value[e]),B={type:Gn.patchFunction,storeId:e,events:m}):(ra(r.state.value[e],z),B={type:Gn.patchObject,payload:z,storeId:e,events:m});const re=v=Symbol();Wn().then(()=>{v===re&&(u=!0)}),c=!0,yn(h,B,r.state.value[e])}const E=a?function(){const{state:B}=n,re=B?B():{};this.$patch(H=>{jt(H,re)})}:xl;function V(){i.stop(),h=[],b=[],r._s.delete(e)}const K=(z,B="")=>{if(Ji in z)return z[js]=B,z;const re=function(){ds(r);const H=Array.from(arguments),be=[],_e=[];function it(te){be.push(te)}function bt(te){_e.push(te)}yn(b,{args:H,name:re[js],store:Q,after:it,onError:bt});let ae;try{ae=z.apply(this&&this.$id===e?this:Q,H)}catch(te){throw yn(_e,te),te}return ae instanceof Promise?ae.then(te=>(yn(be,te),te)).catch(te=>(yn(_e,te),Promise.reject(te))):(yn(be,ae),ae)};return re[Ji]=!0,re[js]=B,re},N={_p:r,$id:e,$onAction:Qi.bind(null,b),$patch:O,$reset:E,$subscribe(z,B={}){const re=Qi(h,z,B.detached,()=>H()),H=i.run(()=>Ye(()=>r.state.value[e],be=>{(B.flush==="sync"?c:u)&&z({storeId:e,type:Gn.direct,events:m},be)},jt({},l,B)));return re},$dispose:V},Q=as(N);r._s.set(e,Q);const oe=(r._a&&r._a.runWithContext||hh)(()=>r._e.run(()=>(i=To()).run(()=>t({action:K}))));for(const z in oe){const B=oe[z];if(we(B)&&!mh(B)||It(B))a||(x&&ph(B)&&(we(B)?B.value=x[z]:ra(B,x[z])),r.state.value[e][z]=B);else if(typeof B=="function"){const re=K(B,z);oe[z]=re,o.actions[z]=B}}return jt(Q,oe),jt(ue(Q),oe),Object.defineProperty(Q,"$state",{get:()=>r.state.value[e],set:z=>{O(B=>{jt(B,z)})}}),r._p.forEach(z=>{jt(Q,i.run(()=>z({store:Q,app:r._a,pinia:r,options:o})))}),x&&a&&n.hydrate&&n.hydrate(Q.$state,x),u=!0,c=!0,Q}function yh(e,t,n){let r,s;const a=typeof t=="function";r=e,s=a?n:t;function i(o,l){const u=Ld();return o=o||(u?Hn(Tl,null):null),o&&ds(o),o=Sl,o._s.has(r)||(a?Pl(r,t,s,o):vh(r,s,o)),o._s.get(r)}return i.$id=r,i}const bh="modulepreload",_h=function(e,t){return new URL(e,t).href},Xi={},Ie=function(t,n,r){let s=Promise.resolve();if(n&&n.length>0){let u=function(c){return Promise.all(c.map(h=>Promise.resolve(h).then(b=>({status:"fulfilled",value:b}),b=>({status:"rejected",reason:b}))))};const i=document.getElementsByTagName("link"),o=document.querySelector("meta[property=csp-nonce]"),l=o?.nonce||o?.getAttribute("nonce");s=u(n.map(c=>{if(c=_h(c,r),c in Xi)return;Xi[c]=!0;const h=c.endsWith(".css"),b=h?'[rel="stylesheet"]':"";if(r)for(let x=i.length-1;x>=0;x--){const v=i[x];if(v.href===c&&(!h||v.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${c}"]${b}`))return;const m=document.createElement("link");if(m.rel=h?"stylesheet":bh,h||(m.as="script"),m.crossOrigin="",m.href=c,l&&m.setAttribute("nonce",l),document.head.appendChild(m),h)return new Promise((x,v)=>{m.addEventListener("load",x),m.addEventListener("error",()=>v(new Error(`Unable to preload CSS for ${c}`)))})}))}function a(i){const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=i,window.dispatchEvent(o),!o.defaultPrevented)throw i}return s.then(i=>{for(const o of i||[])o.status==="rejected"&&a(o.reason);return t().catch(a)})};var le;(function(e){e.assertEqual=s=>{};function t(s){}e.assertIs=t;function n(s){throw new Error}e.assertNever=n,e.arrayToEnum=s=>{const a={};for(const i of s)a[i]=i;return a},e.getValidEnumValues=s=>{const a=e.objectKeys(s).filter(o=>typeof s[s[o]]!="number"),i={};for(const o of a)i[o]=s[o];return e.objectValues(i)},e.objectValues=s=>e.objectKeys(s).map(function(a){return s[a]}),e.objectKeys=typeof Object.keys=="function"?s=>Object.keys(s):s=>{const a=[];for(const i in s)Object.prototype.hasOwnProperty.call(s,i)&&a.push(i);return a},e.find=(s,a)=>{for(const i of s)if(a(i))return i},e.isInteger=typeof Number.isInteger=="function"?s=>Number.isInteger(s):s=>typeof s=="number"&&Number.isFinite(s)&&Math.floor(s)===s;function r(s,a=" | "){return s.map(i=>typeof i=="string"?`'${i}'`:i).join(a)}e.joinValues=r,e.jsonStringifyReplacer=(s,a)=>typeof a=="bigint"?a.toString():a})(le||(le={}));var eo;(function(e){e.mergeShapes=(t,n)=>({...t,...n})})(eo||(eo={}));const D=le.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),Ht=e=>{switch(typeof e){case"undefined":return D.undefined;case"string":return D.string;case"number":return Number.isNaN(e)?D.nan:D.number;case"boolean":return D.boolean;case"function":return D.function;case"bigint":return D.bigint;case"symbol":return D.symbol;case"object":return Array.isArray(e)?D.array:e===null?D.null:e.then&&typeof e.then=="function"&&e.catch&&typeof e.catch=="function"?D.promise:typeof Map<"u"&&e instanceof Map?D.map:typeof Set<"u"&&e instanceof Set?D.set:typeof Date<"u"&&e instanceof Date?D.date:D.object;default:return D.unknown}},P=le.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]);class Ot extends Error{get errors(){return this.issues}constructor(t){super(),this.issues=[],this.addIssue=r=>{this.issues=[...this.issues,r]},this.addIssues=(r=[])=>{this.issues=[...this.issues,...r]};const n=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,n):this.__proto__=n,this.name="ZodError",this.issues=t}format(t){const n=t||function(a){return a.message},r={_errors:[]},s=a=>{for(const i of a.issues)if(i.code==="invalid_union")i.unionErrors.map(s);else if(i.code==="invalid_return_type")s(i.returnTypeError);else if(i.code==="invalid_arguments")s(i.argumentsError);else if(i.path.length===0)r._errors.push(n(i));else{let o=r,l=0;for(;ln.message){const n={},r=[];for(const s of this.issues)if(s.path.length>0){const a=s.path[0];n[a]=n[a]||[],n[a].push(t(s))}else r.push(t(s));return{formErrors:r,fieldErrors:n}}get formErrors(){return this.flatten()}}Ot.create=e=>new Ot(e);const sa=(e,t)=>{let n;switch(e.code){case P.invalid_type:e.received===D.undefined?n="Required":n=`Expected ${e.expected}, received ${e.received}`;break;case P.invalid_literal:n=`Invalid literal value, expected ${JSON.stringify(e.expected,le.jsonStringifyReplacer)}`;break;case P.unrecognized_keys:n=`Unrecognized key(s) in object: ${le.joinValues(e.keys,", ")}`;break;case P.invalid_union:n="Invalid input";break;case P.invalid_union_discriminator:n=`Invalid discriminator value. Expected ${le.joinValues(e.options)}`;break;case P.invalid_enum_value:n=`Invalid enum value. Expected ${le.joinValues(e.options)}, received '${e.received}'`;break;case P.invalid_arguments:n="Invalid function arguments";break;case P.invalid_return_type:n="Invalid function return type";break;case P.invalid_date:n="Invalid date";break;case P.invalid_string:typeof e.validation=="object"?"includes"in e.validation?(n=`Invalid input: must include "${e.validation.includes}"`,typeof e.validation.position=="number"&&(n=`${n} at one or more positions greater than or equal to ${e.validation.position}`)):"startsWith"in e.validation?n=`Invalid input: must start with "${e.validation.startsWith}"`:"endsWith"in e.validation?n=`Invalid input: must end with "${e.validation.endsWith}"`:le.assertNever(e.validation):e.validation!=="regex"?n=`Invalid ${e.validation}`:n="Invalid";break;case P.too_small:e.type==="array"?n=`Array must contain ${e.exact?"exactly":e.inclusive?"at least":"more than"} ${e.minimum} element(s)`:e.type==="string"?n=`String must contain ${e.exact?"exactly":e.inclusive?"at least":"over"} ${e.minimum} character(s)`:e.type==="number"?n=`Number must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${e.minimum}`:e.type==="bigint"?n=`Number must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${e.minimum}`:e.type==="date"?n=`Date must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(e.minimum))}`:n="Invalid input";break;case P.too_big:e.type==="array"?n=`Array must contain ${e.exact?"exactly":e.inclusive?"at most":"less than"} ${e.maximum} element(s)`:e.type==="string"?n=`String must contain ${e.exact?"exactly":e.inclusive?"at most":"under"} ${e.maximum} character(s)`:e.type==="number"?n=`Number must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="bigint"?n=`BigInt must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="date"?n=`Date must be ${e.exact?"exactly":e.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(e.maximum))}`:n="Invalid input";break;case P.custom:n="Invalid input";break;case P.invalid_intersection_types:n="Intersection results could not be merged";break;case P.not_multiple_of:n=`Number must be a multiple of ${e.multipleOf}`;break;case P.not_finite:n="Number must be finite";break;default:n=t.defaultError,le.assertNever(e)}return{message:n}};let Ch=sa;function kh(){return Ch}const wh=e=>{const{data:t,path:n,errorMaps:r,issueData:s}=e,a=[...n,...s.path||[]],i={...s,path:a};if(s.message!==void 0)return{...s,path:a,message:s.message};let o="";const l=r.filter(u=>!!u).slice().reverse();for(const u of l)o=u(i,{data:t,defaultError:o}).message;return{...s,path:a,message:o}};function M(e,t){const n=kh(),r=wh({issueData:t,data:e.data,path:e.path,errorMaps:[e.common.contextualErrorMap,e.schemaErrorMap,n,n===sa?void 0:sa].filter(s=>!!s)});e.common.issues.push(r)}class je{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(t,n){const r=[];for(const s of n){if(s.status==="aborted")return Y;s.status==="dirty"&&t.dirty(),r.push(s.value)}return{status:t.value,value:r}}static async mergeObjectAsync(t,n){const r=[];for(const s of n){const a=await s.key,i=await s.value;r.push({key:a,value:i})}return je.mergeObjectSync(t,r)}static mergeObjectSync(t,n){const r={};for(const s of n){const{key:a,value:i}=s;if(a.status==="aborted"||i.status==="aborted")return Y;a.status==="dirty"&&t.dirty(),i.status==="dirty"&&t.dirty(),a.value!=="__proto__"&&(typeof i.value<"u"||s.alwaysSet)&&(r[a.value]=i.value)}return{status:t.value,value:r}}}const Y=Object.freeze({status:"aborted"}),Bn=e=>({status:"dirty",value:e}),et=e=>({status:"valid",value:e}),to=e=>e.status==="aborted",no=e=>e.status==="dirty",Rn=e=>e.status==="valid",jr=e=>typeof Promise<"u"&&e instanceof Promise;var U;(function(e){e.errToObj=t=>typeof t=="string"?{message:t}:t||{},e.toString=t=>typeof t=="string"?t:t?.message})(U||(U={}));class yt{constructor(t,n,r,s){this._cachedPath=[],this.parent=t,this.data=n,this._path=r,this._key=s}get path(){return this._cachedPath.length||(Array.isArray(this._key)?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}}const ro=(e,t)=>{if(Rn(t))return{success:!0,data:t.value};if(!e.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;const n=new Ot(e.common.issues);return this._error=n,this._error}}};function ee(e){if(!e)return{};const{errorMap:t,invalid_type_error:n,required_error:r,description:s}=e;if(t&&(n||r))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return t?{errorMap:t,description:s}:{errorMap:(i,o)=>{const{message:l}=e;return i.code==="invalid_enum_value"?{message:l??o.defaultError}:typeof o.data>"u"?{message:l??r??o.defaultError}:i.code!=="invalid_type"?{message:o.defaultError}:{message:l??n??o.defaultError}},description:s}}class se{get description(){return this._def.description}_getType(t){return Ht(t.data)}_getOrReturnCtx(t,n){return n||{common:t.parent.common,data:t.data,parsedType:Ht(t.data),schemaErrorMap:this._def.errorMap,path:t.path,parent:t.parent}}_processInputParams(t){return{status:new je,ctx:{common:t.parent.common,data:t.data,parsedType:Ht(t.data),schemaErrorMap:this._def.errorMap,path:t.path,parent:t.parent}}}_parseSync(t){const n=this._parse(t);if(jr(n))throw new Error("Synchronous parse encountered promise.");return n}_parseAsync(t){const n=this._parse(t);return Promise.resolve(n)}parse(t,n){const r=this.safeParse(t,n);if(r.success)return r.data;throw r.error}safeParse(t,n){const r={common:{issues:[],async:n?.async??!1,contextualErrorMap:n?.errorMap},path:n?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:Ht(t)},s=this._parseSync({data:t,path:r.path,parent:r});return ro(r,s)}"~validate"(t){const n={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:Ht(t)};if(!this["~standard"].async)try{const r=this._parseSync({data:t,path:[],parent:n});return Rn(r)?{value:r.value}:{issues:n.common.issues}}catch(r){r?.message?.toLowerCase()?.includes("encountered")&&(this["~standard"].async=!0),n.common={issues:[],async:!0}}return this._parseAsync({data:t,path:[],parent:n}).then(r=>Rn(r)?{value:r.value}:{issues:n.common.issues})}async parseAsync(t,n){const r=await this.safeParseAsync(t,n);if(r.success)return r.data;throw r.error}async safeParseAsync(t,n){const r={common:{issues:[],contextualErrorMap:n?.errorMap,async:!0},path:n?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:Ht(t)},s=this._parse({data:t,path:r.path,parent:r}),a=await(jr(s)?s:Promise.resolve(s));return ro(r,a)}refine(t,n){const r=s=>typeof n=="string"||typeof n>"u"?{message:n}:typeof n=="function"?n(s):n;return this._refinement((s,a)=>{const i=t(s),o=()=>a.addIssue({code:P.custom,...r(s)});return typeof Promise<"u"&&i instanceof Promise?i.then(l=>l?!0:(o(),!1)):i?!0:(o(),!1)})}refinement(t,n){return this._refinement((r,s)=>t(r)?!0:(s.addIssue(typeof n=="function"?n(r,s):n),!1))}_refinement(t){return new fn({schema:this,typeName:G.ZodEffects,effect:{type:"refinement",refinement:t}})}superRefine(t){return this._refinement(t)}constructor(t){this.spa=this.safeParseAsync,this._def=t,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:n=>this["~validate"](n)}}optional(){return Lt.create(this,this._def)}nullable(){return hn.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return mt.create(this)}promise(){return qr.create(this,this._def)}or(t){return $r.create([this,t],this._def)}and(t){return Wr.create(this,t,this._def)}transform(t){return new fn({...ee(this._def),schema:this,typeName:G.ZodEffects,effect:{type:"transform",transform:t}})}default(t){const n=typeof t=="function"?t:()=>t;return new Yr({...ee(this._def),innerType:this,defaultValue:n,typeName:G.ZodDefault})}brand(){return new Ll({typeName:G.ZodBranded,type:this,...ee(this._def)})}catch(t){const n=typeof t=="function"?t:()=>t;return new Gr({...ee(this._def),innerType:this,catchValue:n,typeName:G.ZodCatch})}describe(t){const n=this.constructor;return new n({...this._def,description:t})}pipe(t){return Ma.create(this,t)}readonly(){return Qr.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}const Sh=/^c[^\s-]{8,}$/i,Th=/^[0-9a-z]+$/,xh=/^[0-9A-HJKMNP-TV-Z]{26}$/i,Ph=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,Ah=/^[a-z0-9_-]{21}$/i,Eh=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,Ih=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,Lh=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,Rh="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$";let Vs;const Mh=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,Dh=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,Nh=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,Oh=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,zh=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,Uh=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,Al="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",Fh=new RegExp(`^${Al}$`);function El(e){let t="[0-5]\\d";e.precision?t=`${t}\\.\\d{${e.precision}}`:e.precision==null&&(t=`${t}(\\.\\d+)?`);const n=e.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${t})${n}`}function Bh(e){return new RegExp(`^${El(e)}$`)}function jh(e){let t=`${Al}T${El(e)}`;const n=[];return n.push(e.local?"Z?":"Z"),e.offset&&n.push("([+-]\\d{2}:?\\d{2})"),t=`${t}(${n.join("|")})`,new RegExp(`^${t}$`)}function Vh(e,t){return!!((t==="v4"||!t)&&Mh.test(e)||(t==="v6"||!t)&&Nh.test(e))}function $h(e,t){if(!Eh.test(e))return!1;try{const[n]=e.split(".");if(!n)return!1;const r=n.replace(/-/g,"+").replace(/_/g,"/").padEnd(n.length+(4-n.length%4)%4,"="),s=JSON.parse(atob(r));return!(typeof s!="object"||s===null||"typ"in s&&s?.typ!=="JWT"||!s.alg||t&&s.alg!==t)}catch{return!1}}function Wh(e,t){return!!((t==="v4"||!t)&&Dh.test(e)||(t==="v6"||!t)&&Oh.test(e))}class Et extends se{_parse(t){if(this._def.coerce&&(t.data=String(t.data)),this._getType(t)!==D.string){const a=this._getOrReturnCtx(t);return M(a,{code:P.invalid_type,expected:D.string,received:a.parsedType}),Y}const r=new je;let s;for(const a of this._def.checks)if(a.kind==="min")t.data.lengtha.value&&(s=this._getOrReturnCtx(t,s),M(s,{code:P.too_big,maximum:a.value,type:"string",inclusive:!0,exact:!1,message:a.message}),r.dirty());else if(a.kind==="length"){const i=t.data.length>a.value,o=t.data.lengtht.test(s),{validation:n,code:P.invalid_string,...U.errToObj(r)})}_addCheck(t){return new Et({...this._def,checks:[...this._def.checks,t]})}email(t){return this._addCheck({kind:"email",...U.errToObj(t)})}url(t){return this._addCheck({kind:"url",...U.errToObj(t)})}emoji(t){return this._addCheck({kind:"emoji",...U.errToObj(t)})}uuid(t){return this._addCheck({kind:"uuid",...U.errToObj(t)})}nanoid(t){return this._addCheck({kind:"nanoid",...U.errToObj(t)})}cuid(t){return this._addCheck({kind:"cuid",...U.errToObj(t)})}cuid2(t){return this._addCheck({kind:"cuid2",...U.errToObj(t)})}ulid(t){return this._addCheck({kind:"ulid",...U.errToObj(t)})}base64(t){return this._addCheck({kind:"base64",...U.errToObj(t)})}base64url(t){return this._addCheck({kind:"base64url",...U.errToObj(t)})}jwt(t){return this._addCheck({kind:"jwt",...U.errToObj(t)})}ip(t){return this._addCheck({kind:"ip",...U.errToObj(t)})}cidr(t){return this._addCheck({kind:"cidr",...U.errToObj(t)})}datetime(t){return typeof t=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:t}):this._addCheck({kind:"datetime",precision:typeof t?.precision>"u"?null:t?.precision,offset:t?.offset??!1,local:t?.local??!1,...U.errToObj(t?.message)})}date(t){return this._addCheck({kind:"date",message:t})}time(t){return typeof t=="string"?this._addCheck({kind:"time",precision:null,message:t}):this._addCheck({kind:"time",precision:typeof t?.precision>"u"?null:t?.precision,...U.errToObj(t?.message)})}duration(t){return this._addCheck({kind:"duration",...U.errToObj(t)})}regex(t,n){return this._addCheck({kind:"regex",regex:t,...U.errToObj(n)})}includes(t,n){return this._addCheck({kind:"includes",value:t,position:n?.position,...U.errToObj(n?.message)})}startsWith(t,n){return this._addCheck({kind:"startsWith",value:t,...U.errToObj(n)})}endsWith(t,n){return this._addCheck({kind:"endsWith",value:t,...U.errToObj(n)})}min(t,n){return this._addCheck({kind:"min",value:t,...U.errToObj(n)})}max(t,n){return this._addCheck({kind:"max",value:t,...U.errToObj(n)})}length(t,n){return this._addCheck({kind:"length",value:t,...U.errToObj(n)})}nonempty(t){return this.min(1,U.errToObj(t))}trim(){return new Et({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new Et({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new Et({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(t=>t.kind==="datetime")}get isDate(){return!!this._def.checks.find(t=>t.kind==="date")}get isTime(){return!!this._def.checks.find(t=>t.kind==="time")}get isDuration(){return!!this._def.checks.find(t=>t.kind==="duration")}get isEmail(){return!!this._def.checks.find(t=>t.kind==="email")}get isURL(){return!!this._def.checks.find(t=>t.kind==="url")}get isEmoji(){return!!this._def.checks.find(t=>t.kind==="emoji")}get isUUID(){return!!this._def.checks.find(t=>t.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(t=>t.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(t=>t.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(t=>t.kind==="cuid2")}get isULID(){return!!this._def.checks.find(t=>t.kind==="ulid")}get isIP(){return!!this._def.checks.find(t=>t.kind==="ip")}get isCIDR(){return!!this._def.checks.find(t=>t.kind==="cidr")}get isBase64(){return!!this._def.checks.find(t=>t.kind==="base64")}get isBase64url(){return!!this._def.checks.find(t=>t.kind==="base64url")}get minLength(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxLength(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.valuenew Et({checks:[],typeName:G.ZodString,coerce:e?.coerce??!1,...ee(e)});function Hh(e,t){const n=(e.toString().split(".")[1]||"").length,r=(t.toString().split(".")[1]||"").length,s=n>r?n:r,a=Number.parseInt(e.toFixed(s).replace(".","")),i=Number.parseInt(t.toFixed(s).replace(".",""));return a%i/10**s}class nr extends se{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(t){if(this._def.coerce&&(t.data=Number(t.data)),this._getType(t)!==D.number){const a=this._getOrReturnCtx(t);return M(a,{code:P.invalid_type,expected:D.number,received:a.parsedType}),Y}let r;const s=new je;for(const a of this._def.checks)a.kind==="int"?le.isInteger(t.data)||(r=this._getOrReturnCtx(t,r),M(r,{code:P.invalid_type,expected:"integer",received:"float",message:a.message}),s.dirty()):a.kind==="min"?(a.inclusive?t.dataa.value:t.data>=a.value)&&(r=this._getOrReturnCtx(t,r),M(r,{code:P.too_big,maximum:a.value,type:"number",inclusive:a.inclusive,exact:!1,message:a.message}),s.dirty()):a.kind==="multipleOf"?Hh(t.data,a.value)!==0&&(r=this._getOrReturnCtx(t,r),M(r,{code:P.not_multiple_of,multipleOf:a.value,message:a.message}),s.dirty()):a.kind==="finite"?Number.isFinite(t.data)||(r=this._getOrReturnCtx(t,r),M(r,{code:P.not_finite,message:a.message}),s.dirty()):le.assertNever(a);return{status:s.value,value:t.data}}gte(t,n){return this.setLimit("min",t,!0,U.toString(n))}gt(t,n){return this.setLimit("min",t,!1,U.toString(n))}lte(t,n){return this.setLimit("max",t,!0,U.toString(n))}lt(t,n){return this.setLimit("max",t,!1,U.toString(n))}setLimit(t,n,r,s){return new nr({...this._def,checks:[...this._def.checks,{kind:t,value:n,inclusive:r,message:U.toString(s)}]})}_addCheck(t){return new nr({...this._def,checks:[...this._def.checks,t]})}int(t){return this._addCheck({kind:"int",message:U.toString(t)})}positive(t){return this._addCheck({kind:"min",value:0,inclusive:!1,message:U.toString(t)})}negative(t){return this._addCheck({kind:"max",value:0,inclusive:!1,message:U.toString(t)})}nonpositive(t){return this._addCheck({kind:"max",value:0,inclusive:!0,message:U.toString(t)})}nonnegative(t){return this._addCheck({kind:"min",value:0,inclusive:!0,message:U.toString(t)})}multipleOf(t,n){return this._addCheck({kind:"multipleOf",value:t,message:U.toString(n)})}finite(t){return this._addCheck({kind:"finite",message:U.toString(t)})}safe(t){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:U.toString(t)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:U.toString(t)})}get minValue(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxValue(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.valuet.kind==="int"||t.kind==="multipleOf"&&le.isInteger(t.value))}get isFinite(){let t=null,n=null;for(const r of this._def.checks){if(r.kind==="finite"||r.kind==="int"||r.kind==="multipleOf")return!0;r.kind==="min"?(n===null||r.value>n)&&(n=r.value):r.kind==="max"&&(t===null||r.valuenew nr({checks:[],typeName:G.ZodNumber,coerce:e?.coerce||!1,...ee(e)});class rr extends se{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(t){if(this._def.coerce)try{t.data=BigInt(t.data)}catch{return this._getInvalidInput(t)}if(this._getType(t)!==D.bigint)return this._getInvalidInput(t);let r;const s=new je;for(const a of this._def.checks)a.kind==="min"?(a.inclusive?t.dataa.value:t.data>=a.value)&&(r=this._getOrReturnCtx(t,r),M(r,{code:P.too_big,type:"bigint",maximum:a.value,inclusive:a.inclusive,message:a.message}),s.dirty()):a.kind==="multipleOf"?t.data%a.value!==BigInt(0)&&(r=this._getOrReturnCtx(t,r),M(r,{code:P.not_multiple_of,multipleOf:a.value,message:a.message}),s.dirty()):le.assertNever(a);return{status:s.value,value:t.data}}_getInvalidInput(t){const n=this._getOrReturnCtx(t);return M(n,{code:P.invalid_type,expected:D.bigint,received:n.parsedType}),Y}gte(t,n){return this.setLimit("min",t,!0,U.toString(n))}gt(t,n){return this.setLimit("min",t,!1,U.toString(n))}lte(t,n){return this.setLimit("max",t,!0,U.toString(n))}lt(t,n){return this.setLimit("max",t,!1,U.toString(n))}setLimit(t,n,r,s){return new rr({...this._def,checks:[...this._def.checks,{kind:t,value:n,inclusive:r,message:U.toString(s)}]})}_addCheck(t){return new rr({...this._def,checks:[...this._def.checks,t]})}positive(t){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:U.toString(t)})}negative(t){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:U.toString(t)})}nonpositive(t){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:U.toString(t)})}nonnegative(t){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:U.toString(t)})}multipleOf(t,n){return this._addCheck({kind:"multipleOf",value:t,message:U.toString(n)})}get minValue(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxValue(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.valuenew rr({checks:[],typeName:G.ZodBigInt,coerce:e?.coerce??!1,...ee(e)});class so extends se{_parse(t){if(this._def.coerce&&(t.data=!!t.data),this._getType(t)!==D.boolean){const r=this._getOrReturnCtx(t);return M(r,{code:P.invalid_type,expected:D.boolean,received:r.parsedType}),Y}return et(t.data)}}so.create=e=>new so({typeName:G.ZodBoolean,coerce:e?.coerce||!1,...ee(e)});class Vr extends se{_parse(t){if(this._def.coerce&&(t.data=new Date(t.data)),this._getType(t)!==D.date){const a=this._getOrReturnCtx(t);return M(a,{code:P.invalid_type,expected:D.date,received:a.parsedType}),Y}if(Number.isNaN(t.data.getTime())){const a=this._getOrReturnCtx(t);return M(a,{code:P.invalid_date}),Y}const r=new je;let s;for(const a of this._def.checks)a.kind==="min"?t.data.getTime()a.value&&(s=this._getOrReturnCtx(t,s),M(s,{code:P.too_big,message:a.message,inclusive:!0,exact:!1,maximum:a.value,type:"date"}),r.dirty()):le.assertNever(a);return{status:r.value,value:new Date(t.data.getTime())}}_addCheck(t){return new Vr({...this._def,checks:[...this._def.checks,t]})}min(t,n){return this._addCheck({kind:"min",value:t.getTime(),message:U.toString(n)})}max(t,n){return this._addCheck({kind:"max",value:t.getTime(),message:U.toString(n)})}get minDate(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t!=null?new Date(t):null}get maxDate(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.valuenew Vr({checks:[],coerce:e?.coerce||!1,typeName:G.ZodDate,...ee(e)});class ao extends se{_parse(t){if(this._getType(t)!==D.symbol){const r=this._getOrReturnCtx(t);return M(r,{code:P.invalid_type,expected:D.symbol,received:r.parsedType}),Y}return et(t.data)}}ao.create=e=>new ao({typeName:G.ZodSymbol,...ee(e)});class aa extends se{_parse(t){if(this._getType(t)!==D.undefined){const r=this._getOrReturnCtx(t);return M(r,{code:P.invalid_type,expected:D.undefined,received:r.parsedType}),Y}return et(t.data)}}aa.create=e=>new aa({typeName:G.ZodUndefined,...ee(e)});class ia extends se{_parse(t){if(this._getType(t)!==D.null){const r=this._getOrReturnCtx(t);return M(r,{code:P.invalid_type,expected:D.null,received:r.parsedType}),Y}return et(t.data)}}ia.create=e=>new ia({typeName:G.ZodNull,...ee(e)});class oa extends se{constructor(){super(...arguments),this._any=!0}_parse(t){return et(t.data)}}oa.create=e=>new oa({typeName:G.ZodAny,...ee(e)});class io extends se{constructor(){super(...arguments),this._unknown=!0}_parse(t){return et(t.data)}}io.create=e=>new io({typeName:G.ZodUnknown,...ee(e)});class qt extends se{_parse(t){const n=this._getOrReturnCtx(t);return M(n,{code:P.invalid_type,expected:D.never,received:n.parsedType}),Y}}qt.create=e=>new qt({typeName:G.ZodNever,...ee(e)});class oo extends se{_parse(t){if(this._getType(t)!==D.undefined){const r=this._getOrReturnCtx(t);return M(r,{code:P.invalid_type,expected:D.void,received:r.parsedType}),Y}return et(t.data)}}oo.create=e=>new oo({typeName:G.ZodVoid,...ee(e)});class mt extends se{_parse(t){const{ctx:n,status:r}=this._processInputParams(t),s=this._def;if(n.parsedType!==D.array)return M(n,{code:P.invalid_type,expected:D.array,received:n.parsedType}),Y;if(s.exactLength!==null){const i=n.data.length>s.exactLength.value,o=n.data.lengths.maxLength.value&&(M(n,{code:P.too_big,maximum:s.maxLength.value,type:"array",inclusive:!0,exact:!1,message:s.maxLength.message}),r.dirty()),n.common.async)return Promise.all([...n.data].map((i,o)=>s.type._parseAsync(new yt(n,i,n.path,o)))).then(i=>je.mergeArray(r,i));const a=[...n.data].map((i,o)=>s.type._parseSync(new yt(n,i,n.path,o)));return je.mergeArray(r,a)}get element(){return this._def.type}min(t,n){return new mt({...this._def,minLength:{value:t,message:U.toString(n)}})}max(t,n){return new mt({...this._def,maxLength:{value:t,message:U.toString(n)}})}length(t,n){return new mt({...this._def,exactLength:{value:t,message:U.toString(n)}})}nonempty(t){return this.min(1,t)}}mt.create=(e,t)=>new mt({type:e,minLength:null,maxLength:null,exactLength:null,typeName:G.ZodArray,...ee(t)});function kn(e){if(e instanceof xe){const t={};for(const n in e.shape){const r=e.shape[n];t[n]=Lt.create(kn(r))}return new xe({...e._def,shape:()=>t})}else return e instanceof mt?new mt({...e._def,type:kn(e.element)}):e instanceof Lt?Lt.create(kn(e.unwrap())):e instanceof hn?hn.create(kn(e.unwrap())):e instanceof un?un.create(e.items.map(t=>kn(t))):e}class xe extends se{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;const t=this._def.shape(),n=le.objectKeys(t);return this._cached={shape:t,keys:n},this._cached}_parse(t){if(this._getType(t)!==D.object){const u=this._getOrReturnCtx(t);return M(u,{code:P.invalid_type,expected:D.object,received:u.parsedType}),Y}const{status:r,ctx:s}=this._processInputParams(t),{shape:a,keys:i}=this._getCached(),o=[];if(!(this._def.catchall instanceof qt&&this._def.unknownKeys==="strip"))for(const u in s.data)i.includes(u)||o.push(u);const l=[];for(const u of i){const c=a[u],h=s.data[u];l.push({key:{status:"valid",value:u},value:c._parse(new yt(s,h,s.path,u)),alwaysSet:u in s.data})}if(this._def.catchall instanceof qt){const u=this._def.unknownKeys;if(u==="passthrough")for(const c of o)l.push({key:{status:"valid",value:c},value:{status:"valid",value:s.data[c]}});else if(u==="strict")o.length>0&&(M(s,{code:P.unrecognized_keys,keys:o}),r.dirty());else if(u!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{const u=this._def.catchall;for(const c of o){const h=s.data[c];l.push({key:{status:"valid",value:c},value:u._parse(new yt(s,h,s.path,c)),alwaysSet:c in s.data})}}return s.common.async?Promise.resolve().then(async()=>{const u=[];for(const c of l){const h=await c.key,b=await c.value;u.push({key:h,value:b,alwaysSet:c.alwaysSet})}return u}).then(u=>je.mergeObjectSync(r,u)):je.mergeObjectSync(r,l)}get shape(){return this._def.shape()}strict(t){return U.errToObj,new xe({...this._def,unknownKeys:"strict",...t!==void 0?{errorMap:(n,r)=>{const s=this._def.errorMap?.(n,r).message??r.defaultError;return n.code==="unrecognized_keys"?{message:U.errToObj(t).message??s}:{message:s}}}:{}})}strip(){return new xe({...this._def,unknownKeys:"strip"})}passthrough(){return new xe({...this._def,unknownKeys:"passthrough"})}extend(t){return new xe({...this._def,shape:()=>({...this._def.shape(),...t})})}merge(t){return new xe({unknownKeys:t._def.unknownKeys,catchall:t._def.catchall,shape:()=>({...this._def.shape(),...t._def.shape()}),typeName:G.ZodObject})}setKey(t,n){return this.augment({[t]:n})}catchall(t){return new xe({...this._def,catchall:t})}pick(t){const n={};for(const r of le.objectKeys(t))t[r]&&this.shape[r]&&(n[r]=this.shape[r]);return new xe({...this._def,shape:()=>n})}omit(t){const n={};for(const r of le.objectKeys(this.shape))t[r]||(n[r]=this.shape[r]);return new xe({...this._def,shape:()=>n})}deepPartial(){return kn(this)}partial(t){const n={};for(const r of le.objectKeys(this.shape)){const s=this.shape[r];t&&!t[r]?n[r]=s:n[r]=s.optional()}return new xe({...this._def,shape:()=>n})}required(t){const n={};for(const r of le.objectKeys(this.shape))if(t&&!t[r])n[r]=this.shape[r];else{let a=this.shape[r];for(;a instanceof Lt;)a=a._def.innerType;n[r]=a}return new xe({...this._def,shape:()=>n})}keyof(){return Il(le.objectKeys(this.shape))}}xe.create=(e,t)=>new xe({shape:()=>e,unknownKeys:"strip",catchall:qt.create(),typeName:G.ZodObject,...ee(t)});xe.strictCreate=(e,t)=>new xe({shape:()=>e,unknownKeys:"strict",catchall:qt.create(),typeName:G.ZodObject,...ee(t)});xe.lazycreate=(e,t)=>new xe({shape:e,unknownKeys:"strip",catchall:qt.create(),typeName:G.ZodObject,...ee(t)});class $r extends se{_parse(t){const{ctx:n}=this._processInputParams(t),r=this._def.options;function s(a){for(const o of a)if(o.result.status==="valid")return o.result;for(const o of a)if(o.result.status==="dirty")return n.common.issues.push(...o.ctx.common.issues),o.result;const i=a.map(o=>new Ot(o.ctx.common.issues));return M(n,{code:P.invalid_union,unionErrors:i}),Y}if(n.common.async)return Promise.all(r.map(async a=>{const i={...n,common:{...n.common,issues:[]},parent:null};return{result:await a._parseAsync({data:n.data,path:n.path,parent:i}),ctx:i}})).then(s);{let a;const i=[];for(const l of r){const u={...n,common:{...n.common,issues:[]},parent:null},c=l._parseSync({data:n.data,path:n.path,parent:u});if(c.status==="valid")return c;c.status==="dirty"&&!a&&(a={result:c,ctx:u}),u.common.issues.length&&i.push(u.common.issues)}if(a)return n.common.issues.push(...a.ctx.common.issues),a.result;const o=i.map(l=>new Ot(l));return M(n,{code:P.invalid_union,unionErrors:o}),Y}}get options(){return this._def.options}}$r.create=(e,t)=>new $r({options:e,typeName:G.ZodUnion,...ee(t)});const Tt=e=>e instanceof Kr?Tt(e.schema):e instanceof fn?Tt(e.innerType()):e instanceof Zr?[e.value]:e instanceof dn?e.options:e instanceof ca?le.objectValues(e.enum):e instanceof Yr?Tt(e._def.innerType):e instanceof aa?[void 0]:e instanceof ia?[null]:e instanceof Lt?[void 0,...Tt(e.unwrap())]:e instanceof hn?[null,...Tt(e.unwrap())]:e instanceof Ll||e instanceof Qr?Tt(e.unwrap()):e instanceof Gr?Tt(e._def.innerType):[];class Ra extends se{_parse(t){const{ctx:n}=this._processInputParams(t);if(n.parsedType!==D.object)return M(n,{code:P.invalid_type,expected:D.object,received:n.parsedType}),Y;const r=this.discriminator,s=n.data[r],a=this.optionsMap.get(s);return a?n.common.async?a._parseAsync({data:n.data,path:n.path,parent:n}):a._parseSync({data:n.data,path:n.path,parent:n}):(M(n,{code:P.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[r]}),Y)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(t,n,r){const s=new Map;for(const a of n){const i=Tt(a.shape[t]);if(!i.length)throw new Error(`A discriminator value for key \`${t}\` could not be extracted from all schema options`);for(const o of i){if(s.has(o))throw new Error(`Discriminator property ${String(t)} has duplicate value ${String(o)}`);s.set(o,a)}}return new Ra({typeName:G.ZodDiscriminatedUnion,discriminator:t,options:n,optionsMap:s,...ee(r)})}}function la(e,t){const n=Ht(e),r=Ht(t);if(e===t)return{valid:!0,data:e};if(n===D.object&&r===D.object){const s=le.objectKeys(t),a=le.objectKeys(e).filter(o=>s.indexOf(o)!==-1),i={...e,...t};for(const o of a){const l=la(e[o],t[o]);if(!l.valid)return{valid:!1};i[o]=l.data}return{valid:!0,data:i}}else if(n===D.array&&r===D.array){if(e.length!==t.length)return{valid:!1};const s=[];for(let a=0;a{if(to(a)||to(i))return Y;const o=la(a.value,i.value);return o.valid?((no(a)||no(i))&&n.dirty(),{status:n.value,value:o.data}):(M(r,{code:P.invalid_intersection_types}),Y)};return r.common.async?Promise.all([this._def.left._parseAsync({data:r.data,path:r.path,parent:r}),this._def.right._parseAsync({data:r.data,path:r.path,parent:r})]).then(([a,i])=>s(a,i)):s(this._def.left._parseSync({data:r.data,path:r.path,parent:r}),this._def.right._parseSync({data:r.data,path:r.path,parent:r}))}}Wr.create=(e,t,n)=>new Wr({left:e,right:t,typeName:G.ZodIntersection,...ee(n)});class un extends se{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==D.array)return M(r,{code:P.invalid_type,expected:D.array,received:r.parsedType}),Y;if(r.data.lengththis._def.items.length&&(M(r,{code:P.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),n.dirty());const a=[...r.data].map((i,o)=>{const l=this._def.items[o]||this._def.rest;return l?l._parse(new yt(r,i,r.path,o)):null}).filter(i=>!!i);return r.common.async?Promise.all(a).then(i=>je.mergeArray(n,i)):je.mergeArray(n,a)}get items(){return this._def.items}rest(t){return new un({...this._def,rest:t})}}un.create=(e,t)=>{if(!Array.isArray(e))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new un({items:e,typeName:G.ZodTuple,rest:null,...ee(t)})};class Hr extends se{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==D.object)return M(r,{code:P.invalid_type,expected:D.object,received:r.parsedType}),Y;const s=[],a=this._def.keyType,i=this._def.valueType;for(const o in r.data)s.push({key:a._parse(new yt(r,o,r.path,o)),value:i._parse(new yt(r,r.data[o],r.path,o)),alwaysSet:o in r.data});return r.common.async?je.mergeObjectAsync(n,s):je.mergeObjectSync(n,s)}get element(){return this._def.valueType}static create(t,n,r){return n instanceof se?new Hr({keyType:t,valueType:n,typeName:G.ZodRecord,...ee(r)}):new Hr({keyType:Et.create(),valueType:t,typeName:G.ZodRecord,...ee(n)})}}class lo extends se{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==D.map)return M(r,{code:P.invalid_type,expected:D.map,received:r.parsedType}),Y;const s=this._def.keyType,a=this._def.valueType,i=[...r.data.entries()].map(([o,l],u)=>({key:s._parse(new yt(r,o,r.path,[u,"key"])),value:a._parse(new yt(r,l,r.path,[u,"value"]))}));if(r.common.async){const o=new Map;return Promise.resolve().then(async()=>{for(const l of i){const u=await l.key,c=await l.value;if(u.status==="aborted"||c.status==="aborted")return Y;(u.status==="dirty"||c.status==="dirty")&&n.dirty(),o.set(u.value,c.value)}return{status:n.value,value:o}})}else{const o=new Map;for(const l of i){const u=l.key,c=l.value;if(u.status==="aborted"||c.status==="aborted")return Y;(u.status==="dirty"||c.status==="dirty")&&n.dirty(),o.set(u.value,c.value)}return{status:n.value,value:o}}}}lo.create=(e,t,n)=>new lo({valueType:t,keyType:e,typeName:G.ZodMap,...ee(n)});class sr extends se{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==D.set)return M(r,{code:P.invalid_type,expected:D.set,received:r.parsedType}),Y;const s=this._def;s.minSize!==null&&r.data.sizes.maxSize.value&&(M(r,{code:P.too_big,maximum:s.maxSize.value,type:"set",inclusive:!0,exact:!1,message:s.maxSize.message}),n.dirty());const a=this._def.valueType;function i(l){const u=new Set;for(const c of l){if(c.status==="aborted")return Y;c.status==="dirty"&&n.dirty(),u.add(c.value)}return{status:n.value,value:u}}const o=[...r.data.values()].map((l,u)=>a._parse(new yt(r,l,r.path,u)));return r.common.async?Promise.all(o).then(l=>i(l)):i(o)}min(t,n){return new sr({...this._def,minSize:{value:t,message:U.toString(n)}})}max(t,n){return new sr({...this._def,maxSize:{value:t,message:U.toString(n)}})}size(t,n){return this.min(t,n).max(t,n)}nonempty(t){return this.min(1,t)}}sr.create=(e,t)=>new sr({valueType:e,minSize:null,maxSize:null,typeName:G.ZodSet,...ee(t)});class Kr extends se{get schema(){return this._def.getter()}_parse(t){const{ctx:n}=this._processInputParams(t);return this._def.getter()._parse({data:n.data,path:n.path,parent:n})}}Kr.create=(e,t)=>new Kr({getter:e,typeName:G.ZodLazy,...ee(t)});class Zr extends se{_parse(t){if(t.data!==this._def.value){const n=this._getOrReturnCtx(t);return M(n,{received:n.data,code:P.invalid_literal,expected:this._def.value}),Y}return{status:"valid",value:t.data}}get value(){return this._def.value}}Zr.create=(e,t)=>new Zr({value:e,typeName:G.ZodLiteral,...ee(t)});function Il(e,t){return new dn({values:e,typeName:G.ZodEnum,...ee(t)})}class dn extends se{_parse(t){if(typeof t.data!="string"){const n=this._getOrReturnCtx(t),r=this._def.values;return M(n,{expected:le.joinValues(r),received:n.parsedType,code:P.invalid_type}),Y}if(this._cache||(this._cache=new Set(this._def.values)),!this._cache.has(t.data)){const n=this._getOrReturnCtx(t),r=this._def.values;return M(n,{received:n.data,code:P.invalid_enum_value,options:r}),Y}return et(t.data)}get options(){return this._def.values}get enum(){const t={};for(const n of this._def.values)t[n]=n;return t}get Values(){const t={};for(const n of this._def.values)t[n]=n;return t}get Enum(){const t={};for(const n of this._def.values)t[n]=n;return t}extract(t,n=this._def){return dn.create(t,{...this._def,...n})}exclude(t,n=this._def){return dn.create(this.options.filter(r=>!t.includes(r)),{...this._def,...n})}}dn.create=Il;class ca extends se{_parse(t){const n=le.getValidEnumValues(this._def.values),r=this._getOrReturnCtx(t);if(r.parsedType!==D.string&&r.parsedType!==D.number){const s=le.objectValues(n);return M(r,{expected:le.joinValues(s),received:r.parsedType,code:P.invalid_type}),Y}if(this._cache||(this._cache=new Set(le.getValidEnumValues(this._def.values))),!this._cache.has(t.data)){const s=le.objectValues(n);return M(r,{received:r.data,code:P.invalid_enum_value,options:s}),Y}return et(t.data)}get enum(){return this._def.values}}ca.create=(e,t)=>new ca({values:e,typeName:G.ZodNativeEnum,...ee(t)});class qr extends se{unwrap(){return this._def.type}_parse(t){const{ctx:n}=this._processInputParams(t);if(n.parsedType!==D.promise&&n.common.async===!1)return M(n,{code:P.invalid_type,expected:D.promise,received:n.parsedType}),Y;const r=n.parsedType===D.promise?n.data:Promise.resolve(n.data);return et(r.then(s=>this._def.type.parseAsync(s,{path:n.path,errorMap:n.common.contextualErrorMap})))}}qr.create=(e,t)=>new qr({type:e,typeName:G.ZodPromise,...ee(t)});class fn extends se{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===G.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(t){const{status:n,ctx:r}=this._processInputParams(t),s=this._def.effect||null,a={addIssue:i=>{M(r,i),i.fatal?n.abort():n.dirty()},get path(){return r.path}};if(a.addIssue=a.addIssue.bind(a),s.type==="preprocess"){const i=s.transform(r.data,a);if(r.common.async)return Promise.resolve(i).then(async o=>{if(n.value==="aborted")return Y;const l=await this._def.schema._parseAsync({data:o,path:r.path,parent:r});return l.status==="aborted"?Y:l.status==="dirty"||n.value==="dirty"?Bn(l.value):l});{if(n.value==="aborted")return Y;const o=this._def.schema._parseSync({data:i,path:r.path,parent:r});return o.status==="aborted"?Y:o.status==="dirty"||n.value==="dirty"?Bn(o.value):o}}if(s.type==="refinement"){const i=o=>{const l=s.refinement(o,a);if(r.common.async)return Promise.resolve(l);if(l instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return o};if(r.common.async===!1){const o=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});return o.status==="aborted"?Y:(o.status==="dirty"&&n.dirty(),i(o.value),{status:n.value,value:o.value})}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(o=>o.status==="aborted"?Y:(o.status==="dirty"&&n.dirty(),i(o.value).then(()=>({status:n.value,value:o.value}))))}if(s.type==="transform")if(r.common.async===!1){const i=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});if(!Rn(i))return Y;const o=s.transform(i.value,a);if(o instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:n.value,value:o}}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(i=>Rn(i)?Promise.resolve(s.transform(i.value,a)).then(o=>({status:n.value,value:o})):Y);le.assertNever(s)}}fn.create=(e,t,n)=>new fn({schema:e,typeName:G.ZodEffects,effect:t,...ee(n)});fn.createWithPreprocess=(e,t,n)=>new fn({schema:t,effect:{type:"preprocess",transform:e},typeName:G.ZodEffects,...ee(n)});class Lt extends se{_parse(t){return this._getType(t)===D.undefined?et(void 0):this._def.innerType._parse(t)}unwrap(){return this._def.innerType}}Lt.create=(e,t)=>new Lt({innerType:e,typeName:G.ZodOptional,...ee(t)});class hn extends se{_parse(t){return this._getType(t)===D.null?et(null):this._def.innerType._parse(t)}unwrap(){return this._def.innerType}}hn.create=(e,t)=>new hn({innerType:e,typeName:G.ZodNullable,...ee(t)});class Yr extends se{_parse(t){const{ctx:n}=this._processInputParams(t);let r=n.data;return n.parsedType===D.undefined&&(r=this._def.defaultValue()),this._def.innerType._parse({data:r,path:n.path,parent:n})}removeDefault(){return this._def.innerType}}Yr.create=(e,t)=>new Yr({innerType:e,typeName:G.ZodDefault,defaultValue:typeof t.default=="function"?t.default:()=>t.default,...ee(t)});class Gr extends se{_parse(t){const{ctx:n}=this._processInputParams(t),r={...n,common:{...n.common,issues:[]}},s=this._def.innerType._parse({data:r.data,path:r.path,parent:{...r}});return jr(s)?s.then(a=>({status:"valid",value:a.status==="valid"?a.value:this._def.catchValue({get error(){return new Ot(r.common.issues)},input:r.data})})):{status:"valid",value:s.status==="valid"?s.value:this._def.catchValue({get error(){return new Ot(r.common.issues)},input:r.data})}}removeCatch(){return this._def.innerType}}Gr.create=(e,t)=>new Gr({innerType:e,typeName:G.ZodCatch,catchValue:typeof t.catch=="function"?t.catch:()=>t.catch,...ee(t)});class co extends se{_parse(t){if(this._getType(t)!==D.nan){const r=this._getOrReturnCtx(t);return M(r,{code:P.invalid_type,expected:D.nan,received:r.parsedType}),Y}return{status:"valid",value:t.data}}}co.create=e=>new co({typeName:G.ZodNaN,...ee(e)});class Ll extends se{_parse(t){const{ctx:n}=this._processInputParams(t),r=n.data;return this._def.type._parse({data:r,path:n.path,parent:n})}unwrap(){return this._def.type}}class Ma extends se{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.common.async)return(async()=>{const a=await this._def.in._parseAsync({data:r.data,path:r.path,parent:r});return a.status==="aborted"?Y:a.status==="dirty"?(n.dirty(),Bn(a.value)):this._def.out._parseAsync({data:a.value,path:r.path,parent:r})})();{const s=this._def.in._parseSync({data:r.data,path:r.path,parent:r});return s.status==="aborted"?Y:s.status==="dirty"?(n.dirty(),{status:"dirty",value:s.value}):this._def.out._parseSync({data:s.value,path:r.path,parent:r})}}static create(t,n){return new Ma({in:t,out:n,typeName:G.ZodPipeline})}}class Qr extends se{_parse(t){const n=this._def.innerType._parse(t),r=s=>(Rn(s)&&(s.value=Object.freeze(s.value)),s);return jr(n)?n.then(s=>r(s)):r(n)}unwrap(){return this._def.innerType}}Qr.create=(e,t)=>new Qr({innerType:e,typeName:G.ZodReadonly,...ee(t)});var G;(function(e){e.ZodString="ZodString",e.ZodNumber="ZodNumber",e.ZodNaN="ZodNaN",e.ZodBigInt="ZodBigInt",e.ZodBoolean="ZodBoolean",e.ZodDate="ZodDate",e.ZodSymbol="ZodSymbol",e.ZodUndefined="ZodUndefined",e.ZodNull="ZodNull",e.ZodAny="ZodAny",e.ZodUnknown="ZodUnknown",e.ZodNever="ZodNever",e.ZodVoid="ZodVoid",e.ZodArray="ZodArray",e.ZodObject="ZodObject",e.ZodUnion="ZodUnion",e.ZodDiscriminatedUnion="ZodDiscriminatedUnion",e.ZodIntersection="ZodIntersection",e.ZodTuple="ZodTuple",e.ZodRecord="ZodRecord",e.ZodMap="ZodMap",e.ZodSet="ZodSet",e.ZodFunction="ZodFunction",e.ZodLazy="ZodLazy",e.ZodLiteral="ZodLiteral",e.ZodEnum="ZodEnum",e.ZodEffects="ZodEffects",e.ZodNativeEnum="ZodNativeEnum",e.ZodOptional="ZodOptional",e.ZodNullable="ZodNullable",e.ZodDefault="ZodDefault",e.ZodCatch="ZodCatch",e.ZodPromise="ZodPromise",e.ZodBranded="ZodBranded",e.ZodPipeline="ZodPipeline",e.ZodReadonly="ZodReadonly"})(G||(G={}));const wn=Et.create,Kh=oa.create;qt.create;const ua=mt.create,ar=xe.create;$r.create;const Zh=Ra.create;Wr.create;un.create;const qh=Hr.create,Yh=Kr.create,uo=Zr.create,Gh=dn.create;qr.create;Lt.create;hn.create;const Qh=ar({id:wn().min(1),type:wn().min(1),props:qh(Kh()).optional().default({}),bind:wn().optional(),emit:wn().optional()}),Rl=Yh(()=>Zh("type",[ar({type:uo("split"),orientation:Gh(["horizontal","vertical"]),children:ua(Rl).min(1)}),ar({type:uo("leaf"),title:wn().optional(),widgets:ua(wn()).min(1)})])),Jh=ar({ui:ar({widgets:ua(Qh).default([]),layout:Rl})});function Xh(e){const t=Jh.safeParse(e);if(!t.success){const o=t.error.issues[0],l=o.path.length?o.path.join("."):"ui";return{ok:!1,error:{message:o.message,path:l}}}const n=t.data,r=new Set;for(const o of n.ui.widgets){if(r.has(o.id))return{ok:!1,error:{message:`duplicate widget id: ${o.id}`,path:"ui.widgets"}};r.add(o.id)}const s=new Set(n.ui.widgets.map(o=>o.id)),a=[];function i(o,l){o.type==="split"?o.children.forEach((u,c)=>i(u,`${l}.children[${c}]`)):o.widgets.forEach((u,c)=>{s.has(u)||a.push(`${l}.widgets[${c}] -> ${u}`)})}return i(n.ui.layout,"ui.layout"),a.length?{ok:!1,error:{message:`unknown widget id: ${a[0]}`,path:"ui.layout"}}:{ok:!0,value:n}}const eg=`ui: + widgets: + - id: wifi-ssid + type: input.text + props: + label: WiFi SSID + hint: 输入网络名称 + default: Office_Network + bind: wifi.ssid + - id: wifi-enabled + type: input.switch + props: + label: 启用 WiFi + default: true + bind: wifi.enabled + - id: apply + type: action.button + props: + label: 应用设置 + payload: + scope: wifi + emit: action.wifi.apply + - id: log-panel + type: log.viewer + props: + title: WiFi 事件日志 + bind: wifi.events + layout: + type: split + orientation: horizontal + children: + - type: leaf + title: 网络配置 + widgets: [wifi-ssid, wifi-enabled, apply] + - type: leaf + title: 事件流 + widgets: [log-panel] +`,tg=yh("uiRuntime",{state:()=>({yamlText:eg,lastGoodConfig:null,parseError:null,widgetsById:{},selectedWidgetId:null,inputValues:{},eventLog:[],dataBus:{},_debounceTimer:0}),actions:{setYamlText(e){this.yamlText=e},tryParseAndValidate(){this._debounceTimer&&clearTimeout(this._debounceTimer),this._debounceTimer=window.setTimeout(()=>{this._parseWithBridge()},300)},async _parseWithBridge(){const e=window.bridge;if(e&&e.parse_ui_yaml)try{const t=await Promise.resolve(e.parse_ui_yaml(this.yamlText));this._handleParseResult(t);return}catch(t){this.parseError={message:String(t||"bridge parse error")};return}this.parseError={message:"WebBridge unavailable for YAML parsing"}},_handleParseResult(e){if(!e.ok){const s=e.error||{message:"YAML parse error"};this.parseError={message:s.message,line:s.line,column:s.column};return}const t=Xh(e.value);if(!t.ok){this.parseError={message:t.error.message,path:t.error.path};return}const n=t.value,r={};n.ui.widgets.forEach(s=>{r[s.id]={...s,props:s.props||{}}}),this.widgetsById=r,this.lastGoodConfig=n,this.parseError=null},selectWidget(e){this.selectedWidgetId=e},getInputValue(e,t){return this.inputValues[e]===void 0&&t!==void 0&&(this.inputValues[e]=t),this.inputValues[e]},setInputValue(e,t,n){this.inputValues[e]=t,n&&this.pushData(n,t)},dispatchEvent(e){this.eventLog.push({ts:Date.now(),...e});const t=window.bridge;t&&t.dispatch_ui_event&&t.dispatch_ui_event({ts:Date.now(),...e})},pushData(e,t){this.dataBus[e]||(this.dataBus[e]=[]),this.dataBus[e].push({ts:Date.now(),value:t}),this.dataBus[e].length>200&&(this.dataBus[e]=this.dataBus[e].slice(-200))},bindBridge(e){!e||!e.ui_event_log||e.ui_event_log.connect(t=>{t&&this.eventLog.push({ts:t.ts?Number(t.ts):Date.now(),emit:t.emit||"",payload:t.payload,source:t.source})})}}}),ng={"nav.manual":"串口终端","nav.scripts":"自动脚本","nav.proxy":"代理监控","nav.protocols":"协议管理","nav.settings":"设置","nav.workspace":"管理员工作区","header.manual.title":"串口终端","header.manual.desc":"传统串口调试工具:发送命令,监听 I/O 与日志回显。","header.scripts.title":"自动脚本","header.scripts.desc":"用于协议解析与测试脚本自动化执行。","header.proxy.title":"代理监控","header.proxy.desc":"管理转发链路并实时监控数据流状态。","header.protocols.title":"协议管理","header.protocols.desc":"配置通信协议定义,绑定通道并设置解析规则。","header.settings.title":"应用设置","header.settings.desc":"管理全局偏好、协议默认值和运行时环境配置。","action.refresh":"刷新","action.createProtocol":"新建协议","action.discardChanges":"放弃更改","action.saveChanges":"保存修改","action.docsCenter":"文档中心","action.loadScript":"加载脚本","action.save":"保存","badge.readOnly":"只读","action.refreshStatus":"刷新状态","action.newProxy":"新建转发对","action.connect":"连接","action.disconnect":"断开","filter.all":"全部","filter.running":"运行中","filter.stopped":"已停止","filter.error":"异常","status.connected":"已连接","status.disconnected":"未连接","status.error":"错误","status.connecting":"连接中","protocol.tab.all":"全部协议","protocol.tab.modbus":"Modbus","protocol.tab.tcp":"TCP/IP","protocol.tab.custom":"自定义","settings.tab.general":"通用","settings.tab.plugins":"插件","settings.tab.runtime":"运行时","settings.tab.logs":"日志","settings.language":"界面语言","settings.theme":"主题偏好","settings.autoConnect.title":"启动时自动连接","settings.autoConnect.desc":"自动尝试重连上次活动的通道。","settings.workspace":"工作目录","settings.chooseFolder":"选择目录","settings.plugins.title":"插件管理","settings.plugins.refresh":"刷新列表","settings.plugins.directory":"插件目录","settings.protocols.title":"协议包","settings.filter.enabled":"已启用","settings.filter.available":"可用","settings.meta.unversioned":"未标注版本","settings.empty.filtered":"当前筛选无结果","settings.empty.noPlugins":"未发现可用插件","settings.empty.noProtocols":"未发现可用协议包","settings.runtime.placeholder":"暂无可配置项,运行时设置将随着模块扩展开放。","settings.logs.placeholder":"日志采集与归档策略将在后续版本中提供。","lang.zhCN":"简体中文","lang.zhTW":"繁體中文","lang.enUS":"English (US)","lang.jaJP":"日本語","lang.koKR":"한국어","lang.frFR":"Français","lang.deDE":"Deutsch","lang.esES":"Español","lang.ptBR":"Português (Brasil)","lang.ruRU":"Русский","lang.ar":"العربية","lang.hi":"हिन्दी","lang.itIT":"Italiano","lang.nlNL":"Nederlands","lang.thTH":"ไทย","lang.viVN":"Tiếng Việt","lang.idID":"Bahasa Indonesia","lang.trTR":"Türkçe","lang.plPL":"Polski","lang.ukUA":"Українська","theme.system":"系统默认","theme.dark":"深色 (工程模式)","theme.light":"浅色"},Ae={"nav.manual":"Serial Terminal","nav.scripts":"Automation Scripts","nav.proxy":"Proxy Monitor","nav.protocols":"Protocol Manager","nav.settings":"Settings","nav.workspace":"Admin Workspace","header.manual.title":"Serial Terminal","header.manual.desc":"Classic serial console for sending commands, monitoring I/O and logs.","header.scripts.title":"Automation Scripts","header.scripts.desc":"Run parsing and test automation scripts.","header.proxy.title":"Proxy Monitor","header.proxy.desc":"Manage forwarding links and monitor data streams.","header.protocols.title":"Protocol Manager","header.protocols.desc":"Define protocols, bind channels, and configure parsing rules.","header.settings.title":"App Settings","header.settings.desc":"Manage global preferences, defaults, and runtime configuration.","action.refresh":"Refresh","action.createProtocol":"New Protocol","action.discardChanges":"Discard Changes","action.saveChanges":"Save Changes","action.docsCenter":"Documentation","action.loadScript":"Load Script","action.save":"Save","badge.readOnly":"Read-only","action.refreshStatus":"Refresh Status","action.newProxy":"New Forward Pair","action.connect":"Connect","action.disconnect":"Disconnect","filter.all":"All","filter.running":"Running","filter.stopped":"Stopped","filter.error":"Error","status.connected":"Connected","status.disconnected":"Disconnected","status.error":"Error","status.connecting":"Connecting","protocol.tab.all":"All Protocols","protocol.tab.modbus":"Modbus","protocol.tab.tcp":"TCP/IP","protocol.tab.custom":"Custom","settings.tab.general":"General","settings.tab.plugins":"Plugins","settings.tab.runtime":"Runtime","settings.tab.logs":"Logs","settings.language":"Language","settings.theme":"Theme","settings.autoConnect.title":"Auto-connect on launch","settings.autoConnect.desc":"Reconnect to the last active channel automatically.","settings.workspace":"Workspace","settings.chooseFolder":"Choose Folder","settings.plugins.title":"Plugins","settings.plugins.refresh":"Refresh List","settings.plugins.directory":"Plugin Directory","settings.protocols.title":"Protocol Packages","settings.filter.enabled":"Enabled","settings.filter.available":"Available","settings.meta.unversioned":"Version not specified","settings.empty.filtered":"No results for current filter","settings.empty.noPlugins":"No available plugins found","settings.empty.noProtocols":"No available protocol packages found","settings.runtime.placeholder":"No configurable items yet. Runtime settings will be opened as modules expand.","settings.logs.placeholder":"Log collection and archive policy will be provided in a later release.","lang.zhCN":"简体中文","lang.zhTW":"繁體中文","lang.enUS":"English (US)","lang.jaJP":"日本語","lang.koKR":"한국어","lang.frFR":"Français","lang.deDE":"Deutsch","lang.esES":"Español","lang.ptBR":"Português (Brasil)","lang.ruRU":"Русский","lang.ar":"العربية","lang.hi":"हिन्दी","lang.itIT":"Italiano","lang.nlNL":"Nederlands","lang.thTH":"ไทย","lang.viVN":"Tiếng Việt","lang.idID":"Bahasa Indonesia","lang.trTR":"Türkçe","lang.plPL":"Polski","lang.ukUA":"Українська","theme.system":"System","theme.dark":"Dark (Engineer)","theme.light":"Light",Copy:"Copy","DSL 编辑器":"DSL Editor","GPS 模块数据流":"GPS Module Data Stream","IO 监控":"I/O Monitor","MQTT 适配器":"MQTT Adapter","TCP / 网络":"TCP / Network","TCP 客户端":"TCP Client","TCP 服务端":"TCP Server","TCP 端口":"TCP Port","UI YAML 预览":"UI YAML Preview","YAML UI 编辑器":"YAML UI Editor",复制:"Copy",展开:"Expand",搜索:"Search",收起:"Collapse",清空日志:"Clear Logs",滚动到底部:"Scroll to Bottom","v0.9.8 - 未安装":"v0.9.8 - Not Installed","v1.2.4 - 已启用":"v1.2.4 - Enabled","丢包率 (Packet Loss)":"Packet Loss","串口 (Serial)":"Serial","串口 (UART)":"Serial (UART)",串口参数:"Serial Parameters",串口参数配置:"Serial Parameter Setup",串口端口:"Serial Port",串口设置:"Serial Settings",串口通道:"Serial Channel",串口配置:"Serial Configuration",主控制器链路:"Main Controller Link",主机源端口:"Host Source Port",主机端口:"Host Port",代理名称:"Proxy Name","例如:192.168.1.10":"Example: 192.168.1.10","例如:CMD PING":"Example: CMD PING","例如:传感器A接口":"Example: Sensor A Interface",保存:"Save",保存修改:"Save Changes",保存后立即连接:"Connect after saving",保存配置:"Save Configuration",停止:"Stop",停止位:"Stop Bits",偶校验:"Even Parity",全部日志:"All Logs",共:"Total","写超时 (ms)":"Write Timeout (ms)",分类:"Category",列:"Columns",创建后立即启动连接:"Start connection after creation",创建指令:"Create Command",创建新的快捷调试指令:"Create a new quick command",创建通道:"Create Channel",删除:"Delete","删除前将停止转发。":"Forwarding will stop before deletion.",删除协议:"Delete Protocol",删除快捷指令:"Delete Quick Command",刷新:"Refresh",刷新串口:"Refresh Ports",动作:"Action",协议:"Protocol",协议名称:"Protocol Name","协议层级解析 (PROTOCOL TREE)":"Protocol Tree (PROTOCOL TREE)",协议桥接:"Protocol Bridge",协议详情:"Protocol Details",原始值:"Raw Value","原始十六进制 (RAW HEX)":"Raw Hex (RAW HEX)",原始数据:"Raw Data",发布规格页:"Publish Spec Page",发送数据:"Send Data",发送选项:"Send Options",取消:"Cancel",变量名:"Variable Name",变量监控:"Variable Monitor",可用:"Available","吗?":" ?",基本信息:"Basic Info",复制原始十六进制:"Copy Raw Hex",多协议通用报文分析引擎:"Multi-Protocol Packet Analysis Engine","通用动态解析 (Agnostic Engine)":"Agnostic Parsing Engine",奇校验:"Odd Parity",字段:"Fields",字节:"Bytes",实时带宽:"Live Bandwidth",实时渲染:"Live Rendering",实时网络指标:"Live Network Metrics",导出:"Export",导出分析结果:"Export Analysis",导出数据格式:"Export Format",已停止:"Stopped","已匹配协议解析插件,当前展示该报文的解析详情。":"A protocol parser is matched. Showing parsed details for this packet.",已启用:"Enabled",已用时间:"Elapsed",已禁用:"Disabled",序号:"No.",异常:"Error",引擎状态:"Engine Status",当前值:"Current Value","当前步骤:":"Current Step:","往返延时 (RTT)":"Round-trip time (RTT)",循环发送:"Loop Send",快捷指令:"Quick Commands",快捷指令编辑:"Quick Command Editor",手动解析:"Manual Parse",执行控制:"Execution Control",批量运行:"Batch Run",抓包:"Capture",报文:"Packets",报文解析详情:"Packet Analysis Details",指令内容:"Command Content",指令名称:"Command Name",接收缓冲区:"Receive Buffer",描述:"Description",搜索关键词:"Search keywords","搜索标识、十六进制、协议、原始数据...":"Search IDs, hex, protocol, raw data...","摘要 (解析结果/HEX/ASCII)":"Summary (Parsed/HEX/ASCII)",数据位:"Data Bits",文本:"Text",文档中心:"Documentation",新增快捷指令:"Add Quick Command",新建协议:"New Protocol",新建转发对:"New Forward Pair",新建通道:"New Channel",方向:"Direction",无:"None",无可用串口:"No available serial ports",无校验:"No Parity","日志采集与归档策略将在后续版本中提供。":"Log collection and archiving policies will be available in a future release.",时间戳:"Timestamp",映射模式:"Mapping Mode",显示:"Showing",暂停:"Pause",暂无十六进制数据:"No hex data",暂无协议:"No protocols",暂无协议解析数据:"No protocol parsing data","暂无可渲染的 UI 配置":"No renderable UI configuration","暂无可用协议,可从内置模板创建或新增自定义协议。":"No protocols available. Create from built-in templates or add custom.","暂无可配置项,运行时设置将随着模块扩展开放。":"No configurable items. Runtime settings will open as modules expand.",暂无报文数据:"No packet data",暂无描述:"No description",未命名指令:"Untitled Command",未命名转发对:"Unnamed Forward Pair",未安装:"Not Installed",未知:"Unknown","未知协议报文 (Unknown Protocol)":"Unknown Protocol Packet (Unknown Protocol)",未选择任何组件:"No component selected",条日志记录:"log entries",查看:"View","查看或更新协议描述与分类。":"View or update protocol description and category.",查看详情:"View Details",校验位:"Parity","格式:":"Format:",波特率:"Baud Rate",活动通道:"Active Channel",流控:"Flow Control","浏览...":"Browse...","添加 CR (\r)":"Add CR (\r)","添加 LF (\n)":`Add LF ( +)`,"添加自定义协议元数据,供解析引擎识别。":"Add custom protocol metadata for the parser engine.",清除:"Clear",清除日志:"Clear Logs",版本:"Version",状态:"Status",电机反馈继电器:"Motor Feedback Relay",目标地址:"Target Address",确认删除:"Confirm Delete",确认删除自定义协议:"Confirm delete custom protocol","确认删除该快捷指令,删除后无法恢复。":"Confirm delete this quick command? This action cannot be undone.",确认删除转发对:"Confirm delete forward pair",离线:"Offline",空闲:"Idle",端口:"Port",第:"Page","等待 YAML 配置...":"Waiting for YAML configuration...","系统未能自动匹配已知的解析插件。您可以尝试手动配置解析规则,或使用万能解析脚本。":"The system could not match a known parser. Try manual rules or use the universal parsing script.",继续捕获:"Resume Capture",编译日期:"Build Date",编辑:"Edit",编辑或更新现有的快捷调试指令:"Edit or update an existing quick command",编辑转发代理:"Edit Forward Proxy","网络 (TCP)":"Network (TCP)","脚本运行中展示 UI 渲染结果":"Show UI rendering while script runs",自动重连:"Auto Reconnect",自定义:"Custom",行:"Rows",解析值:"Parsed Value",解析失败:"Parse Failed",解析错误:"Parse Error",设备代理端口:"Device Proxy Port",设备端口:"Device Port",详细日志:"Verbose Logs",请输入指令名称和内容:"Enter command name and content","读超时 (ms)":"Read Timeout (ms)",调整解析规则:"Adjust parsing rules",路径:"Path",转发中:"Forwarding","输入搜索...":"Enter search...",输入要发送的指令内容:"Enter command content to send","输入要发送的数据...":"Enter data to send...","过滤日志...":"Filter logs...",运行:"Run",运行中:"Running",运行日志:"Run Logs",连接失败:"Connection Failed",连接模式:"Connection Mode",选择串口:"Select Serial Port",选择工作区:"Select Workspace",选择路径:"Select Path",透传模式:"Transparent Mode",通道名称:"Channel Name",配置:"Configure",配置串口连接参数:"Configure serial connection parameters",配置协议:"Configure Protocol",配置新的通信连接参数:"Configure new connection parameters",配置解析规则:"Configure parsing rules",重置:"Reset","链路层 (Data Link Layer)":"Data Link Layer",错误数:"Error Count",键名:"Key",长度:"Length",问题反馈:"Feedback",页:"",驱动:"Driver",驱动类:"Driver Class",高级选项:"Advanced Options","(两端需一致)":"(Both ends must match)"},rg={...Ae,"nav.manual":"串口終端","nav.scripts":"自動腳本","nav.proxy":"代理監控","nav.protocols":"協議管理","nav.settings":"設定","nav.workspace":"管理員工作區","header.manual.title":"串口終端","header.manual.desc":"傳統串口調試工具:發送命令,監聽 I/O 與日誌回顯。","header.scripts.title":"自動腳本","header.scripts.desc":"用於協議解析與測試腳本自動化執行。","header.proxy.title":"代理監控","header.proxy.desc":"管理轉發鏈路並即時監控資料流狀態。","header.protocols.title":"協議管理","header.protocols.desc":"配置通訊協議定義,綁定通道並設定解析規則。","header.settings.title":"應用設定","header.settings.desc":"管理全域偏好、協議預設值與執行時環境配置。","action.refresh":"重新整理","action.createProtocol":"新增協議","action.discardChanges":"放棄變更","action.saveChanges":"儲存變更","action.loadScript":"載入腳本","action.save":"儲存","badge.readOnly":"唯讀","action.refreshStatus":"重新整理狀態","action.newProxy":"新增轉發對","action.connect":"連線","action.disconnect":"中斷連線","filter.all":"全部","filter.running":"執行中","filter.stopped":"已停止","filter.error":"異常","status.connected":"已連線","status.disconnected":"未連線","status.error":"錯誤","status.connecting":"連線中","protocol.tab.all":"全部協議","protocol.tab.modbus":"Modbus","protocol.tab.tcp":"TCP/IP","protocol.tab.custom":"自訂","settings.tab.general":"通用","settings.tab.plugins":"外掛","settings.tab.runtime":"執行時","settings.tab.logs":"日誌","settings.language":"介面語言","settings.theme":"主題偏好","settings.autoConnect.title":"啟動時自動連線","settings.autoConnect.desc":"自動嘗試重新連線上次活動的通道。","settings.workspace":"工作目錄","settings.chooseFolder":"選擇目錄","settings.plugins.title":"外掛管理","settings.plugins.refresh":"重新整理清單","lang.zhCN":"簡體中文","lang.zhTW":"繁體中文","lang.enUS":"English (US)","lang.jaJP":"日本語","lang.koKR":"한국어","lang.frFR":"Français","lang.deDE":"Deutsch","lang.esES":"Español","lang.ptBR":"Português (Brasil)","lang.ruRU":"Русский","lang.ar":"العربية","lang.hi":"हिन्दी","lang.itIT":"Italiano","lang.nlNL":"Nederlands","lang.thTH":"ไทย","lang.viVN":"Tiếng Việt","lang.idID":"Bahasa Indonesia","lang.trTR":"Türkçe","lang.plPL":"Polski","lang.ukUA":"Українська","theme.system":"系統預設","theme.dark":"深色 (工程模式)","theme.light":"淺色","MQTT 适配器":"MQTT 適配器","TCP / 网络":"TCP / 網路","TCP 客户端":"TCP 用戶端","TCP 服务端":"TCP 伺服端","TCP 端口":"TCP 連接埠","UI YAML 预览":"UI YAML 預覽","v0.9.8 - 未安装":"v0.9.8 - 未安裝","v1.2.4 - 已启用":"v1.2.4 - 已啟用","串口 (Serial)":"串口 (Serial)",串口参数:"串口參數",串口端口:"串口埠",串口通道:"串口通道",串口配置:"串口設定","例如:192.168.1.10":"例如:192.168.1.10","例如:传感器A接口":"例如:感測器A介面",保存:"儲存",保存后立即连接:"儲存後立即連線",保存配置:"儲存設定",停止位:"停止位",偶校验:"偶校驗","写超时 (ms)":"寫入逾時 (ms)",分类:"分類",创建后立即启动连接:"建立後立即啟動連線",创建通道:"建立通道",删除协议:"刪除協定",协议:"協定",协议名称:"協定名稱",协议详情:"協定詳情",取消:"取消",可用:"可用","吗?":"嗎?",基本信息:"基本資訊",奇校验:"奇校驗",已启用:"已啟用",已禁用:"已停用",描述:"描述",搜索关键词:"搜尋關鍵字",数据位:"資料位",新建协议:"新增協定",新建通道:"新增通道",无:"無",无可用串口:"無可用串口",无校验:"無校驗","日志采集与归档策略将在后续版本中提供。":"日誌採集與歸檔策略將在後續版本中提供。",暂无协议:"暫無協定","暂无可渲染的 UI 配置":"暫無可渲染的 UI 設定","暂无可用协议,可从内置模板创建或新增自定义协议。":"暫無可用協定,可從內建範本建立或新增自訂協定。","暂无可配置项,运行时设置将随着模块扩展开放。":"暫無可設定項,執行時設定將隨模組擴充開放。",暂无描述:"暫無描述",未安装:"未安裝",未知:"未知",查看:"檢視","查看或更新协议描述与分类。":"檢視或更新協定描述與分類。",校验位:"校驗位",波特率:"波特率",流控:"流控","添加自定义协议元数据,供解析引擎识别。":"新增自訂協定中繼資料,供解析引擎識別。",状态:"狀態",目标地址:"目標位址",确认删除:"確認刪除",确认删除自定义协议:"確認刪除自訂協定",空闲:"閒置",端口:"埠","脚本运行中展示 UI 渲染结果":"腳本執行中顯示 UI 渲染結果",自定义:"自訂",解析失败:"解析失敗",请输入指令名称和内容:"請輸入指令名稱與內容","读超时 (ms)":"讀取逾時 (ms)",运行中:"執行中",选择串口:"選擇串口",选择工作区:"選擇工作區",通道名称:"通道名稱",配置:"設定",配置串口连接参数:"設定串口連線參數",配置协议:"設定協定",配置新的通信连接参数:"設定新的通訊連線參數",键名:"鍵名",驱动:"驅動",驱动类:"驅動類別"},sg={...Ae,"nav.manual":"シリアルターミナル","nav.scripts":"自動スクリプト","nav.proxy":"プロキシ監視","nav.protocols":"プロトコル管理","nav.settings":"設定","nav.workspace":"管理ワークスペース","header.manual.title":"シリアルターミナル","header.manual.desc":"コマンド送信と I/O・ログを監視する従来型シリアルツール。","header.scripts.title":"自動スクリプト","header.scripts.desc":"プロトコル解析とテストスクリプトの自動実行。","header.proxy.title":"プロキシ監視","header.proxy.desc":"転送リンクを管理し、データストリームをリアルタイム監視します。","header.protocols.title":"プロトコル管理","header.protocols.desc":"通信プロトコルを定義し、チャネルを割り当て、解析ルールを設定します。","header.settings.title":"アプリ設定","header.settings.desc":"全体の設定、プロトコル既定値、実行時環境を管理します。","action.refresh":"更新","action.createProtocol":"新規プロトコル","action.discardChanges":"変更を破棄","action.saveChanges":"変更を保存","action.loadScript":"スクリプト読込","action.save":"保存","badge.readOnly":"読み取り専用","action.refreshStatus":"状態を更新","action.newProxy":"新規転送ペア","action.connect":"接続","action.disconnect":"切断","filter.all":"すべて","filter.running":"稼働中","filter.stopped":"停止","filter.error":"異常","status.connected":"接続済み","status.disconnected":"未接続","status.error":"エラー","status.connecting":"接続中","protocol.tab.all":"すべてのプロトコル","protocol.tab.modbus":"Modbus","protocol.tab.tcp":"TCP/IP","protocol.tab.custom":"カスタム","settings.tab.general":"一般","settings.tab.plugins":"プラグイン","settings.tab.runtime":"ランタイム","settings.tab.logs":"ログ","settings.language":"表示言語","settings.theme":"テーマ","settings.autoConnect.title":"起動時に自動接続","settings.autoConnect.desc":"前回のアクティブチャネルに自動再接続します。","settings.workspace":"ワークスペース","settings.chooseFolder":"フォルダを選択","settings.plugins.title":"プラグイン管理","settings.plugins.refresh":"一覧を更新","lang.zhCN":"簡体中文","lang.zhTW":"繁體中文","lang.enUS":"English (US)","lang.jaJP":"日本語","lang.koKR":"한국어","lang.frFR":"Français","lang.deDE":"Deutsch","lang.esES":"Español","lang.ptBR":"Português (Brasil)","lang.ruRU":"Русский","lang.ar":"العربية","lang.hi":"हिन्दी","lang.itIT":"Italiano","lang.nlNL":"Nederlands","lang.thTH":"ไทย","lang.viVN":"Tiếng Việt","lang.idID":"Bahasa Indonesia","lang.trTR":"Türkçe","lang.plPL":"Polski","lang.ukUA":"Українська","theme.system":"システム","theme.dark":"ダーク(エンジニア)","theme.light":"ライト","MQTT 适配器":"MQTT アダプター","TCP / 网络":"TCP / ネットワーク","TCP 客户端":"TCP クライアント","TCP 服务端":"TCP サーバー","TCP 端口":"TCP ポート","UI YAML 预览":"UI YAML プレビュー","v0.9.8 - 未安装":"v0.9.8 - 未インストール","v1.2.4 - 已启用":"v1.2.4 - 有効","串口 (Serial)":"シリアル (Serial)",串口参数:"シリアルパラメータ",串口端口:"シリアルポート",串口通道:"シリアルチャネル",串口配置:"シリアル設定","例如:192.168.1.10":"例:192.168.1.10","例如:传感器A接口":"例:センサーAインターフェース",保存:"保存",保存后立即连接:"保存後すぐに接続",保存配置:"設定を保存",停止位:"ストップビット",偶校验:"偶数パリティ","写超时 (ms)":"書き込みタイムアウト (ms)",分类:"分類",创建后立即启动连接:"作成後すぐに接続を開始",创建通道:"チャネルを作成",删除协议:"プロトコルを削除",协议:"プロトコル",协议名称:"プロトコル名",协议详情:"プロトコル詳細",取消:"キャンセル",可用:"利用可能","吗?":"?",基本信息:"基本情報",奇校验:"奇数パリティ",已启用:"有効",已禁用:"無効",描述:"説明",搜索关键词:"検索キーワード",数据位:"データビット",新建协议:"新規プロトコル",新建通道:"新規チャネル",无:"なし",无可用串口:"利用可能なシリアルポートがありません",无校验:"パリティなし","日志采集与归档策略将在后续版本中提供。":"ログ収集とアーカイブ方針は後続バージョンで提供予定です。",暂无协议:"プロトコルがありません","暂无可渲染的 UI 配置":"レンダリング可能な UI 設定がありません","暂无可用协议,可从内置模板创建或新增自定义协议。":"利用可能なプロトコルがありません。内蔵テンプレートから作成するか、カスタムを追加してください。","暂无可配置项,运行时设置将随着模块扩展开放。":"設定可能な項目がありません。実行時設定はモジュール拡張に合わせて公開されます。",暂无描述:"説明なし",未安装:"未インストール",未知:"不明",查看:"表示","查看或更新协议描述与分类。":"プロトコルの説明と分類を表示または更新します。",校验位:"パリティ",波特率:"ボーレート",流控:"フロー制御","添加自定义协议元数据,供解析引擎识别。":"解析エンジンが識別できるようにカスタムプロトコルのメタデータを追加します。",状态:"状態",目标地址:"宛先アドレス",确认删除:"削除を確認",确认删除自定义协议:"カスタムプロトコルの削除を確認",空闲:"アイドル",端口:"ポート","脚本运行中展示 UI 渲染结果":"スクリプト実行中に UI レンダリング結果を表示",自定义:"カスタム",解析失败:"解析失敗",请输入指令名称和内容:"コマンド名と内容を入力してください","读超时 (ms)":"読み取りタイムアウト (ms)",运行中:"実行中",选择串口:"シリアルポートを選択",选择工作区:"ワークスペースを選択",通道名称:"チャネル名",配置:"設定",配置串口连接参数:"シリアル接続パラメータを設定",配置协议:"プロトコルを設定",配置新的通信连接参数:"新しい通信接続パラメータを設定",键名:"キー名",驱动:"ドライバー",驱动类:"ドライバークラス"},ag={...Ae,"nav.manual":"시리얼 터미널","nav.scripts":"자동화 스크립트","nav.proxy":"프록시 모니터","nav.protocols":"프로토콜 관리자","nav.settings":"설정","nav.workspace":"관리자 작업공간","status.connected":"연결됨","status.connecting":"연결 중","status.error":"오류","status.disconnected":"연결 끊김","theme.system":"시스템","theme.dark":"다크(엔지니어)","theme.light":"라이트","header.protocols.title":"프로토콜 관리자","header.protocols.desc":"프로토콜을 정의하고 채널을 바인딩하며 파싱 규칙을 구성합니다.","action.refresh":"새로고침","action.createProtocol":"새 프로토콜","protocol.tab.all":"모든 프로토콜","protocol.tab.custom":"사용자 정의","header.settings.title":"앱 설정","header.settings.desc":"전역 환경설정, 기본값 및 런타임 구성을 관리합니다.","action.discardChanges":"변경 사항 취소","action.saveChanges":"변경 사항 저장","settings.tab.general":"일반","settings.tab.plugins":"플러그인","settings.tab.runtime":"런타임","settings.tab.logs":"로그","settings.language":"언어","settings.theme":"테마","settings.autoConnect.title":"시작 시 자동 연결","settings.autoConnect.desc":"마지막 활성 채널에 자동으로 다시 연결합니다.","settings.workspace":"작업공간","settings.chooseFolder":"폴더 선택","settings.plugins.title":"플러그인","settings.plugins.refresh":"목록 새로고침",空闲:"유휴",串口通道:"시리얼 채널","TCP 客户端":"TCP 클라이언트","TCP 服务端":"TCP 서버",端口:"포트",运行中:"실행 중",请输入指令名称和内容:"명령 이름과 내용을 입력하세요",协议:"프로토콜",可用:"사용 가능",自定义:"사용자 정의",已禁用:"비활성화",未知:"알 수 없음",键名:"키",驱动:"드라이버",分类:"카테고리",搜索关键词:"키워드 검색",选择工作区:"작업공간 선택",暂无描述:"설명 없음",配置:"구성",查看:"보기",暂无协议:"프로토콜 없음","暂无可用协议,可从内置模板创建或新增自定义协议。":"사용 가능한 프로토콜이 없습니다. 내장 템플릿에서 만들거나 사용자 정의를 추가하세요.","v1.2.4 - 已启用":"v1.2.4 - 사용",已启用:"활성화","MQTT 适配器":"MQTT 어댑터","v0.9.8 - 未安装":"v0.9.8 - 미설치",未安装:"미설치","暂无可配置项,运行时设置将随着模块扩展开放。":"구성할 항목이 없습니다. 런타임 설정은 모듈 확장에 따라 제공됩니다.","日志采集与归档策略将在后续版本中提供。":"로그 수집 및 아카이브 정책은 이후 버전에서 제공됩니다.",串口配置:"시리얼 구성",新建通道:"새 채널",配置串口连接参数:"시리얼 연결 파라미터 구성",配置新的通信连接参数:"새 통신 연결 파라미터 구성","串口 (Serial)":"시리얼 (Serial)","TCP / 网络":"TCP / 네트워크",基本信息:"기본 정보",通道名称:"채널 이름","例如:传感器A接口":"예: 센서 A 인터페이스",串口端口:"시리얼 포트",选择串口:"시리얼 포트 선택",无可用串口:"사용 가능한 시리얼 포트 없음",目标地址:"대상 주소","例如:192.168.1.10":"예: 192.168.1.10",串口参数:"시리얼 파라미터",波特率:"보드레이트",数据位:"데이터 비트",停止位:"정지 비트",校验位:"패리티",无校验:"패리티 없음",奇校验:"홀수 패리티",偶校验:"짝수 패리티",流控:"흐름 제어",无:"없음","读超时 (ms)":"읽기 타임아웃 (ms)","写超时 (ms)":"쓰기 타임아웃 (ms)","TCP 端口":"TCP 포트",保存后立即连接:"저장 후 즉시 연결",创建后立即启动连接:"생성 후 즉시 연결 시작",取消:"취소",保存配置:"구성 저장",创建通道:"채널 생성",新建协议:"새 프로토콜",配置协议:"프로토콜 구성",协议详情:"프로토콜 상세","添加自定义协议元数据,供解析引擎识别。":"파서 엔진이 인식하도록 사용자 정의 프로토콜 메타데이터를 추가합니다.","查看或更新协议描述与分类。":"프로토콜 설명과 분류를 보기 또는 업데이트합니다.",协议名称:"프로토콜 이름",状态:"상태",描述:"설명",驱动类:"드라이버 클래스",保存:"저장",删除协议:"프로토콜 삭제",确认删除自定义协议:"사용자 정의 프로토콜 삭제 확인","吗?":"?",确认删除:"삭제 확인","UI YAML 预览":"UI YAML 미리보기","脚本运行中展示 UI 渲染结果":"스크립트 실행 중 UI 렌더링 결과 표시",解析失败:"파싱 실패","暂无可渲染的 UI 配置":"렌더링 가능한 UI 설정 없음"},ig={...Ae,"nav.manual":"Terminal série","nav.scripts":"Scripts d’automatisation","nav.proxy":"Surveillance proxy","nav.protocols":"Gestionnaire de protocoles","nav.settings":"Paramètres","nav.workspace":"Espace de travail admin","status.connected":"Connecté","status.connecting":"Connexion","status.error":"Erreur","status.disconnected":"Déconnecté","theme.system":"Système","theme.dark":"Sombre (Ingénieur)","theme.light":"Clair","header.protocols.title":"Gestionnaire de protocoles","header.protocols.desc":"Définissez les protocoles, associez les canaux et configurez les règles d’analyse.","action.refresh":"Actualiser","action.createProtocol":"Nouveau protocole","protocol.tab.all":"Tous les protocoles","protocol.tab.custom":"Personnalisé","header.settings.title":"Paramètres de l’application","header.settings.desc":"Gérez les préférences globales, les valeurs par défaut et la configuration d’exécution.","action.discardChanges":"Ignorer les modifications","action.saveChanges":"Enregistrer les modifications","settings.tab.general":"Général","settings.tab.plugins":"Plugins","settings.tab.runtime":"Exécution","settings.tab.logs":"Journaux","settings.language":"Langue","settings.theme":"Thème","settings.autoConnect.title":"Connexion automatique au démarrage","settings.autoConnect.desc":"Reconnecter automatiquement le dernier canal actif.","settings.workspace":"Espace de travail","settings.chooseFolder":"Choisir un dossier","settings.plugins.title":"Plugins","settings.plugins.refresh":"Actualiser la liste",空闲:"Inactif",串口通道:"Canal série","TCP 客户端":"Client TCP","TCP 服务端":"Serveur TCP",端口:"Port",运行中:"En cours",请输入指令名称和内容:"Saisissez le nom et le contenu de la commande",协议:"Protocole",可用:"Disponible",自定义:"Personnalisé",已禁用:"Désactivé",未知:"Inconnu",键名:"Clé",驱动:"Pilote",分类:"Catégorie",搜索关键词:"Rechercher des mots-clés",选择工作区:"Sélectionner l’espace de travail",暂无描述:"Aucune description",配置:"Configurer",查看:"Voir",暂无协议:"Aucun protocole","暂无可用协议,可从内置模板创建或新增自定义协议。":"Aucun protocole disponible. Créez-en depuis les modèles intégrés ou ajoutez un personnalisé.","v1.2.4 - 已启用":"v1.2.4 - Activé",已启用:"Activé","MQTT 适配器":"Adaptateur MQTT","v0.9.8 - 未安装":"v0.9.8 - Non installé",未安装:"Non installé","暂无可配置项,运行时设置将随着模块扩展开放。":"Aucun élément configurable. Les paramètres d’exécution seront disponibles à mesure que les modules s’étendent.","日志采集与归档策略将在后续版本中提供。":"Les politiques de collecte et d’archivage des journaux seront disponibles dans une version ultérieure.",串口配置:"Configuration série",新建通道:"Nouveau canal",配置串口连接参数:"Configurer les paramètres de connexion série",配置新的通信连接参数:"Configurer de nouveaux paramètres de connexion","串口 (Serial)":"Série (Serial)","TCP / 网络":"TCP / Réseau",基本信息:"Infos de base",通道名称:"Nom du canal","例如:传感器A接口":"Exemple : interface du capteur A",串口端口:"Port série",选择串口:"Sélectionner le port série",无可用串口:"Aucun port série disponible",目标地址:"Adresse cible","例如:192.168.1.10":"Exemple : 192.168.1.10",串口参数:"Paramètres série",波特率:"Débit en bauds",数据位:"Bits de données",停止位:"Bits d’arrêt",校验位:"Parité",无校验:"Aucune parité",奇校验:"Parité impaire",偶校验:"Parité paire",流控:"Contrôle de flux",无:"Aucun","读超时 (ms)":"Délai de lecture (ms)","写超时 (ms)":"Délai d’écriture (ms)","TCP 端口":"Port TCP",保存后立即连接:"Connecter après l’enregistrement",创建后立即启动连接:"Démarrer la connexion après la création",取消:"Annuler",保存配置:"Enregistrer la configuration",创建通道:"Créer un canal",新建协议:"Nouveau protocole",配置协议:"Configurer le protocole",协议详情:"Détails du protocole","添加自定义协议元数据,供解析引擎识别。":"Ajouter des métadonnées de protocole personnalisées pour que le moteur d’analyse les reconnaisse.","查看或更新协议描述与分类。":"Afficher ou mettre à jour la description et la catégorie du protocole.",协议名称:"Nom du protocole",状态:"Statut",描述:"Description",驱动类:"Classe de pilote",保存:"Enregistrer",删除协议:"Supprimer le protocole",确认删除自定义协议:"Confirmer la suppression du protocole personnalisé","吗?":"?",确认删除:"Confirmer la suppression","UI YAML 预览":"Aperçu UI YAML","脚本运行中展示 UI 渲染结果":"Afficher le rendu UI pendant l’exécution du script",解析失败:"Échec de l’analyse","暂无可渲染的 UI 配置":"Aucune configuration UI rendable"},og={...Ae,"nav.manual":"Serielles Terminal","nav.scripts":"Automationsskripte","nav.proxy":"Proxy-Monitor","nav.protocols":"Protokoll-Manager","nav.settings":"Einstellungen","nav.workspace":"Admin-Arbeitsbereich","status.connected":"Verbunden","status.connecting":"Verbindung wird hergestellt","status.error":"Fehler","status.disconnected":"Getrennt","theme.system":"System","theme.dark":"Dunkel (Ingenieur)","theme.light":"Hell","header.protocols.title":"Protokoll-Manager","header.protocols.desc":"Protokolle definieren, Kanäle binden und Parsing-Regeln konfigurieren.","action.refresh":"Aktualisieren","action.createProtocol":"Neues Protokoll","protocol.tab.all":"Alle Protokolle","protocol.tab.custom":"Benutzerdefiniert","header.settings.title":"App-Einstellungen","header.settings.desc":"Globale Einstellungen, Standardwerte und Laufzeitkonfiguration verwalten.","action.discardChanges":"Änderungen verwerfen","action.saveChanges":"Änderungen speichern","settings.tab.general":"Allgemein","settings.tab.plugins":"Plugins","settings.tab.runtime":"Laufzeit","settings.tab.logs":"Protokolle","settings.language":"Sprache","settings.theme":"Design","settings.autoConnect.title":"Beim Start automatisch verbinden","settings.autoConnect.desc":"Automatisch mit dem zuletzt aktiven Kanal verbinden.","settings.workspace":"Arbeitsbereich","settings.chooseFolder":"Ordner auswählen","settings.plugins.title":"Plugins","settings.plugins.refresh":"Liste aktualisieren",空闲:"Leerlauf",串口通道:"Serieller Kanal","TCP 客户端":"TCP-Client","TCP 服务端":"TCP-Server",端口:"Port",运行中:"Läuft",请输入指令名称和内容:"Befehlname und Inhalt eingeben",协议:"Protokoll",可用:"Verfügbar",自定义:"Benutzerdefiniert",已禁用:"Deaktiviert",未知:"Unbekannt",键名:"Schlüssel",驱动:"Treiber",分类:"Kategorie",搜索关键词:"Schlüsselwörter suchen",选择工作区:"Arbeitsbereich auswählen",暂无描述:"Keine Beschreibung",配置:"Konfigurieren",查看:"Anzeigen",暂无协议:"Keine Protokolle","暂无可用协议,可从内置模板创建或新增自定义协议。":"Keine Protokolle verfügbar. Aus integrierten Vorlagen erstellen oder benutzerdefiniert hinzufügen.","v1.2.4 - 已启用":"v1.2.4 - Aktiviert",已启用:"Aktiviert","MQTT 适配器":"MQTT-Adapter","v0.9.8 - 未安装":"v0.9.8 - Nicht installiert",未安装:"Nicht installiert","暂无可配置项,运行时设置将随着模块扩展开放。":"Keine konfigurierbaren Elemente. Laufzeiteinstellungen werden mit Modulerweiterungen verfügbar.","日志采集与归档策略将在后续版本中提供。":"Richtlinien zur Protokollerfassung und Archivierung werden in einer zukünftigen Version verfügbar sein.",串口配置:"Serielle Konfiguration",新建通道:"Neuer Kanal",配置串口连接参数:"Serielle Verbindungsparameter konfigurieren",配置新的通信连接参数:"Neue Verbindungsparameter konfigurieren","串口 (Serial)":"Seriell (Serial)","TCP / 网络":"TCP / Netzwerk",基本信息:"Grundinformationen",通道名称:"Kanalname","例如:传感器A接口":"Beispiel: Sensor-A-Schnittstelle",串口端口:"Serieller Port",选择串口:"Seriellen Port auswählen",无可用串口:"Keine seriellen Ports verfügbar",目标地址:"Zieladresse","例如:192.168.1.10":"Beispiel: 192.168.1.10",串口参数:"Serielle Parameter",波特率:"Baudrate",数据位:"Datenbits",停止位:"Stoppbits",校验位:"Parität",无校验:"Keine Parität",奇校验:"Ungerade Parität",偶校验:"Gerade Parität",流控:"Flusskontrolle",无:"Keine","读超时 (ms)":"Lese-Timeout (ms)","写超时 (ms)":"Schreib-Timeout (ms)","TCP 端口":"TCP-Port",保存后立即连接:"Nach dem Speichern verbinden",创建后立即启动连接:"Verbindung nach Erstellung starten",取消:"Abbrechen",保存配置:"Konfiguration speichern",创建通道:"Kanal erstellen",新建协议:"Neues Protokoll",配置协议:"Protokoll konfigurieren",协议详情:"Protokolldetails","添加自定义协议元数据,供解析引擎识别。":"Benutzerdefinierte Protokoll-Metadaten hinzufügen, damit die Engine sie erkennt.","查看或更新协议描述与分类。":"Protokollbeschreibung und Kategorie anzeigen oder aktualisieren.",协议名称:"Protokollname",状态:"Status",描述:"Beschreibung",驱动类:"Treiberklasse",保存:"Speichern",删除协议:"Protokoll löschen",确认删除自定义协议:"Benutzerdefiniertes Protokoll löschen bestätigen","吗?":"?",确认删除:"Löschen bestätigen","UI YAML 预览":"UI-YAML-Vorschau","脚本运行中展示 UI 渲染结果":"UI-Rendering während der Skriptausführung anzeigen",解析失败:"Parsing fehlgeschlagen","暂无可渲染的 UI 配置":"Keine renderbare UI-Konfiguration"},lg={...Ae,"nav.manual":"Terminal serie","nav.scripts":"Scripts de automatización","nav.proxy":"Monitor de proxy","nav.protocols":"Gestor de protocolos","nav.settings":"Ajustes","nav.workspace":"Espacio de trabajo admin","status.connected":"Conectado","status.connecting":"Conectando","status.error":"Error","status.disconnected":"Desconectado","theme.system":"Sistema","theme.dark":"Oscuro (Ingeniero)","theme.light":"Claro","header.protocols.title":"Gestor de protocolos","header.protocols.desc":"Defina protocolos, vincule canales y configure reglas de análisis.","action.refresh":"Actualizar","action.createProtocol":"Nuevo protocolo","protocol.tab.all":"Todos los protocolos","protocol.tab.custom":"Personalizado","header.settings.title":"Ajustes de la aplicación","header.settings.desc":"Gestione preferencias globales, valores predeterminados y la configuración de ejecución.","action.discardChanges":"Descartar cambios","action.saveChanges":"Guardar cambios","settings.tab.general":"General","settings.tab.plugins":"Plugins","settings.tab.runtime":"Tiempo de ejecución","settings.tab.logs":"Registros","settings.language":"Idioma","settings.theme":"Tema","settings.autoConnect.title":"Conexión automática al iniciar","settings.autoConnect.desc":"Reconectar automáticamente al último canal activo.","settings.workspace":"Espacio de trabajo","settings.chooseFolder":"Elegir carpeta","settings.plugins.title":"Plugins","settings.plugins.refresh":"Actualizar lista",空闲:"Inactivo",串口通道:"Canal serie","TCP 客户端":"Cliente TCP","TCP 服务端":"Servidor TCP",端口:"Puerto",运行中:"En ejecución",请输入指令名称和内容:"Introduzca el nombre y el contenido del comando",协议:"Protocolo",可用:"Disponible",自定义:"Personalizado",已禁用:"Deshabilitado",未知:"Desconocido",键名:"Clave",驱动:"Controlador",分类:"Categoría",搜索关键词:"Buscar palabras clave",选择工作区:"Seleccionar espacio de trabajo",暂无描述:"Sin descripción",配置:"Configurar",查看:"Ver",暂无协议:"Sin protocolos","暂无可用协议,可从内置模板创建或新增自定义协议。":"No hay protocolos disponibles. Cree desde plantillas integradas o añada uno personalizado.","v1.2.4 - 已启用":"v1.2.4 - Habilitado",已启用:"Habilitado","MQTT 适配器":"Adaptador MQTT","v0.9.8 - 未安装":"v0.9.8 - No instalado",未安装:"No instalado","暂无可配置项,运行时设置将随着模块扩展开放。":"No hay elementos configurables. Los ajustes de ejecución se abrirán a medida que se amplíen los módulos.","日志采集与归档策略将在后续版本中提供。":"Las políticas de recopilación y archivado de registros estarán disponibles en una versión futura.",串口配置:"Configuración serie",新建通道:"Nuevo canal",配置串口连接参数:"Configurar parámetros de conexión serie",配置新的通信连接参数:"Configurar nuevos parámetros de conexión","串口 (Serial)":"Serie (Serial)","TCP / 网络":"TCP / Red",基本信息:"Información básica",通道名称:"Nombre del canal","例如:传感器A接口":"Ejemplo: interfaz del sensor A",串口端口:"Puerto serie",选择串口:"Seleccionar puerto serie",无可用串口:"No hay puertos serie disponibles",目标地址:"Dirección de destino","例如:192.168.1.10":"Ejemplo: 192.168.1.10",串口参数:"Parámetros serie",波特率:"Velocidad en baudios",数据位:"Bits de datos",停止位:"Bits de parada",校验位:"Paridad",无校验:"Sin paridad",奇校验:"Paridad impar",偶校验:"Paridad par",流控:"Control de flujo",无:"Ninguno","读超时 (ms)":"Tiempo de espera de lectura (ms)","写超时 (ms)":"Tiempo de espera de escritura (ms)","TCP 端口":"Puerto TCP",保存后立即连接:"Conectar después de guardar",创建后立即启动连接:"Iniciar conexión después de la creación",取消:"Cancelar",保存配置:"Guardar configuración",创建通道:"Crear canal",新建协议:"Nuevo protocolo",配置协议:"Configurar protocolo",协议详情:"Detalles del protocolo","添加自定义协议元数据,供解析引擎识别。":"Añadir metadatos de protocolo personalizados para que el motor los reconozca.","查看或更新协议描述与分类。":"Ver o actualizar la descripción y la categoría del protocolo.",协议名称:"Nombre del protocolo",状态:"Estado",描述:"Descripción",驱动类:"Clase de controlador",保存:"Guardar",删除协议:"Eliminar protocolo",确认删除自定义协议:"Confirmar eliminación del protocolo personalizado","吗?":"?",确认删除:"Confirmar eliminación","UI YAML 预览":"Vista previa de UI YAML","脚本运行中展示 UI 渲染结果":"Mostrar renderizado de UI mientras se ejecuta el script",解析失败:"Error de análisis","暂无可渲染的 UI 配置":"No hay configuración de UI renderizable"},cg={...Ae,"nav.manual":"Terminal serial","nav.scripts":"Scripts de automação","nav.proxy":"Monitor de proxy","nav.protocols":"Gerenciador de protocolos","nav.settings":"Configurações","nav.workspace":"Espaço de trabalho admin","status.connected":"Conectado","status.connecting":"Conectando","status.error":"Erro","status.disconnected":"Desconectado","theme.system":"Sistema","theme.dark":"Escuro (Engenheiro)","theme.light":"Claro","header.protocols.title":"Gerenciador de protocolos","header.protocols.desc":"Defina protocolos, vincule canais e configure regras de parsing.","action.refresh":"Atualizar","action.createProtocol":"Novo protocolo","protocol.tab.all":"Todos os protocolos","protocol.tab.custom":"Personalizado","header.settings.title":"Configurações do app","header.settings.desc":"Gerencie preferências globais, padrões e configuração de execução.","action.discardChanges":"Descartar alterações","action.saveChanges":"Salvar alterações","settings.tab.general":"Geral","settings.tab.plugins":"Plugins","settings.tab.runtime":"Tempo de execução","settings.tab.logs":"Logs","settings.language":"Idioma","settings.theme":"Tema","settings.autoConnect.title":"Conectar automaticamente ao iniciar","settings.autoConnect.desc":"Reconectar automaticamente ao último canal ativo.","settings.workspace":"Espaço de trabalho","settings.chooseFolder":"Escolher pasta","settings.plugins.title":"Plugins","settings.plugins.refresh":"Atualizar lista",空闲:"Inativo",串口通道:"Canal serial","TCP 客户端":"Cliente TCP","TCP 服务端":"Servidor TCP",端口:"Porta",运行中:"Em execução",请输入指令名称和内容:"Digite o nome e o conteúdo do comando",协议:"Protocolo",可用:"Disponível",自定义:"Personalizado",已禁用:"Desativado",未知:"Desconhecido",键名:"Chave",驱动:"Driver",分类:"Categoria",搜索关键词:"Buscar palavras-chave",选择工作区:"Selecionar espaço de trabalho",暂无描述:"Sem descrição",配置:"Configurar",查看:"Ver",暂无协议:"Nenhum protocolo","暂无可用协议,可从内置模板创建或新增自定义协议。":"Nenhum protocolo disponível. Crie a partir de modelos embutidos ou adicione um personalizado.","v1.2.4 - 已启用":"v1.2.4 - Habilitado",已启用:"Habilitado","MQTT 适配器":"Adaptador MQTT","v0.9.8 - 未安装":"v0.9.8 - Não instalado",未安装:"Não instalado","暂无可配置项,运行时设置将随着模块扩展开放。":"Nenhum item configurável. As configurações de execução ficarão disponíveis conforme os módulos se expandirem.","日志采集与归档策略将在后续版本中提供。":"Políticas de coleta e arquivamento de logs estarão disponíveis em uma versão futura.",串口配置:"Configuração serial",新建通道:"Novo canal",配置串口连接参数:"Configurar parâmetros de conexão serial",配置新的通信连接参数:"Configurar novos parâmetros de conexão","串口 (Serial)":"Serial (Serial)","TCP / 网络":"TCP / Rede",基本信息:"Informações básicas",通道名称:"Nome do canal","例如:传感器A接口":"Exemplo: interface do sensor A",串口端口:"Porta serial",选择串口:"Selecionar porta serial",无可用串口:"Nenhuma porta serial disponível",目标地址:"Endereço de destino","例如:192.168.1.10":"Exemplo: 192.168.1.10",串口参数:"Parâmetros seriais",波特率:"Taxa de baud",数据位:"Bits de dados",停止位:"Bits de parada",校验位:"Paridade",无校验:"Sem paridade",奇校验:"Paridade ímpar",偶校验:"Paridade par",流控:"Controle de fluxo",无:"Nenhum","读超时 (ms)":"Tempo limite de leitura (ms)","写超时 (ms)":"Tempo limite de escrita (ms)","TCP 端口":"Porta TCP",保存后立即连接:"Conectar após salvar",创建后立即启动连接:"Iniciar conexão após a criação",取消:"Cancelar",保存配置:"Salvar configuração",创建通道:"Criar canal",新建协议:"Novo protocolo",配置协议:"Configurar protocolo",协议详情:"Detalhes do protocolo","添加自定义协议元数据,供解析引擎识别。":"Adicionar metadados de protocolo personalizados para que o motor de análise reconheça.","查看或更新协议描述与分类。":"Ver ou atualizar a descrição e a categoria do protocolo.",协议名称:"Nome do protocolo",状态:"Status",描述:"Descrição",驱动类:"Classe do driver",保存:"Salvar",删除协议:"Excluir protocolo",确认删除自定义协议:"Confirmar exclusão do protocolo personalizado","吗?":"?",确认删除:"Confirmar exclusão","UI YAML 预览":"Pré-visualização de UI YAML","脚本运行中展示 UI 渲染结果":"Mostrar renderização da UI enquanto o script é executado",解析失败:"Falha na análise","暂无可渲染的 UI 配置":"Nenhuma configuração de UI renderizável"},ug={...Ae,"nav.manual":"Последовательный терминал","nav.scripts":"Скрипты автоматизации","nav.proxy":"Монитор прокси","nav.protocols":"Менеджер протоколов","nav.settings":"Настройки","nav.workspace":"Рабочее пространство администратора","status.connected":"Подключено","status.connecting":"Подключение","status.error":"Ошибка","status.disconnected":"Отключено","theme.system":"Система","theme.dark":"Темная (Инженер)","theme.light":"Светлая","header.protocols.title":"Менеджер протоколов","header.protocols.desc":"Определяйте протоколы, привязывайте каналы и настраивайте правила разбора.","action.refresh":"Обновить","action.createProtocol":"Новый протокол","protocol.tab.all":"Все протоколы","protocol.tab.custom":"Пользовательский","header.settings.title":"Настройки приложения","header.settings.desc":"Управление глобальными предпочтениями, значениями по умолчанию и конфигурацией выполнения.","action.discardChanges":"Отменить изменения","action.saveChanges":"Сохранить изменения","settings.tab.general":"Общие","settings.tab.plugins":"Плагины","settings.tab.runtime":"Выполнение","settings.tab.logs":"Журналы","settings.language":"Язык","settings.theme":"Тема","settings.autoConnect.title":"Автоподключение при запуске","settings.autoConnect.desc":"Автоматически переподключаться к последнему активному каналу.","settings.workspace":"Рабочее пространство","settings.chooseFolder":"Выбрать папку","settings.plugins.title":"Плагины","settings.plugins.refresh":"Обновить список",空闲:"Простой",串口通道:"Последовательный канал","TCP 客户端":"TCP-клиент","TCP 服务端":"TCP-сервер",端口:"Порт",运行中:"Выполняется",请输入指令名称和内容:"Введите имя и содержимое команды",协议:"Протокол",可用:"Доступно",自定义:"Пользовательский",已禁用:"Отключено",未知:"Неизвестно",键名:"Ключ",驱动:"Драйвер",分类:"Категория",搜索关键词:"Поиск по ключевым словам",选择工作区:"Выбрать рабочее пространство",暂无描述:"Нет описания",配置:"Настроить",查看:"Просмотреть",暂无协议:"Нет протоколов","暂无可用协议,可从内置模板创建或新增自定义协议。":"Протоколы отсутствуют. Создайте из встроенных шаблонов или добавьте пользовательский.","v1.2.4 - 已启用":"v1.2.4 - Включено",已启用:"Включено","MQTT 适配器":"MQTT-адаптер","v0.9.8 - 未安装":"v0.9.8 - Не установлено",未安装:"Не установлено","暂无可配置项,运行时设置将随着模块扩展开放。":"Нет настраиваемых элементов. Настройки выполнения будут доступны по мере расширения модулей.","日志采集与归档策略将在后续版本中提供。":"Политики сбора и архивирования журналов будут доступны в будущей версии.",串口配置:"Конфигурация последовательного порта",新建通道:"Новый канал",配置串口连接参数:"Настроить параметры последовательного соединения",配置新的通信连接参数:"Настроить новые параметры соединения","串口 (Serial)":"Последовательный (Serial)","TCP / 网络":"TCP / Сеть",基本信息:"Основная информация",通道名称:"Имя канала","例如:传感器A接口":"Пример: интерфейс датчика A",串口端口:"Последовательный порт",选择串口:"Выбрать последовательный порт",无可用串口:"Нет доступных последовательных портов",目标地址:"Целевой адрес","例如:192.168.1.10":"Пример: 192.168.1.10",串口参数:"Параметры последовательного порта",波特率:"Скорость (бод)",数据位:"Биты данных",停止位:"Стоп-биты",校验位:"Четность",无校验:"Без четности",奇校验:"Нечетная четность",偶校验:"Четная четность",流控:"Управление потоком",无:"Нет","读超时 (ms)":"Тайм-аут чтения (мс)","写超时 (ms)":"Тайм-аут записи (мс)","TCP 端口":"TCP-порт",保存后立即连接:"Подключить после сохранения",创建后立即启动连接:"Запустить подключение после создания",取消:"Отмена",保存配置:"Сохранить конфигурацию",创建通道:"Создать канал",新建协议:"Новый протокол",配置协议:"Настроить протокол",协议详情:"Сведения о протоколе","添加自定义协议元数据,供解析引擎识别。":"Добавить метаданные пользовательского протокола для распознавания движком.","查看或更新协议描述与分类。":"Просмотреть или обновить описание и категорию протокола.",协议名称:"Имя протокола",状态:"Статус",描述:"Описание",驱动类:"Класс драйвера",保存:"Сохранить",删除协议:"Удалить протокол",确认删除自定义协议:"Подтвердить удаление пользовательского протокола","吗?":"?",确认删除:"Подтвердить удаление","UI YAML 预览":"Предпросмотр UI YAML","脚本运行中展示 UI 渲染结果":"Показывать рендеринг UI во время выполнения скрипта",解析失败:"Ошибка разбора","暂无可渲染的 UI 配置":"Нет конфигурации UI для рендера"},dg={...Ae,"nav.manual":"طرفية تسلسلية","nav.scripts":"نصوص الأتمتة","nav.proxy":"مراقب الوكيل","nav.protocols":"مدير البروتوكولات","nav.settings":"الإعدادات","nav.workspace":"مساحة عمل المسؤول","status.connected":"متصل","status.connecting":"جارٍ الاتصال","status.error":"خطأ","status.disconnected":"غير متصل","theme.system":"النظام","theme.dark":"داكن (مهندس)","theme.light":"فاتح","header.protocols.title":"مدير البروتوكولات","header.protocols.desc":"عرّف البروتوكولات، واربط القنوات، واضبط قواعد التحليل.","action.refresh":"تحديث","action.createProtocol":"بروتوكول جديد","protocol.tab.all":"كل البروتوكولات","protocol.tab.custom":"مخصص","header.settings.title":"إعدادات التطبيق","header.settings.desc":"إدارة التفضيلات العامة والقيم الافتراضية وتكوين وقت التشغيل.","action.discardChanges":"تجاهل التغييرات","action.saveChanges":"حفظ التغييرات","settings.tab.general":"عام","settings.tab.plugins":"الإضافات","settings.tab.runtime":"وقت التشغيل","settings.tab.logs":"السجلات","settings.language":"اللغة","settings.theme":"السمة","settings.autoConnect.title":"اتصال تلقائي عند التشغيل","settings.autoConnect.desc":"إعادة الاتصال تلقائياً بآخر قناة نشطة.","settings.workspace":"مساحة العمل","settings.chooseFolder":"اختر مجلداً","settings.plugins.title":"الإضافات","settings.plugins.refresh":"تحديث القائمة",空闲:"خامل",串口通道:"قناة تسلسلية","TCP 客户端":"عميل TCP","TCP 服务端":"خادم TCP",端口:"منفذ",运行中:"قيد التشغيل",请输入指令名称和内容:"أدخل اسم الأمر ومحتواه",协议:"بروتوكول",可用:"متاح",自定义:"مخصص",已禁用:"معطل",未知:"غير معروف",键名:"مفتاح",驱动:"برنامج تشغيل",分类:"فئة",搜索关键词:"ابحث عن كلمات مفتاحية",选择工作区:"اختر مساحة العمل",暂无描述:"لا وصف",配置:"تهيئة",查看:"عرض",暂无协议:"لا توجد بروتوكولات","暂无可用协议,可从内置模板创建或新增自定义协议。":"لا توجد بروتوكولات متاحة. أنشئ من القوالب المضمنة أو أضف مخصصاً.","v1.2.4 - 已启用":"v1.2.4 - مفعّل",已启用:"مفعّل","MQTT 适配器":"محوّل MQTT","v0.9.8 - 未安装":"v0.9.8 - غير مثبت",未安装:"غير مثبت","暂无可配置项,运行时设置将随着模块扩展开放。":"لا توجد عناصر قابلة للتهيئة. ستتوفر إعدادات وقت التشغيل مع توسع الوحدات.","日志采集与归档策略将在后续版本中提供。":"ستتوفر سياسات جمع السجلات وأرشفتها في إصدار لاحق.",串口配置:"تهيئة تسلسلية",新建通道:"قناة جديدة",配置串口连接参数:"تهيئة معلمات الاتصال التسلسلي",配置新的通信连接参数:"تهيئة معلمات الاتصال الجديدة","串口 (Serial)":"تسلسلي (Serial)","TCP / 网络":"TCP / الشبكة",基本信息:"معلومات أساسية",通道名称:"اسم القناة","例如:传感器A接口":"مثال: واجهة المستشعر A",串口端口:"منفذ تسلسلي",选择串口:"اختر منفذًا تسلسليًا",无可用串口:"لا توجد منافذ تسلسلية متاحة",目标地址:"عنوان الهدف","例如:192.168.1.10":"مثال: 192.168.1.10",串口参数:"معلمات التسلسل",波特率:"معدل البود",数据位:"بتات البيانات",停止位:"بتات التوقف",校验位:"التماثل",无校验:"بدون تماثل",奇校验:"تماثل فردي",偶校验:"تماثل زوجي",流控:"التحكم في التدفق",无:"لا شيء","读超时 (ms)":"مهلة القراءة (ms)","写超时 (ms)":"مهلة الكتابة (ms)","TCP 端口":"منفذ TCP",保存后立即连接:"الاتصال بعد الحفظ",创建后立即启动连接:"بدء الاتصال بعد الإنشاء",取消:"إلغاء",保存配置:"حفظ التهيئة",创建通道:"إنشاء قناة",新建协议:"بروتوكول جديد",配置协议:"تهيئة البروتوكول",协议详情:"تفاصيل البروتوكول","添加自定义协议元数据,供解析引擎识别。":"أضف بيانات تعريف بروتوكول مخصصة ليتعرف عليها محرك التحليل.","查看或更新协议描述与分类。":"عرض أو تحديث وصف البروتوكول وفئته.",协议名称:"اسم البروتوكول",状态:"الحالة",描述:"الوصف",驱动类:"فئة برنامج التشغيل",保存:"حفظ",删除协议:"حذف البروتوكول",确认删除自定义协议:"تأكيد حذف البروتوكول المخصص","吗?":"؟",确认删除:"تأكيد الحذف","UI YAML 预览":"معاينة UI YAML","脚本运行中展示 UI 渲染结果":"عرض ناتج عرض UI أثناء تشغيل السكربت",解析失败:"فشل التحليل","暂无可渲染的 UI 配置":"لا توجد تهيئة UI قابلة للعرض"},fg={...Ae,"nav.manual":"सीरियल टर्मिनल","nav.scripts":"ऑटोमेशन स्क्रिप्ट्स","nav.proxy":"प्रॉक्सी मॉनिटर","nav.protocols":"प्रोटोकॉल मैनेजर","nav.settings":"सेटिंग्स","nav.workspace":"एडमिन वर्कस्पेस","status.connected":"कनेक्टेड","status.connecting":"कनेक्ट हो रहा है","status.error":"त्रुटि","status.disconnected":"डिसकनेक्टेड","theme.system":"सिस्टम","theme.dark":"डार्क (इंजीनियर)","theme.light":"लाइट","header.protocols.title":"प्रोटोकॉल मैनेजर","header.protocols.desc":"प्रोटोकॉल परिभाषित करें, चैनल बाँधें और पार्सिंग नियम कॉन्फ़िगर करें।","action.refresh":"रीफ़्रेश","action.createProtocol":"नया प्रोटोकॉल","protocol.tab.all":"सभी प्रोटोकॉल","protocol.tab.custom":"कस्टम","header.settings.title":"ऐप सेटिंग्स","header.settings.desc":"वैश्विक प्राथमिकताएँ, डिफ़ॉल्ट और रनटाइम कॉन्फ़िगरेशन प्रबंधित करें।","action.discardChanges":"परिवर्तन त्यागें","action.saveChanges":"परिवर्तन सहेजें","settings.tab.general":"सामान्य","settings.tab.plugins":"प्लगइन्स","settings.tab.runtime":"रनटाइम","settings.tab.logs":"लॉग्स","settings.language":"भाषा","settings.theme":"थीम","settings.autoConnect.title":"लॉन्च पर ऑटो-कनेक्ट","settings.autoConnect.desc":"आख़िरी सक्रिय चैनल से स्वतः पुनः कनेक्ट करें।","settings.workspace":"वर्कस्पेस","settings.chooseFolder":"फ़ोल्डर चुनें","settings.plugins.title":"प्लगइन्स","settings.plugins.refresh":"सूची रीफ़्रेश करें",空闲:"निष्क्रिय",串口通道:"सीरियल चैनल","TCP 客户端":"TCP क्लाइंट","TCP 服务端":"TCP सर्वर",端口:"पोर्ट",运行中:"चल रहा है",请输入指令名称和内容:"कमांड का नाम और सामग्री दर्ज करें",协议:"प्रोटोकॉल",可用:"उपलब्ध",自定义:"कस्टम",已禁用:"अक्षम",未知:"अज्ञात",键名:"कुंजी",驱动:"ड्राइवर",分类:"श्रेणी",搜索关键词:"कीवर्ड खोजें",选择工作区:"वर्कस्पेस चुनें",暂无描述:"कोई विवरण नहीं",配置:"कॉन्फ़िगर करें",查看:"देखें",暂无协议:"कोई प्रोटोकॉल नहीं","暂无可用协议,可从内置模板创建或新增自定义协议。":"कोई प्रोटोकॉल उपलब्ध नहीं। अंतर्निर्मित टेम्पलेट से बनाएं या कस्टम जोड़ें।","v1.2.4 - 已启用":"v1.2.4 - सक्षम",已启用:"सक्षम","MQTT 适配器":"MQTT एडेप्टर","v0.9.8 - 未安装":"v0.9.8 - इंस्टॉल नहीं",未安装:"इंस्टॉल नहीं","暂无可配置项,运行时设置将随着模块扩展开放。":"कोई कॉन्फ़िगर करने योग्य आइटम नहीं। मॉड्यूल बढ़ने पर रनटाइम सेटिंग्स उपलब्ध होंगी।","日志采集与归档策略将在后续版本中提供。":"लॉग संग्रह और संग्रहण नीतियाँ भविष्य के संस्करण में उपलब्ध होंगी।",串口配置:"सीरियल कॉन्फ़िगरेशन",新建通道:"नया चैनल",配置串口连接参数:"सीरियल कनेक्शन पैरामीटर कॉन्फ़िगर करें",配置新的通信连接参数:"नए संचार कनेक्शन पैरामीटर कॉन्फ़िगर करें","串口 (Serial)":"सीरियल (Serial)","TCP / 网络":"TCP / नेटवर्क",基本信息:"मूल जानकारी",通道名称:"चैनल नाम","例如:传感器A接口":"उदाहरण: सेंसर A इंटरफ़ेस",串口端口:"सीरियल पोर्ट",选择串口:"सीरियल पोर्ट चुनें",无可用串口:"कोई सीरियल पोर्ट उपलब्ध नहीं",目标地址:"लक्ष्य पता","例如:192.168.1.10":"उदाहरण: 192.168.1.10",串口参数:"सीरियल पैरामीटर",波特率:"बॉड रेट",数据位:"डेटा बिट्स",停止位:"स्टॉप बिट्स",校验位:"पैरिटी",无校验:"कोई पैरिटी नहीं",奇校验:"विषम पैरिटी",偶校验:"सम पैरिटी",流控:"फ़्लो कंट्रोल",无:"कोई नहीं","读超时 (ms)":"रीड टाइमआउट (ms)","写超时 (ms)":"राइट टाइमआउट (ms)","TCP 端口":"TCP पोर्ट",保存后立即连接:"सहेजने के बाद कनेक्ट करें",创建后立即启动连接:"निर्माण के बाद कनेक्शन शुरू करें",取消:"रद्द करें",保存配置:"कॉन्फ़िगरेशन सहेजें",创建通道:"चैनल बनाएँ",新建协议:"नया प्रोटोकॉल",配置协议:"प्रोटोकॉल कॉन्फ़िगर करें",协议详情:"प्रोटोकॉल विवरण","添加自定义协议元数据,供解析引擎识别。":"पार्सर इंजन के लिए कस्टम प्रोटोकॉल मेटाडेटा जोड़ें।","查看或更新协议描述与分类。":"प्रोटोकॉल विवरण और श्रेणी देखें या अपडेट करें।",协议名称:"प्रोटोकॉल नाम",状态:"स्थिति",描述:"विवरण",驱动类:"ड्राइवर क्लास",保存:"सहेजें",删除协议:"प्रोटोकॉल हटाएँ",确认删除自定义协议:"कस्टम प्रोटोकॉल हटाने की पुष्टि करें","吗?":"?",确认删除:"हटाने की पुष्टि","UI YAML 预览":"UI YAML प्रीव्यू","脚本运行中展示 UI 渲染结果":"स्क्रिप्ट चलने के दौरान UI रेंडरिंग दिखाएँ",解析失败:"पार्स विफल","暂无可渲染的 UI 配置":"कोई UI कॉन्फ़िगरेशन रेंडर करने योग्य नहीं"},hg={...Ae,"nav.manual":"Terminale seriale","nav.scripts":"Script di automazione","nav.proxy":"Monitor proxy","nav.protocols":"Gestore protocolli","nav.settings":"Impostazioni","nav.workspace":"Area di lavoro admin","status.connected":"Connesso","status.connecting":"Connessione in corso","status.error":"Errore","status.disconnected":"Disconnesso","theme.system":"Sistema","theme.dark":"Scuro (Ingegnere)","theme.light":"Chiaro","header.protocols.title":"Gestore protocolli","header.protocols.desc":"Definisci i protocolli, associa i canali e configura le regole di parsing.","action.refresh":"Aggiorna","action.createProtocol":"Nuovo protocollo","protocol.tab.all":"Tutti i protocolli","protocol.tab.custom":"Personalizzato","header.settings.title":"Impostazioni app","header.settings.desc":"Gestisci preferenze globali, valori predefiniti e configurazione di runtime.","action.discardChanges":"Annulla modifiche","action.saveChanges":"Salva modifiche","settings.tab.general":"Generale","settings.tab.plugins":"Plugin","settings.tab.runtime":"Runtime","settings.tab.logs":"Log","settings.language":"Lingua","settings.theme":"Tema","settings.autoConnect.title":"Connessione automatica all’avvio","settings.autoConnect.desc":"Riconnetti automaticamente l’ultimo canale attivo.","settings.workspace":"Area di lavoro","settings.chooseFolder":"Scegli cartella","settings.plugins.title":"Plugin","settings.plugins.refresh":"Aggiorna elenco",空闲:"Inattivo",串口通道:"Canale seriale","TCP 客户端":"Client TCP","TCP 服务端":"Server TCP",端口:"Porta",运行中:"In esecuzione",请输入指令名称和内容:"Inserisci nome e contenuto del comando",协议:"Protocollo",可用:"Disponibile",自定义:"Personalizzato",已禁用:"Disabilitato",未知:"Sconosciuto",键名:"Chiave",驱动:"Driver",分类:"Categoria",搜索关键词:"Cerca parole chiave",选择工作区:"Seleziona area di lavoro",暂无描述:"Nessuna descrizione",配置:"Configura",查看:"Visualizza",暂无协议:"Nessun protocollo","暂无可用协议,可从内置模板创建或新增自定义协议。":"Nessun protocollo disponibile. Crea da modelli integrati o aggiungi un personalizzato.","v1.2.4 - 已启用":"v1.2.4 - Abilitato",已启用:"Abilitato","MQTT 适配器":"Adattatore MQTT","v0.9.8 - 未安装":"v0.9.8 - Non installato",未安装:"Non installato","暂无可配置项,运行时设置将随着模块扩展开放。":"Nessun elemento configurabile. Le impostazioni runtime saranno disponibili con l’espansione dei moduli.","日志采集与归档策略将在后续版本中提供。":"Le politiche di raccolta e archiviazione dei log saranno disponibili in una versione futura.",串口配置:"Configurazione seriale",新建通道:"Nuovo canale",配置串口连接参数:"Configura i parametri di connessione seriale",配置新的通信连接参数:"Configura i nuovi parametri di connessione","串口 (Serial)":"Seriale (Serial)","TCP / 网络":"TCP / Rete",基本信息:"Informazioni di base",通道名称:"Nome canale","例如:传感器A接口":"Esempio: interfaccia sensore A",串口端口:"Porta seriale",选择串口:"Seleziona porta seriale",无可用串口:"Nessuna porta seriale disponibile",目标地址:"Indirizzo di destinazione","例如:192.168.1.10":"Esempio: 192.168.1.10",串口参数:"Parametri seriali",波特率:"Baud rate",数据位:"Bit di dati",停止位:"Bit di stop",校验位:"Parità",无校验:"Nessuna parità",奇校验:"Parità dispari",偶校验:"Parità pari",流控:"Controllo di flusso",无:"Nessuno","读超时 (ms)":"Timeout lettura (ms)","写超时 (ms)":"Timeout scrittura (ms)","TCP 端口":"Porta TCP",保存后立即连接:"Connetti dopo il salvataggio",创建后立即启动连接:"Avvia la connessione dopo la creazione",取消:"Annulla",保存配置:"Salva configurazione",创建通道:"Crea canale",新建协议:"Nuovo protocollo",配置协议:"Configura protocollo",协议详情:"Dettagli protocollo","添加自定义协议元数据,供解析引擎识别。":"Aggiungi metadati di protocollo personalizzati per il motore di parsing.","查看或更新协议描述与分类。":"Visualizza o aggiorna descrizione e categoria del protocollo.",协议名称:"Nome protocollo",状态:"Stato",描述:"Descrizione",驱动类:"Classe driver",保存:"Salva",删除协议:"Elimina protocollo",确认删除自定义协议:"Conferma eliminazione protocollo personalizzato","吗?":"?",确认删除:"Conferma eliminazione","UI YAML 预览":"Anteprima UI YAML","脚本运行中展示 UI 渲染结果":"Mostra il rendering UI durante l’esecuzione dello script",解析失败:"Analisi non riuscita","暂无可渲染的 UI 配置":"Nessuna configurazione UI renderizzabile"},gg={...Ae,"nav.manual":"Seriële terminal","nav.scripts":"Automatiseringsscripts","nav.proxy":"Proxy-monitor","nav.protocols":"Protocolbeheer","nav.settings":"Instellingen","nav.workspace":"Admin-werkruimte","status.connected":"Verbonden","status.connecting":"Bezig met verbinden","status.error":"Fout","status.disconnected":"Niet verbonden","theme.system":"Systeem","theme.dark":"Donker (Engineer)","theme.light":"Licht","header.protocols.title":"Protocolbeheer","header.protocols.desc":"Definieer protocollen, koppel kanalen en configureer parse-regels.","action.refresh":"Vernieuwen","action.createProtocol":"Nieuw protocol","protocol.tab.all":"Alle protocollen","protocol.tab.custom":"Aangepast","header.settings.title":"App-instellingen","header.settings.desc":"Beheer globale voorkeuren, standaardwaarden en runtimeconfiguratie.","action.discardChanges":"Wijzigingen verwerpen","action.saveChanges":"Wijzigingen opslaan","settings.tab.general":"Algemeen","settings.tab.plugins":"Plugins","settings.tab.runtime":"Runtime","settings.tab.logs":"Logboeken","settings.language":"Taal","settings.theme":"Thema","settings.autoConnect.title":"Automatisch verbinden bij starten","settings.autoConnect.desc":"Automatisch opnieuw verbinden met het laatst actieve kanaal.","settings.workspace":"Werkruimte","settings.chooseFolder":"Map kiezen","settings.plugins.title":"Plugins","settings.plugins.refresh":"Lijst vernieuwen",空闲:"Inactief",串口通道:"Serieel kanaal","TCP 客户端":"TCP-client","TCP 服务端":"TCP-server",端口:"Poort",运行中:"Actief",请输入指令名称和内容:"Voer de opdrachtnaam en inhoud in",协议:"Protocol",可用:"Beschikbaar",自定义:"Aangepast",已禁用:"Uitgeschakeld",未知:"Onbekend",键名:"Sleutel",驱动:"Driver",分类:"Categorie",搜索关键词:"Zoek trefwoorden",选择工作区:"Werkruimte kiezen",暂无描述:"Geen beschrijving",配置:"Configureren",查看:"Bekijken",暂无协议:"Geen protocollen","暂无可用协议,可从内置模板创建或新增自定义协议。":"Geen protocollen beschikbaar. Maak aan vanuit ingebouwde sjablonen of voeg een aangepast protocol toe.","v1.2.4 - 已启用":"v1.2.4 - Ingeschakeld",已启用:"Ingeschakeld","MQTT 适配器":"MQTT-adapter","v0.9.8 - 未安装":"v0.9.8 - Niet geïnstalleerd",未安装:"Niet geïnstalleerd","暂无可配置项,运行时设置将随着模块扩展开放。":"Geen configureerbare items. Runtime-instellingen worden beschikbaar naarmate modules uitbreiden.","日志采集与归档策略将在后续版本中提供。":"Beleid voor logverzameling en archivering is beschikbaar in een toekomstige release.",串口配置:"Seriële configuratie",新建通道:"Nieuw kanaal",配置串口连接参数:"Seriële verbindingsparameters configureren",配置新的通信连接参数:"Nieuwe verbindingsparameters configureren","串口 (Serial)":"Serieel (Serial)","TCP / 网络":"TCP / Netwerk",基本信息:"Basisinformatie",通道名称:"Kanaalnaam","例如:传感器A接口":"Voorbeeld: sensor A-interface",串口端口:"Seriële poort",选择串口:"Seriële poort selecteren",无可用串口:"Geen beschikbare seriële poorten",目标地址:"Doeladres","例如:192.168.1.10":"Voorbeeld: 192.168.1.10",串口参数:"Seriële parameters",波特率:"Baudsnelheid",数据位:"Databits",停止位:"Stopbits",校验位:"Pariteit",无校验:"Geen pariteit",奇校验:"Oneven pariteit",偶校验:"Even pariteit",流控:"Flow control",无:"Geen","读超时 (ms)":"Lees-timeout (ms)","写超时 (ms)":"Schrijf-timeout (ms)","TCP 端口":"TCP-poort",保存后立即连接:"Verbinden na opslaan",创建后立即启动连接:"Verbinding starten na aanmaken",取消:"Annuleren",保存配置:"Configuratie opslaan",创建通道:"Kanaal maken",新建协议:"Nieuw protocol",配置协议:"Protocol configureren",协议详情:"Protocoldetails","添加自定义协议元数据,供解析引擎识别。":"Aangepaste protocolmetadata toevoegen zodat de parser-engine deze herkent.","查看或更新协议描述与分类。":"Protocolbeschrijving en categorie bekijken of bijwerken.",协议名称:"Protocolnaam",状态:"Status",描述:"Beschrijving",驱动类:"Driver-klasse",保存:"Opslaan",删除协议:"Protocol verwijderen",确认删除自定义协议:"Bevestig verwijderen van aangepast protocol","吗?":"?",确认删除:"Verwijderen bevestigen","UI YAML 预览":"UI YAML-voorvertoning","脚本运行中展示 UI 渲染结果":"UI-rendering tonen tijdens het uitvoeren van het script",解析失败:"Parseren mislukt","暂无可渲染的 UI 配置":"Geen renderbare UI-configuratie"},pg={...Ae,"nav.manual":"เทอร์มินัลอนุกรม","nav.scripts":"สคริปต์อัตโนมัติ","nav.proxy":"มอนิเตอร์พร็อกซี","nav.protocols":"ตัวจัดการโปรโตคอล","nav.settings":"การตั้งค่า","nav.workspace":"เวิร์กสเปซผู้ดูแล","status.connected":"เชื่อมต่อแล้ว","status.connecting":"กำลังเชื่อมต่อ","status.error":"ข้อผิดพลาด","status.disconnected":"ยกเลิกการเชื่อมต่อ","theme.system":"ระบบ","theme.dark":"มืด (วิศวกร)","theme.light":"สว่าง","header.protocols.title":"ตัวจัดการโปรโตคอล","header.protocols.desc":"กำหนดโปรโตคอล ผูกช่องทาง และกำหนดกฎการแยกวิเคราะห์","action.refresh":"รีเฟรช","action.createProtocol":"โปรโตคอลใหม่","protocol.tab.all":"โปรโตคอลทั้งหมด","protocol.tab.custom":"กำหนดเอง","header.settings.title":"การตั้งค่าแอป","header.settings.desc":"จัดการค่ากำหนดทั่วไประดับโลก ค่าเริ่มต้น และการกำหนดค่าขณะทำงาน","action.discardChanges":"ยกเลิกการเปลี่ยนแปลง","action.saveChanges":"บันทึกการเปลี่ยนแปลง","settings.tab.general":"ทั่วไป","settings.tab.plugins":"ปลั๊กอิน","settings.tab.runtime":"ขณะทำงาน","settings.tab.logs":"บันทึก","settings.language":"ภาษา","settings.theme":"ธีม","settings.autoConnect.title":"เชื่อมต่ออัตโนมัติเมื่อเปิด","settings.autoConnect.desc":"เชื่อมต่อกับช่องทางที่ใช้งานล่าสุดโดยอัตโนมัติ","settings.workspace":"เวิร์กสเปซ","settings.chooseFolder":"เลือกโฟลเดอร์","settings.plugins.title":"ปลั๊กอิน","settings.plugins.refresh":"รีเฟรชรายการ",空闲:"ว่าง",串口通道:"ช่องทางอนุกรม","TCP 客户端":"ไคลเอนต์ TCP","TCP 服务端":"เซิร์ฟเวอร์ TCP",端口:"พอร์ต",运行中:"กำลังทำงาน",请输入指令名称和内容:"ป้อนชื่อคำสั่งและเนื้อหา",协议:"โปรโตคอล",可用:"พร้อมใช้งาน",自定义:"กำหนดเอง",已禁用:"ปิดใช้งาน",未知:"ไม่ทราบ",键名:"คีย์",驱动:"ไดรเวอร์",分类:"หมวดหมู่",搜索关键词:"ค้นหาคีย์เวิร์ด",选择工作区:"เลือกเวิร์กสเปซ",暂无描述:"ไม่มีคำอธิบาย",配置:"กำหนดค่า",查看:"ดู",暂无协议:"ไม่มีโปรโตคอล","暂无可用协议,可从内置模板创建或新增自定义协议。":"ไม่มีโปรโตคอลที่ใช้ได้ สร้างจากเทมเพลตในตัวหรือเพิ่มแบบกำหนดเอง","v1.2.4 - 已启用":"v1.2.4 - เปิดใช้งาน",已启用:"เปิดใช้งาน","MQTT 适配器":"อะแดปเตอร์ MQTT","v0.9.8 - 未安装":"v0.9.8 - ยังไม่ได้ติดตั้ง",未安装:"ยังไม่ได้ติดตั้ง","暂无可配置项,运行时设置将随着模块扩展开放。":"ไม่มีรายการที่กำหนดค่าได้ การตั้งค่าขณะทำงานจะพร้อมใช้งานเมื่อโมดูลขยาย","日志采集与归档策略将在后续版本中提供。":"นโยบายการเก็บรวบรวมและการจัดเก็บบันทึกจะมีในเวอร์ชันถัดไป",串口配置:"การกำหนดค่าอนุกรม",新建通道:"ช่องทางใหม่",配置串口连接参数:"กำหนดค่าพารามิเตอร์การเชื่อมต่ออนุกรม",配置新的通信连接参数:"กำหนดค่าพารามิเตอร์การเชื่อมต่อใหม่","串口 (Serial)":"อนุกรม (Serial)","TCP / 网络":"TCP / เครือข่าย",基本信息:"ข้อมูลพื้นฐาน",通道名称:"ชื่อช่องทาง","例如:传感器A接口":"ตัวอย่าง: อินเทอร์เฟซเซ็นเซอร์ A",串口端口:"พอร์ตอนุกรม",选择串口:"เลือกพอร์ตอนุกรม",无可用串口:"ไม่มีพอร์ตอนุกรมที่ใช้ได้",目标地址:"ที่อยู่เป้าหมาย","例如:192.168.1.10":"ตัวอย่าง: 192.168.1.10",串口参数:"พารามิเตอร์อนุกรม",波特率:"อัตรา baud",数据位:"บิตข้อมูล",停止位:"บิตหยุด",校验位:"พาริตี้",无校验:"ไม่มีพาริตี้",奇校验:"พาริตี้คี่",偶校验:"พาริตี้คู่",流控:"การควบคุมโฟลว์",无:"ไม่มี","读超时 (ms)":"หมดเวลาอ่าน (ms)","写超时 (ms)":"หมดเวลาเขียน (ms)","TCP 端口":"พอร์ต TCP",保存后立即连接:"เชื่อมต่อหลังบันทึก",创建后立即启动连接:"เริ่มเชื่อมต่อหลังสร้าง",取消:"ยกเลิก",保存配置:"บันทึกการกำหนดค่า",创建通道:"สร้างช่องทาง",新建协议:"โปรโตคอลใหม่",配置协议:"กำหนดค่าโปรโตคอล",协议详情:"รายละเอียดโปรโตคอล","添加自定义协议元数据,供解析引擎识别。":"เพิ่มเมตาดาตาโปรโตคอลกำหนดเองให้เครื่องมือแยกวิเคราะห์รู้จัก","查看或更新协议描述与分类。":"ดูหรืออัปเดตคำอธิบายและหมวดหมู่โปรโตคอล",协议名称:"ชื่อโปรโตคอล",状态:"สถานะ",描述:"คำอธิบาย",驱动类:"คลาสไดรเวอร์",保存:"บันทึก",删除协议:"ลบโปรโตคอล",确认删除自定义协议:"ยืนยันการลบโปรโตคอลกำหนดเอง","吗?":"?",确认删除:"ยืนยันการลบ","UI YAML 预览":"ตัวอย่าง UI YAML","脚本运行中展示 UI 渲染结果":"แสดงผลการเรนเดอร์ UI ขณะสคริปต์ทำงาน",解析失败:"การแยกวิเคราะห์ล้มเหลว","暂无可渲染的 UI 配置":"ไม่มีการกำหนดค่า UI ที่เรนเดอร์ได้"},mg={...Ae,"nav.manual":"Terminal nối tiếp","nav.scripts":"Script tự động hóa","nav.proxy":"Giám sát proxy","nav.protocols":"Trình quản lý giao thức","nav.settings":"Cài đặt","nav.workspace":"Không gian làm việc quản trị","status.connected":"Đã kết nối","status.connecting":"Đang kết nối","status.error":"Lỗi","status.disconnected":"Đã ngắt kết nối","theme.system":"Hệ thống","theme.dark":"Tối (Kỹ sư)","theme.light":"Sáng","header.protocols.title":"Trình quản lý giao thức","header.protocols.desc":"Định nghĩa giao thức, liên kết kênh và cấu hình quy tắc phân tích.","action.refresh":"Làm mới","action.createProtocol":"Giao thức mới","protocol.tab.all":"Tất cả giao thức","protocol.tab.custom":"Tùy chỉnh","header.settings.title":"Cài đặt ứng dụng","header.settings.desc":"Quản lý tùy chọn toàn cục, giá trị mặc định và cấu hình thời gian chạy.","action.discardChanges":"Hủy thay đổi","action.saveChanges":"Lưu thay đổi","settings.tab.general":"Chung","settings.tab.plugins":"Plugin","settings.tab.runtime":"Runtime","settings.tab.logs":"Nhật ký","settings.language":"Ngôn ngữ","settings.theme":"Chủ đề","settings.autoConnect.title":"Tự động kết nối khi khởi động","settings.autoConnect.desc":"Tự động kết nối lại kênh hoạt động gần nhất.","settings.workspace":"Không gian làm việc","settings.chooseFolder":"Chọn thư mục","settings.plugins.title":"Plugin","settings.plugins.refresh":"Làm mới danh sách",空闲:"Nhàn rỗi",串口通道:"Kênh nối tiếp","TCP 客户端":"Máy khách TCP","TCP 服务端":"Máy chủ TCP",端口:"Cổng",运行中:"Đang chạy",请输入指令名称和内容:"Nhập tên và nội dung lệnh",协议:"Giao thức",可用:"Có sẵn",自定义:"Tùy chỉnh",已禁用:"Vô hiệu hóa",未知:"Không xác định",键名:"Khóa",驱动:"Trình điều khiển",分类:"Danh mục",搜索关键词:"Tìm từ khóa",选择工作区:"Chọn không gian làm việc",暂无描述:"Không có mô tả",配置:"Cấu hình",查看:"Xem",暂无协议:"Không có giao thức","暂无可用协议,可从内置模板创建或新增自定义协议。":"Không có giao thức nào. Tạo từ mẫu tích hợp hoặc thêm tùy chỉnh.","v1.2.4 - 已启用":"v1.2.4 - Đã bật",已启用:"Đã bật","MQTT 适配器":"Bộ chuyển đổi MQTT","v0.9.8 - 未安装":"v0.9.8 - Chưa cài đặt",未安装:"Chưa cài đặt","暂无可配置项,运行时设置将随着模块扩展开放。":"Không có mục nào có thể cấu hình. Cài đặt runtime sẽ mở khi mô-đun mở rộng.","日志采集与归档策略将在后续版本中提供。":"Chính sách thu thập và lưu trữ nhật ký sẽ có trong phiên bản tương lai.",串口配置:"Cấu hình nối tiếp",新建通道:"Kênh mới",配置串口连接参数:"Cấu hình tham số kết nối nối tiếp",配置新的通信连接参数:"Cấu hình tham số kết nối mới","串口 (Serial)":"Nối tiếp (Serial)","TCP / 网络":"TCP / Mạng",基本信息:"Thông tin cơ bản",通道名称:"Tên kênh","例如:传感器A接口":"Ví dụ: giao diện cảm biến A",串口端口:"Cổng nối tiếp",选择串口:"Chọn cổng nối tiếp",无可用串口:"Không có cổng nối tiếp khả dụng",目标地址:"Địa chỉ đích","例如:192.168.1.10":"Ví dụ: 192.168.1.10",串口参数:"Tham số nối tiếp",波特率:"Tốc độ baud",数据位:"Bit dữ liệu",停止位:"Bit dừng",校验位:"Chẵn lẻ",无校验:"Không chẵn lẻ",奇校验:"Chẵn lẻ lẻ",偶校验:"Chẵn lẻ chẵn",流控:"Điều khiển luồng",无:"Không","读超时 (ms)":"Hết thời gian đọc (ms)","写超时 (ms)":"Hết thời gian ghi (ms)","TCP 端口":"Cổng TCP",保存后立即连接:"Kết nối sau khi lưu",创建后立即启动连接:"Bắt đầu kết nối sau khi tạo",取消:"Hủy",保存配置:"Lưu cấu hình",创建通道:"Tạo kênh",新建协议:"Giao thức mới",配置协议:"Cấu hình giao thức",协议详情:"Chi tiết giao thức","添加自定义协议元数据,供解析引擎识别。":"Thêm siêu dữ liệu giao thức tùy chỉnh để bộ phân tích nhận diện.","查看或更新协议描述与分类。":"Xem hoặc cập nhật mô tả và danh mục giao thức.",协议名称:"Tên giao thức",状态:"Trạng thái",描述:"Mô tả",驱动类:"Lớp trình điều khiển",保存:"Lưu",删除协议:"Xóa giao thức",确认删除自定义协议:"Xác nhận xóa giao thức tùy chỉnh","吗?":"?",确认删除:"Xác nhận xóa","UI YAML 预览":"Xem trước UI YAML","脚本运行中展示 UI 渲染结果":"Hiển thị kết quả render UI khi script chạy",解析失败:"Phân tích thất bại","暂无可渲染的 UI 配置":"Không có cấu hình UI có thể render"},vg={...Ae,"nav.manual":"Terminal serial","nav.scripts":"Skrip otomatisasi","nav.proxy":"Monitor proxy","nav.protocols":"Manajer protokol","nav.settings":"Pengaturan","nav.workspace":"Ruang kerja admin","status.connected":"Terhubung","status.connecting":"Menghubungkan","status.error":"Kesalahan","status.disconnected":"Terputus","theme.system":"Sistem","theme.dark":"Gelap (Insinyur)","theme.light":"Terang","header.protocols.title":"Manajer protokol","header.protocols.desc":"Tentukan protokol, kaitkan kanal, dan konfigurasi aturan parsing.","action.refresh":"Muat ulang","action.createProtocol":"Protokol baru","protocol.tab.all":"Semua protokol","protocol.tab.custom":"Kustom","header.settings.title":"Pengaturan aplikasi","header.settings.desc":"Kelola preferensi global, nilai default, dan konfigurasi runtime.","action.discardChanges":"Batalkan perubahan","action.saveChanges":"Simpan perubahan","settings.tab.general":"Umum","settings.tab.plugins":"Plugin","settings.tab.runtime":"Runtime","settings.tab.logs":"Log","settings.language":"Bahasa","settings.theme":"Tema","settings.autoConnect.title":"Sambung otomatis saat mulai","settings.autoConnect.desc":"Sambungkan kembali ke kanal aktif terakhir secara otomatis.","settings.workspace":"Ruang kerja","settings.chooseFolder":"Pilih folder","settings.plugins.title":"Plugin","settings.plugins.refresh":"Muat ulang daftar",空闲:"Menganggur",串口通道:"Kanal serial","TCP 客户端":"Klien TCP","TCP 服务端":"Server TCP",端口:"Port",运行中:"Berjalan",请输入指令名称和内容:"Masukkan nama dan isi perintah",协议:"Protokol",可用:"Tersedia",自定义:"Kustom",已禁用:"Dinonaktifkan",未知:"Tidak diketahui",键名:"Kunci",驱动:"Driver",分类:"Kategori",搜索关键词:"Cari kata kunci",选择工作区:"Pilih ruang kerja",暂无描述:"Tidak ada deskripsi",配置:"Konfigurasi",查看:"Lihat",暂无协议:"Tidak ada protokol","暂无可用协议,可从内置模板创建或新增自定义协议。":"Tidak ada protokol tersedia. Buat dari template bawaan atau tambah kustom.","v1.2.4 - 已启用":"v1.2.4 - Diaktifkan",已启用:"Diaktifkan","MQTT 适配器":"Adaptor MQTT","v0.9.8 - 未安装":"v0.9.8 - Belum terpasang",未安装:"Belum terpasang","暂无可配置项,运行时设置将随着模块扩展开放。":"Tidak ada item yang dapat dikonfigurasi. Pengaturan runtime akan tersedia saat modul diperluas.","日志采集与归档策略将在后续版本中提供。":"Kebijakan pengumpulan dan pengarsipan log akan tersedia pada rilis mendatang.",串口配置:"Konfigurasi serial",新建通道:"Kanal baru",配置串口连接参数:"Konfigurasi parameter koneksi serial",配置新的通信连接参数:"Konfigurasi parameter koneksi baru","串口 (Serial)":"Serial (Serial)","TCP / 网络":"TCP / Jaringan",基本信息:"Info dasar",通道名称:"Nama kanal","例如:传感器A接口":"Contoh: antarmuka sensor A",串口端口:"Port serial",选择串口:"Pilih port serial",无可用串口:"Tidak ada port serial yang tersedia",目标地址:"Alamat target","例如:192.168.1.10":"Contoh: 192.168.1.10",串口参数:"Parameter serial",波特率:"Laju baud",数据位:"Bit data",停止位:"Bit stop",校验位:"Paritas",无校验:"Tanpa paritas",奇校验:"Paritas ganjil",偶校验:"Paritas genap",流控:"Kontrol aliran",无:"Tidak ada","读超时 (ms)":"Batas waktu baca (ms)","写超时 (ms)":"Batas waktu tulis (ms)","TCP 端口":"Port TCP",保存后立即连接:"Hubungkan setelah menyimpan",创建后立即启动连接:"Mulai koneksi setelah dibuat",取消:"Batal",保存配置:"Simpan konfigurasi",创建通道:"Buat kanal",新建协议:"Protokol baru",配置协议:"Konfigurasi protokol",协议详情:"Detail protokol","添加自定义协议元数据,供解析引擎识别。":"Tambahkan metadata protokol kustom agar mesin parser mengenalinya.","查看或更新协议描述与分类。":"Lihat atau perbarui deskripsi dan kategori protokol.",协议名称:"Nama protokol",状态:"Status",描述:"Deskripsi",驱动类:"Kelas driver",保存:"Simpan",删除协议:"Hapus protokol",确认删除自定义协议:"Konfirmasi hapus protokol kustom","吗?":"?",确认删除:"Konfirmasi hapus","UI YAML 预览":"Pratinjau UI YAML","脚本运行中展示 UI 渲染结果":"Tampilkan rendering UI saat skrip berjalan",解析失败:"Gagal parsing","暂无可渲染的 UI 配置":"Tidak ada konfigurasi UI yang dapat dirender"},yg={...Ae,"nav.manual":"Seri terminal","nav.scripts":"Otomasyon betikleri","nav.proxy":"Proxy izleyici","nav.protocols":"Protokol yöneticisi","nav.settings":"Ayarlar","nav.workspace":"Yönetici çalışma alanı","status.connected":"Bağlı","status.connecting":"Bağlanıyor","status.error":"Hata","status.disconnected":"Bağlı değil","theme.system":"Sistem","theme.dark":"Koyu (Mühendis)","theme.light":"Açık","header.protocols.title":"Protokol yöneticisi","header.protocols.desc":"Protokolleri tanımlayın, kanalları bağlayın ve ayrıştırma kurallarını yapılandırın.","action.refresh":"Yenile","action.createProtocol":"Yeni protokol","protocol.tab.all":"Tüm protokoller","protocol.tab.custom":"Özel","header.settings.title":"Uygulama ayarları","header.settings.desc":"Genel tercihleri, varsayılanları ve çalışma zamanı yapılandırmasını yönetin.","action.discardChanges":"Değişiklikleri at","action.saveChanges":"Değişiklikleri kaydet","settings.tab.general":"Genel","settings.tab.plugins":"Eklentiler","settings.tab.runtime":"Çalışma zamanı","settings.tab.logs":"Günlükler","settings.language":"Dil","settings.theme":"Tema","settings.autoConnect.title":"Başlangıçta otomatik bağlan","settings.autoConnect.desc":"Son etkin kanala otomatik olarak yeniden bağlan.","settings.workspace":"Çalışma alanı","settings.chooseFolder":"Klasör seç","settings.plugins.title":"Eklentiler","settings.plugins.refresh":"Listeyi yenile",空闲:"Boşta",串口通道:"Seri kanal","TCP 客户端":"TCP istemcisi","TCP 服务端":"TCP sunucusu",端口:"Port",运行中:"Çalışıyor",请输入指令名称和内容:"Komut adı ve içeriğini girin",协议:"Protokol",可用:"Kullanılabilir",自定义:"Özel",已禁用:"Devre dışı",未知:"Bilinmeyen",键名:"Anahtar",驱动:"Sürücü",分类:"Kategori",搜索关键词:"Anahtar kelime ara",选择工作区:"Çalışma alanı seç",暂无描述:"Açıklama yok",配置:"Yapılandır",查看:"Görüntüle",暂无协议:"Protokol yok","暂无可用协议,可从内置模板创建或新增自定义协议。":"Kullanılabilir protokol yok. Dahili şablonlardan oluşturun veya özel ekleyin.","v1.2.4 - 已启用":"v1.2.4 - Etkin",已启用:"Etkin","MQTT 适配器":"MQTT adaptörü","v0.9.8 - 未安装":"v0.9.8 - Yüklü değil",未安装:"Yüklü değil","暂无可配置项,运行时设置将随着模块扩展开放。":"Yapılandırılabilir öğe yok. Çalışma zamanı ayarları modüller genişledikçe açılacaktır.","日志采集与归档策略将在后续版本中提供。":"Günlük toplama ve arşivleme politikaları gelecekteki bir sürümde sunulacak.",串口配置:"Seri yapılandırma",新建通道:"Yeni kanal",配置串口连接参数:"Seri bağlantı parametrelerini yapılandır",配置新的通信连接参数:"Yeni bağlantı parametrelerini yapılandır","串口 (Serial)":"Seri (Serial)","TCP / 网络":"TCP / Ağ",基本信息:"Temel bilgiler",通道名称:"Kanal adı","例如:传感器A接口":"Örnek: Sensör A arayüzü",串口端口:"Seri port",选择串口:"Seri port seç",无可用串口:"Kullanılabilir seri port yok",目标地址:"Hedef adres","例如:192.168.1.10":"Örnek: 192.168.1.10",串口参数:"Seri parametreler",波特率:"Baud hızı",数据位:"Veri bitleri",停止位:"Stop bitleri",校验位:"Parite",无校验:"Parite yok",奇校验:"Tek parite",偶校验:"Çift parite",流控:"Akış kontrolü",无:"Yok","读超时 (ms)":"Okuma zaman aşımı (ms)","写超时 (ms)":"Yazma zaman aşımı (ms)","TCP 端口":"TCP portu",保存后立即连接:"Kaydettikten sonra bağlan",创建后立即启动连接:"Oluşturulduktan sonra bağlantıyı başlat",取消:"İptal",保存配置:"Yapılandırmayı kaydet",创建通道:"Kanal oluştur",新建协议:"Yeni protokol",配置协议:"Protokolü yapılandır",协议详情:"Protokol ayrıntıları","添加自定义协议元数据,供解析引擎识别。":"Çözümleyici motorun tanıması için özel protokol meta verileri ekle.","查看或更新协议描述与分类。":"Protokol açıklaması ve kategorisini görüntüleyin veya güncelleyin.",协议名称:"Protokol adı",状态:"Durum",描述:"Açıklama",驱动类:"Sürücü sınıfı",保存:"Kaydet",删除协议:"Protokolü sil",确认删除自定义协议:"Özel protokolü silmeyi onayla","吗?":"?",确认删除:"Silmeyi onayla","UI YAML 预览":"UI YAML önizleme","脚本运行中展示 UI 渲染结果":"Betik çalışırken UI render sonucunu göster",解析失败:"Ayrıştırma başarısız","暂无可渲染的 UI 配置":"Render edilebilir UI yapılandırması yok"},bg={...Ae,"nav.manual":"Terminal szeregowy","nav.scripts":"Skrypty automatyzacji","nav.proxy":"Monitor proxy","nav.protocols":"Menedżer protokołów","nav.settings":"Ustawienia","nav.workspace":"Obszar roboczy administratora","status.connected":"Połączono","status.connecting":"Łączenie","status.error":"Błąd","status.disconnected":"Rozłączono","theme.system":"System","theme.dark":"Ciemny (Inżynier)","theme.light":"Jasny","header.protocols.title":"Menedżer protokołów","header.protocols.desc":"Definiuj protokoły, przypisuj kanały i konfiguruj reguły parsowania.","action.refresh":"Odśwież","action.createProtocol":"Nowy protokół","protocol.tab.all":"Wszystkie protokoły","protocol.tab.custom":"Niestandardowy","header.settings.title":"Ustawienia aplikacji","header.settings.desc":"Zarządzaj globalnymi preferencjami, domyślnymi wartościami i konfiguracją uruchomieniową.","action.discardChanges":"Odrzuć zmiany","action.saveChanges":"Zapisz zmiany","settings.tab.general":"Ogólne","settings.tab.plugins":"Wtyczki","settings.tab.runtime":"Środowisko wykonawcze","settings.tab.logs":"Logi","settings.language":"Język","settings.theme":"Motyw","settings.autoConnect.title":"Automatyczne łączenie przy starcie","settings.autoConnect.desc":"Automatycznie łącz z ostatnim aktywnym kanałem.","settings.workspace":"Obszar roboczy","settings.chooseFolder":"Wybierz folder","settings.plugins.title":"Wtyczki","settings.plugins.refresh":"Odśwież listę",空闲:"Bezczynny",串口通道:"Kanał szeregowy","TCP 客户端":"Klient TCP","TCP 服务端":"Serwer TCP",端口:"Port",运行中:"Uruchomiony",请输入指令名称和内容:"Wprowadź nazwę i treść polecenia",协议:"Protokół",可用:"Dostępne",自定义:"Niestandardowy",已禁用:"Wyłączony",未知:"Nieznany",键名:"Klucz",驱动:"Sterownik",分类:"Kategoria",搜索关键词:"Szukaj słów kluczowych",选择工作区:"Wybierz obszar roboczy",暂无描述:"Brak opisu",配置:"Konfiguruj",查看:"Wyświetl",暂无协议:"Brak protokołów","暂无可用协议,可从内置模板创建或新增自定义协议。":"Brak dostępnych protokołów. Utwórz z wbudowanych szablonów lub dodaj niestandardowy.","v1.2.4 - 已启用":"v1.2.4 - Włączony",已启用:"Włączony","MQTT 适配器":"Adapter MQTT","v0.9.8 - 未安装":"v0.9.8 - Nie zainstalowano",未安装:"Nie zainstalowano","暂无可配置项,运行时设置将随着模块扩展开放。":"Brak konfigurowalnych elementów. Ustawienia uruchomieniowe będą dostępne wraz z rozbudową modułów.","日志采集与归档策略将在后续版本中提供。":"Zasady zbierania i archiwizacji logów będą dostępne w przyszłej wersji.",串口配置:"Konfiguracja szeregowa",新建通道:"Nowy kanał",配置串口连接参数:"Skonfiguruj parametry połączenia szeregowego",配置新的通信连接参数:"Skonfiguruj nowe parametry połączenia","串口 (Serial)":"Szeregowy (Serial)","TCP / 网络":"TCP / Sieć",基本信息:"Podstawowe informacje",通道名称:"Nazwa kanału","例如:传感器A接口":"Przykład: interfejs czujnika A",串口端口:"Port szeregowy",选择串口:"Wybierz port szeregowy",无可用串口:"Brak dostępnych portów szeregowych",目标地址:"Adres docelowy","例如:192.168.1.10":"Przykład: 192.168.1.10",串口参数:"Parametry szeregowe",波特率:"Prędkość baud",数据位:"Bity danych",停止位:"Bity stopu",校验位:"Parzystość",无校验:"Brak parzystości",奇校验:"Parzystość nieparzysta",偶校验:"Parzystość parzysta",流控:"Kontrola przepływu",无:"Brak","读超时 (ms)":"Limit czasu odczytu (ms)","写超时 (ms)":"Limit czasu zapisu (ms)","TCP 端口":"Port TCP",保存后立即连接:"Połącz po zapisaniu",创建后立即启动连接:"Uruchom połączenie po utworzeniu",取消:"Anuluj",保存配置:"Zapisz konfigurację",创建通道:"Utwórz kanał",新建协议:"Nowy protokół",配置协议:"Konfiguruj protokół",协议详情:"Szczegóły protokołu","添加自定义协议元数据,供解析引擎识别。":"Dodaj niestandardowe metadane protokołu, aby silnik parsera je rozpoznał.","查看或更新协议描述与分类。":"Wyświetl lub zaktualizuj opis i kategorię protokołu.",协议名称:"Nazwa protokołu",状态:"Status",描述:"Opis",驱动类:"Klasa sterownika",保存:"Zapisz",删除协议:"Usuń protokół",确认删除自定义协议:"Potwierdź usunięcie niestandardowego protokołu","吗?":"?",确认删除:"Potwierdź usunięcie","UI YAML 预览":"Podgląd UI YAML","脚本运行中展示 UI 渲染结果":"Pokaż renderowanie UI podczas działania skryptu",解析失败:"Nieudane parsowanie","暂无可渲染的 UI 配置":"Brak renderowalnej konfiguracji UI"},_g={...Ae,"nav.manual":"Послідовний термінал","nav.scripts":"Скрипти автоматизації","nav.proxy":"Монітор проксі","nav.protocols":"Менеджер протоколів","nav.settings":"Налаштування","nav.workspace":"Робочий простір адміністратора","status.connected":"Підключено","status.connecting":"Підключення","status.error":"Помилка","status.disconnected":"Відключено","theme.system":"Система","theme.dark":"Темна (Інженер)","theme.light":"Світла","header.protocols.title":"Менеджер протоколів","header.protocols.desc":"Визначайте протоколи, прив’язуйте канали та налаштовуйте правила розбору.","action.refresh":"Оновити","action.createProtocol":"Новий протокол","protocol.tab.all":"Усі протоколи","protocol.tab.custom":"Користувацький","header.settings.title":"Налаштування застосунку","header.settings.desc":"Керуйте глобальними параметрами, значеннями за замовчуванням і конфігурацією виконання.","action.discardChanges":"Скасувати зміни","action.saveChanges":"Зберегти зміни","settings.tab.general":"Загальні","settings.tab.plugins":"Плагіни","settings.tab.runtime":"Виконання","settings.tab.logs":"Журнали","settings.language":"Мова","settings.theme":"Тема","settings.autoConnect.title":"Автопідключення під час запуску","settings.autoConnect.desc":"Автоматично перепідключатися до останнього активного каналу.","settings.workspace":"Робочий простір","settings.chooseFolder":"Вибрати папку","settings.plugins.title":"Плагіни","settings.plugins.refresh":"Оновити список",空闲:"Бездіяльний",串口通道:"Послідовний канал","TCP 客户端":"TCP-клієнт","TCP 服务端":"TCP-сервер",端口:"Порт",运行中:"Працює",请输入指令名称和内容:"Введіть назву та вміст команди",协议:"Протокол",可用:"Доступний",自定义:"Користувацький",已禁用:"Вимкнений",未知:"Невідомо",键名:"Ключ",驱动:"Драйвер",分类:"Категорія",搜索关键词:"Пошук ключових слів",选择工作区:"Вибрати робочий простір",暂无描述:"Без опису",配置:"Налаштувати",查看:"Переглянути",暂无协议:"Немає протоколів","暂无可用协议,可从内置模板创建或新增自定义协议。":"Немає доступних протоколів. Створіть із вбудованих шаблонів або додайте власний.","v1.2.4 - 已启用":"v1.2.4 - Увімкнено",已启用:"Увімкнено","MQTT 适配器":"MQTT-адаптер","v0.9.8 - 未安装":"v0.9.8 - Не встановлено",未安装:"Не встановлено","暂无可配置项,运行时设置将随着模块扩展开放。":"Немає елементів для налаштування. Налаштування виконання будуть доступні зі зростанням модулів.","日志采集与归档策略将在后续版本中提供。":"Політики збору та архівації журналів будуть доступні у майбутньому випуску.",串口配置:"Послідовна конфігурація",新建通道:"Новий канал",配置串口连接参数:"Налаштувати параметри послідовного з’єднання",配置新的通信连接参数:"Налаштувати нові параметри з’єднання","串口 (Serial)":"Послідовний (Serial)","TCP / 网络":"TCP / Мережа",基本信息:"Основна інформація",通道名称:"Назва каналу","例如:传感器A接口":"Приклад: інтерфейс датчика A",串口端口:"Послідовний порт",选择串口:"Вибрати послідовний порт",无可用串口:"Немає доступних послідовних портів",目标地址:"Цільова адреса","例如:192.168.1.10":"Приклад: 192.168.1.10",串口参数:"Параметри послідовного порту",波特率:"Швидкість бод",数据位:"Біти даних",停止位:"Стоп-біти",校验位:"Парність",无校验:"Без парності",奇校验:"Непарна парність",偶校验:"Парна парність",流控:"Керування потоком",无:"Немає","读超时 (ms)":"Тайм-аут читання (мс)","写超时 (ms)":"Тайм-аут запису (мс)","TCP 端口":"TCP-порт",保存后立即连接:"Підключити після збереження",创建后立即启动连接:"Запустити підключення після створення",取消:"Скасувати",保存配置:"Зберегти конфігурацію",创建通道:"Створити канал",新建协议:"Новий протокол",配置协议:"Налаштувати протокол",协议详情:"Деталі протоколу","添加自定义协议元数据,供解析引擎识别。":"Додайте користувацькі метадані протоколу, щоб рушій аналізу їх розпізнав.","查看或更新协议描述与分类。":"Переглянути або оновити опис і категорію протоколу.",协议名称:"Назва протоколу",状态:"Статус",描述:"Опис",驱动类:"Клас драйвера",保存:"Зберегти",删除协议:"Видалити протокол",确认删除自定义协议:"Підтвердити видалення користувацького протоколу","吗?":"?",确认删除:"Підтвердити видалення","UI YAML 预览":"Попередній перегляд UI YAML","脚本运行中展示 UI 渲染结果":"Показувати рендеринг UI під час виконання скрипту",解析失败:"Помилка розбору","暂无可渲染的 UI 配置":"Немає конфігурації UI для рендерингу"},Ml={"zh-CN":ng,"zh-TW":rg,"en-US":Ae,"ja-JP":sg,"ko-KR":ag,"fr-FR":ig,"de-DE":og,"es-ES":lg,"pt-BR":cg,"ru-RU":ug,ar:dg,hi:fg,"it-IT":hg,"nl-NL":gg,"th-TH":pg,"vi-VN":mg,"id-ID":vg,"tr-TR":yg,"pl-PL":bg,"uk-UA":_g},Cg=new Set(Object.keys(Ml)),kg="zh-CN",wg=Object.freeze(Object.defineProperty({__proto__:null,DEFAULT_LANGUAGE:kg,supportedLanguages:Cg,translations:Ml},Symbol.toStringTag,{value:"Module"})),da=Array.from({length:32},(e,t)=>`COM${t+1}`),Sg=[9600,19200,38400,57600,115200],$e={portPlaceholder:"COM1",baud:115200,dataBits:"8",stopBits:"1",parity:"none",flowControl:"none",readTimeoutMs:1e3,writeTimeoutMs:1e3},St={host:"127.0.0.1",port:502,timeoutMs:5e3,heartbeatSec:60,retryCount:3},Un={language:"zh-CN",theme:"light",autoConnectOnStart:!0,appVersionFallback:"v0.0.0"};function ir(e){const t=String(e??"").trim();if(!t)return"";const n=t.match(/COM\d+/i);return n?n[0].toUpperCase():t}function Tg(e){if(!Array.isArray(e))return[];const t=new Set,n=[];for(const r of e){const s=ir(r);!s||t.has(s)||(t.add(s),n.push(s))}return n}function nt(e,t){if(e&&typeof e.then=="function"){e.then(t);return}t(e)}function xg(e,t){const n=ge(()=>e.value.length===0),r=ge(()=>(e.value.length?e.value:da).map(o=>({label:o,value:o,icon:"usb"})));function s(i){e.value=Tg(i),t.value=ir(t.value),!t.value&&e.value.length&&(t.value=e.value[0])}function a(i){const o=ir(i);o&&(t.value=o)}return{noPorts:n,portOptionsList:r,applyPorts:s,selectPort:a}}function Pg(){function e(t){return ir(t)}return{resolveSerialPort:e}}function Ag(e){function t(i){i&&(e.selectChannelPort(i),e.channelMode.value="serial")}function n(){if(!e.bridge.value||e.isConnecting.value||e.isConnected.value)return;const i=e.resolveSerialPort(e.selectedPort.value);i&&(e.selectedPort.value=i,e.isConnecting.value=!0,e.bridge.value.connect_serial(i,Number(e.baud.value)))}function r(){e.bridge.value&&(e.isConnecting.value||e.isConnected.value||(e.isConnecting.value=!0,e.bridge.value.connect_tcp(e.tcpHost.value,Number(e.tcpPort.value))))}function s(){if(e.channelMode.value==="tcp"){r();return}n()}function a(){e.bridge.value&&e.bridge.value.disconnect()}return{selectPort:t,connectSerial:n,connectTcp:r,connectPrimary:s,disconnect:a}}function Eg(e){let t=null,n=0,r=null;function s(u){e.channels.value=Array.isArray(u)?u:[];const c=e.channels.value[0];if(c){if(c.status==="connected"){const h=c.address||c.port||c.type||"";e.emitStatus(`Connected: ${h}`,Date.now()/1e3),e.connectionInfo.value={state:"connected",detail:c.address||c.port||c.type||""},e.isConnecting.value=!1;return}c.status==="error"&&(e.emitStatus(`Error: ${c.error||""}`,Date.now()/1e3),e.connectionInfo.value={state:"error",detail:c.error||""},e.isConnecting.value=!1)}}function a(u){r=u,!n&&(n=window.requestAnimationFrame(()=>{n=0;const c=r;r=null,s(c)}))}function i(){!e.bridge.value||!e.bridge.value.list_channels||nt(e.bridge.value.list_channels(),u=>{s(u)})}function o(){t||(t=window.setTimeout(()=>{t=null,i()},150))}function l(){t&&(window.clearTimeout(t),t=null),n&&(window.cancelAnimationFrame(n),n=0),r=null}return{setChannels:s,scheduleSetChannels:a,refreshChannels:i,scheduleChannelRefresh:o,disposeChannelSync:l}}function Ig(e){const{refs:t}=e;function n(){t.channelDialogMode.value="create",t.channelType.value="serial",t.channelName.value="",t.channelPort.value=e.normalizeSerialPortName(t.selectedPort.value||t.ports.value[0]||e.defaults.fallbackPorts[0]),t.channelBaud.value=Number(t.defaultBaud.value||e.defaults.serialDefaults.baud),t.channelDataBits.value="8",t.channelParity.value=t.defaultParity.value||"none",t.channelStopBits.value=t.defaultStopBits.value||"1",t.channelFlowControl.value="none",t.channelReadTimeout.value=1e3,t.channelWriteTimeout.value=1e3,t.channelHost.value=t.tcpHost.value||e.defaults.networkDefaults.host,t.channelTcpPort.value=Number(t.tcpPort.value||502),t.channelAutoConnect.value=!!t.autoConnectOnStart.value,t.channelDialogOpen.value=!0}function r(){n(),t.channelDialogMode.value="serial",t.channelType.value="serial"}function s(){t.channelDialogOpen.value=!1}function a(){if(e.bridge.value){if(t.channelType.value==="serial"){if(t.channelAutoConnect.value){const i=e.normalizeSerialPortName(t.channelPort.value);i&&(t.channelPort.value=i,e.bridge.value.connect_serial(i,Number(t.channelBaud.value||115200)))}}else t.channelType.value==="tcp"&&t.channelAutoConnect.value&&e.bridge.value.connect_tcp(t.channelHost.value,Number(t.channelTcpPort.value||502));t.channelDialogOpen.value=!1}}return{handleNewChannel:n,openChannelSettings:r,closeChannelDialog:s,submitChannelDialog:a}}function fo(e,t=!1,n=!1){let r=e;return t&&(r+="\r"),n&&(r+=` +`),r}function ho(e,t=!1,n=!1){const r=String(e||"").trim().split(/\s+/).filter(Boolean);return t&&r.push("0D"),n&&r.push("0A"),r.join(" ")}function Lg(e){function t(){if(!e.bridge.value||!e.sendText.value)return;const a=fo(e.sendText.value,e.appendCR.value,e.appendLF.value);e.bridge.value.send_text(a)}function n(){if(!e.bridge.value||!e.sendHex.value)return;const a=ho(e.sendHex.value,e.appendCR.value,e.appendLF.value);e.bridge.value.send_hex(a)}function r(){if(e.sendMode.value==="hex"){n();return}t()}function s(a){if(!a)return;const i=typeof a=="string"?a:a.payload||a.name||"";if(!i)return;const o=typeof a=="string"?"text":a.mode||"text",l=typeof a=="string"?e.appendCR.value:a.appendCR??e.appendCR.value,u=typeof a=="string"?e.appendLF.value:a.appendLF??e.appendLF.value;if(o==="hex"){if(e.sendMode.value="hex",e.sendHex.value=i,!e.bridge.value)return;const h=ho(i,l,u);e.bridge.value.send_hex(h);return}if(e.sendMode.value="text",e.sendText.value=i,!e.bridge.value)return;const c=fo(i,l,u);e.bridge.value.send_text(c)}return{sendPayload:r,sendQuickCommand:s}}function Rg(e){function t(r){if(typeof r!="string")return r;try{return JSON.parse(r)}catch{return{text:String(r)}}}function n(r){if(!e.commPaused.value&&(r=t(r),!!Array.isArray(r)))for(const s of r){if(!s)continue;const a=s.kind||"RX";if(a==="FRAME"){e.addCommLog("FRAME",{text:JSON.stringify(s.payload),ts:s.ts});continue}let i=s.payload||{};i&&typeof i=="object"&&!i.text&&!i.hex&&(s.text||s.hex)&&(i={text:s.text||"",hex:s.hex||"",ts:s.ts||i.ts}),i&&typeof i=="object"&&!i.text&&!i.hex&&(i={text:JSON.stringify(s),ts:s.ts||i.ts}),e.addCommLog(a,i)}}return{parseBridgePayload:t,addCommBatch:n}}function Mg(e){const t=e.createObjectUrl||(o=>URL.createObjectURL(o)),n=e.revokeObjectUrl||(o=>URL.revokeObjectURL(o)),r=e.createAnchor||(()=>document.createElement("a"));function s(o){return o?e.displayMode.value==="hex"&&o.hex?o.hex:o.text||o.hex||"":""}function a(o){if(!o)return"";const l=o.ts?e.formatTime(o.ts):"",u=o.kind||"",c=s(o).replace(/\r?\n/g,"\\n");return`${l} ${u} ${c}`}function i(){const l=e.commLogs.value.map(m=>a(m)).filter(Boolean).join(` +`),u=`io_logs_${new Date().toISOString().replace(/[:.]/g,"-")}.log`,c=new Blob([l],{type:"text/plain"}),h=t(c),b=r();b.href=h,b.download=u,document.body.appendChild(b),b.click(),b.remove(),n(h)}return{formatPayload:s,formatCommLine:a,exportCommLogs:i}}const Dg=e=>window.alert(e),Ng=()=>`qc_${Date.now()}_${Math.random().toString(16).slice(2,6)}`;function Og(e,t){const n=String(e||"");if(t==="hex"){const r=n.replace(/[^0-9a-fA-F]/g,"");return Math.floor(r.length/2)}return n.length}function zg(e){const t=e.alert||Dg,n=e.generateId||Ng;function r(m){if(!Array.isArray(m))return e.quickCommands.value;const x=[];return m.forEach((v,O)=>{if(!v)return;if(typeof v=="string"){x.push({id:`qc_${O}`,name:v,payload:v,mode:"text",appendCR:!0,appendLF:!0});return}const E=String(v.name||v.payload||"").trim(),V=String(v.payload||v.name||"").trim();!E||!V||x.push({id:v.id||`qc_${O}`,name:E,payload:V,mode:v.mode==="hex"?"hex":"text",appendCR:v.appendCR??!0,appendLF:v.appendLF??!0})}),x.length?x:e.quickCommands.value}function s(m){m&&(e.quickDeleting.value=m,e.quickDeleteOpen.value=!0)}function a(){e.quickDeleteOpen.value=!1,e.quickDeleting.value=null}function i(){e.quickDeleting.value&&(e.quickCommands.value=e.quickCommands.value.filter(m=>m.id!==e.quickDeleting.value.id),a())}function o(m){m?(e.quickDialogMode.value="edit",e.quickEditingId.value=m.id,e.quickDraft.value={name:m.name||"",payload:m.payload||m.name||"",mode:m.mode==="hex"?"hex":"text",appendCR:m.appendCR??!0,appendLF:m.appendLF??!0}):(e.quickDialogMode.value="create",e.quickEditingId.value="",e.quickDraft.value={name:"",payload:"",mode:e.sendMode.value==="hex"?"hex":"text",appendCR:e.appendCR.value,appendLF:e.appendLF.value}),e.quickDialogOpen.value=!0}function l(){e.quickDialogOpen.value=!1}function u(){const m=String(e.quickDraft.value.name||"").trim(),x=String(e.quickDraft.value.payload||"").trim();if(!m||!x){t(e.tr("请输入指令名称和内容"));return}const v={name:m,payload:e.quickDraft.value.payload,mode:e.quickDraft.value.mode==="hex"?"hex":"text",appendCR:e.quickDraft.value.appendCR??!0,appendLF:e.quickDraft.value.appendLF??!0};if(e.quickDialogMode.value==="edit"&&e.quickEditingId.value){const O=e.quickCommands.value.find(E=>E.id===e.quickEditingId.value);O?Object.assign(O,v):e.quickCommands.value.push({id:e.quickEditingId.value,...v})}else e.quickCommands.value.push({id:n(),...v});l()}function c(){o()}function h(m){o(m)}function b(m){s(m)}return{normalizeQuickCommands:r,openQuickDeleteDialog:s,closeQuickDeleteDialog:a,confirmQuickDelete:i,openQuickCommandDialog:o,closeQuickCommandDialog:l,saveQuickCommand:u,addQuickCommand:c,editQuickCommand:h,removeQuickCommand:b,countQuickPayload:Og}}function Ug(e){function t(){if(e.bridge.value&&e.bridge.value.load_yaml){e.withResult(e.bridge.value.load_yaml(),a=>{!a||!a.text||(e.yamlText.value=a.text,e.scriptFileName.value=a.name||e.scriptFileName.value,e.scriptFilePath.value=a.path||e.scriptFilePath.value,e.refreshScriptVariables(),e.addScriptLog(`[INFO] Loaded: ${e.scriptFileName.value}`))});return}e.yamlFileInputRef.value&&(e.yamlFileInputRef.value.value="",e.yamlFileInputRef.value.click())}function n(){const a=e.yamlText.value.trim();if(!a){e.addScriptLog("[WARN] YAML is empty, not saved.");return}if(e.bridge.value&&e.bridge.value.save_yaml){e.withResult(e.bridge.value.save_yaml(a,e.scriptFileName.value||"workflow.yaml"),c=>{c&&(c.name&&(e.scriptFileName.value=c.name),c.path&&(e.scriptFilePath.value=c.path),e.addScriptLog(`[INFO] Saved: ${e.scriptFileName.value}`))});return}const i=e.scriptFileName.value||"script.yaml",o=new Blob([a],{type:"text/yaml"}),l=URL.createObjectURL(o),u=document.createElement("a");u.href=l,u.download=i,document.body.appendChild(u),u.click(),u.remove(),URL.revokeObjectURL(l),e.addScriptLog(`[INFO] Saved: ${i}`)}function r(a){const i=a&&a.target&&a.target.files?a.target.files[0]:null;if(!i)return;const o=new FileReader;o.onload=()=>{const l=typeof o.result=="string"?o.result:"";e.yamlText.value=l,e.scriptFileName.value=i.name,e.scriptFilePath.value=i.name,e.refreshScriptVariables(),e.addScriptLog(`[INFO] Loaded: ${i.name}`)},o.readAsText(i)}async function s(){const a=e.yamlText.value.trim();if(!a){e.addScriptLog("[WARN] YAML is empty, nothing to copy.");return}if(navigator.clipboard&&navigator.clipboard.writeText)try{await navigator.clipboard.writeText(a),e.addScriptLog("[INFO] YAML copied to clipboard.");return}catch{e.addScriptLog("[WARN] Clipboard API failed, falling back.")}const i=document.createElement("textarea");i.value=a,document.body.appendChild(i),i.select(),document.execCommand("copy"),i.remove(),e.addScriptLog("[INFO] YAML copied to clipboard.")}return{loadYaml:t,saveYaml:n,handleYamlFile:r,copyYaml:s}}function Fg(e){async function t(){e.uiModalOpen.value||(e.uiModalOpen.value=!0),e.uiRuntime.yamlText=e.yamlText.value,await e.uiRuntime._parseWithBridge()}function n(){e.uiModalOpen.value=!1}function r(){if(!e.bridge.value)return;const a=e.yamlText.value.trim();if(!a){e.addScriptLog("[WARN] YAML is empty, abort run.");return}e.scriptRunning.value=!0,e.scriptState.value="starting",e.scriptStartMs.value=Date.now(),e.scriptElapsedMs.value=0,e.scriptProgress.value=0,t(),e.bridge.value.run_script(a)}function s(){e.bridge.value&&(e.scriptState.value="stopping",e.bridge.value.stop_script(),e.addScriptLog("[INFO] Stop requested."))}return{openUiYamlModal:t,closeUiYamlModal:n,runScript:r,stopScript:s}}function Bg(e){function t(){e.scriptLogs.value=[],e.scriptLogBuffer.length=0}function n(){if(!e.scriptLogRef.value)return;const s=e.scriptLogRef.value.rootEl,a=s&&s.value?s.value:s;a&&(a.scrollTop=a.scrollHeight)}function r(){e.clearScriptVarTimer(),e.scriptVariablesList.value=e.parseScriptVariables(e.yamlText.value)}return{clearScriptLogs:t,scrollScriptLogsToBottom:n,refreshScriptVariables:r}}function jg(e){function t(){const n=window.prompt(e.tr("搜索关键词"));if(!n)return;const r=e.getEditor();if(r){const o=r.state.doc.toString().toLowerCase().indexOf(n.toLowerCase());if(o===-1){e.addScriptLog(`[INFO] Not found: ${n}`);return}r.dispatch({selection:{anchor:o,head:o+n.length},scrollIntoView:!0});return}window.find(n)||e.addScriptLog(`[INFO] Not found: ${n}`)}return{searchYaml:t}}function Vg(e){function t(n){n&&(n.script_log&&typeof n.script_log.connect=="function"&&n.script_log.connect(r=>e.addScriptLog(r)),n.script_state&&typeof n.script_state.connect=="function"&&n.script_state.connect(r=>{if(r==="__running__"){e.scriptRunning.value=!0,e.scriptState.value="running";return}if(r==="__finished__"){e.scriptRunning.value=!1,e.scriptState.value="idle",e.scriptProgress.value=100;return}if(r==="__stopped__"){e.scriptRunning.value=!1,e.scriptState.value="idle";return}if(r==="__error__"){e.scriptRunning.value=!1,e.scriptState.value="error";return}e.scriptState.value=r,r&&(e.scriptRunning.value=!0)}),n.script_progress&&typeof n.script_progress.connect=="function"&&n.script_progress.connect(r=>{e.scriptProgress.value=r}),n.channel_update&&typeof n.channel_update.connect=="function"&&n.channel_update.connect(r=>{e.scheduleSetChannels(r)}))}return{bindScriptBridgeSignals:t}}function $g(e){function t(n){n&&(n.comm_rx&&n.comm_tx&&typeof n.comm_rx.connect=="function"&&typeof n.comm_tx.connect=="function"?(n.comm_rx.connect(r=>{const s=e.parseBridgePayload(r);e.addCommLog("RX",s)}),n.comm_tx.connect(r=>{const s=e.parseBridgePayload(r);e.addCommLog("TX",s)})):n.comm_batch&&typeof n.comm_batch.connect=="function"&&n.comm_batch.connect(r=>e.addCommBatch(r)),n.protocol_frame&&typeof n.protocol_frame.connect=="function"&&n.protocol_frame.connect(r=>{const s=r&&r.ts?r.ts:Date.now()/1e3;e.addCommLog("FRAME",{text:JSON.stringify(r),ts:s})}),n.capture_frame&&typeof n.capture_frame.connect=="function"&&n.capture_frame.connect(r=>{const s=r&&r.ts?r.ts:Date.now()/1e3;e.addCommLog("CAPTURE",{text:JSON.stringify(r),ts:s}),e.ingestCaptureFrame(r)}),n.comm_status&&typeof n.comm_status.connect=="function"&&n.comm_status.connect(r=>{const s=r&&r.payload!==void 0?r.payload:r,a=r&&r.ts?r.ts:Date.now()/1e3;if(e.setConnectingFalse(),!s){const i=r&&r.reason?String(r.reason):"",o=i?`Disconnected: ${i}`:"Disconnected";e.shouldEmitDisconnected(i)&&e.emitStatus(o,a),e.onConnectionInfo({state:"disconnected",detail:""}),e.scheduleChannelRefresh();return}if(typeof s=="string"){e.emitStatus(`Error: ${s}`,a),e.onConnectionInfo({state:"error",detail:s}),e.scheduleChannelRefresh();return}if(s&&typeof s=="object"){const i=s.address||s.port||s.type||"";e.emitStatus(`Connected: ${i}`,a)}e.onConnectionInfo({state:"connected",detail:s.address||s.port||s.type||""}),e.scheduleChannelRefresh()}))}return{bindCommBridgeSignals:t}}function Wg(e){const t=S(!1),n=S(!1),r=S(!1),s=S({x:0,y:0}),a=S("");let i=!1;function o(){const H=e.sidebarRef.value;if(!H||!H.getBoundingClientRect)return;const be=Math.round(H.getBoundingClientRect().width);document.documentElement.style.setProperty("--sidebar-width",`${be}px`)}function l(){document.documentElement.style.removeProperty("--sidebar-width")}function u(H){H&&(H.detail&&H.detail>1||(n.value=!0,r.value=!1,s.value={x:H.screenX,y:H.screenY},K()))}function c(H){if(!n.value||r.value||!H)return;const be=Math.abs(H.screenX-s.value.x),_e=Math.abs(H.screenY-s.value.y);be<10&&_e<10||(o(),e.bridge.value&&(e.bridge.value.window_start_move_at?e.bridge.value.window_start_move_at(Math.round(H.screenX),Math.round(H.screenY)):e.bridge.value.window_start_move&&e.bridge.value.window_start_move()),r.value=!0,t.value=!0,N(),document.body.classList.add("dragging-window"),e.lockPageScroll(),a.value="",Q())}function h(){e.bridge.value&&e.bridge.value.window_minimize&&e.bridge.value.window_minimize()}function b(){e.bridge.value&&e.bridge.value.window_toggle_maximize&&e.bridge.value.window_toggle_maximize()}function m(){e.bridge.value&&e.bridge.value.window_close&&e.bridge.value.window_close()}function x(H){e.bridge.value&&H&&r.value&&e.bridge.value.window_apply_snap&&e.bridge.value.window_apply_snap(Math.round(H.screenX),Math.round(H.screenY)),z()}function v(H){e.bridge.value&&H&&e.bridge.value.window_show_system_menu&&e.bridge.value.window_show_system_menu(Math.round(H.screenX),Math.round(H.screenY))}function O(H,be){!e.bridge.value||!H||!be||!e.bridge.value.window_start_resize||(document.body.classList.add("resizing"),e.lockPageScroll(),e.bridge.value.window_start_resize(H))}function E(H){t.value&&x(H)}function V(){t.value||(n.value=!1,r.value=!1),N()}function K(){i||(i=!0,window.addEventListener("mousemove",c),window.addEventListener("mouseup",V),window.addEventListener("blur",V))}function N(){i&&(i=!1,window.removeEventListener("mousemove",c),window.removeEventListener("mouseup",V),window.removeEventListener("blur",V))}function Q(){window.addEventListener("mouseup",E),window.addEventListener("blur",oe),document.addEventListener("visibilitychange",oe)}function W(){window.removeEventListener("mouseup",E),window.removeEventListener("blur",oe),document.removeEventListener("visibilitychange",oe)}function oe(){z()}function z(){t.value=!1,n.value=!1,r.value=!1,a.value="",l(),document.body.classList.remove("dragging-window"),document.body.classList.remove("resizing"),e.unlockPageScroll(),N(),W()}function B(){z()}function re(){t.value||(n.value=!1,r.value=!1,N())}return{draggingWindow:t,snapPreview:a,armWindowMove:u,maybeStartWindowMove:c,minimizeWindow:h,toggleMaximize:b,closeWindow:m,applyWindowSnap:x,showSystemMenu:v,startResize:O,cancelWindowMoveArm:re,disposeWindowChrome:B}}function Hg(e){const t=ge(()=>{if(!e.settingsSnapshot.value)return!1;const a=e.normalize(e.buildPayload());return JSON.stringify(a)!==JSON.stringify(e.settingsSnapshot.value)});function n(a){e.settingsSnapshot.value=e.normalize(a)}function r(){n(e.buildPayload())}function s(){e.settingsSnapshot.value&&e.apply(e.settingsSnapshot.value)}return{settingsDirty:t,setSnapshot:n,commitCurrent:r,discard:s}}function Kg(e,t,n){const r=String(e||""),s=r.toLowerCase();let i={"zh-cn":"zh-CN","zh-tw":"zh-TW","en-us":"en-US","ja-jp":"ja-JP","ko-kr":"ko-KR","fr-fr":"fr-FR","de-de":"de-DE","es-es":"es-ES","pt-br":"pt-BR","ru-ru":"ru-RU",ar:"ar",hi:"hi","it-it":"it-IT","nl-nl":"nl-NL","th-th":"th-TH","vi-vn":"vi-VN","id-id":"id-ID","tr-tr":"tr-TR","pl-pl":"pl-PL","uk-ua":"uk-UA"}[s]||"";return i||(r==="简体中文"?i="zh-CN":r==="繁體中文"||r==="繁体中文"?i="zh-TW":r==="English (US)"&&(i="en-US")),i&&t.has(i)?i:n}function Zg(e){const t=String(e||""),n=t.toLowerCase();return t==="system"||n==="system"||t==="系统默认"?"system":t==="dark"||n==="dark"||t==="深色 (工程模式)"?"dark":"light"}function qg(e){const{refs:t,defaults:n,normalizeQuickCommands:r}=e;function s(){return{uiLanguage:t.uiLanguage.value,uiTheme:t.uiTheme.value,autoConnectOnStart:!!t.autoConnectOnStart.value,dslWorkspacePath:t.dslWorkspacePath.value,quickCommands:t.quickCommands.value,serial:{defaultBaud:Number(t.defaultBaud.value||n.serialDefaults.baud),defaultParity:t.defaultParity.value,defaultStopBits:t.defaultStopBits.value},network:{tcpTimeoutMs:Number(t.tcpTimeoutMs.value||0),tcpHeartbeatSec:Number(t.tcpHeartbeatSec.value||0),tcpRetryCount:Number(t.tcpRetryCount.value||0)}}}function a(o){const l=n.workspaceFallback||"/usr/local/protoflow/workflows",u={uiLanguage:n.uiDefaults.language,uiTheme:n.uiDefaults.theme,autoConnectOnStart:n.uiDefaults.autoConnectOnStart,dslWorkspacePath:l,quickCommands:t.quickCommands.value,serial:{defaultBaud:n.serialDefaults.baud,defaultParity:n.serialDefaults.parity,defaultStopBits:n.serialDefaults.stopBits},network:{tcpTimeoutMs:n.networkDefaults.timeoutMs,tcpHeartbeatSec:n.networkDefaults.heartbeatSec,tcpRetryCount:n.networkDefaults.retryCount}};return!o||typeof o!="object"?u:{...u,...o,uiLanguage:Kg(o.uiLanguage,n.supportedLanguages,n.defaultLanguage),uiTheme:Zg(o.uiTheme),serial:{...u.serial,...o.serial||{}},network:{...u.network,...o.network||{}}}}function i(o){const l=a(o);t.uiLanguage.value=l.uiLanguage,t.uiTheme.value=l.uiTheme,t.autoConnectOnStart.value=!!l.autoConnectOnStart,t.dslWorkspacePath.value=l.dslWorkspacePath,t.quickCommands.value=r(l.quickCommands),t.defaultBaud.value=Number(l.serial.defaultBaud||n.serialDefaults.baud),t.defaultParity.value=l.serial.defaultParity||n.serialDefaults.parity,t.defaultStopBits.value=l.serial.defaultStopBits||n.serialDefaults.stopBits,t.tcpTimeoutMs.value=Number(l.network.tcpTimeoutMs||0),t.tcpHeartbeatSec.value=Number(l.network.tcpHeartbeatSec||0),t.tcpRetryCount.value=Number(l.network.tcpRetryCount||0),t.baud.value=Number(t.defaultBaud.value||n.serialDefaults.baud)}return{buildSettingsPayload:s,normalizeSettings:a,applySettings:i}}function Yg(e){function t(){if(e.bridge.value&&e.bridge.value.load_settings){e.withResult(e.bridge.value.load_settings(),a=>{const i=e.normalizeSettings(a);e.applySettings(i),e.setSettingsSnapshot(i)});return}const s=e.normalizeSettings(null);e.applySettings(s),e.setSettingsSnapshot(s)}function n(){const s=e.buildSettingsPayload();e.settingsSaving.value=!0;const a=()=>{e.commitSettingsSnapshot(),e.settingsSaving.value=!1};e.bridge.value&&e.bridge.value.save_settings?e.withResult(e.bridge.value.save_settings(s),()=>a()):a()}function r(){!e.bridge.value||!e.bridge.value.select_directory||e.withResult(e.bridge.value.select_directory(e.tr("选择工作区"),e.dslWorkspacePath.value||""),s=>{s&&(e.dslWorkspacePath.value=s)})}return{loadSettings:t,saveSettings:n,chooseDslWorkspace:r}}function Gg(e){const t=String(e||"").toLowerCase();return t==="modbus_rtu"||t==="modbus-rtu"?"modbus-rtu":t==="modbus_ascii"||t==="modbus-ascii"?"modbus-ascii":t==="modbus_tcp"||t==="modbus-tcp"?"modbus-tcp":t.includes("tcp")?"tcp":"custom"}function Qg(e,t,n){const r=String(e||"").trim();return r?r.split("_").map(a=>{const i=a.toUpperCase();return["RTU","TCP","SCPI","AT","XMODEM","YMODEM"].includes(i)||i.length<=2?i:a.charAt(0).toUpperCase()+a.slice(1)}).join(" "):t||n("协议")}function Jg(e,t){return e==="available"?{text:t("可用"),className:"badge-green"}:e==="custom"?{text:t("自定义"),className:"badge-blue"}:e==="disabled"?{text:t("已禁用"),className:"badge-gray"}:{text:e||t("未知"),className:"badge-gray"}}function Xg(e){const t=S("all"),n=S(!1),r=S("create"),s=S(null),a=S(!1),i=S(null),o=S({id:"",key:"",name:"",desc:"",category:"custom",status:"custom"}),l=S([]),u=ge(()=>t.value==="all"?l.value:l.value.filter(W=>W.category===t.value));function c(W){const oe=Array.isArray(W)?W:[];l.value=oe.map(z=>{const B=String(z.key||z.id||""),re=String(z.driver||""),H=String(z.name||""),be=String(z.category||Gg(B)),_e=String(z.status||"available"),it=String(z.source||"builtin"),bt=String(z.desc||""),ae=Jg(_e,e.tr);return{id:B||re||Math.random().toString(36).slice(2),key:B,name:H||Qg(B,re,e.tr),driver:re,category:be,desc:bt,statusText:ae.text,statusClass:ae.className,status:_e,source:it,rows:[{label:e.tr("键名"),value:B||"--"},{label:e.tr("驱动"),value:re||"--"},{label:e.tr("分类"),value:be||"--"}]}})}function h(){!e.bridge.value||!e.bridge.value.list_protocols||e.withResult(e.bridge.value.list_protocols(),W=>{c(W)})}function b(){o.value={id:"",key:"",name:"",desc:"",category:"custom",status:"custom"}}function m(){r.value="create",s.value=null,b(),n.value=!0}function x(W){W&&(s.value=W,r.value=W.source==="custom"?"edit":"view",o.value={id:W.id||"",key:W.key||"",name:W.name||"",desc:W.desc||"",category:W.category||"custom",status:W.status||"available"},n.value=!0)}function v(){n.value=!1}function O({field:W,value:oe}){W&&(o.value={...o.value,[W]:oe})}function E(){if(!e.bridge.value){n.value=!1;return}const W={id:o.value.id,key:o.value.key,name:o.value.name,desc:o.value.desc,category:o.value.category,status:o.value.status};if(r.value==="create"){if(!e.bridge.value.create_protocol)return;e.withResult(e.bridge.value.create_protocol(W),()=>{h(),n.value=!1});return}if(r.value==="edit"){if(!e.bridge.value.update_protocol)return;e.withResult(e.bridge.value.update_protocol(W),()=>{h(),n.value=!1});return}n.value=!1}function V(W){!W||W.source!=="custom"||(i.value=W,a.value=!0)}function K(){a.value=!1,i.value=null}function N(){if(!e.bridge.value||!e.bridge.value.delete_protocol||!i.value){K();return}const W=i.value.id;e.withResult(e.bridge.value.delete_protocol(W),()=>{h(),K()})}function Q(W){t.value=W}return{protocolTab:t,protocolDialogOpen:n,protocolDialogMode:r,protocolEditing:s,protocolDeleteOpen:a,protocolDeleting:i,protocolDraft:o,protocolCards:l,filteredProtocolCards:u,setProtocols:c,refreshProtocols:h,openCreateProtocol:m,openProtocolDetails:x,closeProtocolDialog:v,updateProtocolDraft:O,saveProtocol:E,openProtocolDelete:V,closeProtocolDelete:K,confirmProtocolDelete:N,setProtocolTab:Q}}function ep(e){let t=null,n=null;function r(i){!i||t===i||(t=i,e.bridge.value=i,i.get_app_version&&nt(i.get_app_version(),o=>{o&&(e.appVersion.value=String(o).trim())}),i.get_feature_flags&&nt(i.get_feature_flags(),o=>{o&&typeof o=="object"&&e.applyFeatureFlags(o)}),e.bindCommBridgeSignals(i),e.bindScriptBridgeSignals(i),e.refreshPorts(),e.refreshChannels(),e.refreshProtocols(),e.refreshPlugins(),e.loadSettings())}function s(i=()=>window.bridge,o=200){n||(n=window.setInterval(()=>{const l=i();l&&(r(l),n&&(window.clearInterval(n),n=null))},o))}function a(){n&&(window.clearInterval(n),n=null)}return{attachBridge:r,startBridgeBootstrap:s,disposeBridgeBootstrap:a}}function tp(e){const t=[],n=[],r=S(!1);let s=0,a=0,i=0,o="";function l(){if(t.length){const O=t.splice(0,t.length);e.commLogs.value.push(...O),e.commLogs.value.length>e.maxCommLogs&&e.commLogs.value.splice(0,e.commLogs.value.length-e.maxCommLogs)}n.length&&(e.scriptLogs.value.push(...n.splice(0,n.length)),e.scriptLogs.value.length>e.maxScriptLogs&&e.scriptLogs.value.splice(0,e.scriptLogs.value.length-e.maxScriptLogs))}function u(){s||(s=window.requestAnimationFrame(()=>{s=0,l()}))}function c(O,E){e.commPaused.value||(!E||typeof E!="object"?E={text:String(E||""),hex:"",ts:Date.now()/1e3}:!E.text&&!E.hex&&(E={text:JSON.stringify(E),hex:"",ts:E.ts||Date.now()/1e3}),t.push({id:`c${a++}`,kind:O,text:E.text||"",hex:E.hex||"",ts:E.ts||Date.now()/1e3}),u())}function h(O,E){const V=String(O||"");!V||V===o||(o=V,r.value=!0,c("STATUS",{text:V,ts:E}))}function b(O){const E=String(O||"");n.push({id:`s${i++}`,text:E}),u(),(E.includes("Script finished")||E.includes("Script stopped")||E.toLowerCase().includes("[error]"))&&(e.scriptRunning.value=!1,e.scriptState.value="idle")}function m(){e.commLogs.value=[],t.length=0}function x(){e.commPaused.value=!e.commPaused.value}function v(){s&&(window.cancelAnimationFrame(s),s=0)}return{scriptLogBuffer:n,hasStatusActivity:r,addCommLog:c,emitStatus:h,addScriptLog:b,clearCommLogs:m,toggleCommPaused:x,disposeLogBuffers:v}}const np={class:"app"},rp={class:"title-actions"},sp={class:"app-shell"},ap={class:"sidebar-header"},ip={class:"brand-meta"},op={class:"sidebar-nav"},lp={class:"main"},cp={key:2,class:"page"},up={key:3,class:"page"},dp=200,fp=200,$s=120,hp=256,gp={__name:"App",setup(e){const t=ut(()=>Ie(()=>import("./ManualView-DJLo1BfX.js"),__vite__mapDeps([0,1,2]),import.meta.url)),n=ut(()=>Ie(()=>import("./ScriptsView-1qSko5pB.js"),__vite__mapDeps([3,2]),import.meta.url)),r=ut(()=>Ie(()=>import("./ChannelDialogModal-DzmGdCiS.js"),__vite__mapDeps([4,1]),import.meta.url)),s=ut(()=>Ie(()=>import("./SettingsPanels-DGYEalpE.js"),__vite__mapDeps([5,1]),import.meta.url)),a=ut(()=>Ie(()=>import("./SettingsHeader-UIDTxUaK.js"),[],import.meta.url)),i=ut(()=>Ie(()=>import("./ProtocolCardsSection-Cn6wfyRB.js"),[],import.meta.url)),o=ut(()=>Ie(()=>import("./ProtocolHeader-CYs6sqHy.js"),[],import.meta.url)),l=ut(()=>Ie(()=>import("./ProtocolEditModal-DeOzd6kz.js"),[],import.meta.url)),u=ut(()=>Ie(()=>import("./ProtocolDeleteModal-DSL3yVyk.js"),[],import.meta.url)),c=ut(()=>Ie(()=>import("./UiYamlPreviewModal-Ds7DIyOM.js"),[],import.meta.url)),h=S(null),b=S(null),m=S({state:"disconnected",detail:""}),x=S([]),v=S(da[0]||"COM1"),O=S($e.baud),E=S(St.host),V=S(St.port),K=S("serial"),N=S("text"),Q=S("ascii"),W=S(""),oe=S(""),z=S([]),B=S([]),re=S(!1),H=S("idle"),be=S(0),_e=S("# paste DSL YAML here"),it=S("production_test_suite_v2.yaml"),bt=S("/usr/local/scripts/auto/prod/..."),ae=S(!1),te=S(0),de=S(0),tt=S([]),Yt=S(null),ot=S(null),Xe=S(!0),Ut=S(!0),_t=S(null),Oe=S("manual"),Ft=S(""),Gt=S("all"),Qt=S(!0),pn=S(!0),Jt=S(!1),Mn=S(!1),d=$e.portPlaceholder,f=S(!1),p=S("create"),T=S("serial"),_=S(""),C=S(""),L=S($e.baud),I=S($e.dataBits),A=S($e.parity),k=S($e.stopBits),$=S($e.flowControl),R=S($e.readTimeoutMs),j=S($e.writeTimeoutMs),q=S(St.host),ne=S(St.port),fe=S(!0),ie=S(Un.language),Se=S(Un.theme),Ee=S($e.baud),We=S($e.parity),He=S($e.stopBits),Xt=S(St.timeoutMs),dr=S(St.heartbeatSec),ze=S(St.retryCount),Ve=S("/usr/local/protoflow/workflows"),en=S(Un.autoConnectOnStart),Dn=S(!1),Dl=S(null),fs=S("general"),hs=S(""),gs=S([]),fr=S([]),ps=S(!1),{translations:hr,supportedLanguages:Nl,DEFAULT_LANGUAGE:Nn}=wg,ce=(y,g)=>{const w=ie.value||Nn;return hr[w]?.[y]??hr[Nn]?.[y]??g??y},Ke=y=>{const g=ie.value||Nn,w=String(y??"");return hr[g]?.[w]??hr[Nn]?.[w]??w},gr=ge(()=>({manual:ce("nav.manual"),scripts:ce("nav.scripts"),protocols:ce("nav.protocols"),settings:ce("nav.settings")})),Da=S("all"),Na=tg(),pr=S(!1),Oa=S(""),Ol=S(!1),{scriptLogBuffer:zl,hasStatusActivity:Ul,addCommLog:za,emitStatus:Ua,addScriptLog:mr,clearCommLogs:Fl,toggleCommPaused:Bl,disposeLogBuffers:jl}=tp({commLogs:z,scriptLogs:B,commPaused:re,scriptRunning:ae,scriptState:H,maxCommLogs:dp,maxScriptLogs:fp}),{parseBridgePayload:Vl,addCommBatch:$l}=Rg({commPaused:re,addCommLog:za}),{formatPayload:Wl,exportCommLogs:Hl}=Mg({displayMode:Q,commLogs:z,formatTime:ni}),Kl=()=>{},{noPorts:Zl,portOptionsList:Fa,applyPorts:ql,selectPort:Yl}=xg(x,v),{resolveSerialPort:Gl}=Pg(),ms=S([{id:"qc_at_gmr",name:"AT+GMR",payload:"AT+GMR",mode:"text",appendCR:!0,appendLF:!0},{id:"qc_reset",name:"RESET_DEVICE_01",payload:"RESET_DEVICE_01",mode:"text",appendCR:!0,appendLF:!0},{id:"qc_wifi",name:"GET_WIFI_STATUS",payload:"GET_WIFI_STATUS",mode:"text",appendCR:!0,appendLF:!0},{id:"qc_ping",name:"PING_SERVER",payload:"PING_SERVER",mode:"text",appendCR:!0,appendLF:!0}]),vs=S(!1),Ba=S("create"),Ql=S(""),ys=S(!1),ja=S(null),vr=S({name:"",payload:"",mode:"text",appendCR:!0,appendLF:!0}),{normalizeQuickCommands:Jl,openQuickDeleteDialog:Xl,closeQuickDeleteDialog:ec,confirmQuickDelete:tc,openQuickCommandDialog:nc,closeQuickCommandDialog:rc,saveQuickCommand:sc,addQuickCommand:ac,editQuickCommand:ic,removeQuickCommand:oc,countQuickPayload:lc}=zg({quickCommands:ms,quickDialogOpen:vs,quickDialogMode:Ba,quickEditingId:Ql,quickDeleteOpen:ys,quickDeleting:ja,quickDraft:vr,sendMode:N,appendCR:Qt,appendLF:pn,tr:Ke}),Va=S([]),$a=ge(()=>Va.value.map(y=>{const g=y.type||"unknown",w=y.status||"disconnected",Ce={connected:{text:ce("status.connected"),className:"status-ok"},connecting:{text:ce("status.connecting"),className:"status-warn"},error:{text:ce("status.error"),className:"status-error"},disconnected:{text:ce("status.disconnected"),className:"status-idle"},idle:{text:Ke("空闲"),className:"status-idle"}},ke=Ce[w]||Ce.disconnected,Ze=g==="serial",lt=g==="tcp-client",Ps=Ke(Ze?"串口通道":lt?"TCP 客户端":"TCP 服务端"),ct=Ze?[y.port||"--",y.baud?`${y.baud} bps`:"--"]:[y.host||y.address||"--",y.port?`${Ke("端口")}: ${y.port}`:"--"],As=`TX: ${ri(y.tx_bytes||0)} / RX: ${ri(y.rx_bytes||0)}`;return{id:y.id||`${g}:${ct[0]}`,name:Ps,type:Ze?"Serial":lt?"TCP Client":"TCP Server",category:g,statusText:ke.text,statusClass:ke.className,details:ct,traffic:As,error:y.error||""}})),Wa=ge(()=>m.value.state==="connected"),{selectPort:cc,connectSerial:uc,disconnect:dc}=Ag({bridge:h,isConnecting:Mn,isConnected:Wa,selectedPort:v,baud:O,tcpHost:E,tcpPort:V,channelMode:K,resolveSerialPort:Gl,selectChannelPort:Yl}),{scheduleSetChannels:fc,refreshChannels:hc,scheduleChannelRefresh:gc,disposeChannelSync:pc}=Eg({bridge:h,channels:Va,connectionInfo:m,isConnecting:Mn,emitStatus:Ua}),bs=(y,g)=>Array.isArray(y)?y.length<=g?y:y.slice(y.length-g):[],Ha=ge(()=>yu(z.value,Gt.value,Ft.value)),mc=ge(()=>bs(z.value,$s)),vc=ge(()=>bs(Ha.value,$s)),yc=ge(()=>bs(B.value,$s)),bc=ge(()=>tt.value),_c=ge(()=>B.value.filter(y=>String(y.text||"").toLowerCase().includes("[error]")).length),yr=ge(()=>_u(_e.value)),Cc=ge(()=>yr.value?Math.max(0,Math.min(yr.value,Math.round(be.value/100*yr.value))):0),kc=ge(()=>bu(de.value)),wc=ge(()=>!ae.value&&_e.value.trim().length>0),Sc=ge(()=>ae.value),Tc=ge(()=>ae.value?H.value?`${Ke("运行中")} ${H.value}`:Ke("运行中"):Ke("空闲")),xc=ge(()=>ae.value?"running":"idle"),Pc=ge(()=>lc(vr.value.payload,vr.value.mode)),Ac=ge(()=>[{value:"zh-CN",label:ce("lang.zhCN")},{value:"zh-TW",label:ce("lang.zhTW")},{value:"en-US",label:ce("lang.enUS")},{value:"ja-JP",label:ce("lang.jaJP")},{value:"ko-KR",label:ce("lang.koKR")},{value:"fr-FR",label:ce("lang.frFR")},{value:"de-DE",label:ce("lang.deDE")},{value:"es-ES",label:ce("lang.esES")},{value:"pt-BR",label:ce("lang.ptBR")},{value:"ru-RU",label:ce("lang.ruRU")},{value:"ar",label:ce("lang.ar")},{value:"hi",label:ce("lang.hi")},{value:"it-IT",label:ce("lang.itIT")},{value:"nl-NL",label:ce("lang.nlNL")},{value:"th-TH",label:ce("lang.thTH")},{value:"vi-VN",label:ce("lang.viVN")},{value:"id-ID",label:ce("lang.idID")},{value:"tr-TR",label:ce("lang.trTR")},{value:"pl-PL",label:ce("lang.plPL")},{value:"uk-UA",label:ce("lang.ukUA")}]),Ec=ge(()=>[{value:"system",label:ce("theme.system")},{value:"dark",label:ce("theme.dark")},{value:"light",label:ce("theme.light")}]),Ic=ge(()=>Oa.value||Un.appVersionFallback);let br=null;function Lc(y){return y==="dark"?"dark":y==="light"?"light":window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function _s(y){const g=Lc(y);document.documentElement.setAttribute("data-theme",g),document.documentElement.style.colorScheme=g}function Rc(){if(!window.matchMedia)return;br=window.matchMedia("(prefers-color-scheme: dark)");const y=()=>{Se.value==="system"&&_s("system")};br.addEventListener?.("change",y),Ys(()=>{br?.removeEventListener?.("change",y),br=null})}ge(()=>Da.value==="all"?$a.value:$a.value.filter(y=>y.category===Da.value));const{protocolTab:Mc,protocolDialogOpen:Ka,protocolDialogMode:Dc,protocolEditing:Nc,protocolDeleteOpen:Za,protocolDeleting:Oc,protocolDraft:zc,filteredProtocolCards:Uc,refreshProtocols:Cs,openCreateProtocol:qa,openProtocolDetails:Fc,closeProtocolDialog:Bc,updateProtocolDraft:jc,saveProtocol:Vc,openProtocolDelete:$c,closeProtocolDelete:Wc,confirmProtocolDelete:Hc,setProtocolTab:Kc}=Xg({bridge:h,tr:Ke,withResult:nt}),{openChannelSettings:Zc,closeChannelDialog:Ya,submitChannelDialog:qc}=Ig({refs:{channelDialogOpen:f,channelDialogMode:p,channelType:T,channelName:_,channelPort:C,channelBaud:L,channelDataBits:I,channelParity:A,channelStopBits:k,channelFlowControl:$,channelReadTimeout:R,channelWriteTimeout:j,channelHost:q,channelTcpPort:ne,channelAutoConnect:fe,selectedPort:v,ports:x,defaultBaud:Ee,defaultParity:We,defaultStopBits:He,tcpHost:E,tcpPort:V,autoConnectOnStart:en},defaults:{fallbackPorts:da,serialDefaults:{baud:$e.baud},networkDefaults:{host:St.host}},bridge:h,normalizeSerialPortName:ir}),{sendPayload:Yc,sendQuickCommand:Gc}=Lg({bridge:h,sendMode:N,sendText:W,sendHex:oe,appendCR:Qt,appendLF:pn}),{clearScriptLogs:Qc,scrollScriptLogsToBottom:Ga,refreshScriptVariables:Qa}=Bg({scriptLogs:B,scriptLogBuffer:zl,scriptLogRef:ot,scriptVariablesList:tt,yamlText:_e,parseScriptVariables:si,clearScriptVarTimer:()=>{kt&&(window.clearTimeout(kt),kt=null)}}),{loadYaml:Jc,saveYaml:Xc,handleYamlFile:eu,copyYaml:tu}=Ug({bridge:h,withResult:nt,yamlText:_e,scriptFileName:it,scriptFilePath:bt,yamlFileInputRef:Yt,refreshScriptVariables:Qa,addScriptLog:mr}),{openUiYamlModal:nu,closeUiYamlModal:ru,runScript:su,stopScript:au}=Fg({bridge:h,uiRuntime:Na,uiModalOpen:pr,yamlText:_e,scriptRunning:ae,scriptState:H,scriptStartMs:te,scriptElapsedMs:de,scriptProgress:be,addScriptLog:mr}),{searchYaml:iu}=jg({tr:Ke,addScriptLog:mr,getEditor:()=>Ct}),{bindScriptBridgeSignals:ou}=Vg({scriptRunning:ae,scriptState:H,scriptProgress:be,addScriptLog:mr,scheduleSetChannels:fc}),{bindCommBridgeSignals:lu}=$g({parseBridgePayload:Vl,addCommLog:za,addCommBatch:$l,ingestCaptureFrame:Kl,emitStatus:Ua,scheduleChannelRefresh:gc,setConnectingFalse:()=>{Mn.value=!1},onConnectionInfo:y=>{m.value=y},shouldEmitDisconnected:y=>Ul.value||!!y}),{armWindowMove:Ja,minimizeWindow:Xa,toggleMaximize:ks,closeWindow:ei,showSystemMenu:ti,startResize:Bt,cancelWindowMoveArm:cu,disposeWindowChrome:uu}=Wg({bridge:h,sidebarRef:b,lockPageScroll:mu,unlockPageScroll:vu});function du(){cu(),ks()}function fu(y){fs.value=y}function ws(){if(!h.value)return;ps.value=!0,fr.value=[];const y=()=>{ps.value=!1};if(h.value.refresh_plugins){nt(h.value.refresh_plugins(),g=>{hs.value=String(g?.directory||""),gs.value=Array.isArray(g?.items)?g.items:[],h.value.list_protocols?nt(h.value.list_protocols(),w=>{fr.value=Array.isArray(w)?w:[],y()}):y()});return}if(h.value.list_plugins){nt(h.value.list_plugins(),g=>{hs.value=String(g?.directory||""),gs.value=Array.isArray(g?.items)?g.items:[],h.value.list_protocols?nt(h.value.list_protocols(),w=>{fr.value=Array.isArray(w)?w:[],y()}):y()});return}y()}const hu={connectionInfo:m,isConnected:Wa,isConnecting:Mn,selectedPort:v,portOptionsList:Fa,portPlaceholder:d,noPorts:Zl,sendMode:N,sendText:W,sendHex:oe,appendCR:Qt,appendLF:pn,loopSend:Jt,displayMode:Q,quickCommands:ms,logTab:Gt,logKeyword:Ft,visibleCommLogs:Ha,renderedCommLogs:mc,renderedVisibleCommLogs:vc,formatTime:ni,formatPayload:Wl,commPaused:re,clearCommLogs:Fl,toggleCommPaused:Bl,exportCommLogs:Hl,quickDialogOpen:vs,quickDialogMode:Ba,quickDraft:vr,quickPayloadCount:Pc,quickPayloadLimit:hp,openQuickCommandDialog:nc,closeQuickCommandDialog:rc,saveQuickCommand:sc,quickDeleteOpen:ys,quickDeleting:ja,openQuickDeleteDialog:Xl,closeQuickDeleteDialog:ec,confirmQuickDelete:tc,addQuickCommand:ac,editQuickCommand:ic,removeQuickCommand:oc,selectPort:cc,refreshPorts:oi,openChannelSettings:Zc,disconnect:dc,connectSerial:uc,sendPayload:Yc,sendQuickCommand:Gc},gu={scriptFileName:it,scriptFilePath:bt,loadYaml:Jc,saveYaml:Xc,yamlFileInputRef:Yt,handleYamlFile:eu,yamlCollapsed:Ut,toggleYamlCollapsed:ku,copyYaml:tu,searchYaml:iu,yamlEditorRef:_t,scriptStatusClass:xc,scriptRunning:ae,scriptStatusLabel:Tc,scriptCanRun:wc,scriptCanStop:Sc,runScript:su,stopScript:au,scriptState:H,scriptStepIndex:Cc,scriptStepTotal:yr,scriptProgress:be,scriptElapsedLabel:kc,scriptErrorCount:_c,scriptVariables:bc,refreshScriptVariables:Qa,clearScriptLogs:Qc,scrollScriptLogsToBottom:Ga,renderedScriptLogs:yc,scriptLogRef:ot};Cn("manualView",hu),Cn("scriptsView",gu),Cn("bridge",h),Cn("t",ce),Cn("tr",Ke);let _r=null,Ct=null,Ss=!1,kt=null,mn=0,Ts=null;const pu=[".page",".modal-body",".log-stream",".quick-list",".sidebar-nav",".select-menu"];let xs=[];function Cr(y){y&&y.preventDefault()}function mu(){const y=pu.join(", "),g=document.querySelectorAll(y);xs=Array.from(g).map(w=>({el:w,top:w.scrollTop||0})),document.addEventListener("wheel",Cr,{passive:!1}),document.addEventListener("touchmove",Cr,{passive:!1})}function vu(){xs.forEach(y=>{y.el&&(y.el.scrollTop=y.top)}),xs=[],document.removeEventListener("wheel",Cr),document.removeEventListener("touchmove",Cr)}function yu(y,g,w){if(g==="tcp")return[];const Ce=String(w||"").trim().toLowerCase();return Ce?y.filter(ke=>{const Ze=String(ke.text||"").toLowerCase(),lt=String(ke.hex||"").toLowerCase();return Ze.includes(Ce)||lt.includes(Ce)}):y}function ni(y){const g=new Date((y||0)*1e3),w=(Ce,ke=2)=>String(Ce).padStart(ke,"0");return`${w(g.getHours())}:${w(g.getMinutes())}:${w(g.getSeconds())}.${w(g.getMilliseconds(),3)}`}function bu(y){const g=Math.max(0,Math.floor(y/1e3)),w=Math.floor(g/60),Ce=g%60,ke=Math.floor(y%1e3/100);return`${String(w).padStart(2,"0")}:${String(Ce).padStart(2,"0")}.${ke}`}function ri(y){const g=Number(y)||0;if(g<1024)return`${g} B`;const w=g/1024;if(w<1024)return`${w.toFixed(1)} KB`;const Ce=w/1024;return Ce<1024?`${Ce.toFixed(1)} MB`:`${(Ce/1024).toFixed(1)} GB`}function _u(y){if(!y)return 0;const g=y.match(/^\s*-\s*step\s*:/gm);return g?g.length:0}function si(y){if(!y)return[];const g=y.split(/\r?\n/),w=[];let Ce=!1;for(const ke of g){if(!Ce){/^\s*variables\s*:\s*$/.test(ke)&&(Ce=!0);continue}if(!ke.trim())continue;if(!/^\s+/.test(ke))break;const Ze=ke.match(/^\s+([A-Za-z0-9_-]+)\s*:\s*(.*)$/);if(!Ze)continue;let lt=Ze[2].trim();lt=lt.replace(/^['"]|['"]$/g,""),w.push({name:Ze[1],value:lt})}return w}async function Cu(){return Ts||(Ts=Promise.all([Ie(()=>import("./index-CWdEPjyK.js"),__vite__mapDeps([6,7,8,9,10]),import.meta.url),Ie(()=>import("./index-1CbRHFUW.js"),[],import.meta.url),Ie(()=>import("./index-DocLX96z.js").then(y=>y.t),__vite__mapDeps([7,8]),import.meta.url),Ie(()=>import("./index-CkqoOxGF.js"),__vite__mapDeps([9,10,8,7]),import.meta.url),Ie(()=>import("./index-CQY7N6SN.js").then(y=>y.i),[],import.meta.url),Ie(()=>import("./index-B9CtIV-P.js"),__vite__mapDeps([11,10,9,8,7]),import.meta.url)]).then(([y,g,w,Ce,ke,Ze])=>({basicSetup:y.basicSetup,EditorState:g.EditorState,RangeSetBuilder:g.RangeSetBuilder,Decoration:w.Decoration,EditorView:w.EditorView,ViewPlugin:w.ViewPlugin,HighlightStyle:Ce.HighlightStyle,syntaxHighlighting:Ce.syntaxHighlighting,tags:ke.tags,yamlLanguage:Ze.yaml}))),Ts}async function ai(){if(!_t.value||Ct)return;const{basicSetup:y,EditorState:g,RangeSetBuilder:w,Decoration:Ce,EditorView:ke,ViewPlugin:Ze,HighlightStyle:lt,syntaxHighlighting:Ps,tags:ct,yamlLanguage:As}=await Cu();_t.value&&(_t.value.style.height=Ut.value?"360px":"640px");const Ru=ke.theme({"&":{height:"100%",backgroundColor:"#fafafa",fontFamily:'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace',fontSize:"13px"},".cm-scroller":{overflow:"auto"},".cm-content":{padding:"16px"},".cm-gutters":{backgroundColor:"#f8fafc",borderRight:"1px solid #e2e8f0"},".cm-lineNumbers":{color:"#94a3b8"},".cm-activeLine":{backgroundColor:"#eef2ff"},".cm-activeLineGutter":{backgroundColor:"#e0e7ff"}},{dark:!1}),Mu=Ze.fromClass(class{constructor(qe){this.decorations=this.build(qe)}update(qe){(qe.docChanged||qe.viewportChanged)&&(this.decorations=this.build(qe.view))}build(qe){const hi=new w;for(const{from:Nu,to:Ou}of qe.visibleRanges){let Es=Nu;for(;Es<=Ou;){const kr=qe.state.doc.lineAt(Es),gi=kr.text.match(/^\s+/),zu=gi?gi[0].length:0,Uu=Math.min(5,Math.floor(zu/2)+1);hi.add(kr.from,kr.from,Ce.line({class:`yaml-indent-${Uu}`})),Es=kr.to+1}}return hi.finish()}},{decorations:qe=>qe.decorations}),Du=g.create({doc:_e.value,extensions:[y,As(),Ps(lt.define([{tag:ct.keyword,color:"#1d4ed8"},{tag:ct.atom,color:"#1d4ed8"},{tag:ct.string,color:"#16a34a"},{tag:ct.number,color:"#f97316"},{tag:ct.bool,color:"#1d4ed8"},{tag:ct.comment,color:"#94a3b8",fontStyle:"italic"},{tag:ct.punctuation,color:"#64748b"}])),Ru,ke.lineWrapping,Mu,ke.updateListener.of(qe=>{qe.docChanged&&(Ss=!0,_e.value=qe.state.doc.toString(),Ss=!1)})]});Ct=new ke({state:Du,parent:_t.value})}function ii(){Ct&&(Ct.destroy(),Ct=null)}function ku(){Ut.value=!Ut.value}function oi(){h.value&&nt(h.value.list_ports(),y=>{ql(y)})}Xo(()=>{Iu(),_r=window.setInterval(()=>{ae.value&&te.value&&(de.value=Date.now()-te.value)},200),Oe.value==="scripts"&&Wn(()=>ai()),window.addEventListener("keydown",li),Rc(),_s(Se.value),fi()}),Ys(()=>{_r&&(window.clearInterval(_r),_r=null),kt&&(window.clearTimeout(kt),kt=null),jl(),Lu(),pc(),mn&&(window.cancelAnimationFrame(mn),mn=0),uu(),ii(),window.removeEventListener("keydown",li)}),Ye(()=>B.value.length,()=>{Xe.value&&(mn||(mn=window.requestAnimationFrame(async()=>{mn=0,await Wn(),Ga()})))}),Ye(()=>Oe.value,y=>{y==="scripts"?Wn(()=>ai()):ii(),y==="protocols"&&Cs()}),Ye(()=>Se.value,y=>{_s(y)}),Ye(()=>fs.value,y=>{y==="plugins"&&ws()}),Ye(()=>Ut.value,y=>{_t.value&&(_t.value.style.height=y?"360px":"640px")}),Ye(()=>f.value||vs.value||ys.value||Ka.value||Za.value||pr.value,y=>{document.body.classList.toggle("modal-open",y)}),Ye(()=>ae.value,y=>{y&&!pr.value&&nu()}),Ye(()=>_e.value,y=>{if(!Ct||Ss)return;const g=Ct.state.doc.toString();y!==g&&Ct.dispatch({changes:{from:0,to:g.length,insert:y}})}),Ye(()=>_e.value,y=>{kt&&window.clearTimeout(kt),kt=window.setTimeout(()=>{tt.value=si(y)},200)});function li(y){y&&y.key==="Escape"&&f.value&&Ya()}function wu(){try{if(h.value&&typeof h.value.open_manual_docs=="function"){h.value.open_manual_docs();return}if(h.value&&typeof h.value.open_external_url=="function"){h.value.open_external_url("https://github.com/11cookies11/ProtoFlow/blob/main/README.zh-CN.md");return}}catch{}window.open("https://github.com/11cookies11/ProtoFlow/blob/main/README.zh-CN.md","_blank","noopener,noreferrer")}const{buildSettingsPayload:ci,normalizeSettings:ui,applySettings:di}=qg({refs:{uiLanguage:ie,uiTheme:Se,autoConnectOnStart:en,dslWorkspacePath:Ve,quickCommands:ms,defaultBaud:Ee,defaultParity:We,defaultStopBits:He,tcpTimeoutMs:Xt,tcpHeartbeatSec:dr,tcpRetryCount:ze,baud:O},defaults:{uiDefaults:Un,serialDefaults:$e,networkDefaults:St,defaultLanguage:Nn,supportedLanguages:Nl,workspaceFallback:"/usr/local/protoflow/workflows"},normalizeQuickCommands:Jl}),{settingsDirty:Su,setSnapshot:Tu,commitCurrent:xu,discard:Pu}=Hg({settingsSnapshot:Dl,buildPayload:ci,normalize:ui,apply:di}),{loadSettings:fi,saveSettings:Au,chooseDslWorkspace:Eu}=Yg({bridge:h,settingsSaving:Dn,dslWorkspacePath:Ve,tr:Ke,withResult:nt,normalizeSettings:ui,applySettings:di,setSettingsSnapshot:Tu,buildSettingsPayload:ci,commitSettingsSnapshot:xu}),{startBridgeBootstrap:Iu,disposeBridgeBootstrap:Lu}=ep({bridge:h,appVersion:Oa,applyFeatureFlags:y=>{Ol.value=!!y?.proxyMonitorEnabled},bindCommBridgeSignals:lu,bindScriptBridgeSignals:ou,refreshPorts:oi,refreshChannels:hc,refreshProtocols:Cs,refreshPlugins:ws,loadSettings:fi});return(y,g)=>(ht(),Us("div",np,[X("div",{class:"resize-handle top",onMousedown:g[0]||(g[0]=Pe(w=>F(Bt)("top",w),["stop"]))},null,32),X("div",{class:"resize-handle bottom",onMousedown:g[1]||(g[1]=Pe(w=>F(Bt)("bottom",w),["stop"]))},null,32),X("div",{class:"resize-handle left",onMousedown:g[2]||(g[2]=Pe(w=>F(Bt)("left",w),["stop"]))},null,32),X("div",{class:"resize-handle right",onMousedown:g[3]||(g[3]=Pe(w=>F(Bt)("right",w),["stop"]))},null,32),X("div",{class:"resize-handle top-left",onMousedown:g[4]||(g[4]=Pe(w=>F(Bt)("top-left",w),["stop"]))},null,32),X("div",{class:"resize-handle top-right",onMousedown:g[5]||(g[5]=Pe(w=>F(Bt)("top-right",w),["stop"]))},null,32),X("div",{class:"resize-handle bottom-left",onMousedown:g[6]||(g[6]=Pe(w=>F(Bt)("bottom-left",w),["stop"]))},null,32),X("div",{class:"resize-handle bottom-right",onMousedown:g[7]||(g[7]=Pe(w=>F(Bt)("bottom-right",w),["stop"]))},null,32),X("header",{class:"app-titlebar",onDblclick:du,onMousedown:g[17]||(g[17]=Pe((...w)=>F(Ja)&&F(Ja)(...w),["left"])),onContextmenu:g[18]||(g[18]=Pe((...w)=>F(ti)&&F(ti)(...w),["prevent"]))},[g[42]||(g[42]=X("div",{class:"app-title"},"ProtoFlow",-1)),X("div",rp,[X("button",{class:"title-btn",type:"button",onMousedown:g[8]||(g[8]=Pe(()=>{},["stop"])),onDblclick:g[9]||(g[9]=Pe(()=>{},["stop"])),onClick:g[10]||(g[10]=Pe((...w)=>F(Xa)&&F(Xa)(...w),["stop"]))},[...g[39]||(g[39]=[X("span",{class:"material-symbols-outlined"},"minimize",-1)])],32),X("button",{class:"title-btn",type:"button",onMousedown:g[11]||(g[11]=Pe(()=>{},["stop"])),onDblclick:g[12]||(g[12]=Pe(()=>{},["stop"])),onClick:g[13]||(g[13]=Pe((...w)=>F(ks)&&F(ks)(...w),["stop"]))},[...g[40]||(g[40]=[X("span",{class:"material-symbols-outlined"},"crop_square",-1)])],32),X("button",{class:"title-btn close",type:"button",onMousedown:g[14]||(g[14]=Pe(()=>{},["stop"])),onDblclick:g[15]||(g[15]=Pe(()=>{},["stop"])),onClick:g[16]||(g[16]=Pe((...w)=>F(ei)&&F(ei)(...w),["stop"]))},[...g[41]||(g[41]=[X("span",{class:"material-symbols-outlined"},"close",-1)])],32)])],32),X("div",sp,[X("aside",{ref_key:"sidebarRef",ref:b,class:"sidebar"},[X("div",ap,[g[44]||(g[44]=X("div",{class:"brand-mark"},[X("span",{class:"material-symbols-outlined"},"hub")],-1)),X("div",null,[g[43]||(g[43]=X("div",{class:"brand-name"},"ProtoFlow",-1)),X("div",ip,bn(Ic.value),1)])]),X("nav",op,[X("button",{class:an(["nav-item",{active:Oe.value==="manual"}]),onClick:g[19]||(g[19]=w=>Oe.value="manual")},[g[45]||(g[45]=X("span",{class:"material-symbols-outlined"},"terminal",-1)),X("span",null,bn(gr.value.manual),1)],2),X("button",{class:an(["nav-item",{active:Oe.value==="scripts"}]),onClick:g[20]||(g[20]=w=>Oe.value="scripts")},[g[46]||(g[46]=X("span",{class:"material-symbols-outlined"},"smart_toy",-1)),X("span",null,bn(gr.value.scripts),1)],2),X("button",{class:an(["nav-item",{active:Oe.value==="protocols"}]),onClick:g[21]||(g[21]=w=>Oe.value="protocols")},[g[47]||(g[47]=X("span",{class:"material-symbols-outlined"},"cable",-1)),X("span",null,bn(gr.value.protocols),1)],2),g[49]||(g[49]=X("div",{class:"nav-divider"},null,-1)),X("button",{class:an(["nav-item",{active:Oe.value==="settings"}]),onClick:g[22]||(g[22]=w=>Oe.value="settings")},[g[48]||(g[48]=X("span",{class:"material-symbols-outlined"},"settings",-1)),X("span",null,bn(gr.value.settings),1)],2)])],512),X("main",lp,[Oe.value==="manual"?(ht(),on(F(t),{key:0})):Oe.value==="scripts"?(ht(),on(F(n),{key:1})):Oe.value==="protocols"?(ht(),Us("section",cp,[ye(F(o),{onRefresh:F(Cs),onCreate:F(qa)},null,8,["onRefresh","onCreate"]),ye(F(i),{"protocol-tab":F(Mc),"filtered-protocol-cards":F(Uc),onSetTab:F(Kc),onCreate:F(qa),onDetails:F(Fc),onDelete:F($c)},null,8,["protocol-tab","filtered-protocol-cards","onSetTab","onCreate","onDetails","onDelete"])])):(ht(),Us("section",up,[ye(F(a),{"settings-dirty":F(Su),"settings-saving":Dn.value,onOpenManualDocs:wu,onDiscard:F(Pu),onSave:F(Au)},null,8,["settings-dirty","settings-saving","onDiscard","onSave"]),ye(F(s),{"settings-tab":fs.value,"ui-language":ie.value,"ui-theme":Se.value,"auto-connect-on-start":en.value,"dsl-workspace-path":Ve.value,"plugin-directory":hs.value,"plugin-items":gs.value,"protocol-items":fr.value,"plugins-refreshing":ps.value,"language-options":Ac.value,"theme-options":Ec.value,onSetTab:fu,onChooseDslWorkspace:F(Eu),onRefreshPlugins:ws,"onUpdate:uiLanguage":g[23]||(g[23]=w=>ie.value=w),"onUpdate:uiTheme":g[24]||(g[24]=w=>Se.value=w),"onUpdate:autoConnectOnStart":g[25]||(g[25]=w=>en.value=w)},null,8,["settings-tab","ui-language","ui-theme","auto-connect-on-start","dsl-workspace-path","plugin-directory","plugin-items","protocol-items","plugins-refreshing","language-options","theme-options","onChooseDslWorkspace"])])),ye(F(r),{open:f.value,mode:p.value,"channel-type":T.value,"channel-name":_.value,"channel-port":C.value,"channel-baud":L.value,"channel-data-bits":I.value,"channel-parity":A.value,"channel-stop-bits":k.value,"channel-flow-control":$.value,"channel-read-timeout":R.value,"channel-write-timeout":j.value,"channel-host":q.value,"channel-tcp-port":ne.value,"channel-auto-connect":fe.value,"has-ports":x.value.length>0,"port-options-list":F(Fa),"supported-baud-rates":F(Sg),onClose:F(Ya),onSubmit:F(qc),"onUpdate:channelType":g[26]||(g[26]=w=>T.value=w),"onUpdate:channelName":g[27]||(g[27]=w=>_.value=w),"onUpdate:channelPort":g[28]||(g[28]=w=>C.value=w),"onUpdate:channelBaud":g[29]||(g[29]=w=>L.value=w),"onUpdate:channelDataBits":g[30]||(g[30]=w=>I.value=w),"onUpdate:channelParity":g[31]||(g[31]=w=>A.value=w),"onUpdate:channelStopBits":g[32]||(g[32]=w=>k.value=w),"onUpdate:channelFlowControl":g[33]||(g[33]=w=>$.value=w),"onUpdate:channelReadTimeout":g[34]||(g[34]=w=>R.value=w),"onUpdate:channelWriteTimeout":g[35]||(g[35]=w=>j.value=w),"onUpdate:channelHost":g[36]||(g[36]=w=>q.value=w),"onUpdate:channelTcpPort":g[37]||(g[37]=w=>ne.value=w),"onUpdate:channelAutoConnect":g[38]||(g[38]=w=>fe.value=w)},null,8,["open","mode","channel-type","channel-name","channel-port","channel-baud","channel-data-bits","channel-parity","channel-stop-bits","channel-flow-control","channel-read-timeout","channel-write-timeout","channel-host","channel-tcp-port","channel-auto-connect","has-ports","port-options-list","supported-baud-rates","onClose","onSubmit"]),(ht(),on(wi,{to:"body"},[ye(F(l),{open:F(Ka),mode:F(Dc),draft:F(zc),editing:F(Nc),onClose:F(Bc),onSave:F(Vc),onUpdateDraft:F(jc)},null,8,["open","mode","draft","editing","onClose","onSave","onUpdateDraft"]),ye(F(u),{open:F(Za),deleting:F(Oc),onClose:F(Wc),onConfirm:F(Hc)},null,8,["open","deleting","onClose","onConfirm"])])),(ht(),on(wi,{to:"body"},[ye(F(c),{open:pr.value,runtime:F(Na),onClose:F(ru)},null,8,["open","runtime","onClose"])]))])])]))}};function pp(){return!window.qt||!window.qt.webChannelTransport?Promise.resolve(null):new Promise(e=>{new QWebChannel(window.qt.webChannelTransport,t=>{const n=t.objects.bridge;window.bridge=n,e(n)})})}async function mp(){const e=await pp();e&&(e.log.connect(n=>{console.log("[bridge]",n)}),e.notify_ready(),e.ping("frontend").then(n=>console.log(n)));const t=ch(gp);t.use(fh()),t.mount("#app")}mp();export{tg as A,Cp as B,Ge as F,wi as T,X as a,_p as b,Us as c,Pf as d,ye as e,we as f,wp as g,Pe as h,Hn as i,ma as j,S as k,ge as l,Ye as m,an as n,ht as o,Wn as p,Xo as q,yp as r,Ys as s,bn as t,F as u,kp as v,vp as w,on as x,Ud as y,bp as z}; diff --git a/ui/assets/web/assets/index-CkqoOxGF.js b/ui/assets/web/assets/index-CkqoOxGF.js new file mode 100644 index 0000000..9b1fe35 --- /dev/null +++ b/ui/assets/web/assets/index-CkqoOxGF.js @@ -0,0 +1,3 @@ +import{N as y,c as te,T as g,d as F,P as Tt,t as u,I as ut,b as $,h as ee,a as ne,s as re}from"./index-CQY7N6SN.js";import{StateEffect as j,Facet as v,StateField as nt,RangeSetBuilder as rt,EditorState as O,Prec as xt,countColumn as se,RangeSet as St,combineConfig as Pt}from"./index-1CbRHFUW.js";import{V as z,q as ie,E as m,a as d,G as oe,S as ct,D as U,W as Ct,l as le}from"./index-DocLX96z.js";var J;const S=new y;function At(n){return v.define({combine:n?t=>t.concat(n):void 0})}const ae=new y;class p{constructor(t,e,r=[],s=""){this.data=t,this.name=s,O.prototype.hasOwnProperty("tree")||Object.defineProperty(O.prototype,"tree",{get(){return k(this)}}),this.parser=e,this.extension=[T.of(this),O.languageData.of((i,o,a)=>{let l=dt(i,o,a),h=l.type.prop(S);if(!h)return[];let f=i.facet(h),c=l.type.prop(ae);if(c){let w=l.resolve(o-l.from,a);for(let b of c)if(b.test(w,i)){let P=i.facet(b.facet);return b.type=="replace"?P:P.concat(f)}}return f})].concat(r)}isActiveAt(t,e,r=-1){return dt(t,e,r).type.prop(S)==this.data}findRegions(t){let e=t.facet(T);if(e?.data==this.data)return[{from:0,to:t.doc.length}];if(!e||!e.allowsNesting)return[];let r=[],s=(i,o)=>{if(i.prop(S)==this.data){r.push({from:o,to:o+i.length});return}let a=i.prop(y.mounted);if(a){if(a.tree.prop(S)==this.data){if(a.overlay)for(let l of a.overlay)r.push({from:l.from+o,to:l.to+o});else r.push({from:o,to:o+i.length});return}else if(a.overlay){let l=r.length;if(s(a.tree,a.overlay[0].from+o),r.length>l)return}}for(let l=0;lr.isTop?e:void 0)]}),t.name)}configure(t,e){return new X(this.data,this.parser.configure(t),e||this.name)}get allowsNesting(){return this.parser.hasWrappers()}}function k(n){let t=n.field(p.state,!1);return t?t.tree:g.empty}function he(n,t,e=50){var r;let s=(r=n.field(p.state,!1))===null||r===void 0?void 0:r.context;if(!s)return null;let i=s.viewport;s.updateViewport({from:0,to:t});let o=s.isDone(t)||s.work(e,t)?s.tree:null;return s.updateViewport(i),o}function sn(n,t=n.doc.length){var e;return((e=n.field(p.state,!1))===null||e===void 0?void 0:e.context.isDone(t))||!1}function on(n,t=n.viewport.to,e=100){let r=he(n.state,t,e);return r!=k(n.state)&&n.dispatch({}),!!r}function ln(n){var t;return((t=n.plugin(Dt))===null||t===void 0?void 0:t.isWorking())||!1}class fe{constructor(t){this.doc=t,this.cursorPos=0,this.string="",this.cursor=t.iter()}get length(){return this.doc.length}syncTo(t){return this.string=this.cursor.next(t-this.cursorPos).value,this.cursorPos=t+this.string.length,this.cursorPos-this.string.length}chunk(t){return this.syncTo(t),this.string}get lineChunks(){return!0}read(t,e){let r=this.cursorPos-this.string.length;return t=this.cursorPos?this.doc.sliceString(t,e):this.string.slice(t-r,e-r)}}let M=null;class A{constructor(t,e,r=[],s,i,o,a,l){this.parser=t,this.state=e,this.fragments=r,this.tree=s,this.treeLen=i,this.viewport=o,this.skipped=a,this.scheduleOn=l,this.parse=null,this.tempSkipped=[]}static create(t,e,r){return new A(t,e,[],g.empty,0,r,[],null)}startParse(){return this.parser.startParse(new fe(this.state.doc),this.fragments)}work(t,e){return e!=null&&e>=this.state.doc.length&&(e=void 0),this.tree!=g.empty&&this.isDone(e??this.state.doc.length)?(this.takeTree(),!0):this.withContext(()=>{var r;if(typeof t=="number"){let s=Date.now()+t;t=()=>Date.now()>s}for(this.parse||(this.parse=this.startParse()),e!=null&&(this.parse.stoppedAt==null||this.parse.stoppedAt>e)&&e=this.treeLen&&((this.parse.stoppedAt==null||this.parse.stoppedAt>t)&&this.parse.stopAt(t),this.withContext(()=>{for(;!(e=this.parse.advance()););}),this.treeLen=t,this.tree=e,this.fragments=this.withoutTempSkipped(F.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(t){let e=M;M=this;try{return t()}finally{M=e}}withoutTempSkipped(t){for(let e;e=this.tempSkipped.pop();)t=pt(t,e.from,e.to);return t}changes(t,e){let{fragments:r,tree:s,treeLen:i,viewport:o,skipped:a}=this;if(this.takeTree(),!t.empty){let l=[];if(t.iterChangedRanges((h,f,c,w)=>l.push({fromA:h,toA:f,fromB:c,toB:w})),r=F.applyChanges(r,l),s=g.empty,i=0,o={from:t.mapPos(o.from,-1),to:t.mapPos(o.to,1)},this.skipped.length){a=[];for(let h of this.skipped){let f=t.mapPos(h.from,1),c=t.mapPos(h.to,-1);ft.from&&(this.fragments=pt(this.fragments,s,i),this.skipped.splice(r--,1))}return this.skipped.length>=e?!1:(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(t,e){this.skipped.push({from:t,to:e})}static getSkippingParser(t){return new class extends Tt{createParse(e,r,s){let i=s[0].from,o=s[s.length-1].to;return{parsedPos:i,advance(){let l=M;if(l){for(let h of s)l.tempSkipped.push(h);t&&(l.scheduleOn=l.scheduleOn?Promise.all([l.scheduleOn,t]):t)}return this.parsedPos=o,new g($.none,[],[],o-i)},stoppedAt:null,stopAt(){}}}}}isDone(t){t=Math.min(t,this.state.doc.length);let e=this.fragments;return this.treeLen>=t&&e.length&&e[0].from==0&&e[0].to>=t}static get(){return M}}function pt(n,t,e){return F.applyChanges(n,[{fromA:t,toA:e,fromB:t,toB:e}])}class I{constructor(t){this.context=t,this.tree=t.tree}apply(t){if(!t.docChanged&&this.tree==this.context.tree)return this;let e=this.context.changes(t.changes,t.state),r=this.context.treeLen==t.startState.doc.length?void 0:Math.max(t.changes.mapPos(this.context.treeLen),e.viewport.to);return e.work(20,r)||e.takeTree(),new I(e)}static init(t){let e=Math.min(3e3,t.doc.length),r=A.create(t.facet(T).parser,t,{from:0,to:e});return r.work(20,e)||r.takeTree(),new I(r)}}p.state=nt.define({create:I.init,update(n,t){for(let e of t.effects)if(e.is(p.setState))return e.value;return t.startState.facet(T)!=t.state.facet(T)?I.init(t.state):n.apply(t)}});let It=n=>{let t=setTimeout(()=>n(),500);return()=>clearTimeout(t)};typeof requestIdleCallback<"u"&&(It=n=>{let t=-1,e=setTimeout(()=>{t=requestIdleCallback(n,{timeout:400})},100);return()=>t<0?clearTimeout(e):cancelIdleCallback(t)});const _=typeof navigator<"u"&&(!((J=navigator.scheduling)===null||J===void 0)&&J.isInputPending)?()=>navigator.scheduling.isInputPending():null,Dt=z.fromClass(class{constructor(t){this.view=t,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(t){let e=this.view.state.field(p.state).context;(e.updateViewport(t.view.viewport)||this.view.viewport.to>e.treeLen)&&this.scheduleWork(),(t.docChanged||t.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(e)}scheduleWork(){if(this.working)return;let{state:t}=this.view,e=t.field(p.state);(e.tree!=e.context.tree||!e.context.isDone(t.doc.length))&&(this.working=It(this.work))}work(t){this.working=null;let e=Date.now();if(this.chunkEnds+1e3,l=i.context.work(()=>_&&_()||Date.now()>o,s+(a?0:1e5));this.chunkBudget-=Date.now()-e,(l||this.chunkBudget<=0)&&(i.context.takeTree(),this.view.dispatch({effects:p.setState.of(new I(i.context))})),this.chunkBudget>0&&!(l&&!a)&&this.scheduleWork(),this.checkAsyncSchedule(i.context)}checkAsyncSchedule(t){t.scheduleOn&&(this.workScheduled++,t.scheduleOn.then(()=>this.scheduleWork()).catch(e=>le(this.view.state,e)).then(()=>this.workScheduled--),t.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),T=v.define({combine(n){return n.length?n[0]:null},enables:n=>[p.state,Dt,m.contentAttributes.compute([n],t=>{let e=t.facet(n);return e&&e.name?{"data-language":e.name}:{}})]});class hn{constructor(t,e=[]){this.language=t,this.support=e,this.extension=[t,e]}}class Mt{constructor(t,e,r,s,i,o=void 0){this.name=t,this.alias=e,this.extensions=r,this.filename=s,this.loadFunc=i,this.support=o,this.loading=null}load(){return this.loading||(this.loading=this.loadFunc().then(t=>this.support=t,t=>{throw this.loading=null,t}))}static of(t){let{load:e,support:r}=t;if(!e){if(!r)throw new RangeError("Must pass either 'load' or 'support' to LanguageDescription.of");e=()=>Promise.resolve(r)}return new Mt(t.name,(t.alias||[]).concat(t.name).map(s=>s.toLowerCase()),t.extensions||[],t.filename,e,r)}static matchFilename(t,e){for(let s of t)if(s.filename&&s.filename.test(e))return s;let r=/\.([^.]+)$/.exec(e);if(r){for(let s of t)if(s.extensions.indexOf(r[1])>-1)return s}return null}static matchLanguageName(t,e,r=!0){e=e.toLowerCase();for(let s of t)if(s.alias.some(i=>i==e))return s;if(r)for(let s of t)for(let i of s.alias){let o=e.indexOf(i);if(o>-1&&(i.length>2||!/\w/.test(e[o-1])&&!/\w/.test(e[o+i.length])))return s}return null}}const ue=v.define(),Ot=v.define({combine:n=>{if(!n.length)return" ";let t=n[0];if(!t||/\S/.test(t)||Array.from(t).some(e=>e!=t[0]))throw new Error("Invalid indent unit: "+JSON.stringify(n[0]));return t}});function H(n){let t=n.facet(Ot);return t.charCodeAt(0)==9?n.tabSize*t.length:t.length}function Bt(n,t){let e="",r=n.tabSize,s=n.facet(Ot)[0];if(s==" "){for(;t>=r;)e+=" ",t-=r;s=" "}for(let i=0;i=t?ce(n,e,t):null}function fn(n,t,e){let r=Object.create(null),s=new st(n,{overrideIndentation:o=>{var a;return(a=r[o])!==null&&a!==void 0?a:-1}}),i=[];for(let o=t;o<=e;){let a=n.doc.lineAt(o);o=a.to+1;let l=Lt(s,a.from);if(l==null)continue;/\S/.test(a.text)||(l=0);let h=/^\s*/.exec(a.text)[0],f=Bt(n,l);h!=f&&(r[a.from]=l,i.push({from:a.from,to:a.from+h.length,insert:f}))}return n.changes(i)}class st{constructor(t,e={}){this.state=t,this.options=e,this.unit=H(t)}lineAt(t,e=1){let r=this.state.doc.lineAt(t),{simulateBreak:s,simulateDoubleBreak:i}=this.options;return s!=null&&s>=r.from&&s<=r.to?i&&s==t?{text:"",from:t}:(e<0?s-1&&(i+=o-this.countColumn(r,r.search(/\S|$/))),i}countColumn(t,e=t.length){return se(t,this.state.tabSize,e)}lineIndent(t,e=1){let{text:r,from:s}=this.lineAt(t,e),i=this.options.overrideIndentation;if(i){let o=i(s);if(o>-1)return o}return this.countColumn(r,r.search(/\S|$/))}get simulatedBreak(){return this.options.simulateBreak||null}}const Nt=new y;function ce(n,t,e){let r=t.resolveStack(e),s=t.resolveInner(e,-1).resolve(e,0).enterUnfinishedNodesBefore(e);if(s!=r.node){let i=[];for(let o=s;o&&!(o.fromr.node.to||o.from==r.node.from&&o.type==r.node.type);o=o.parent)i.push(o);for(let o=i.length-1;o>=0;o--)r={node:i[o],next:r}}return Rt(r,n,e)}function Rt(n,t,e){for(let r=n;r;r=r.next){let s=pe(r.node);if(s)return s(it.create(t,e,r))}return 0}function de(n){return n.pos==n.options.simulateBreak&&n.options.simulateDoubleBreak}function pe(n){let t=n.type.prop(Nt);if(t)return t;let e=n.firstChild,r;if(e&&(r=e.type.prop(y.closedBy))){let s=n.lastChild,i=s&&r.indexOf(s.name)>-1;return o=>Et(o,!0,1,void 0,i&&!de(o)?s.from:void 0)}return n.parent==null?ge:null}function ge(){return 0}class it extends st{constructor(t,e,r){super(t.state,t.options),this.base=t,this.pos=e,this.context=r}get node(){return this.context.node}static create(t,e,r){return new it(t,e,r)}get textAfter(){return this.textAfterPos(this.pos)}get baseIndent(){return this.baseIndentFor(this.node)}baseIndentFor(t){let e=this.state.doc.lineAt(t.from);for(;;){let r=t.resolve(e.from);for(;r.parent&&r.parent.from==r.from;)r=r.parent;if(me(r,t))break;e=this.state.doc.lineAt(r.from)}return this.lineIndent(e.from)}continue(){return Rt(this.context.next,this.base,this.pos)}}function me(n,t){for(let e=t;e;e=e.parent)if(n==e)return!0;return!1}function ke(n){let t=n.node,e=t.childAfter(t.from),r=t.lastChild;if(!e)return null;let s=n.options.simulateBreak,i=n.state.doc.lineAt(e.from),o=s==null||s<=i.from?i.to:Math.min(i.to,s);for(let a=e.to;;){let l=t.childAfter(a);if(!l||l==r)return null;if(!l.type.isSkipped){if(l.from>=o)return null;let h=/^ */.exec(i.text.slice(e.to-i.from))[0].length;return{from:e.from,to:e.to+h}}a=l.to}}function un({closing:n,align:t=!0,units:e=1}){return r=>Et(r,t,e,n)}function Et(n,t,e,r,s){let i=n.textAfter,o=i.match(/^\s*/)[0].length,a=r&&i.slice(o,o+r.length)==r||s==n.pos+o,l=t?ke(n):null;return l?a?n.column(l.from):n.column(l.to):n.baseIndent+(a?0:n.unit*e)}const cn=n=>n.baseIndent;function dn({except:n,units:t=1}={}){return e=>{let r=n&&n.test(e.textAfter);return e.baseIndent+(r?0:t*e.unit)}}const be=200;function pn(){return O.transactionFilter.of(n=>{if(!n.docChanged||!n.isUserEvent("input.type")&&!n.isUserEvent("input.complete"))return n;let t=n.startState.languageDataAt("indentOnInput",n.startState.selection.main.head);if(!t.length)return n;let e=n.newDoc,{head:r}=n.newSelection.main,s=e.lineAt(r);if(r>s.from+be)return n;let i=e.sliceString(s.from,r);if(!t.some(h=>h.test(i)))return n;let{state:o}=n,a=-1,l=[];for(let{head:h}of o.selection.ranges){let f=o.doc.lineAt(h);if(f.from==a)continue;a=f.from;let c=Lt(o,f.from);if(c==null)continue;let w=/^\s*/.exec(f.text)[0],b=Bt(o,c);w!=b&&l.push({from:f.from,to:f.from+w.length,insert:b})}return l.length?[n,{changes:l,sequential:!0}]:n})}const we=v.define(),ye=new y;function gn(n){let t=n.firstChild,e=n.lastChild;return t&&t.toe)continue;if(i&&a.from=t&&h.to>e&&(i=h)}}return i}function Te(n){let t=n.lastChild;return t&&t.to==n.to&&t.type.isError}function B(n,t,e){for(let r of n.facet(we)){let s=r(n,t,e);if(s)return s}return ve(n,t,e)}function Ft(n,t){let e=t.mapPos(n.from,1),r=t.mapPos(n.to,-1);return e>=r?void 0:{from:e,to:r}}const R=j.define({map:Ft}),D=j.define({map:Ft});function ot(n){let t=[];for(let{head:e}of n.state.selection.ranges)t.some(r=>r.from<=e&&r.to>=e)||t.push(n.lineBlockAt(e));return t}const x=nt.define({create(){return d.none},update(n,t){t.isUserEvent("delete")&&t.changes.iterChangedRanges((e,r)=>n=gt(n,e,r)),n=n.map(t.changes);for(let e of t.effects)if(e.is(R)&&!xe(n,e.value.from,e.value.to)){let{preparePlaceholder:r}=t.state.facet(at),s=r?d.replace({widget:new Me(r(t.state,e.value))}):mt;n=n.update({add:[s.range(e.value.from,e.value.to)]})}else e.is(D)&&(n=n.update({filter:(r,s)=>e.value.from!=r||e.value.to!=s,filterFrom:e.value.from,filterTo:e.value.to}));return t.selection&&(n=gt(n,t.selection.main.head)),n},provide:n=>m.decorations.from(n),toJSON(n,t){let e=[];return n.between(0,t.doc.length,(r,s)=>{e.push(r,s)}),e},fromJSON(n){if(!Array.isArray(n)||n.length%2)throw new RangeError("Invalid JSON for fold state");let t=[];for(let e=0;e{st&&(r=!0)}),r?n.update({filterFrom:t,filterTo:e,filter:(s,i)=>s>=e||i<=t}):n}function mn(n){return n.field(x,!1)||St.empty}function L(n,t,e){var r;let s=null;return(r=n.field(x,!1))===null||r===void 0||r.between(t,e,(i,o)=>{(!s||s.from>i)&&(s={from:i,to:o})}),s}function xe(n,t,e){let r=!1;return n.between(t,t,(s,i)=>{s==t&&i==e&&(r=!0)}),r}function lt(n,t){return n.field(x,!1)?t:t.concat(j.appendConfig.of(Wt()))}const Se=n=>{for(let t of ot(n)){let e=B(n.state,t.from,t.to);if(e)return n.dispatch({effects:lt(n.state,[R.of(e),V(n,e)])}),!0}return!1},Pe=n=>{if(!n.state.field(x,!1))return!1;let t=[];for(let e of ot(n)){let r=L(n.state,e.from,e.to);r&&t.push(D.of(r),V(n,r,!1))}return t.length&&n.dispatch({effects:t}),t.length>0};function V(n,t,e=!0){let r=n.state.doc.lineAt(t.from).number,s=n.state.doc.lineAt(t.to).number;return m.announce.of(`${n.state.phrase(e?"Folded lines":"Unfolded lines")} ${r} ${n.state.phrase("to")} ${s}.`)}const Ce=n=>{let{state:t}=n,e=[];for(let r=0;r{let t=n.state.field(x,!1);if(!t||!t.size)return!1;let e=[];return t.between(0,n.state.doc.length,(r,s)=>{e.push(D.of({from:r,to:s}))}),n.dispatch({effects:e}),!0};function Ie(n,t){for(let e=t;;){let r=B(n.state,e.from,e.to);if(r&&r.to>t.from)return r;if(!e.from)return null;e=n.lineBlockAt(e.from-1)}}const kn=n=>{let t=[];for(let e of ot(n)){let r=L(n.state,e.from,e.to);if(r)t.push(D.of(r),V(n,r,!1));else{let s=Ie(n,e);s&&t.push(R.of(s),V(n,s))}}return t.length>0&&n.dispatch({effects:lt(n.state,t)}),!!t.length},bn=[{key:"Ctrl-Shift-[",mac:"Cmd-Alt-[",run:Se},{key:"Ctrl-Shift-]",mac:"Cmd-Alt-]",run:Pe},{key:"Ctrl-Alt-[",run:Ce},{key:"Ctrl-Alt-]",run:Ae}],De={placeholderDOM:null,preparePlaceholder:null,placeholderText:"…"},at=v.define({combine(n){return Pt(n,De)}});function Wt(n){let t=[x,Be];return n&&t.push(at.of(n)),t}function Ut(n,t){let{state:e}=n,r=e.facet(at),s=o=>{let a=n.lineBlockAt(n.posAtDOM(o.target)),l=L(n.state,a.from,a.to);l&&n.dispatch({effects:D.of(l)}),o.preventDefault()};if(r.placeholderDOM)return r.placeholderDOM(n,s,t);let i=document.createElement("span");return i.textContent=r.placeholderText,i.setAttribute("aria-label",e.phrase("folded code")),i.title=e.phrase("unfold"),i.className="cm-foldPlaceholder",i.onclick=s,i}const mt=d.replace({widget:new class extends Ct{toDOM(n){return Ut(n,null)}}});class Me extends Ct{constructor(t){super(),this.value=t}eq(t){return this.value==t.value}toDOM(t){return Ut(t,this.value)}}const Oe={openText:"⌄",closedText:"›",markerDOM:null,domEventHandlers:{},foldingChanged:()=>!1};class K extends oe{constructor(t,e){super(),this.config=t,this.open=e}eq(t){return this.config==t.config&&this.open==t.open}toDOM(t){if(this.config.markerDOM)return this.config.markerDOM(this.open);let e=document.createElement("span");return e.textContent=this.open?this.config.openText:this.config.closedText,e.title=t.state.phrase(this.open?"Fold line":"Unfold line"),e}}function wn(n={}){let t={...Oe,...n},e=new K(t,!0),r=new K(t,!1),s=z.fromClass(class{constructor(o){this.from=o.viewport.from,this.markers=this.buildMarkers(o)}update(o){(o.docChanged||o.viewportChanged||o.startState.facet(T)!=o.state.facet(T)||o.startState.field(x,!1)!=o.state.field(x,!1)||k(o.startState)!=k(o.state)||t.foldingChanged(o))&&(this.markers=this.buildMarkers(o.view))}buildMarkers(o){let a=new rt;for(let l of o.viewportLineBlocks){let h=L(o.state,l.from,l.to)?r:B(o.state,l.from,l.to)?e:null;h&&a.add(l.from,l.from,h)}return a.finish()}}),{domEventHandlers:i}=t;return[s,ie({class:"cm-foldGutter",markers(o){var a;return((a=o.plugin(s))===null||a===void 0?void 0:a.markers)||St.empty},initialSpacer(){return new K(t,!1)},domEventHandlers:{...i,click:(o,a,l)=>{if(i.click&&i.click(o,a,l))return!0;let h=L(o.state,a.from,a.to);if(h)return o.dispatch({effects:D.of(h)}),!0;let f=B(o.state,a.from,a.to);return f?(o.dispatch({effects:R.of(f)}),!0):!1}}}),Wt()]}const Be=m.baseTheme({".cm-foldPlaceholder":{backgroundColor:"#eee",border:"1px solid #ddd",color:"#888",borderRadius:".2em",margin:"0 1px",padding:"0 1px",cursor:"pointer"},".cm-foldGutter span":{padding:"0 1px",cursor:"pointer"}});class q{constructor(t,e){this.specs=t;let r;function s(a){let l=ct.newName();return(r||(r=Object.create(null)))["."+l]=a,l}const i=typeof e.all=="string"?e.all:e.all?s(e.all):void 0,o=e.scope;this.scope=o instanceof p?a=>a.prop(S)==o.data:o?a=>a==o:void 0,this.style=te(t.map(a=>({tag:a.tag,class:a.class||s(Object.assign({},a,{tag:null}))})),{all:i}).style,this.module=r?new ct(r):null,this.themeType=e.themeType}static define(t,e){return new q(t,e||{})}}const Y=v.define(),Ht=v.define({combine(n){return n.length?[n[0]]:null}});function W(n){let t=n.facet(Y);return t.length?t:n.facet(Ht)}function yn(n,t){let e=[Ne],r;return n instanceof q&&(n.module&&e.push(m.styleModule.of(n.module)),r=n.themeType),t?.fallback?e.push(Ht.of(n)):r?e.push(Y.computeN([m.darkTheme],s=>s.facet(m.darkTheme)==(r=="dark")?[n]:[])):e.push(Y.of(n)),e}function vn(n,t,e){let r=W(n),s=null;if(r){for(let i of r)if(!i.scope||e&&i.scope(e)){let o=i.style(t);o&&(s=s?s+" "+o:o)}}return s}class Le{constructor(t){this.markCache=Object.create(null),this.tree=k(t.state),this.decorations=this.buildDeco(t,W(t.state)),this.decoratedTo=t.viewport.to}update(t){let e=k(t.state),r=W(t.state),s=r!=W(t.startState),{viewport:i}=t.view,o=t.changes.mapPos(this.decoratedTo,1);e.length=i.to?(this.decorations=this.decorations.map(t.changes),this.decoratedTo=o):(e!=this.tree||t.viewportChanged||s)&&(this.tree=e,this.decorations=this.buildDeco(t.view,r),this.decoratedTo=i.to)}buildDeco(t,e){if(!e||!this.tree.length)return d.none;let r=new rt;for(let{from:s,to:i}of t.visibleRanges)ee(this.tree,e,(o,a,l)=>{r.add(o,a,this.markCache[l]||(this.markCache[l]=d.mark({class:l})))},s,i);return r.finish()}}const Ne=xt.high(z.fromClass(Le,{decorations:n=>n.decorations})),Tn=q.define([{tag:u.meta,color:"#404740"},{tag:u.link,textDecoration:"underline"},{tag:u.heading,textDecoration:"underline",fontWeight:"bold"},{tag:u.emphasis,fontStyle:"italic"},{tag:u.strong,fontWeight:"bold"},{tag:u.strikethrough,textDecoration:"line-through"},{tag:u.keyword,color:"#708"},{tag:[u.atom,u.bool,u.url,u.contentSeparator,u.labelName],color:"#219"},{tag:[u.literal,u.inserted],color:"#164"},{tag:[u.string,u.deleted],color:"#a11"},{tag:[u.regexp,u.escape,u.special(u.string)],color:"#e40"},{tag:u.definition(u.variableName),color:"#00f"},{tag:u.local(u.variableName),color:"#30a"},{tag:[u.typeName,u.namespace],color:"#085"},{tag:u.className,color:"#167"},{tag:[u.special(u.variableName),u.macroName],color:"#256"},{tag:u.definition(u.propertyName),color:"#00c"},{tag:u.comment,color:"#940"},{tag:u.invalid,color:"#f00"}]),Re=m.baseTheme({"&.cm-focused .cm-matchingBracket":{backgroundColor:"#328c8252"},"&.cm-focused .cm-nonmatchingBracket":{backgroundColor:"#bb555544"}}),Vt=1e4,$t="()[]{}",jt=v.define({combine(n){return Pt(n,{afterCursor:!0,brackets:$t,maxScanDistance:Vt,renderMatch:We})}}),Ee=d.mark({class:"cm-matchingBracket"}),Fe=d.mark({class:"cm-nonmatchingBracket"});function We(n){let t=[],e=n.matched?Ee:Fe;return t.push(e.range(n.start.from,n.start.to)),n.end&&t.push(e.range(n.end.from,n.end.to)),t}const Ue=nt.define({create(){return d.none},update(n,t){if(!t.docChanged&&!t.selection)return n;let e=[],r=t.state.facet(jt);for(let s of t.state.selection.ranges){if(!s.empty)continue;let i=E(t.state,s.head,-1,r)||s.head>0&&E(t.state,s.head-1,1,r)||r.afterCursor&&(E(t.state,s.head,1,r)||s.headm.decorations.from(n)}),He=[Ue,Re];function xn(n={}){return[jt.of(n),He]}const Ve=new y;function Z(n,t,e){let r=n.prop(t<0?y.openedBy:y.closedBy);if(r)return r;if(n.name.length==1){let s=e.indexOf(n.name);if(s>-1&&s%2==(t<0?1:0))return[e[s+t]]}return null}function tt(n){let t=n.type.prop(Ve);return t?t(n.node):n}function E(n,t,e,r={}){let s=r.maxScanDistance||Vt,i=r.brackets||$t,o=k(n),a=o.resolveInner(t,e);for(let l=a;l;l=l.parent){let h=Z(l.type,e,i);if(h&&l.from0?t>=f.from&&tf.from&&t<=f.to))return $e(n,t,e,l,f,h,i)}}return je(n,t,e,o,a.type,s,i)}function $e(n,t,e,r,s,i,o){let a=r.parent,l={from:s.from,to:s.to},h=0,f=a?.cursor();if(f&&(e<0?f.childBefore(r.from):f.childAfter(r.to)))do if(e<0?f.to<=r.from:f.from>=r.to){if(h==0&&i.indexOf(f.type.name)>-1&&f.from0)return null;let h={from:e<0?t-1:t,to:e>0?t+1:t},f=n.doc.iterRange(t,e>0?n.doc.length:0),c=0;for(let w=0;!f.next().done&&w<=i;){let b=f.value;e<0&&(w+=b.length);let P=t+w*e;for(let C=e>0?0:b.length-1,Zt=e>0?b.length:-1;C!=Zt;C+=e){let G=o.indexOf(b[C]);if(!(G<0||r.resolveInner(P+C,1).type!=s))if(G%2==0==e>0)c++;else{if(c==1)return{start:h,end:{from:P+C,to:P+C+1},matched:G>>1==l>>1};c--}}e>0&&(w+=b.length)}return f.done?{start:h,matched:!1}:null}function kt(n,t,e,r=0,s=0){t==null&&(t=n.search(/[^\s\u00a0]/),t==-1&&(t=n.length));let i=s;for(let o=r;o=this.string.length}sol(){return this.pos==0}peek(){return this.string.charAt(this.pos)||void 0}next(){if(this.pose}eatSpace(){let t=this.pos;for(;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>t}skipToEnd(){this.pos=this.string.length}skipTo(t){let e=this.string.indexOf(t,this.pos);if(e>-1)return this.pos=e,!0}backUp(t){this.pos-=t}column(){return this.lastColumnPosr?o.toLowerCase():o,i=this.string.substr(this.pos,t.length);return s(i)==s(t)?(e!==!1&&(this.pos+=t.length),!0):null}else{let s=this.string.slice(this.pos).match(t);return s&&s.index>0?null:(s&&e!==!1&&(this.pos+=s[0].length),s)}}current(){return this.string.slice(this.start,this.pos)}}function ze(n){return{name:n.name||"",token:n.token,blankLine:n.blankLine||(()=>{}),startState:n.startState||(()=>!0),copyState:n.copyState||qe,indent:n.indent||(()=>null),languageData:n.languageData||{},tokenTable:n.tokenTable||ft,mergeTokens:n.mergeTokens!==!1}}function qe(n){if(typeof n!="object")return n;let t={};for(let e in n){let r=n[e];t[e]=r instanceof Array?r.slice():r}return t}const bt=new WeakMap;class qt extends p{constructor(t){let e=At(t.languageData),r=ze(t),s,i=new class extends Tt{createParse(o,a,l){return new Je(s,o,a,l)}};super(e,i,[],t.name),this.topNode=Qe(e,this),s=this,this.streamParser=r,this.stateAfter=new y({perNode:!0}),this.tokenTable=t.tokenTable?new Kt(r.tokenTable):Ke}static define(t){return new qt(t)}getIndent(t){let e,{overrideIndentation:r}=t.options;r&&(e=bt.get(t.state),e!=null&&e1e4)return null;for(;i=r&&e+t.length<=s&&t.prop(n.stateAfter);if(i)return{state:n.streamParser.copyState(i),pos:e+t.length};for(let o=t.children.length-1;o>=0;o--){let a=t.children[o],l=e+t.positions[o],h=a instanceof g&&l=t.length)return t;!s&&e==0&&t.type==n.topNode&&(s=!0);for(let i=t.children.length-1;i>=0;i--){let o=t.positions[i],a=t.children[i],l;if(oe&&ht(n,i.tree,0-i.offset,e,a),h;if(l&&l.pos<=r&&(h=Gt(n,i.tree,e+i.offset,l.pos+i.offset,!1)))return{state:l.state,tree:h}}return{state:n.streamParser.startState(s?H(s):4),tree:g.empty}}class Je{constructor(t,e,r,s){this.lang=t,this.input=e,this.fragments=r,this.ranges=s,this.stoppedAt=null,this.chunks=[],this.chunkPos=[],this.chunk=[],this.chunkReused=void 0,this.rangeIndex=0,this.to=s[s.length-1].to;let i=A.get(),o=s[0].from,{state:a,tree:l}=Ge(t,r,o,this.to,i?.state);this.state=a,this.parsedPos=this.chunkStart=o+l.length;for(let h=0;hh.from<=i.viewport.from&&h.to>=i.viewport.from)&&(this.state=this.lang.streamParser.startState(H(i.state)),i.skipUntilInView(this.parsedPos,i.viewport.from),this.parsedPos=i.viewport.from),this.moveRangeIndex()}advance(){let t=A.get(),e=this.stoppedAt==null?this.to:Math.min(this.to,this.stoppedAt),r=Math.min(e,this.chunkStart+512);for(t&&(r=Math.min(r,t.viewport.to));this.parsedPos=e?this.finish():t&&this.parsedPos>=t.viewport.to?(t.skipUntilInView(this.parsedPos,e),this.finish()):null}stopAt(t){this.stoppedAt=t}lineAfter(t){let e=this.input.chunk(t);if(this.input.lineChunks)e==` +`&&(e="");else{let r=e.indexOf(` +`);r>-1&&(e=e.slice(0,r))}return t+e.length<=this.to?e:e.slice(0,this.to-t)}nextLine(){let t=this.parsedPos,e=this.lineAfter(t),r=t+e.length;for(let s=this.rangeIndex;;){let i=this.ranges[s].to;if(i>=r||(e=e.slice(0,i-(r-e.length)),s++,s==this.ranges.length))break;let o=this.ranges[s].from,a=this.lineAfter(o);e+=a,r=o+a.length}return{line:e,end:r}}skipGapsTo(t,e,r){for(;;){let s=this.ranges[this.rangeIndex].to,i=t+e;if(r>0?s>i:s>=i)break;let o=this.ranges[++this.rangeIndex].from;e+=o-s}return e}moveRangeIndex(){for(;this.ranges[this.rangeIndex].to1){s=this.skipGapsTo(e,s,1),e+=s;let a=this.chunk.length;s=this.skipGapsTo(r,s,-1),r+=s,i+=this.chunk.length-a}let o=this.chunk.length-4;return this.lang.streamParser.mergeTokens&&i==4&&o>=0&&this.chunk[o]==t&&this.chunk[o+2]==e?this.chunk[o+2]=r:this.chunk.push(t,e,r,i),s}parseLine(t){let{line:e,end:r}=this.nextLine(),s=0,{streamParser:i}=this.lang,o=new zt(e,t?t.state.tabSize:4,t?H(t.state):2);if(o.eol())i.blankLine(this.state,o.indentUnit);else for(;!o.eol();){let a=Jt(i.token,o,this.state);if(a&&(s=this.emitToken(this.lang.tokenTable.resolve(a),this.parsedPos+o.start,this.parsedPos+o.pos,s)),o.start>1e4)break}this.parsedPos=r,this.moveRangeIndex(),this.parsedPost.start)return s}throw new Error("Stream parser failed to advance stream.")}const ft=Object.create(null),N=[$.none],_e=new ne(N),wt=[],yt=Object.create(null),_t=Object.create(null);for(let[n,t]of[["variable","variableName"],["variable-2","variableName.special"],["string-2","string.special"],["def","variableName.definition"],["tag","tagName"],["attribute","attributeName"],["type","typeName"],["builtin","variableName.standard"],["qualifier","modifier"],["error","invalid"],["header","heading"],["property","propertyName"]])_t[n]=Qt(ft,t);class Kt{constructor(t){this.extra=t,this.table=Object.assign(Object.create(null),_t)}resolve(t){return t?this.table[t]||(this.table[t]=Qt(this.extra,t)):0}}const Ke=new Kt(ft);function Q(n,t){wt.indexOf(n)>-1||(wt.push(n),console.warn(t))}function Qt(n,t){let e=[];for(let a of t.split(" ")){let l=[];for(let h of a.split(".")){let f=n[h]||u[h];f?typeof f=="function"?l.length?l=l.map(f):Q(h,`Modifier ${h} used at start of tag`):l.length?Q(h,`Tag ${h} used as modifier`):l=Array.isArray(f)?f:[f]:Q(h,`Unknown highlighting tag ${h}`)}for(let h of l)e.push(h)}if(!e.length)return 0;let r=t.replace(/ /g,"_"),s=r+" "+e.map(a=>a.id),i=yt[s];if(i)return i.id;let o=yt[s]=$.define({id:N.length,name:r,props:[re({[r]:e})]});return N.push(o),o.id}function Qe(n,t){let e=$.define({id:N.length,name:"Document",props:[S.add(()=>n),Nt.add(()=>r=>t.getIndent(r))],top:!0});return N.push(e),e}function Xt(n){return n.length<=4096&&/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac\ufb50-\ufdff]/.test(n)}function Yt(n){for(let t=n.iter();!t.next().done;)if(Xt(t.value))return!0;return!1}function Xe(n){let t=!1;return n.iterChanges((e,r,s,i,o)=>{!t&&Yt(o)&&(t=!0)}),t}const et=v.define({combine:n=>n.some(t=>t)});function Sn(n={}){let t=[Ye];return n.alwaysIsolate&&t.push(et.of(!0)),t}const Ye=z.fromClass(class{constructor(n){this.always=n.state.facet(et)||n.textDirection!=U.LTR||n.state.facet(m.perLineTextDirection),this.hasRTL=!this.always&&Yt(n.state.doc),this.tree=k(n.state),this.decorations=this.always||this.hasRTL?vt(n,this.tree,this.always):d.none}update(n){let t=n.state.facet(et)||n.view.textDirection!=U.LTR||n.state.facet(m.perLineTextDirection);if(!t&&!this.hasRTL&&Xe(n.changes)&&(this.hasRTL=!0),!t&&!this.hasRTL)return;let e=k(n.state);(t!=this.always||e!=this.tree||n.docChanged||n.viewportChanged)&&(this.tree=e,this.always=t,this.decorations=vt(n.view,e,t))}},{provide:n=>{function t(e){var r,s;return(s=(r=e.plugin(n))===null||r===void 0?void 0:r.decorations)!==null&&s!==void 0?s:d.none}return[m.outerDecorations.of(t),xt.lowest(m.bidiIsolatedRanges.of(t))]}});function vt(n,t,e){let r=new rt,s=n.visibleRanges;e||(s=Ze(s,n.state.doc));for(let{from:i,to:o}of s)t.iterate({enter:a=>{let l=a.type.prop(y.isolate);l&&r.add(a.from,a.to,tn[l])},from:i,to:o});return r.finish()}function Ze(n,t){let e=t.iter(),r=0,s=[],i=null;for(let{from:o,to:a}of n)if(!(i&&i.to>o&&(o=i.to,o>=a)))for(r+e.value.lengthl-10?i.to=Math.min(a,h):s.push(i={from:l,to:Math.min(a,h)})),h>=a)break;r=h,e.next()}return s}const tn={rtl:d.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"rtl"},bidiIsolate:U.RTL}),ltr:d.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"ltr"},bidiIsolate:U.LTR}),auto:d.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"auto"},bidiIsolate:null})};export{fe as DocInput,q as HighlightStyle,st as IndentContext,X as LRLanguage,p as Language,Mt as LanguageDescription,hn as LanguageSupport,A as ParseContext,qt as StreamLanguage,zt as StringStream,it as TreeIndentContext,Sn as bidiIsolates,xn as bracketMatching,Ve as bracketMatchingHandle,Wt as codeFolding,dn as continuedIndent,Tn as defaultHighlightStyle,At as defineLanguageFacet,un as delimitedIndent,he as ensureSyntaxTree,cn as flatIndent,Ce as foldAll,Se as foldCode,R as foldEffect,wn as foldGutter,gn as foldInside,bn as foldKeymap,ye as foldNodeProp,we as foldService,x as foldState,B as foldable,mn as foldedRanges,on as forceParsing,H as getIndentUnit,Lt as getIndentation,vn as highlightingFor,Nt as indentNodeProp,pn as indentOnInput,fn as indentRange,ue as indentService,Bt as indentString,Ot as indentUnit,T as language,S as languageDataProp,E as matchBrackets,ae as sublanguageProp,yn as syntaxHighlighting,ln as syntaxParserRunning,k as syntaxTree,sn as syntaxTreeAvailable,kn as toggleFold,Ae as unfoldAll,Pe as unfoldCode,D as unfoldEffect}; diff --git a/ui/assets/web/assets/index-D36uWCvj.css b/ui/assets/web/assets/index-D36uWCvj.css new file mode 100644 index 0000000..a77d60c --- /dev/null +++ b/ui/assets/web/assets/index-D36uWCvj.css @@ -0,0 +1 @@ +@import"https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap";*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.pointer-events-none{pointer-events:none}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.-bottom-1{bottom:-.25rem}.-top-12{top:-3rem}.bottom-0{bottom:0}.left-1\/2{left:50%}.left-\[20\%\]{left:20%}.top-0{top:0}.z-10{z-index:10}.z-50{z-index:50}.col-span-12{grid-column:span 12 / span 12}.col-span-3{grid-column:span 3 / span 3}.col-span-4{grid-column:span 4 / span 4}.col-span-5{grid-column:span 5 / span 5}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-auto{margin-left:auto;margin-right:auto}.-ml-4{margin-left:-1rem}.-mt-1{margin-top:-.25rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.ml-1{margin-left:.25rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.size-10{width:2.5rem;height:2.5rem}.size-2{width:.5rem;height:.5rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-2{height:.5rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-6{height:1.5rem}.h-full{height:100%}.h-screen{height:100vh}.min-h-\[160px\]{min-height:160px}.min-h-\[40px\]{min-height:40px}.min-h-\[520px\]{min-height:520px}.min-h-screen{min-height:100vh}.w-11{width:2.75rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-4{width:1rem}.w-64{width:16rem}.w-72{width:18rem}.w-\[1px\]{width:1px}.w-\[450px\]{width:450px}.w-\[5\%\]{width:5%}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.max-w-\[1600px\]{max-width:1600px}.max-w-\[240px\]{max-width:240px}.max-w-\[280px\]{max-width:280px}.flex-1{flex:1 1 0%}.flex-\[2\]{flex:2}.shrink-0{flex-shrink:0}.border-separate{border-collapse:separate}.border-spacing-0{--tw-border-spacing-x: 0px;--tw-border-spacing-y: 0px;border-spacing:var(--tw-border-spacing-x) var(--tw-border-spacing-y)}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-1{--tw-translate-x: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-6{--tw-translate-x: 1.5rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-45{--tw-rotate: 45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.resize{resize:both}.list-none{list-style-type:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-x{border-left-width:1px;border-right-width:1px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-l-4{border-left-width:4px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-blue-200{--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1))}.border-rose-200{--tw-border-opacity: 1;border-color:rgb(254 205 211 / var(--tw-border-opacity, 1))}.border-slate-100{--tw-border-opacity: 1;border-color:rgb(241 245 249 / var(--tw-border-opacity, 1))}.border-slate-200{--tw-border-opacity: 1;border-color:rgb(226 232 240 / var(--tw-border-opacity, 1))}.border-slate-300{--tw-border-opacity: 1;border-color:rgb(203 213 225 / var(--tw-border-opacity, 1))}.border-slate-700{--tw-border-opacity: 1;border-color:rgb(51 65 85 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.border-white\/50{border-color:#ffffff80}.border-l-orange-400{--tw-border-opacity: 1;border-left-color:rgb(251 146 60 / var(--tw-border-opacity, 1))}.bg-\[var\(--bg-light\)\]{background-color:var(--bg-light)}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-emerald-100{--tw-bg-opacity: 1;background-color:rgb(209 250 229 / var(--tw-bg-opacity, 1))}.bg-emerald-50{--tw-bg-opacity: 1;background-color:rgb(236 253 245 / var(--tw-bg-opacity, 1))}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-emerald-600{--tw-bg-opacity: 1;background-color:rgb(5 150 105 / var(--tw-bg-opacity, 1))}.bg-orange-100{--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1))}.bg-orange-50\/20{background-color:#fff7ed33}.bg-orange-50\/40{background-color:#fff7ed66}.bg-primary{--tw-bg-opacity: 1;background-color:rgb(36 99 235 / var(--tw-bg-opacity, 1))}.bg-rose-100{--tw-bg-opacity: 1;background-color:rgb(255 228 230 / var(--tw-bg-opacity, 1))}.bg-rose-50{--tw-bg-opacity: 1;background-color:rgb(255 241 242 / var(--tw-bg-opacity, 1))}.bg-slate-100{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.bg-slate-100\/50{background-color:#f1f5f980}.bg-slate-200{--tw-bg-opacity: 1;background-color:rgb(226 232 240 / var(--tw-bg-opacity, 1))}.bg-slate-300{--tw-bg-opacity: 1;background-color:rgb(203 213 225 / var(--tw-bg-opacity, 1))}.bg-slate-400{--tw-bg-opacity: 1;background-color:rgb(148 163 184 / var(--tw-bg-opacity, 1))}.bg-slate-50{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.bg-slate-50\/50{background-color:#f8fafc80}.bg-slate-700{--tw-bg-opacity: 1;background-color:rgb(51 65 85 / var(--tw-bg-opacity, 1))}.bg-slate-800{--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity, 1))}.bg-slate-800\/50{background-color:#1e293b80}.bg-slate-900{--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/20{background-color:#fff3}.bg-white\/80{background-color:#fffc}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pl-2{padding-left:.5rem}.pl-4{padding-left:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.\!text-2xl{font-size:1.5rem!important;line-height:2rem!important}.\!text-3xl{font-size:1.875rem!important;line-height:2.25rem!important}.\!text-\[12px\]{font-size:12px!important}.\!text-lg{font-size:1.125rem!important;line-height:1.75rem!important}.\!text-sm{font-size:.875rem!important;line-height:1.25rem!important}.\!text-xs{font-size:.75rem!important;line-height:1rem!important}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-black{font-weight:900}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.leading-6{line-height:1.5rem}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.tracking-tight{letter-spacing:-.025em}.tracking-tighter{letter-spacing:-.05em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.text-amber-500{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-blue-800{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.text-emerald-500{--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity, 1))}.text-emerald-700{--tw-text-opacity: 1;color:rgb(4 120 87 / var(--tw-text-opacity, 1))}.text-orange-600{--tw-text-opacity: 1;color:rgb(234 88 12 / var(--tw-text-opacity, 1))}.text-primary{--tw-text-opacity: 1;color:rgb(36 99 235 / var(--tw-text-opacity, 1))}.text-rose-500{--tw-text-opacity: 1;color:rgb(244 63 94 / var(--tw-text-opacity, 1))}.text-rose-600{--tw-text-opacity: 1;color:rgb(225 29 72 / var(--tw-text-opacity, 1))}.text-rose-700{--tw-text-opacity: 1;color:rgb(190 18 60 / var(--tw-text-opacity, 1))}.text-slate-300{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.text-slate-600{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.text-slate-700{--tw-text-opacity: 1;color:rgb(51 65 85 / var(--tw-text-opacity, 1))}.text-slate-800{--tw-text-opacity: 1;color:rgb(30 41 59 / var(--tw-text-opacity, 1))}.text-slate-900{--tw-text-opacity: 1;color:rgb(15 23 42 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.placeholder-slate-500::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(100 116 139 / var(--tw-placeholder-opacity, 1))}.placeholder-slate-500::placeholder{--tw-placeholder-opacity: 1;color:rgb(100 116 139 / var(--tw-placeholder-opacity, 1))}.accent-primary{accent-color:#2463eb}.opacity-80{opacity:.8}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-inner{--tw-shadow: inset 0 2px 4px 0 rgb(0 0 0 / .05);--tw-shadow-colored: inset 0 2px 4px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-primary\/40{--tw-ring-color: rgb(36 99 235 / .4)}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-md{--tw-backdrop-blur: blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}@font-face{font-family:Material Symbols Outlined;font-style:normal;font-weight:100 700;font-display:swap;src:url(./MaterialSymbolsOutlined-DvxE0gZD.ttf) format("truetype")}.packet-modal{--bg-light: #f8fafc;--bg-dark: #0f172a;font-family:Inter,Microsoft YaHei,sans-serif}.hex-font{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.timeline-heatmap{background:linear-gradient(to right,#10b981 0% 15%,#ef4444 15% 17%,#10b981 17% 45%,#ef4444 45% 46%,#10b981 46% 80%,#f59e0b 80% 82%,#10b981 82% 100%)}.tree-line:before{content:"";position:absolute;left:-12px;top:0;bottom:10px;width:1px;background:#e2e8f0}.protocol-tooltip{visibility:hidden;position:absolute;z-index:50;bottom:125%;left:50%;transform:translate(-50%);transition:opacity .2s;opacity:0}.protocol-badge:hover .protocol-tooltip{visibility:visible;opacity:1}:root{color-scheme:light;font-family:Space Grotesk,Noto Sans SC,Noto Sans,sans-serif;line-height:1.5;font-weight:400;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--titlebar-height: 36px;--primary: #195de6;--bg: #f3f4f6;--surface: #ffffff;--surface-subtle: #f8fafc;--border: #e2e8f0;--text: #0f172a;--muted: #64748b;--shadow: 0 8px 24px rgba(15, 23, 42, .08);--radius: 12px;--sidebar-width: 240px;--control-bg: #ffffff;--control-border: #d0d7e2;--control-border-hover: #b7c4dd;--control-ring: rgba(25, 93, 230, .14);--menu-shadow: 0 14px 28px rgba(15, 23, 42, .1);--hover-bg: #f1f5f9;--accent-soft: rgba(37, 99, 235, .14);--accent-soft-strong: rgba(37, 99, 235, .2);--success: #16a34a;--danger: #dc2626}:root[data-theme=dark]{color-scheme:dark;--bg: #0f172a;--surface: #111827;--surface-subtle: #1f2937;--border: #334155;--text: #e2e8f0;--muted: #94a3b8;--shadow: 0 10px 26px rgba(2, 6, 23, .45);--control-bg: #111827;--control-border: #334155;--control-border-hover: #475569;--control-ring: rgba(59, 130, 246, .24);--menu-shadow: 0 18px 34px rgba(2, 6, 23, .55);--hover-bg: #1f2937;--accent-soft: rgba(59, 130, 246, .22);--accent-soft-strong: rgba(59, 130, 246, .3);--success: #22c55e;--danger: #ef4444}*{box-sizing:border-box}body.resizing,body.dragging-window{-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:default}body.resizing *,body.resizing *:before,body.resizing *:after,body.dragging-window *,body.dragging-window *:before,body.dragging-window *:after{transition:none!important;animation:none!important}body.resizing .panel,body.resizing .card,body.resizing .modal,body.resizing .sidebar,body.resizing .app-titlebar,body.dragging-window .panel,body.dragging-window .card,body.dragging-window .modal,body.dragging-window .sidebar,body.dragging-window .app-titlebar{box-shadow:none!important}body.resizing .page-header,body.dragging-window .page-header{opacity:.85}body.resizing .log-line{content-visibility:visible!important}body.resizing .log-stream,body.resizing .card-list,body.resizing .page{contain:layout paint}body.modal-open *,body.modal-open *:before,body.modal-open *:after,body.dropdown-open *,body.dropdown-open *:before,body.dropdown-open *:after{transition:none!important;animation:none!important}body.modal-open{overflow:hidden}body.modal-open .app-shell{pointer-events:none}body.modal-open .modal-backdrop,body.modal-open .modal-backdrop *,body.modal-open .proxy-modal-backdrop,body.modal-open .proxy-modal-backdrop *{pointer-events:auto}body.proxy-modal-open{overflow:hidden}body.proxy-modal-open .app-shell{pointer-events:none}body.proxy-modal-open .proxy-modal-backdrop,body.proxy-modal-open .proxy-modal-backdrop *,body.proxy-modal-open .proxy-modal-overlay,body.proxy-modal-open .proxy-modal-overlay *{pointer-events:auto}html,body{margin:0;height:100%;background:var(--bg);color:var(--text);overflow:hidden}body{font-family:Noto Sans,Noto Sans SC,sans-serif}button,input,select,textarea{font-family:inherit}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:4px}::-webkit-scrollbar-thumb:hover{background:#94a3b8}#app{height:100%}.app{display:flex;flex-direction:column;height:100%;background:var(--bg)}.app-titlebar{height:var(--titlebar-height);display:flex;align-items:center;justify-content:flex-start;padding:0 10px;background:var(--surface);border-bottom:1px solid var(--border);-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:20}.app-icon{height:22px;width:22px;border:none;background:transparent;border-radius:6px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;margin-right:8px}.app-icon:hover{background:#0f172a14}.app-icon-dot{width:10px;height:10px;border-radius:3px;background:#2563eb}.app-title{font-size:12px;font-weight:600;color:var(--text);letter-spacing:.2px;flex:1}.title-actions{display:flex;gap:4px;margin-left:auto}.title-btn{height:24px;width:32px;border:none;background:transparent;border-radius:6px;cursor:pointer;color:var(--text);display:inline-flex;align-items:center;justify-content:center;padding:0}.title-btn:hover{background:var(--hover-bg)}.title-btn.close:hover{background:#e11d48;color:#fff}:root[data-theme=dark] .app-icon:hover{background:var(--hover-bg)}.material-symbols-outlined{font-family:Material Symbols Outlined;font-size:20px;line-height:1;display:inline-flex;align-items:center;justify-content:center;font-variation-settings:"FILL" 0,"wght" 500,"GRAD" 0,"opsz" 20}.material-symbols-outlined.fill-1{font-variation-settings:"FILL" 1,"wght" 500,"GRAD" 0,"opsz" 20}.app-shell{display:grid;grid-template-columns:var(--sidebar-width) 1fr;flex:1;min-height:0;height:calc(100vh - var(--titlebar-height))}.resize-handle{position:fixed;z-index:10000;background:transparent}.resize-handle.top,.resize-handle.bottom{left:6px;right:6px}.resize-handle.top{height:1px}.resize-handle.bottom{height:6px}.resize-handle.left,.resize-handle.right{top:var(--titlebar-height);bottom:6px;width:6px}.resize-handle.top{top:0;cursor:n-resize}.resize-handle.bottom{bottom:0;cursor:s-resize}.resize-handle.left{left:0;cursor:w-resize}.resize-handle.right{right:0;cursor:e-resize}.resize-handle.top-left,.resize-handle.top-right,.resize-handle.bottom-left,.resize-handle.bottom-right{width:10px;height:10px}.resize-handle.top-left{top:0;left:0;cursor:nw-resize}.resize-handle.top-right{top:0;right:0;cursor:ne-resize}.resize-handle.bottom-left{bottom:0;left:0;cursor:sw-resize}.resize-handle.bottom-right{bottom:0;right:0;cursor:se-resize}.snap-overlay{position:fixed;top:var(--titlebar-height);left:0;right:0;bottom:0;border:2px solid rgba(25,93,230,.55);background:#195de61f;pointer-events:none;z-index:9999}.snap-left{right:50%}.snap-right{left:50%}.snap-max{left:0;right:0}.sidebar{background:var(--surface);border-right:1px solid var(--border);display:flex;flex-direction:column;padding:18px 16px;gap:16px}.sidebar-header{display:flex;gap:12px;align-items:center}.brand-mark{width:36px;height:36px;border-radius:10px;background:var(--primary);color:#fff;display:inline-flex;align-items:center;justify-content:center}.brand-name{font-size:18px;font-weight:700}.brand-meta{font-size:11px;color:var(--muted);font-family:Space Grotesk,Noto Sans SC,sans-serif}.sidebar-nav{display:flex;flex-direction:column;gap:6px;flex:1;overflow-y:auto;overscroll-behavior:contain;overflow-anchor:none;padding-right:4px;scrollbar-gutter:stable}.nav-item{border:none;background:transparent;display:flex;gap:10px;align-items:center;padding:10px 12px;border-radius:10px;color:var(--muted);cursor:pointer;font-size:14px;transition:all .2s ease}.nav-item:hover{background:#f1f5f9;color:var(--text)}.nav-item.active{background:var(--primary);color:#fff;box-shadow:0 12px 24px #195de633}.nav-item.active .material-symbols-outlined{font-variation-settings:"FILL" 1,"wght" 500,"GRAD" 0,"opsz" 20}.nav-divider{height:1px;background:var(--border);margin:6px 4px}.sidebar-footer{display:flex;align-items:center;gap:10px;padding-top:10px;border-top:1px solid var(--border)}.user-avatar{width:34px;height:34px;border-radius:50%;background:linear-gradient(135deg,#6366f1,#7c3aed);border:1px solid #e2e8f0}.user-name{font-size:13px;font-weight:600}.user-meta{font-size:11px;color:var(--muted)}.main{flex:1;background:var(--surface-subtle);overflow:hidden;display:flex;flex-direction:column;min-width:0}.page{display:flex;flex-direction:column;gap:20px;padding:24px 28px 30px;overflow-y:auto;overflow-anchor:none;overscroll-behavior:contain;flex:1;min-height:0;height:100%}.page-header{display:flex;justify-content:space-between;align-items:center;gap:20px;background:var(--surface);border:1px solid var(--border);padding:18px 20px;border-radius:14px;box-shadow:0 12px 40px #0f172a14}.page-header.spaced{align-items:flex-start;background:var(--surface);border-radius:16px;box-shadow:0 12px 40px #0f172a14}.page-header.spaced .header-actions{align-items:center}.page-header>div:first-child{flex:1;min-width:0}.page-header.compact{padding:16px 18px}.page-header h2{margin:0;font-size:24px}.page-header p{margin:4px 0 0;color:var(--muted);font-size:13px}.page-header .header-actions{display:flex;align-items:center;gap:12px}.page-header .header-actions .btn{display:inline-flex;align-items:center;justify-content:center;height:40px;padding:0 18px;line-height:1}.terminal-config-panel{margin:0 0 12px;padding:18px 20px;border:1px solid var(--border);border-radius:16px;background:var(--surface);box-shadow:0 12px 40px #0f172a14}.terminal-config-panel .config-title{margin:0;font-size:24px;font-weight:700;color:var(--text)}.terminal-config-panel .config-description{margin:6px 0 0;font-size:13px;color:var(--muted)}.terminal-config-panel .config-status{display:flex;align-items:center;gap:12px}.terminal-config-actions{flex-wrap:nowrap;gap:6px;justify-content:flex-end;align-items:center}.terminal-port-picker{min-width:200px;max-width:260px;flex:0 1 240px;gap:0;margin-right:6px}.terminal-port-picker .icon-btn{align-self:center}.terminal-config-controls{gap:10px;align-items:center;flex-wrap:wrap}.terminal-config-panel .select-wrap{height:36px;align-items:center;min-width:180px;max-width:240px}.terminal-config-panel .select-trigger{height:100%;align-items:center}.terminal-config-panel .status-pill{height:32px}.terminal-config-panel .btn{height:36px;padding:0 14px}.terminal-config-panel .icon-btn{width:32px;height:32px}.terminal-config-panel .refresh-icon{margin-left:-6px}.channel-config-panel{margin-bottom:16px;padding:20px;border:1px solid var(--border);border-radius:16px;background:var(--surface);box-shadow:0 12px 40px #0f172a14}.config-main{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap}.config-title{margin:0;font-size:20px;font-weight:700;color:var(--text)}.config-description{margin-top:6px;font-size:13px;color:var(--muted);max-width:320px}.config-status{display:flex;align-items:center;gap:12px}.status-pill{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;border-radius:999px;border:1px solid var(--border);font-size:11px;font-weight:600;color:#475569}.status-pill .dot{width:6px;height:6px;border-radius:50%;background:#94a3b8}.status-pill.connected{color:#047857;border-color:#bbf7d0}.status-pill.error{color:#b91c1c;border-color:#fecaca}.port-picker{display:inline-flex;align-items:center;gap:4px}.config-actions{display:inline-flex;gap:8px}.header-actions{display:flex;align-items:center;gap:12px;flex-wrap:nowrap}.status-indicator{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border-radius:999px;font-size:11px;font-weight:700;border:1px solid transparent;color:#64748b;background:#f1f5f9}.status-indicator .dot{width:6px;height:6px;border-radius:50%;background:currentColor}.status-indicator.connected{background:#dcfce7;color:#166534;border-color:#bbf7d0}.status-indicator.error{background:#fef2f2;color:#b91c1c;border-color:#fecaca}.btn{border:1px solid transparent;border-radius:10px;padding:10px 16px;font-size:13px;font-weight:600;cursor:pointer;display:inline-flex;align-items:center;gap:8px;transition:border-color .2s ease,background-color .2s ease,color .2s ease,transform .16s ease}.btn-primary{background:var(--primary);color:#fff;box-shadow:0 8px 18px #195de633}.btn-primary:hover{background:#1d4ed8;transform:translateY(-1px)}.btn-success{background:var(--success);color:#fff;box-shadow:0 8px 18px #16a34a33}.btn-success:hover{background:#15803d;transform:translateY(-1px)}.btn-outline{background:var(--control-bg);color:var(--text);border-color:var(--control-border)}.btn-outline:hover{border-color:var(--control-border-hover);color:var(--primary);background:var(--hover-bg)}.btn-muted{background:var(--hover-bg);color:var(--muted);cursor:not-allowed}.btn-danger{background:var(--danger);color:#fff;box-shadow:0 8px 18px #ef444433}.btn-danger:hover{background:#b91c1c;transform:translateY(-1px)}.btn-ghost{background:transparent;color:#475569;border:1px solid transparent;padding:6px 10px;font-size:12px}.btn-ghost:hover{border-color:var(--control-border);background:var(--hover-bg);color:var(--primary)}.icon-btn{border:none;background:transparent;color:#94a3b8;width:30px;height:30px;border-radius:8px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:all .2s ease}.icon-btn:hover{background:var(--hover-bg);color:var(--primary)}.icon-btn.active{background:var(--accent-soft);color:var(--primary)}.link-btn{border:none;background:transparent;color:var(--primary);font-size:12px;font-weight:600;cursor:pointer;display:inline-flex;align-items:center;gap:6px}.select-wrap{position:relative;display:inline-flex;align-items:center;gap:6px;border:1px solid var(--control-border);border-radius:14px;padding:2px 12px;background:var(--control-bg);min-width:200px;max-width:280px;box-shadow:none;transition:border-color .18s ease,box-shadow .18s ease}.proxy-select.select-wrap{width:100%;max-width:100%;min-width:0}.select-trigger{border:none;background:transparent;padding:8px 28px 8px 2px;font-size:14px;color:var(--text);outline:none;width:100%;cursor:pointer;display:inline-flex;align-items:center;gap:8px}.select-value{flex:1;text-align:left;font-weight:600}.select-wrap .expand{position:absolute;right:10px;color:var(--muted);pointer-events:none}.select-wrap:hover{border-color:var(--control-border-hover)}.select-wrap:focus-within{border-color:#195de6;box-shadow:0 0 0 3px var(--control-ring)}.select-menu{position:fixed;background:var(--surface);border:1px solid var(--control-border);border-radius:12px;box-shadow:var(--menu-shadow);padding:6px;z-index:3000;max-height:240px;overflow-y:auto;overscroll-behavior:contain;overflow-anchor:none}.select-option{border:none;background:transparent;width:100%;text-align:left;padding:10px 12px;border-radius:10px;font-size:14px;color:var(--text);cursor:pointer;display:inline-flex;align-items:center;gap:10px;transition:background .15s ease,color .15s ease}.select-option:hover{background:var(--surface-subtle);color:var(--text)}.select-option.selected{background:#2563eb26;color:#1d4ed8;font-weight:700}.select-option.selected .material-symbols-outlined{color:#1d4ed8}:root[data-theme=dark] .select-option.selected{background:#3b82f63d;color:#bfdbfe}:root[data-theme=dark] .select-option.selected .material-symbols-outlined{color:#bfdbfe}.select-option:disabled{color:var(--muted);cursor:not-allowed}.panel{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);padding:16px}.panel.manual-monitor,.panel.manual-console,.panel.log-panel{box-shadow:0 4px 10px #0f172a0d}.panel.stack{display:flex;flex-direction:column;gap:14px}.panel-title{display:flex;align-items:center;gap:8px;font-weight:700;font-size:14px}.panel-title.simple{justify-content:space-between;font-size:13px}.panel-title.inline{justify-content:space-between}.panel-title.bar{justify-content:space-between;padding-bottom:10px;border-bottom:1px solid var(--border)}.panel-title-left,.panel-actions{display:flex;align-items:center;gap:8px}.divider{width:1px;height:18px;background:var(--border)}.segmented{display:inline-flex;padding:3px;background:var(--hover-bg);border-radius:10px;margin-left:auto;gap:4px;border:1px solid var(--control-border)}.segmented button{border:none;background:transparent;padding:4px 10px;border-radius:8px;font-size:11px;font-weight:600;color:var(--muted);cursor:pointer}.segmented button.active{background:var(--surface);color:var(--primary);box-shadow:0 1px 2px #0f172a0f}.segmented.small button{font-size:10px;padding:2px 8px}.manual-grid{display:grid;grid-template-columns:minmax(280px,320px) minmax(520px,1fr);gap:16px;align-items:start}.manual-left,.manual-right{display:flex;flex-direction:column;gap:16px}.manual-right .monitor{min-height:260px}.manual-right .console{min-height:220px}.manual-send,.manual-quick,.manual-monitor,.manual-console{height:300px}.manual-send .text-area{min-height:140px}.manual-monitor .log-stream,.manual-console .log-stream{max-height:200px}.manual-quick,.manual-console{display:flex;flex-direction:column}.manual-quick .quick-list,.manual-console .log-stream{flex:1;min-height:0}.text-area{width:100%;min-height:160px;border:1px solid var(--border);border-radius:12px;padding:12px;font-size:13px;font-family:Noto Sans,Noto Sans SC,sans-serif;background:var(--control-bg);outline:none;resize:none}.text-area:focus{border-color:var(--primary);box-shadow:0 0 0 2px #195de61a}.toggle-row{display:flex;gap:12px;align-items:center;flex-wrap:wrap}.toggle-row.spaced{justify-content:space-between;margin-top:12px;gap:20px;padding:10px 0 6px}.toggle-row.spaced+.toggle-row.spaced{margin-top:8px;padding-top:14px;border-top:1px solid var(--border)}.toggle-row p{margin:4px 0 0;font-size:12px;color:var(--muted)}.check{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--muted)}.check input{accent-color:var(--primary)}.quick-list{display:flex;flex-direction:column;gap:8px;max-height:208px;min-height:208px;overflow-y:auto;overscroll-behavior:contain;overflow-anchor:none;padding-right:4px}.quick-item{border:1px solid transparent;background:#f8fafc;border-radius:10px;padding:10px 12px;font-size:12px;font-family:Space Grotesk,Noto Sans SC,sans-serif;display:flex;align-items:center;justify-content:space-between;color:#475569;cursor:pointer}.quick-item:hover{border-color:var(--border);color:var(--primary)}.quick-info{display:flex;flex-direction:column;gap:2px;text-align:left}.quick-title{font-weight:600;color:#1e293b}.quick-meta{font-size:10px;color:#94a3b8}.quick-item-actions{display:inline-flex;align-items:center;gap:6px}.icon-btn.small{width:24px;height:24px;border-radius:6px}.monitor-stack{display:grid;grid-template-columns:minmax(300px,1fr) minmax(280px,360px);gap:16px}.pill{padding:2px 8px;border-radius:999px;font-size:10px;font-weight:700;border:1px solid transparent}.pill.live{background:#dcfce7;color:#166534;border-color:#bbf7d0}.log-stream{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:12px;color:#334155;display:flex;flex-direction:column;gap:6px;padding:12px 6px 6px;overflow-y:auto;contain:paint;overscroll-behavior:contain;overflow-anchor:none;max-height:320px;min-height:180px}.log-stream.compact{max-height:200px;font-size:11px;min-height:120px}.log-line{line-height:1.5;display:flex;align-items:flex-start;gap:8px;content-visibility:auto;contain-intrinsic-size:0 22px}.log-time{min-width:70px;font-size:10px;color:#94a3b8}.log-kind{min-width:36px;font-size:10px;font-weight:700;text-transform:uppercase;color:#64748b}.kind-tx{color:#2563eb}.kind-rx{color:#16a34a}.kind-frame{color:#7c3aed}.log-text{flex:1;word-break:break-word}.log-text.text-status{color:#0f172a}.log-text.text-tx{color:#2563eb}.log-text.text-rx{color:#16a34a}.tab-strip{display:flex;align-items:center;gap:6px;border-bottom:1px solid var(--border);padding-bottom:6px;flex-wrap:wrap}.tab-strip button{border:1px solid transparent;background:transparent;padding:7px 12px;font-size:12px;font-weight:600;color:var(--muted);border-radius:10px;cursor:pointer}.tab-strip button.active{color:var(--primary);border-color:var(--control-border);background:var(--surface);box-shadow:0 1px 2px #0f172a0d}.tab-strip.secondary{border-bottom:1px solid var(--border);padding-left:4px;padding-bottom:12px;margin-bottom:10px}.tab-strip button:hover:not(.active){background:var(--hover-bg);color:var(--text)}.search{margin-left:auto;position:relative;display:inline-flex;align-items:center}.search input{border:1px solid var(--control-border);border-radius:10px;padding:6px 10px 6px 28px;font-size:12px;outline:none;background:var(--control-bg)}.search span{position:absolute;left:8px;color:#94a3b8}.panel-footer{display:flex;justify-content:space-between;align-items:center;font-size:11px;color:var(--muted);border-top:1px solid var(--border);padding-top:10px}.scripts-grid{display:grid;grid-template-columns:minmax(320px,1fr) 320px;gap:18px}.scripts-side{display:flex;flex-direction:column;gap:18px;min-height:0}.scripts-side>.panel.stack{flex:1 1 auto;min-height:360px}.editor textarea{min-height:360px}.code-area{width:100%;min-height:360px;border:none;background:var(--surface);font-size:13px;border-radius:0 0 var(--radius) var(--radius);outline:none;overflow:hidden}.code-area.collapsed{max-height:360px;height:360px}.code-area:not(.collapsed){max-height:640px;height:640px}.code-area .cm-editor{height:100%}.code-area .cm-scroller{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.code-area .cm-focused{outline:none}.code-area .cm-line.yaml-indent-1{box-shadow:inset 2px 0 #60a5fa;color:#1d4ed8}.code-area .cm-line.yaml-indent-2{box-shadow:inset 2px 0 #34d399;color:#047857}.code-area .cm-line.yaml-indent-3{box-shadow:inset 2px 0 #fbbf24;color:#b45309}.code-area .cm-line.yaml-indent-4{box-shadow:inset 2px 0 #f472b6;color:#be185d}.code-area .cm-line.yaml-indent-5{box-shadow:inset 2px 0 #a78bfa;color:#6d28d9}.file-info{display:flex;flex-direction:column;gap:4px}.file-title{font-size:15px;font-weight:700;display:flex;gap:10px;align-items:center}.file-path{font-size:12px;color:var(--muted);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.scripts-title{display:flex;align-items:center;gap:10px;margin:0}.scripts-path{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.badge{background:#f1f5f9;color:#64748b;border:1px solid #e2e8f0;padding:3px 10px;border-radius:999px;font-size:10px;font-weight:700;min-width:44px;text-align:center;white-space:nowrap}.status-pill{display:inline-flex;align-items:center;gap:8px;padding:6px 10px;border-radius:999px;background:#dcfce7;color:#166534;border:1px solid #bbf7d0;font-size:12px;font-weight:700}.status-pill.idle{background:#f1f5f9;color:#64748b;border-color:#e2e8f0}.status-pill.running{background:#dcfce7;color:#166534;border-color:#bbf7d0}.pulse{width:8px;height:8px;border-radius:50%;background:#22c55e;position:relative}.pulse:after{content:"";position:absolute;inset:0;border-radius:50%;background:#22c55e80;animation:pulse 1.4s infinite}@keyframes pulse{0%{transform:scale(1);opacity:.6}to{transform:scale(2.4);opacity:0}}.button-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}.progress-block{display:flex;flex-direction:column;gap:10px}.progress-row{display:flex;justify-content:space-between;font-size:12px;color:var(--muted)}.progress-bar{height:8px;border-radius:999px;background:#e2e8f0;overflow:hidden}.progress{height:100%;background:var(--primary);border-radius:999px}.progress-stats{display:flex;justify-content:space-between;font-size:12px;color:var(--muted)}.mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.mini-table{width:100%;border-collapse:collapse;font-size:12px}.mini-table th,.mini-table td{padding:8px 10px;border-bottom:1px solid #f1f5f9;text-align:left}.mini-table th{background:#f8fafc;color:var(--muted);font-weight:600}.mini-table td.right{text-align:right}.mini-table .primary{color:var(--primary)}.mini-table .green{color:#16a34a}.log-panel .log-stream{max-height:200px}.card-list{display:flex;flex-direction:column;gap:16px}.card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:16px;display:flex;justify-content:space-between;align-items:center;gap:20px;box-shadow:var(--shadow)}.card.empty-card{border:1px dashed #cbd5e1;box-shadow:none;color:var(--muted)}.modal-backdrop{position:fixed;inset:0;background:#0f172a66;-webkit-backdrop-filter:none;backdrop-filter:none;display:flex;align-items:center;justify-content:center;padding:24px;z-index:2000;will-change:opacity}.channel-modal,.quick-modal{width:min(680px,92vw);background:#fff;border-radius:18px;box-shadow:0 24px 60px #0f172a33;border:1px solid #e2e8f0;display:flex;flex-direction:column;max-height:90vh;overflow:hidden}.ui-yaml-modal{width:min(1100px,94vw);max-width:1100px;height:min(86vh,900px)}.ui-yaml-body{padding:0;background:#f8fafc}.ui-yaml-body>div{padding:18px 22px}.ui-yaml-error{border:1px solid #fecaca;background:#fff1f2;color:#9f1239;border-radius:12px;display:grid;gap:6px}.quick-modal{width:min(560px,92vw)}.quick-modal.quick-modal-sm{width:min(420px,92vw)}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:18px 22px;border-bottom:1px solid var(--border);background:#f8fafc}.modal-header h3{margin:0;font-size:18px}.modal-header p{margin:4px 0 0;font-size:12px;color:var(--muted)}.modal-body{padding:20px 22px;overflow-y:auto;overscroll-behavior:contain;overflow-anchor:none;display:flex;flex-direction:column;gap:18px}.modal-section{padding-top:8px;border-top:1px solid #f1f5f9}.modal-section.first{padding-top:0;border-top:none}.channel-type-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.channel-type-card{border:1px solid #e2e8f0;border-radius:14px;padding:12px 14px;display:inline-flex;align-items:center;gap:10px;background:#fff;color:#64748b;font-weight:600;cursor:pointer;transition:all .2s ease}.channel-type-card.active{border-color:#195de6;background:#195de614;color:#195de6}.channel-type-card:hover{border-color:#9db3ff;background:#f8fafc}.channel-toggle{display:inline-flex;align-items:center;gap:10px;font-size:13px;color:var(--muted)}.channel-toggle input{accent-color:var(--primary)}.modal-footer{padding:16px 22px;border-top:1px solid var(--border);display:flex;justify-content:flex-end;gap:10px;background:#f8fafc}.quick-field{display:flex;flex-direction:column;gap:8px}.quick-field label{font-size:12px;color:var(--muted);font-weight:600}.quick-field input,.quick-textarea{border:1px solid var(--border);border-radius:12px;padding:10px 12px;font-size:13px;background:#fff;outline:none}.quick-field input:focus,.quick-textarea:focus{border-color:var(--primary);box-shadow:0 0 0 2px #195de61a}.quick-textarea{min-height:110px;resize:none;font-family:Noto Sans,Noto Sans SC,sans-serif}.quick-field-header{display:flex;align-items:center;justify-content:space-between;gap:12px}.quick-mode{display:inline-flex;align-items:center;gap:8px}.quick-mode-label{font-size:11px;color:var(--muted)}.quick-counter{margin:0;text-align:right;font-size:11px;color:var(--muted)}.quick-options{display:flex;flex-direction:column;gap:12px}.quick-delete-summary{display:flex;align-items:center;gap:12px;padding:14px 16px;border-radius:12px;border:1px solid #fee2e2;background:#fef2f2;color:#991b1b}.quick-delete-summary .material-symbols-outlined{font-size:22px}.quick-delete-title{margin:0;font-size:14px;font-weight:600;color:#7f1d1d}.quick-delete-meta{margin:4px 0 0;font-size:12px;color:#b91c1c}.card-main{display:flex;align-items:center;gap:16px}.card-icon{width:46px;height:46px;border-radius:12px;background:#eef2ff;color:#4338ca;display:inline-flex;align-items:center;justify-content:center}.card-title{display:flex;align-items:center;gap:10px;font-weight:700;font-size:14px}.chip{padding:2px 6px;background:#f1f5f9;border-radius:8px;font-size:10px;color:var(--muted);border:1px solid var(--border)}.card-meta{display:flex;align-items:center;gap:8px;font-size:11px;color:var(--muted);margin-top:4px}.card-meta .dot{width:4px;height:4px;border-radius:50%;background:#cbd5e1}.card-side{display:flex;align-items:center;gap:16px}.traffic{text-align:right;font-size:10px;color:var(--muted)}.traffic strong{display:block;font-size:12px;color:#334155}.status{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:600;padding:6px 10px;border-radius:10px;border:1px solid transparent}.status .dot{width:6px;height:6px;border-radius:50%;background:currentColor}.status-ok{background:#ecfdf3;color:#15803d;border-color:#bbf7d0}.status-warn{background:#fff7ed;color:#b45309;border-color:#fed7aa}.status-idle{background:#f1f5f9;color:#64748b;border-color:#e2e8f0}.status-error{background:#fef2f2;color:#b91c1c;border-color:#fecaca}.protocol-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:16px}.protocol-cards-section .protocol-grid{margin-top:12px}.protocol-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:16px;box-shadow:var(--shadow);display:flex;flex-direction:column;gap:12px}.protocol-card.empty{border:1px dashed #cbd5e1;align-items:center;justify-content:center;text-align:center;padding:26px;background:#f8fafc}.protocol-header{display:flex;justify-content:space-between;align-items:flex-start;gap:12px}.protocol-title{font-weight:700;font-size:14px}.protocol-sub{font-size:11px;color:var(--muted)}.protocol-rows{display:flex;flex-direction:column;gap:8px}.protocol-row{display:flex;justify-content:space-between;font-size:12px;color:var(--muted)}.protocol-row strong{color:var(--text);font-weight:600}.protocol-actions{display:flex;gap:6px;align-items:center}.empty-icon{width:48px;height:48px;border-radius:999px;background:#fff;display:inline-flex;align-items:center;justify-content:center;color:var(--primary);border:1px solid var(--border);margin-bottom:8px}.settings-stack{display:flex;flex-direction:column;gap:24px}.empty-state{padding:12px 0;font-size:13px;color:var(--muted)}.muted{color:var(--muted)}.form-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.form-grid.triple{grid-template-columns:repeat(auto-fit,minmax(160px,1fr))}.form-grid.quad{grid-template-columns:repeat(auto-fit,minmax(150px,1fr))}.form-grid label{display:flex;flex-direction:column;gap:6px;font-size:12px;color:var(--muted)}.form-grid input,.form-grid select{border:1px solid var(--control-border);border-radius:10px;padding:10px 12px;font-size:13px;background:var(--control-bg);outline:none}.form-grid input:focus,.form-grid select:focus{border-color:var(--primary);box-shadow:0 0 0 2px #195de61a}.protocol-modal-body{gap:20px}.protocol-modal .modal-header h3{font-size:18px}.protocol-grid{grid-template-columns:repeat(2,minmax(240px,1fr))}.protocol-textarea{display:flex;flex-direction:column;gap:6px;font-size:12px;color:var(--muted)}.protocol-textarea textarea{border:1px solid var(--control-border);border-radius:12px;padding:12px 14px;font-size:13px;background:var(--control-bg);min-height:96px;resize:vertical;outline:none}.protocol-textarea textarea:focus{border-color:var(--primary);box-shadow:0 0 0 2px #195de61a}.protocol-driver{background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px;padding:12px}.section-title{font-size:12px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.08em}.file-row{display:flex;flex-direction:column;gap:8px;align-items:stretch}.file-row-controls{display:flex;align-items:center;gap:10px}.file-row-controls .btn{flex:0 0 auto}.file-input{display:flex;align-items:center;gap:8px;border:1px solid var(--control-border);border-radius:10px;padding:8px 10px;background:var(--control-bg);flex:1 1 auto;min-width:0}.file-input input{border:none;background:transparent;font-size:12px;width:100%;outline:none}.plugin-list{display:flex;flex-direction:column;gap:10px}.plugin-filters{display:inline-flex;align-items:center;flex-wrap:wrap;gap:8px}.plugin-filters button{border:1px solid var(--control-border);background:var(--control-bg);color:var(--muted);border-radius:999px;padding:4px 10px;font-size:12px;font-weight:600;cursor:pointer}.plugin-filters button.active{background:var(--accent-soft);color:var(--primary);border-color:var(--accent-soft-strong)}.plugin-filters button:hover:not(.active){background:var(--hover-bg);color:var(--text)}.plugin-item{border:1px solid var(--border);border-radius:10px;padding:10px 12px;display:flex;align-items:center;justify-content:space-between;gap:10px}.plugin-item.muted{background:#f8fafc}.plugin-title{font-weight:600;font-size:13px}.plugin-meta{font-size:11px;color:var(--muted)}.badge-green{background:#dcfce7;color:#166534;border-color:#bbf7d0}.badge-gray{background:#f1f5f9;color:#64748b;border-color:#e2e8f0}.badge-yellow{background:#fef9c3;color:#a16207;border-color:#fde68a}.badge-blue{background:#dbeafe;color:#1d4ed8;border-color:#bfdbfe}@media(max-width:1100px){.file-row-controls{flex-direction:column;align-items:stretch}.file-row-controls .btn{width:100%;justify-content:center}}.switch{position:relative;width:44px;height:24px}.switch input{opacity:0;width:0;height:0}.switch span{position:absolute;cursor:pointer;inset:0;background:#e2e8f0;border-radius:999px;transition:.2s}.switch span:before{content:"";position:absolute;height:18px;width:18px;left:3px;top:3px;background:#fff;border-radius:50%;transition:.2s;box-shadow:0 2px 6px #0f172a33}.switch input:checked+span{background:var(--primary)}.switch input:checked+span:before{transform:translate(20px)}.proxy-page{gap:18px}.proxy-hero{border-radius:18px}.proxy-filters{display:flex;flex-wrap:wrap;gap:10px;padding-left:4px}.proxy-filter{border:1px solid var(--border);background:#fff;color:var(--muted);padding:6px 16px;border-radius:999px;font-size:11px;font-weight:700;cursor:pointer;transition:all .2s ease}.proxy-filter:hover{border-color:#c7d2fe;color:#1e293b}.proxy-filter.active{background:#0f172a;color:#fff;border-color:#0f172a;box-shadow:0 10px 20px #0f172a33}.proxy-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:16px}.proxy-card{border:1px solid var(--border);border-radius:18px;background:#fff;padding:18px;display:flex;flex-direction:column;gap:14px;box-shadow:0 12px 30px #0f172a14;transition:transform .2s ease,box-shadow .2s ease}.proxy-card:hover{transform:translateY(-2px);box-shadow:0 18px 36px #0f172a1f}.proxy-card-header{display:flex;justify-content:space-between;align-items:flex-start;gap:12px}.proxy-title{display:flex;gap:12px;align-items:center}.proxy-title h3{margin:0;font-size:15px;font-weight:700;color:var(--text)}.proxy-subtitle{margin:2px 0 0;font-size:11px;color:#94a3b8;font-family:Space Grotesk,Noto Sans SC,sans-serif;letter-spacing:.04em}.proxy-icon{width:40px;height:40px;border-radius:12px;display:inline-flex;align-items:center;justify-content:center;background:#e0e7ff;color:#4338ca}.proxy-icon.accent-running{background:#dbeafe;color:#1d4ed8}.proxy-icon.accent-stopped{background:#f1f5f9;color:#64748b}.proxy-icon.accent-error{background:#fee2e2;color:#dc2626}.proxy-status{display:inline-flex;align-items:center;gap:6px;font-size:10px;font-weight:800;padding:4px 10px;border-radius:999px;border:1px solid transparent}.proxy-status .dot{width:6px;height:6px;border-radius:50%;background:currentColor}.proxy-status.running{background:#ecfdf3;color:#15803d;border-color:#bbf7d0}.proxy-status.stopped{background:#f1f5f9;color:#64748b;border-color:#e2e8f0}.proxy-status.error{background:#fef2f2;color:#b91c1c;border-color:#fecaca}.proxy-route{display:flex;flex-direction:column;gap:6px;padding:10px 12px;border-radius:12px;border:1px dashed #e2e8f0;background:#f8fafc;font-size:11px;color:var(--muted)}.proxy-route-label{text-transform:uppercase;letter-spacing:.08em;font-size:9px;font-weight:700;color:#64748b}.proxy-route-line{display:flex;align-items:center;flex-wrap:wrap;gap:6px}.proxy-route-chip{padding:2px 8px;border-radius:999px;border:1px solid #e2e8f0;background:#fff;font-size:10px;font-weight:600;color:#1e293b;letter-spacing:.04em}.proxy-route-arrow{font-size:10px;color:#94a3b8}.proxy-card-body{display:flex;justify-content:space-between;align-items:center;gap:12px;border-top:1px solid #f1f5f9;border-bottom:1px solid #f1f5f9;background:#f8fafc;border-radius:12px;padding:12px}.proxy-metric{display:flex;flex-direction:column;gap:4px;font-size:11px;color:var(--muted)}.proxy-metric strong{font-size:13px;color:#1e293b}.proxy-sparkline{width:90px;height:32px;display:flex;align-items:flex-end;justify-content:flex-end}.proxy-sparkline path{fill:none;stroke-width:1.6;stroke-linejoin:round}.proxy-sparkline.running path{stroke:#2563eb}.proxy-sparkline.stopped path{stroke:#64748b}.proxy-sparkline.error path{stroke:#ef4444}.proxy-card-footer{display:flex;align-items:center;justify-content:space-between;gap:12px}.proxy-toggle-wrap{display:inline-flex;align-items:center;gap:8px}.proxy-toggle{position:relative;width:34px;height:18px;display:inline-block;cursor:pointer}.proxy-toggle-track{position:absolute;inset:0;background:#e2e8f0;border-radius:999px;transition:.2s}.proxy-toggle-track:before{content:"";position:absolute;height:14px;width:14px;left:2px;top:2px;border-radius:50%;background:#fff;box-shadow:0 2px 6px #0f172a33;transition:.2s}.proxy-toggle.active .proxy-toggle-track{background:#2563eb}.proxy-toggle.active .proxy-toggle-track:before{transform:translate(16px)}.proxy-toggle-label{font-size:10px;font-weight:700;color:#94a3b8;text-transform:uppercase;letter-spacing:.04em}.proxy-actions{display:inline-flex;gap:6px}.proxy-card-add{border:2px dashed #cbd5e1;background:#f8fafc;align-items:center;justify-content:center;text-align:center;cursor:pointer}.proxy-card-add:hover{border-color:#93c5fd;color:#1d4ed8}.proxy-add-icon{width:46px;height:46px;border-radius:999px;background:#e2e8f0;display:inline-flex;align-items:center;justify-content:center;color:#64748b;transition:all .2s ease}.proxy-card-add:hover .proxy-add-icon{background:#2563eb;color:#fff}.proxy-add-title{margin-top:12px;font-size:13px;font-weight:700}.proxy-add-sub{margin-top:6px;font-size:11px;color:#94a3b8}.proxy-modal-backdrop{position:fixed;inset:0;background:#0f172a73;display:flex;align-items:center;justify-content:center;padding:20px;z-index:2500}.proxy-modal{width:min(1200px,92vw);height:min(85vh,860px);background:#fff;border-radius:20px;border:1px solid var(--border);box-shadow:0 30px 80px #0f172a2e;display:flex;flex-direction:column;overflow:hidden}.proxy-modal-header{padding:16px 22px;border-bottom:1px solid var(--border);background:#fff;display:flex;align-items:center;justify-content:space-between;gap:16px}.proxy-modal-title{display:flex;align-items:center;gap:14px;color:var(--text)}.proxy-modal-title h3{margin:0;font-size:18px;font-weight:700}.proxy-modal-icon{width:40px;height:40px;border-radius:14px;background:#e0e7ff;color:#1d4ed8;display:inline-flex;align-items:center;justify-content:center}.proxy-modal-meta{margin-top:4px;font-size:11px;color:#64748b;display:inline-flex;align-items:center;gap:8px;text-transform:uppercase;letter-spacing:.08em}.pulse-dot{width:6px;height:6px;border-radius:50%;background:#22c55e;position:relative}.pulse-dot:after{content:"";position:absolute;inset:0;border-radius:50%;background:#22c55e99;animation:pulse 1.4s infinite}.proxy-modal-actions{display:flex;align-items:center;gap:10px}.proxy-modal-select{display:flex;align-items:center;gap:10px;padding:6px 10px;border-radius:12px;border:1px solid var(--border);background:#f8fafc}.proxy-modal-select label{font-size:10px;font-weight:700;color:#64748b;text-transform:uppercase;letter-spacing:.06em}.proxy-modal-select select{background:transparent;border:none;color:#0f172a;font-size:12px;font-weight:600;outline:none}.proxy-modal-body{display:grid;grid-template-columns:1fr 260px;flex:1;min-height:0}.proxy-modal-stream{display:flex;flex-direction:column;min-width:0;background:#fff}.proxy-modal-toolbar{padding:10px 16px;background:#f8fafc;border-bottom:1px solid var(--border);display:flex;justify-content:space-between;align-items:center;gap:12px;color:#64748b;font-size:11px;text-transform:uppercase;letter-spacing:.08em}.proxy-modal-toolbar-left,.proxy-modal-toolbar-right{display:inline-flex;align-items:center;gap:8px}.proxy-modal-toolbar-right span{font-size:10px}.proxy-modal-toggle{display:inline-flex;background:#fff;border:1px solid var(--border);border-radius:8px;padding:2px;gap:4px}.proxy-modal-toggle button{border:none;background:transparent;color:#64748b;font-size:9px;font-weight:700;padding:2px 8px;border-radius:6px;cursor:pointer}.proxy-modal-toggle button.active{background:#0f172a;color:#fff}.proxy-modal-list{flex:1;overflow-y:auto;padding:14px 16px 10px;font-family:JetBrains Mono,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace;font-size:12px;color:#334155;overscroll-behavior:contain;overflow-anchor:none}.proxy-modal-list-header{display:grid;grid-template-columns:80px 1fr 160px;gap:12px;padding-bottom:10px;margin-bottom:12px;border-bottom:1px solid var(--border);color:#94a3b8;font-size:10px;text-transform:uppercase;letter-spacing:.14em;position:sticky;top:0;background:#fff;z-index:2}.proxy-frame{border:1px solid var(--border);border-radius:12px;background:#fff;margin-bottom:10px}.proxy-frame.error{border-color:#fecaca;background:#fef2f2}.proxy-frame-row{display:grid;grid-template-columns:80px 1fr 160px;gap:12px;align-items:center;padding:10px 12px;cursor:pointer}.proxy-frame .note{color:#2563eb;border-left:2px solid rgba(37,99,235,.4);padding-left:8px}.proxy-frame .col-summary{text-align:right;font-style:italic;color:#16a34a;font-size:11px}.proxy-frame .col-summary.error{color:#f87171;font-weight:700;font-style:normal}.proxy-chip{padding:2px 6px;border-radius:6px;border:1px solid transparent;font-size:11px;font-weight:700}.proxy-chip[data-warn=true]{-webkit-text-decoration:underline wavy rgba(248,113,113,.6);text-decoration:underline wavy rgba(248,113,113,.6)}.proxy-chip.tone-amber{border-color:#f59e0b66;color:#fbbf24;background:#f59e0b1a}.proxy-chip.tone-blue{border-color:#3b82f666;color:#60a5fa;background:#3b82f61f}.proxy-chip.tone-green{border-color:#10b98166;color:#34d399;background:#10b9811f}.proxy-chip.tone-rose{border-color:#f43f5e66;color:#fb7185;background:#f43f5e1f}.proxy-chip.tone-red{border-color:#ef444499;color:#f87171;background:#ef444466}.proxy-frame-detail{margin:0 12px 12px 24px;padding:12px;border-top:1px solid var(--border);background:#f8fafc;border-radius:0 0 10px 10px;color:#334155;font-size:12px;display:flex;flex-direction:column;gap:6px}.proxy-detail-row{display:flex;align-items:center;gap:10px}.proxy-detail-row span:first-child{color:#64748b;min-width:120px}.proxy-detail-row .tone-amber{color:#fbbf24}.proxy-detail-row .tone-blue{color:#60a5fa}.proxy-detail-row .tone-green{color:#34d399}.proxy-confirm-text{font-size:14px;color:#475569;margin:0;line-height:1.6}.proxy-modal-footer{padding:12px 16px;border-top:1px solid var(--border);background:#f8fafc;display:flex;align-items:center;justify-content:space-between;gap:12px}.proxy-footer-actions{display:inline-flex;gap:8px}.proxy-btn{border:none;border-radius:8px;padding:6px 12px;display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:700;cursor:pointer}.proxy-btn.primary{background:#2563eb;color:#fff;box-shadow:0 10px 20px #2563eb4d}.proxy-btn.warning{background:#fff7ed;color:#b45309}.proxy-btn.ghost{background:#e2e8f0;color:#475569}.proxy-modal-side{padding:18px;background:#f8fafc;border-left:1px solid var(--border);color:#475569;display:flex;flex-direction:column;gap:16px}.proxy-capture .proxy-modal-body{background:#0b1220;border-top:1px solid #1f2937;display:grid!important;grid-template-columns:minmax(0,1fr) 320px!important;align-items:stretch}.proxy-capture .proxy-modal-stream{background:#0b1220;color:#cbd5f5;padding:0}.proxy-capture .proxy-modal-toolbar{background:#0f172a;border-color:#1f2937;color:#94a3b8;padding:12px 16px}.proxy-capture .proxy-modal-toolbar.secondary{border-top:1px solid #1f2937}.proxy-capture .proxy-modal-list{background:#0b1220;color:#cbd5f5;padding:14px 16px}.proxy-capture .proxy-modal-list-header{background:#0b1220;border-color:#1f2937;color:#64748b;padding-bottom:12px}.proxy-capture .proxy-frame{background:#0f172a;border-color:#1f2937;border-radius:14px;box-shadow:0 8px 24px #02061773}.proxy-capture .proxy-frame.error{background:#2b1220;border-color:#7f1d1d}.proxy-capture .proxy-frame-detail{background:#0f172a;border-top-color:#1f2937;color:#cbd5f5}.proxy-capture .proxy-modal-footer{background:#0f172a;border-top-color:#1f2937;padding:14px 16px}.proxy-capture .proxy-modal-side{background:#0b1220;border-left-color:#1f2937;color:#cbd5f5;min-width:260px;padding:18px 16px;box-shadow:inset 1px 0 #94a3b814}.proxy-capture .proxy-modal-select{background:#0f172a;border:1px solid #1f2937;border-radius:12px;padding:6px 12px}.proxy-capture .proxy-modal-select label{display:block;font-size:10px;font-weight:700;color:#94a3b8;text-transform:uppercase;letter-spacing:.08em}.proxy-capture .proxy-modal-select select{background:transparent;border:none;color:#e2e8f0;font-size:12px;font-weight:600;outline:none;padding:0}.proxy-capture .proxy-modal-header{justify-content:space-between}.proxy-capture-actions{display:flex;align-items:center;gap:12px}.proxy-capture-sub{display:flex;align-items:center;gap:8px;margin-top:4px}.proxy-live-dot{width:6px;height:6px;border-radius:999px;background:#22c55e;box-shadow:0 0 0 4px #22c55e33;animation:proxy-pulse 1.6s infinite}.proxy-time{color:#94a3b8;font-size:11px;font-weight:600}.proxy-payload{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.proxy-summary{text-align:right;font-style:italic;color:#7dd3fc;font-size:11px}.proxy-summary.error{color:#f87171;font-weight:700;font-style:normal}.proxy-capture-header{background:#fff;border-bottom:1px solid #e2e8f0}.proxy-capture .proxy-modal{max-width:1200px;height:min(90vh,940px)}.proxy-capture-header{padding:14px 18px}.proxy-capture .proxy-modal-title h2{font-size:18px;line-height:1.2}.proxy-capture .proxy-subtitle{font-size:11px}.proxy-capture .proxy-modal-icon{width:38px;height:38px;border-radius:12px;background:#e0edff;color:#2563eb}.proxy-capture .proxy-modal-icon .material-symbols-outlined{font-size:18px}.proxy-capture .proxy-capture-actions{gap:10px}.proxy-capture .proxy-modal-select{padding:4px 10px}.proxy-capture .proxy-modal-select label{font-size:9px}.proxy-capture .proxy-modal-select select{font-size:11px}.proxy-capture .proxy-modal-close{width:28px;height:28px}.proxy-capture-header .proxy-modal-title h2{color:#0f172a}.proxy-capture-header .proxy-subtitle{color:#64748b;font-size:12px}.proxy-capture .proxy-modal-title h2{font-weight:700}.proxy-capture-footer{display:flex;align-items:center;justify-content:space-between;gap:12px}.proxy-footer-left,.proxy-footer-right{display:flex;align-items:center;gap:10px}.proxy-capture .proxy-btn.warning{background:#f59e0b26;color:#fbbf24}.proxy-capture .proxy-btn.ghost{background:#111827;color:#cbd5f5}.proxy-capture .proxy-btn.primary{background:#2563eb;color:#fff;box-shadow:0 10px 20px #2563eb4d}.proxy-capture .proxy-modal-toggle{background:#0b1220;border:1px solid #1f2937;border-radius:999px;padding:4px}.proxy-capture .proxy-modal-toggle button{font-size:10px;padding:4px 10px;border-radius:999px;font-weight:700}.proxy-capture .proxy-modal-toggle button.active{background:#1f2937;color:#e2e8f0}.proxy-capture .proxy-modal-list-header span{font-size:10px;text-transform:uppercase;letter-spacing:.12em}.proxy-capture .proxy-frame-row{padding:12px 14px}.proxy-capture .proxy-time{font-size:12px;font-weight:600;color:#94a3b8}.proxy-capture .proxy-payload .proxy-chip{border-radius:10px;padding:2px 8px;font-size:11px}.proxy-capture .proxy-summary{font-size:12px;font-weight:600;color:#7dd3fc}.proxy-capture .proxy-summary.error{color:#fb7185}.proxy-capture .proxy-modal-list{gap:10px}.proxy-capture .proxy-frame+.proxy-frame{margin-top:10px}.proxy-capture .proxy-modal-side h4,.proxy-capture .proxy-side-block h5{color:#94a3b8;letter-spacing:.12em}.proxy-capture .proxy-stat-card{background:#0f172a;border-color:#1f2937;border-radius:16px;padding:16px;box-shadow:inset 0 0 0 1px #94a3b80f}.proxy-capture .proxy-stat-card span{color:#94a3b8}.proxy-capture .proxy-stat-value strong{color:#e2e8f0}.proxy-capture .proxy-stat-value strong.danger{color:#fb7185}.proxy-capture .proxy-stat-value em{color:#22c55e}.proxy-capture .proxy-side-block{background:#0f172a;border-color:#1f2937;border-radius:16px;padding:14px}.proxy-capture .proxy-side-tip{background:#0b1b33;border-color:#1e3a8a;color:#93c5fd;border-radius:16px}@keyframes proxy-pulse{0%{transform:scale(.9);opacity:.8}70%{transform:scale(1.2);opacity:0}to{transform:scale(.9);opacity:0}}.proxy-modal-side h4{margin:0 0 12px;font-size:10px;font-weight:700;color:#94a3b8;letter-spacing:.12em;text-transform:uppercase}.proxy-stat-card{background:#fff;border:1px solid var(--border);border-radius:14px;padding:14px;margin-bottom:12px;position:relative;overflow:hidden}.proxy-stat-card span{font-size:10px;color:#94a3b8;text-transform:uppercase;letter-spacing:.1em;font-weight:700}.proxy-stat-value{margin-top:6px;display:flex;align-items:baseline;gap:8px}.proxy-stat-value strong{font-size:22px;color:#0f172a}.proxy-stat-value strong.danger{color:#fb7185}.proxy-stat-value em{font-size:10px;color:#22c55e;font-weight:700;font-style:normal}.proxy-stat-bar{position:absolute;left:0;right:40%;bottom:0;height:3px;background:#3b82f699}.proxy-side-block{background:#fff;border:1px solid var(--border);border-radius:14px;padding:14px;display:flex;flex-direction:column;gap:8px}.proxy-side-block h5{margin:0 0 6px;font-size:10px;color:#94a3b8;text-transform:uppercase;letter-spacing:.12em}.proxy-side-block label{display:flex;align-items:center;gap:8px;font-size:12px;color:#475569}.proxy-side-block input{accent-color:#2563eb}.proxy-side-tip{border-radius:14px;padding:14px;border:1px solid #bfdbfe;background:#eff6ff;color:#1d4ed8;font-size:11px}.proxy-side-tip-title{display:inline-flex;align-items:center;gap:6px;font-size:10px;text-transform:uppercase;letter-spacing:.12em;font-weight:700;margin-bottom:8px}@media(max-width:1024px){.proxy-modal{height:min(90vh,900px)}.proxy-modal-body{grid-template-columns:1fr}.proxy-capture .proxy-modal-body{grid-template-columns:minmax(0,1fr) 320px!important}.proxy-modal-side{border-left:none;border-top:1px solid rgba(148,163,184,.2);flex-direction:row;flex-wrap:wrap}.proxy-capture .proxy-modal-side{border-left:1px solid #1f2937;border-top:none;flex-direction:column}.proxy-modal-side>div,.proxy-side-block,.proxy-side-tip{flex:1 1 240px}}@media(max-width:1200px){.manual-grid,.monitor-stack,.scripts-grid{grid-template-columns:1fr}.scripts-side>.panel.stack{min-height:0}}@media(max-width:1360px){.manual-grid{grid-template-columns:1fr}.manual-left,.manual-right{display:contents}.manual-monitor,.manual-send,.manual-quick,.manual-console{width:100%}.manual-monitor{order:1}.manual-send{order:2}.manual-quick{order:3}.manual-console{order:4}.manual-monitor{min-height:220px}.manual-monitor .log-stream{min-height:140px;max-height:260px}.manual-send .text-area{min-height:140px}.manual-send{min-height:240px}.header-actions{gap:8px}}@media(max-width:1000px){.page-header{padding:14px 16px}}@media(max-width:1100px){.header-actions{gap:8px}}@media(max-width:900px){.header-actions{flex-wrap:wrap}.select-wrap{flex:1 1 220px}.status-indicator{order:1}}.proxy-dashboard{gap:24px}.proxy-dashboard-hero{display:flex;flex-direction:column;gap:16px}.proxy-hero-card{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:20px;padding:24px 26px;border-radius:24px;border:1px solid var(--border);background:#fffffff2;box-shadow:0 18px 40px #0f172a14}.proxy-hero-card h2{margin:0;font-size:26px;letter-spacing:-.02em}.proxy-hero-card p{margin:6px 0 0;color:var(--muted);font-size:13px}.proxy-hero-actions{display:inline-flex;align-items:center;gap:10px;flex-wrap:wrap}.proxy-hero-btn{display:inline-flex;align-items:center;gap:8px;padding:10px 18px;border-radius:16px;border:1px solid var(--border);background:#fff;font-size:13px;font-weight:600;cursor:pointer;transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease}.proxy-hero-btn:hover{border-color:#cbd5f5;box-shadow:0 10px 20px #2563eb1f;transform:translateY(-1px)}.proxy-hero-btn.primary{border-color:transparent;background:#2563eb;color:#fff;box-shadow:0 16px 30px #2563eb4d}.proxy-hero-btn.primary:hover{box-shadow:0 18px 36px #2563eb5c}.proxy-dashboard-filters{display:flex;flex-wrap:wrap;gap:8px}.proxy-filter-chip{border:1px solid var(--border);background:#fff;color:#64748b;padding:8px 18px;border-radius:999px;font-size:12px;font-weight:600;cursor:pointer;transition:border-color .18s ease,color .18s ease,background .18s ease}.proxy-filter-chip:hover{border-color:#cbd5f5}.proxy-filter-chip.active{background:#0f172a;color:#fff;border-color:#0f172a}.proxy-dashboard-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:18px;justify-content:start}.proxy-panel{display:flex;flex-direction:column;gap:14px;border-radius:22px;border:1px solid var(--border);background:#fff;box-shadow:0 16px 36px #0f172a14;overflow:hidden;transition:transform .2s ease,box-shadow .2s ease}.proxy-panel:hover{transform:translateY(-2px);box-shadow:0 20px 44px #0f172a1f}.proxy-panel.status-stopped{opacity:.75;filter:grayscale(.35)}.proxy-panel-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:20px 20px 0}.proxy-panel-title{display:flex;align-items:center;gap:14px}.proxy-panel-title h3{margin:0;font-size:16px;font-weight:700;color:var(--text)}.proxy-panel-title p{margin:4px 0 0;font-size:11px;color:#94a3b8;letter-spacing:.08em;text-transform:uppercase}.proxy-panel-icon{width:44px;height:44px;border-radius:16px;display:inline-flex;align-items:center;justify-content:center;background:#dbeafe;color:#2563eb}.proxy-panel-icon.status-stopped{background:#f1f5f9;color:#94a3b8}.proxy-panel-icon.status-error{background:#fee2e2;color:#ef4444}.proxy-status-pill{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;border-radius:999px;font-size:10px;font-weight:700;letter-spacing:.2em;text-transform:uppercase;border:1px solid transparent}.proxy-status-pill .dot{width:6px;height:6px;border-radius:50%;background:currentColor}.proxy-status-pill.status-running{color:#16a34a;background:#ecfdf3;border-color:#bbf7d0}.proxy-status-pill.status-stopped{color:#64748b;background:#f1f5f9;border-color:#e2e8f0}.proxy-status-pill.status-error{color:#ef4444;background:#fef2f2;border-color:#fecaca}.proxy-route-card{margin:0 20px;padding:12px 14px;border-radius:18px;border:1px dashed #d1d5db;background:#f8fafc;display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:12px}.proxy-route-card.status-error{border-color:#fecaca;background:#fff1f2}.proxy-route-col{display:flex;flex-direction:column;align-items:center;gap:6px;text-align:center;font-size:11px;color:#94a3b8}.proxy-route-chip{padding:4px 10px;border-radius:10px;border:1px solid #e2e8f0;background:#fff;font-size:12px;color:#1f2937;box-shadow:0 6px 12px #0f172a14}.proxy-route-state{display:inline-flex;flex-direction:column;align-items:center;gap:6px;font-size:10px;font-weight:700;letter-spacing:.12em;text-transform:uppercase}.proxy-route-state.primary{color:#2563eb}.proxy-route-state.muted{color:#94a3b8}.proxy-route-state.danger{color:#ef4444}.proxy-metrics{display:grid;grid-template-columns:1fr 1.4fr;gap:12px;padding:14px 20px;border-top:1px solid #f1f5f9;border-bottom:1px solid #f1f5f9}.proxy-metrics p{margin:0 0 6px;font-size:11px;color:#94a3b8}.proxy-metrics p.danger{color:#ef4444}.proxy-metrics strong{font-size:18px;color:#0f172a}.proxy-metrics strong span{font-size:11px;font-weight:500;color:#94a3b8;margin-left:4px}.proxy-metric-bandwidth{display:flex;justify-content:space-between;align-items:flex-end;gap:10px}.proxy-sparkline{width:90px;height:36px;display:flex;align-items:flex-end;justify-content:flex-end}.proxy-sparkline svg{width:100%;height:100%}.proxy-sparkline path{fill:none;stroke-width:2;stroke:#2563eb}.proxy-sparkline.status-error path{stroke:#ef4444}.proxy-sparkline.status-stopped path{stroke:#94a3b8}.proxy-sparkline-empty{width:100%;height:4px;border-radius:999px;background:#e2e8f0;align-self:center}.proxy-error-hint{margin:0 20px;padding:10px 12px;border-radius:12px;border:1px solid #fecaca;background:#fff1f2;display:flex;align-items:center;justify-content:space-between;gap:10px}.proxy-error-message{display:inline-flex;align-items:flex-start;gap:8px;color:#b91c1c;font-size:11px;line-height:1.4}.proxy-error-message .material-symbols-outlined{font-size:16px;line-height:1;margin-top:1px}.proxy-error-retry{display:inline-flex;align-items:center;gap:4px;border:1px solid #fda4af;color:#b91c1c;background:#fff;border-radius:10px;padding:4px 8px;font-size:11px;font-weight:700;cursor:pointer;transition:all .2s ease;flex-shrink:0}.proxy-error-retry:hover{background:#ffe4e6;border-color:#fb7185}.proxy-error-retry .material-symbols-outlined{font-size:15px}.proxy-panel-footer{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 20px 16px;background:#f8fafc}.proxy-panel-footer.status-error{background:#fff1f2}.proxy-footer-toggle{display:inline-flex;align-items:center;gap:10px}.proxy-toggle-text{font-size:10px;font-weight:700;letter-spacing:.2em;text-transform:uppercase;color:#64748b}.proxy-panel-footer.status-error .proxy-toggle-text{color:#ef4444}.proxy-footer-actions{display:inline-flex;align-items:center;gap:8px}.icon-btn.danger:hover{color:#ef4444;background:#fee2e2}.proxy-panel-add{border:2px dashed #cbd5f5;background:transparent;box-shadow:none;align-items:center;justify-content:center;gap:16px;min-height:300px;padding:24px;text-align:center;cursor:pointer}.proxy-panel-add:hover{border-color:#2563eb;background:#f8fafc}.proxy-add-icon{width:56px;height:56px;border-radius:50%;background:#f1f5f9;display:inline-flex;align-items:center;justify-content:center;color:#94a3b8;transition:all .2s ease}.proxy-panel-add:hover .proxy-add-icon{background:#2563eb;color:#fff}.proxy-add-copy h3{margin:0;font-size:16px;font-weight:700;color:#0f172a}.proxy-add-copy p{margin:6px 0 0;font-size:12px;color:#94a3b8}.proxy-add-tags{display:flex;gap:8px;flex-wrap:wrap;justify-content:center}.proxy-add-tags span{padding:4px 10px;border-radius:999px;background:#f1f5f9;font-size:10px;font-weight:700;color:#64748b}.proxy-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.proxy-modal-overlay{position:fixed;inset:0;background:#0f172a99;display:flex;align-items:center;justify-content:center;padding:20px;z-index:120;pointer-events:auto}body.proxy-edit-open{overflow:hidden}body.proxy-edit-open .main>:not(.proxy-modal-overlay){pointer-events:none}body.proxy-edit-open .proxy-modal-overlay{pointer-events:auto}.proxy-modal{width:min(820px,100%);background:#fff;border-radius:28px;border:1px solid var(--border);box-shadow:0 18px 40px #0f172a33;display:flex;flex-direction:column;overflow:hidden;max-height:90vh}.proxy-confirm-modal{width:min(520px,92vw);max-height:360px}.proxy-confirm-modal .proxy-modal-header{padding:16px 20px}.proxy-confirm-modal .proxy-modal-body{padding:16px 20px 10px}.proxy-confirm-modal .proxy-modal-footer{padding:12px 20px 16px}.proxy-modal-header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:24px 32px;border-bottom:1px solid #eef2f7;background:#fff}.proxy-modal-title{display:flex;align-items:center;gap:12px}.proxy-modal-title h2{margin:0;font-size:18px;font-weight:700;color:#0f172a}.proxy-modal-icon{width:40px;height:40px;border-radius:14px;display:inline-flex;align-items:center;justify-content:center;background:#dbeafe;color:#2563eb}.proxy-modal-close{width:40px;height:40px;border-radius:12px;border:none;background:transparent;color:#94a3b8;cursor:pointer;display:inline-flex;align-items:center;justify-content:center}.proxy-modal-close:hover{background:#f1f5f9;color:#475569}.proxy-modal-body{padding:32px;overflow-y:auto;max-height:85vh;display:flex;flex-direction:column;gap:28px}.proxy-modal-note{margin:0;font-size:14px;color:#64748b}.proxy-modal-stack{display:flex;flex-direction:column;gap:28px;align-items:stretch;width:100%}.proxy-modal-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}.proxy-field{display:flex;flex-direction:column;gap:8px;font-size:12px;color:#334155}.proxy-field label{font-weight:600;display:inline-flex;align-items:center;gap:6px}.proxy-field input,.proxy-field select{border:1px solid #e2e8f0;background:#f8fafc;border-radius:12px;padding:10px 12px;font-size:13px;color:#0f172a;width:100%}.proxy-port-map{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;align-items:end;padding:20px;border-radius:18px;border:1px solid #dbe4ff;background:#f5f8ff;width:100%}.proxy-section{display:flex;flex-direction:column;gap:12px;margin-bottom:18px}.proxy-section-title{display:flex;align-items:center;gap:8px;font-weight:700;font-size:13px;color:#1f2937;border-bottom:1px solid #eef2f7;padding-bottom:8px}.proxy-section-title span:last-child{font-weight:500;font-size:11px;color:#94a3b8}.proxy-section-title.muted{color:#64748b;border-bottom:none;padding-bottom:0}.proxy-section-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;padding:24px;border-radius:16px;border:1px solid #e2e8f0;background:#f8fafc;width:100%}.proxy-span-2{grid-column:span 2}.proxy-segmented{display:grid;grid-template-columns:repeat(auto-fit,minmax(48px,1fr));gap:6px;padding:6px;border-radius:14px;background:#e2e8f0}.proxy-segmented button{border:none;background:transparent;padding:8px;border-radius:10px;font-size:12px;font-weight:700;color:#64748b;cursor:pointer}.proxy-segmented button.active{background:#fff;color:#2563eb;box-shadow:0 4px 10px #0f172a14}.proxy-toggle-row{display:flex;flex-wrap:wrap;gap:18px;font-size:13px;color:#64748b}@media(max-width:900px){.proxy-modal-grid,.proxy-port-map,.proxy-section-grid{grid-template-columns:1fr}}.proxy-modal-advanced{border-top:1px solid #eef2f7;padding-top:16px}.proxy-toggle-row label{display:inline-flex;align-items:center;gap:10px;font-weight:600}.proxy-modal-footer{display:flex;justify-content:flex-end;gap:12px;padding:24px 32px 28px;border-top:1px solid #eef2f7;background:#f8fafc}@media(min-width:768px){.proxy-modal-grid,.proxy-port-map,.proxy-section-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(min-width:1024px){.proxy-section-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}.proxy-modal-btn{border-radius:14px;padding:10px 18px;font-size:13px;font-weight:700;border:1px solid #e2e8f0;background:#fff;color:#64748b;cursor:pointer;transition:transform .16s ease,box-shadow .16s ease}.proxy-modal-btn.ghost:hover{box-shadow:0 6px 12px #0f172a14;transform:translateY(-1px)}.proxy-modal-btn.primary{border:none;background:#2563eb;color:#fff;box-shadow:0 16px 30px #2563eb40}.proxy-capture .proxy-modal-body{background:#f8fafc;border-top:1px solid #e2e8f0}.proxy-capture .proxy-modal-stream{background:#f8fafc;color:#0f172a}.proxy-capture .proxy-modal-toolbar{background:#fff;border-color:#e2e8f0;color:#64748b}.proxy-capture .proxy-modal-list{background:#f8fafc;color:#0f172a}.proxy-capture .proxy-modal-list-header{background:#f8fafc;border-color:#e2e8f0;color:#94a3b8}.proxy-capture .proxy-frame{background:#fff;border-color:#e2e8f0;box-shadow:0 12px 24px #0f172a14}.proxy-capture .proxy-frame.error{background:#fef2f2;border-color:#fecaca}.proxy-capture .proxy-frame-detail{background:#f8fafc;border-top-color:#e2e8f0;color:#334155}.proxy-capture .proxy-modal-footer{background:#fff;border-top-color:#e2e8f0}.proxy-capture .proxy-modal-side{background:#f1f5f9;border-left-color:#e2e8f0;color:#0f172a;box-shadow:inset 1px 0 #94a3b81f}.proxy-capture .proxy-modal-select{background:#f1f5f9;border:1px solid #e2e8f0}.proxy-capture .proxy-modal-select label{color:#64748b}.proxy-capture .proxy-modal-select select{color:#0f172a}.proxy-capture .proxy-time{color:#64748b}.proxy-capture .proxy-summary{color:#2563eb}.proxy-capture .proxy-summary.error{color:#f43f5e}.proxy-capture .proxy-btn.warning{background:#fff7ed;color:#b45309}.proxy-capture .proxy-btn.ghost{background:#e2e8f0;color:#475569}.proxy-capture .proxy-modal-toggle{background:#f8fafc;border:1px solid #e2e8f0}.proxy-capture .proxy-modal-toggle button.active{background:#0f172a;color:#fff}.proxy-capture .proxy-stat-card{background:#fff;border-color:#e2e8f0;box-shadow:0 12px 24px #0f172a14}.proxy-capture .proxy-stat-value strong{color:#0f172a}.proxy-capture .proxy-stat-value strong.danger{color:#f43f5e}.proxy-capture .proxy-side-block{background:#fff;border-color:#e2e8f0}.proxy-capture .proxy-side-tip{background:#eff6ff;border-color:#bfdbfe;color:#2563eb}.packet-modal{max-width:1600px;height:95vh;border-radius:18px;overflow:hidden;pointer-events:auto}.proxy-capture .packet-header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;background:#fff;border-bottom:1px solid #e2e8f0}.packet-header-left{display:flex;align-items:center;gap:14px}.packet-icon{width:36px;height:36px;border-radius:10px;background:#dbeafe;color:#2563eb;display:inline-flex;align-items:center;justify-content:center}.packet-header h2{font-size:14px;font-weight:700;margin:0}.packet-subtitle{display:flex;align-items:center;gap:6px;margin-top:4px;font-size:11px;color:#64748b}.packet-dot{width:6px;height:6px;border-radius:999px;background:#22c55e;box-shadow:0 0 0 4px #22c55e33}.packet-header-actions{display:flex;align-items:center;gap:10px}.packet-header-right{display:flex;align-items:center;gap:10px;flex-wrap:wrap;justify-content:flex-end}.packet-search{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border:1px solid #e2e8f0;border-radius:10px;background:#f8fafc;min-width:240px}.packet-search input{border:none;outline:none;background:transparent;font-size:11px;width:100%}.packet-search .material-symbols-outlined{font-size:16px;color:#94a3b8}.packet-divider{width:1px;height:22px;background:#e2e8f0;margin:0 4px}.packet-action-btn{display:inline-flex;align-items:center;gap:6px;border:1px solid transparent;border-radius:10px;padding:6px 10px;font-size:11px;font-weight:600;cursor:pointer;background:#fff;color:#475569}.packet-action-btn.primary{background:#16a34a;color:#fff;border-color:#16a34a}.packet-action-btn.primary:hover{background:#15803d}.packet-action-btn.ghost{background:#f8fafc;color:#64748b;border-color:#e2e8f0}.packet-action-btn.ghost:hover{color:#0f172a;border-color:#cbd5e1}.packet-select{background:#f1f5f9;border:1px solid #e2e8f0;border-radius:12px;padding:6px 12px}.packet-select label{display:block;font-size:9px;font-weight:700;color:#64748b;text-transform:uppercase;letter-spacing:.08em}.packet-select select{background:transparent;border:none;color:#0f172a;font-size:12px;font-weight:600;outline:none;padding:0}.packet-close{width:28px;height:28px;border-radius:10px;border:none;background:transparent;color:#94a3b8}.packet-close:hover{background:#f1f5f9;color:#475569}.stitch-modal{background:#f8fafc;border:1px solid #e2e8f0;box-shadow:0 20px 50px #0f172a33;display:flex;flex-direction:column}.stitch-header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:12px 16px;background:#fff;border-bottom:1px solid #e2e8f0}.stitch-header-left{display:flex;align-items:center;gap:12px}.stitch-icon{width:34px;height:34px;border-radius:10px;background:#dbeafe;color:#2563eb;display:inline-flex;align-items:center;justify-content:center}.stitch-header h2{margin:0;font-size:14px;font-weight:700;color:#0f172a}.stitch-subtitle{display:flex;align-items:center;gap:6px;font-size:11px;color:#64748b;margin-top:4px}.stitch-dot{width:6px;height:6px;border-radius:999px;background:#22c55e}.stitch-header-right{display:flex;align-items:center;gap:10px;flex-wrap:wrap;justify-content:flex-end}.stitch-search{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border-radius:10px;border:1px solid #e2e8f0;background:#f8fafc;min-width:240px}.stitch-search input{border:none;outline:none;background:transparent;font-size:11px;width:100%}.stitch-divider{width:1px;height:22px;background:#e2e8f0;margin:0 4px}.stitch-btn{display:inline-flex;align-items:center;gap:6px;border-radius:8px;padding:6px 10px;font-size:11px;font-weight:700;border:1px solid transparent;cursor:pointer}.stitch-btn-primary{background:#16a34a;color:#fff}.stitch-btn-ghost{background:#f8fafc;color:#94a3b8;border-color:#e2e8f0}.stitch-timeline{position:relative;height:6px;background:#e2e8f0}.stitch-heatmap{height:100%;background:linear-gradient(to right,#10b981 0% 15%,#ef4444 15% 17%,#10b981 17% 45%,#ef4444 45% 46%,#10b981 46% 80%,#f59e0b 80% 82%,#10b981 82% 100%);opacity:.85}.stitch-window{position:absolute;top:0;bottom:0;left:20%;width:5%;background:#fff6;border-left:1px solid rgba(255,255,255,.8);border-right:1px solid rgba(255,255,255,.8)}.stitch-body{display:grid;grid-template-columns:minmax(0,1fr) 450px;flex:1;min-height:0}.stitch-table-section{background:#fff;display:flex;flex-direction:column;min-width:0}.stitch-table-wrap{flex:1;overflow:auto}.stitch-table{width:100%;border-collapse:collapse;font-size:12px}.stitch-table thead th{position:sticky;top:0;z-index:5;background:#f8fafc;font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:#94a3b8;padding:10px 12px;border-bottom:1px solid #e2e8f0}.stitch-table tbody tr{border-bottom:1px solid #f1f5f9;cursor:pointer}.stitch-table tbody tr.warn{background:#fff7ed99}.stitch-table tbody tr:hover{background:#f8fafc}.stitch-table td{padding:10px 12px;color:#475569}.stitch-dir{font-size:18px}.stitch-dir.rx{color:#10b981}.stitch-dir.tx{color:#3b82f6}.stitch-proto-pill{display:inline-flex;align-items:center;gap:6px;padding:3px 10px;border-radius:999px;font-size:10px;font-weight:700}.stitch-proto-pill.modbus{background:#dbeafe;color:#1d4ed8;border:1px solid #bfdbfe}.stitch-proto-pill.unknown{background:#f1f5f9;color:#64748b;border:1px dashed #cbd5e1}.stitch-proto-pill .pill-dot{width:14px;height:14px;border-radius:999px;background:#2563eb;color:#fff;display:inline-flex;align-items:center;justify-content:center;font-size:9px;font-weight:800}.stitch-proto-pill.unknown .pill-dot{background:#94a3b8}.stitch-side{background:#f8fafc;border-left:1px solid #e2e8f0;display:flex;flex-direction:column;min-height:0}.stitch-side-header{padding:12px 16px;border-bottom:1px solid #e2e8f0;background:#fff;display:flex;align-items:center;justify-content:space-between}.stitch-side-header h3{display:flex;align-items:center;gap:6px;font-size:11px;font-weight:700;text-transform:uppercase;color:#64748b}.stitch-side-actions button{border:none;background:transparent;color:#94a3b8;cursor:pointer}.stitch-side-scroll{flex:1;overflow-y:auto}.stitch-unknown{padding:20px;text-align:center;border-bottom:1px solid #e2e8f0;background:#fff7ed80}.stitch-unknown h4{margin:6px 0 0;font-size:12px;font-weight:700;color:#1e293b}.stitch-unknown p{font-size:11px;color:#64748b;margin:8px auto 0;max-width:280px;line-height:1.5}.unknown-icon{width:42px;height:42px;border-radius:999px;background:#ffedd5;color:#f97316;display:inline-flex;align-items:center;justify-content:center;margin:0 auto 8px}.unknown-actions{display:flex;justify-content:center;gap:8px;margin-top:12px}.unknown-actions .ghost{border:1px solid #e2e8f0;background:#fff;border-radius:8px;padding:6px 10px;font-size:11px;font-weight:700}.unknown-actions .primary{border:none;background:#2563eb;color:#fff;border-radius:8px;padding:6px 10px;font-size:11px;font-weight:700;display:inline-flex;align-items:center;gap:4px}.stitch-hex{padding:16px;border-bottom:1px solid #e2e8f0;background:#fff}.stitch-tree{padding:16px}.stitch-metrics{padding:16px;background:#f1f5f9;border-top:1px solid #e2e8f0;margin-top:auto}.stitch-metrics .metrics-title{font-size:10px;font-weight:700;text-transform:uppercase;color:#94a3b8;margin-bottom:10px}.stitch-footer{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:10px 14px;background:#f8fafc;border-top:1px solid #e2e8f0}.stitch-footer .footer-left{display:flex;align-items:center;gap:16px;font-size:11px;color:#64748b}.stitch-footer .footer-right{display:flex;align-items:center;gap:10px}.stitch-footer .pager{display:inline-flex;align-items:center;gap:4px;border:1px solid #e2e8f0;background:#fff;padding:4px;border-radius:10px}.stitch-footer .pager-btn{border:none;background:transparent;cursor:pointer;padding:4px;color:#64748b}.stitch-footer .pager-info{font-size:11px;font-weight:700;color:#475569;padding:0 6px}.packet-timeline{position:relative;height:8px;background:#e2e8f0}.packet-heatmap{height:100%;background:linear-gradient(to right,#10b981 0% 15%,#ef4444 15% 17%,#10b981 17% 45%,#ef4444 45% 46%,#10b981 46% 80%,#f59e0b 80% 82%,#10b981 82% 100%);opacity:.85}.packet-window{position:absolute;top:0;bottom:0;left:20%;width:12%;background:#fff6;border-left:1px solid rgba(255,255,255,.8);border-right:1px solid rgba(255,255,255,.8)}.packet-body{display:grid;grid-template-columns:minmax(0,1fr) 520px;background:#f8fafc;height:calc(95vh - 72px);min-height:0}.packet-body-tight{border-top:1px solid #e2e8f0}.packet-table{display:flex;flex-direction:column;min-width:0;border-right:1px solid #e2e8f0;background:#fff;min-height:0}.packet-toolbar{display:flex;align-items:center;justify-content:space-between;padding:10px 16px;border-bottom:1px solid #e2e8f0;background:#f8fafc;font-size:11px;color:#64748b}.packet-toolbar.secondary{background:#fff}.packet-toggle{display:inline-flex;background:#f1f5f9;border:1px solid #e2e8f0;border-radius:999px;padding:2px;gap:4px}.packet-toggle button{border:none;background:transparent;font-size:10px;font-weight:700;padding:4px 10px;border-radius:999px;color:#64748b;cursor:pointer}.packet-toggle button.active{background:#0f172a;color:#fff}.packet-table-wrap{flex:1;overflow:auto}.packet-table table{width:100%;border-collapse:collapse;font-size:12px}.packet-table thead th{position:sticky;top:0;z-index:5;background:#f8fafc;text-transform:none;letter-spacing:.02em;font-size:11px;color:#64748b;border-bottom:1px solid #e2e8f0;padding:10px 12px}.packet-table tbody tr{border-bottom:1px solid #f1f5f9;cursor:pointer}.packet-table tbody tr:hover{background:#f1f5f9}.packet-table tbody tr.active{background:#3b82f614;border-left:2px solid #2563eb}.packet-table td{padding:10px 12px;color:#475569}.packet-table-clean tbody tr.warn{background:#fff7ed}.packet-table-clean tbody tr.warn:hover{background:#ffedd5}.dir-icon{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:999px;font-weight:700;font-size:12px}.dir-icon.rx{background:#dcfce7;color:#16a34a}.dir-icon.tx{background:#dbeafe;color:#2563eb}.proto-pill{display:inline-flex;align-items:center;gap:6px;padding:3px 10px;border-radius:999px;font-size:10px;font-weight:700;border:1px solid #dbeafe;background:#eff6ff;color:#2563eb}.proto-pill.red{border-color:#fed7aa;background:#fff7ed;color:#ea580c}.packet-footer{display:flex;justify-content:space-between;align-items:center;gap:16px;padding:10px 14px;border-top:1px solid #e2e8f0;background:#f8fafc}.packet-footer-left{display:flex;align-items:center;gap:16px;font-size:11px;color:#64748b}.packet-progress{display:inline-flex;align-items:center;gap:8px}.packet-progress .progress-bar{width:160px;height:8px;background:#e2e8f0;border-radius:999px;overflow:hidden}.packet-progress .progress-bar span{display:block;width:85%;height:100%;background:#f59e0b}.packet-footer-right{display:inline-flex;align-items:center;gap:8px}.pager-btn{border:1px solid #e2e8f0;background:#fff;border-radius:8px;padding:4px 8px;font-size:11px;color:#475569;cursor:pointer}.pager-info{font-size:11px;color:#475569;padding:0 6px}.export-btn{display:inline-flex;align-items:center;gap:6px;border:1px solid #e2e8f0;background:#fff;border-radius:10px;padding:6px 10px;font-size:11px;font-weight:600;color:#475569;cursor:pointer}.export-btn .material-symbols-outlined{font-size:16px}.col-index{width:60px;font-family:JetBrains Mono,monospace;color:#94a3b8}.col-time{width:120px;font-family:JetBrains Mono,monospace;color:#64748b}.col-dir{width:70px;text-align:center}.col-proto{width:120px;font-weight:600;color:#2563eb}.col-key{width:160px;font-weight:600;color:#0f172a}.col-len{width:80px}.col-raw{max-width:220px;font-family:JetBrains Mono,monospace;color:#64748b}.col-summary{font-style:italic;color:#2563eb}.dir-chip{display:inline-flex;align-items:center;justify-content:center;padding:2px 8px;border-radius:999px;font-size:10px;font-weight:700}.dir-chip.rx{background:#10b9811a;color:#10b981}.dir-chip.tx{background:#3b82f61a;color:#3b82f6}.packet-side{background:#f1f5f9;padding:16px;display:flex;flex-direction:column;gap:16px;min-height:0;overflow:auto}.packet-side-header{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;background:#fff;border:1px solid #e2e8f0;border-radius:12px}.packet-side-title{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:700;color:#2563eb}.packet-side-header h3{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:#64748b}.packet-side-actions button{border:none;background:transparent;color:#94a3b8;cursor:pointer}.packet-side-section{background:#fff;border:1px solid #e2e8f0;border-radius:14px;padding:14px;color:#475569}.packet-side-section h4{font-size:12px;font-weight:700;margin-bottom:8px;color:#0f172a}.packet-side-section p{font-size:11px;color:#64748b}.packet-metrics{display:grid;gap:10px}.metric-card{border:1px solid #e2e8f0;background:#fff;border-radius:12px;padding:10px 12px;display:flex;flex-direction:column;gap:6px;font-size:11px;color:#64748b}.metric-card strong{color:#16a34a;font-size:14px}.packet-side-section.highlight{background:#fff7ed;border-color:#fed7aa;text-align:center}.highlight-icon{width:42px;height:42px;border-radius:999px;background:#ffedd5;color:#f97316;display:inline-flex;align-items:center;justify-content:center;margin:0 auto 8px}.highlight-actions{display:flex;justify-content:center;gap:8px;margin-top:12px}.highlight-actions .ghost{background:#fff;border:1px solid #e2e8f0;border-radius:10px;padding:6px 10px;font-size:11px}.highlight-actions .primary{background:#2563eb;color:#fff;border:none;border-radius:10px;padding:6px 10px;font-size:11px;display:inline-flex;align-items:center;gap:6px}.section-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}.section-header h4{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:#94a3b8}.section-header .badge{font-size:10px;background:#e2e8f0;color:#475569;padding:2px 6px;border-radius:6px}.hex-dump{display:flex;border:1px solid #e2e8f0;border-radius:10px;overflow:hidden}.hex-index{width:50px;background:#f8fafc;border-right:1px solid #e2e8f0;font-size:10px;color:#94a3b8;text-align:right;padding:6px;line-height:18px}.hex-grid{flex:1;display:grid;grid-template-columns:repeat(8,minmax(0,1fr));gap:4px;padding:6px;font-family:JetBrains Mono,monospace;font-size:11px}.hex-ascii{width:70px;background:#f8fafc;border-left:1px solid #e2e8f0;font-size:10px;color:#94a3b8;padding:6px;line-height:18px}.hex-cell{padding:2px 4px;border-radius:6px;text-align:center;font-weight:600}.hex-cell.primary{background:#dbeafe;color:#2563eb}.hex-cell.success{background:#dcfce7;color:#16a34a}.hex-cell.warn{background:#fef3c7;color:#d97706}.hex-cell.muted{background:#f1f5f9;color:#94a3b8}.hex-cell.placeholder{color:#cbd5f5}.packet-tree{display:flex;flex-direction:column;gap:8px;font-size:11px}.tree-item{padding:6px 8px;border-radius:8px;background:#f8fafc;color:#475569}.tree-item.active{background:#3b82f61a;border-left:2px solid #2563eb;color:#1d4ed8}.tree-branch{border-left:1px solid #e2e8f0;padding-left:8px}.tree-detail{display:grid;gap:6px;margin-top:8px}.tree-detail span{color:#94a3b8;font-size:10px}.tree-detail strong{color:#0f172a;font-weight:600}.hover\:border-blue-500:hover{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.hover\:bg-blue-50:hover{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-700:hover{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.hover\:bg-emerald-700:hover{--tw-bg-opacity: 1;background-color:rgb(4 120 87 / var(--tw-bg-opacity, 1))}.hover\:bg-rose-100:hover{--tw-bg-opacity: 1;background-color:rgb(255 228 230 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-100:hover{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-200:hover{--tw-bg-opacity: 1;background-color:rgb(226 232 240 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-300:hover{--tw-bg-opacity: 1;background-color:rgb(203 213 225 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-50:hover{--tw-bg-opacity: 1;background-color:rgb(248 250 252 / var(--tw-bg-opacity, 1))}.hover\:text-slate-600:hover{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.hover\:text-slate-700:hover{--tw-text-opacity: 1;color:rgb(51 65 85 / var(--tw-text-opacity, 1))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:ring-2:hover{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.hover\:ring-primary\/50:hover{--tw-ring-color: rgb(36 99 235 / .5)}.focus\:border-primary:focus{--tw-border-opacity: 1;border-color:rgb(36 99 235 / var(--tw-border-opacity, 1))}.focus\:ring-0:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-4:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-primary\/10:focus{--tw-ring-color: rgb(36 99 235 / .1)}.focus\:ring-primary\/20:focus{--tw-ring-color: rgb(36 99 235 / .2)}.group[open] .group-open\:rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:flex{display:flex}.group:hover .group-hover\:text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:opacity-100{opacity:1}@media(min-width:768px){.md\:h-\[96vh\]{height:96vh}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:rounded-xl{border-radius:.75rem}}@media(min-width:1024px){.lg\:col-span-5{grid-column:span 5 / span 5}.lg\:col-span-7{grid-column:span 7 / span 7}.lg\:w-96{width:24rem}} diff --git a/ui/assets/web/assets/index-Dc1DYgSA.js b/ui/assets/web/assets/index-Dc1DYgSA.js new file mode 100644 index 0000000..5a1e16d --- /dev/null +++ b/ui/assets/web/assets/index-Dc1DYgSA.js @@ -0,0 +1,42 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./ManualView-CkxwU3vG.js","./DropdownSelect-C0USmkt8.js","./LogStream-DjhqBYTz.js","./ScriptsView-CW4YNIup.js","./ChannelDialogModal-CkCBEJ0r.js","./SettingsPanels-EL5jW2Q-.js","./index-CWdEPjyK.js","./index-DocLX96z.js","./index-1CbRHFUW.js","./index-CkqoOxGF.js","./index-CQY7N6SN.js","./index-B9CtIV-P.js"])))=>i.map(i=>d[i]); +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))r(s);new MutationObserver(s=>{for(const a of s)if(a.type==="childList")for(const i of a.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function n(s){const a={};return s.integrity&&(a.integrity=s.integrity),s.referrerPolicy&&(a.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?a.credentials="include":s.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function r(s){if(s.ep)return;s.ep=!0;const a=n(s);fetch(s.href,a)}})();function ra(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const pe={},Sn=[],gt=()=>{},ao=()=>!1,Gr=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),sa=e=>e.startsWith("onUpdate:"),Ne=Object.assign,aa=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Iu=Object.prototype.hasOwnProperty,he=(e,t)=>Iu.call(e,t),Z=Array.isArray,Tn=e=>or(e)==="[object Map]",Qr=e=>or(e)==="[object Set]",oi=e=>or(e)==="[object Date]",J=e=>typeof e=="function",Se=e=>typeof e=="string",rt=e=>typeof e=="symbol",me=e=>e!==null&&typeof e=="object",io=e=>(me(e)||J(e))&&J(e.then)&&J(e.catch),oo=Object.prototype.toString,or=e=>oo.call(e),Ru=e=>or(e).slice(8,-1),lo=e=>or(e)==="[object Object]",Jr=e=>Se(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,jn=ra(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Xr=e=>{const t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},Lu=/-\w/g,Kt=Xr(e=>e.replace(Lu,t=>t.slice(1).toUpperCase())),Mu=/\B([A-Z])/g,gn=Xr(e=>e.replace(Mu,"-$1").toLowerCase()),co=Xr(e=>e.charAt(0).toUpperCase()+e.slice(1)),ks=Xr(e=>e?`on${co(e)}`:""),Ht=(e,t)=>!Object.is(e,t),xr=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},ia=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let li;const es=()=>li||(li=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function oa(e){if(Z(e)){const t={};for(let n=0;n{if(n){const r=n.split(Nu);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function sn(e){let t="";if(Se(e))t=e;else if(Z(e))for(let n=0;nts(n,t))}const go=e=>!!(e&&e.__v_isRef===!0),bn=e=>Se(e)?e:e==null?"":Z(e)||me(e)&&(e.toString===oo||!J(e.toString))?go(e)?bn(e.value):JSON.stringify(e,po,2):String(e),po=(e,t)=>go(t)?po(e,t.value):Tn(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,s],a)=>(n[ws(r,a)+" =>"]=s,n),{})}:Qr(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>ws(n))}:rt(t)?ws(t):me(t)&&!Z(t)&&!lo(t)?String(t):t,ws=(e,t="")=>{var n;return rt(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};let Re;class mo{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=Re,!t&&Re&&(this.index=(Re.scopes||(Re.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&&(Re=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,r;for(n=0,r=this.effects.length;n0)return;if($n){let t=$n;for($n=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Vn;){let t=Vn;for(Vn=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(r){e||(e=r)}t=n}}if(e)throw e}function ko(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function wo(e){let t,n=e.depsTail,r=n;for(;r;){const s=r.prevDep;r.version===-1?(r===n&&(n=s),ua(r),Vu(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=s}e.deps=t,e.depsTail=n}function Os(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(So(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function So(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Qn)||(e.globalVersion=Qn,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Os(e))))return;e.flags|=2;const t=e.dep,n=ve,r=nt;ve=e,nt=!0;try{ko(e);const s=e.fn(e._value);(t.version===0||Ht(s,e._value))&&(e.flags|=128,e._value=s,t.version++)}catch(s){throw t.version++,s}finally{ve=n,nt=r,wo(e),e.flags&=-3}}function ua(e,t=!1){const{dep:n,prevSub:r,nextSub:s}=e;if(r&&(r.nextSub=s,e.prevSub=void 0),s&&(s.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let a=n.computed.deps;a;a=a.nextDep)ua(a,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Vu(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let nt=!0;const To=[];function Rt(){To.push(nt),nt=!1}function Lt(){const e=To.pop();nt=e===void 0?!0:e}function ci(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=ve;ve=void 0;try{t()}finally{ve=n}}}let Qn=0;class $u{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 da{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(!ve||!nt||ve===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==ve)n=this.activeLink=new $u(ve,this),ve.deps?(n.prevDep=ve.depsTail,ve.depsTail.nextDep=n,ve.depsTail=n):ve.deps=ve.depsTail=n,xo(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const r=n.nextDep;r.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=r),n.prevDep=ve.depsTail,n.nextDep=void 0,ve.depsTail.nextDep=n,ve.depsTail=n,ve.deps===n&&(ve.deps=r)}return n}trigger(t){this.version++,Qn++,this.notify(t)}notify(t){la();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{ca()}}}function xo(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let r=t.deps;r;r=r.nextDep)xo(r)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const Ir=new WeakMap,ln=Symbol(""),zs=Symbol(""),Jn=Symbol("");function Le(e,t,n){if(nt&&ve){let r=Ir.get(e);r||Ir.set(e,r=new Map);let s=r.get(n);s||(r.set(n,s=new da),s.map=r,s.key=n),s.track()}}function xt(e,t,n,r,s,a){const i=Ir.get(e);if(!i){Qn++;return}const o=l=>{l&&l.trigger()};if(la(),t==="clear")i.forEach(o);else{const l=Z(e),u=l&&Jr(n);if(l&&n==="length"){const c=Number(r);i.forEach((h,y)=>{(y==="length"||y===Jn||!rt(y)&&y>=c)&&o(h)})}else switch((n!==void 0||i.has(void 0))&&o(i.get(n)),u&&o(i.get(Jn)),t){case"add":l?u&&o(i.get("length")):(o(i.get(ln)),Tn(e)&&o(i.get(zs)));break;case"delete":l||(o(i.get(ln)),Tn(e)&&o(i.get(zs)));break;case"set":Tn(e)&&o(i.get(ln));break}}ca()}function Wu(e,t){const n=Ir.get(e);return n&&n.get(t)}function vn(e){const t=ue(e);return t===e?t:(Le(t,"iterate",Jn),Qe(e)?t:t.map(st))}function ns(e){return Le(e=ue(e),"iterate",Jn),e}function jt(e,t){return Mt(e)?Et(e)?En(st(t)):En(t):st(t)}const Hu={__proto__:null,[Symbol.iterator](){return Ts(this,Symbol.iterator,e=>jt(this,e))},concat(...e){return vn(this).concat(...e.map(t=>Z(t)?vn(t):t))},entries(){return Ts(this,"entries",e=>(e[1]=jt(this,e[1]),e))},every(e,t){return kt(this,"every",e,t,void 0,arguments)},filter(e,t){return kt(this,"filter",e,t,n=>n.map(r=>jt(this,r)),arguments)},find(e,t){return kt(this,"find",e,t,n=>jt(this,n),arguments)},findIndex(e,t){return kt(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return kt(this,"findLast",e,t,n=>jt(this,n),arguments)},findLastIndex(e,t){return kt(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return kt(this,"forEach",e,t,void 0,arguments)},includes(...e){return xs(this,"includes",e)},indexOf(...e){return xs(this,"indexOf",e)},join(e){return vn(this).join(e)},lastIndexOf(...e){return xs(this,"lastIndexOf",e)},map(e,t){return kt(this,"map",e,t,void 0,arguments)},pop(){return On(this,"pop")},push(...e){return On(this,"push",e)},reduce(e,...t){return ui(this,"reduce",e,t)},reduceRight(e,...t){return ui(this,"reduceRight",e,t)},shift(){return On(this,"shift")},some(e,t){return kt(this,"some",e,t,void 0,arguments)},splice(...e){return On(this,"splice",e)},toReversed(){return vn(this).toReversed()},toSorted(e){return vn(this).toSorted(e)},toSpliced(...e){return vn(this).toSpliced(...e)},unshift(...e){return On(this,"unshift",e)},values(){return Ts(this,"values",e=>jt(this,e))}};function Ts(e,t,n){const r=ns(e),s=r[t]();return r!==e&&!Qe(e)&&(s._next=s.next,s.next=()=>{const a=s._next();return a.done||(a.value=n(a.value)),a}),s}const Ku=Array.prototype;function kt(e,t,n,r,s,a){const i=ns(e),o=i!==e&&!Qe(e),l=i[t];if(l!==Ku[t]){const h=l.apply(e,a);return o?st(h):h}let u=n;i!==e&&(o?u=function(h,y){return n.call(this,jt(e,h),y,e)}:n.length>2&&(u=function(h,y){return n.call(this,h,y,e)}));const c=l.call(i,u,r);return o&&s?s(c):c}function ui(e,t,n,r){const s=ns(e);let a=n;return s!==e&&(Qe(e)?n.length>3&&(a=function(i,o,l){return n.call(this,i,o,l,e)}):a=function(i,o,l){return n.call(this,i,jt(e,o),l,e)}),s[t](a,...r)}function xs(e,t,n){const r=ue(e);Le(r,"iterate",Jn);const s=r[t](...n);return(s===-1||s===!1)&&ss(n[0])?(n[0]=ue(n[0]),r[t](...n)):s}function On(e,t,n=[]){Rt(),la();const r=ue(e)[t].apply(e,n);return ca(),Lt(),r}const Zu=ra("__proto__,__v_isRef,__isVue"),Po=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(rt));function qu(e){rt(e)||(e=String(e));const t=ue(this);return Le(t,"has",e),t.hasOwnProperty(e)}class Ao{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){if(n==="__v_skip")return t.__v_skip;const s=this._isReadonly,a=this._isShallow;if(n==="__v_isReactive")return!s;if(n==="__v_isReadonly")return s;if(n==="__v_isShallow")return a;if(n==="__v_raw")return r===(s?a?sd:Lo:a?Ro:Io).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const i=Z(t);if(!s){let l;if(i&&(l=Hu[n]))return l;if(n==="hasOwnProperty")return qu}const o=Reflect.get(t,n,we(t)?t:r);if((rt(n)?Po.has(n):Zu(n))||(s||Le(t,"get",n),a))return o;if(we(o)){const l=i&&Jr(n)?o:o.value;return s&&me(l)?Fs(l):l}return me(o)?s?Fs(o):rs(o):o}}class Eo extends Ao{constructor(t=!1){super(!1,t)}set(t,n,r,s){let a=t[n];const i=Z(t)&&Jr(n);if(!this._isShallow){const u=Mt(a);if(!Qe(r)&&!Mt(r)&&(a=ue(a),r=ue(r)),!i&&we(a)&&!we(r))return u||(a.value=r),!0}const o=i?Number(n)e,Cr=e=>Reflect.getPrototypeOf(e);function Xu(e,t,n){return function(...r){const s=this.__v_raw,a=ue(s),i=Tn(a),o=e==="entries"||e===Symbol.iterator&&i,l=e==="keys"&&i,u=s[e](...r),c=n?Us:t?En:st;return!t&&Le(a,"iterate",l?zs:ln),{next(){const{value:h,done:y}=u.next();return y?{value:h,done:y}:{value:o?[c(h[0]),c(h[1])]:c(h),done:y}},[Symbol.iterator](){return this}}}}function kr(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function ed(e,t){const n={get(s){const a=this.__v_raw,i=ue(a),o=ue(s);e||(Ht(s,o)&&Le(i,"get",s),Le(i,"get",o));const{has:l}=Cr(i),u=t?Us:e?En:st;if(l.call(i,s))return u(a.get(s));if(l.call(i,o))return u(a.get(o));a!==i&&a.get(s)},get size(){const s=this.__v_raw;return!e&&Le(ue(s),"iterate",ln),s.size},has(s){const a=this.__v_raw,i=ue(a),o=ue(s);return e||(Ht(s,o)&&Le(i,"has",s),Le(i,"has",o)),s===o?a.has(s):a.has(s)||a.has(o)},forEach(s,a){const i=this,o=i.__v_raw,l=ue(o),u=t?Us:e?En:st;return!e&&Le(l,"iterate",ln),o.forEach((c,h)=>s.call(a,u(c),u(h),i))}};return Ne(n,e?{add:kr("add"),set:kr("set"),delete:kr("delete"),clear:kr("clear")}:{add(s){!t&&!Qe(s)&&!Mt(s)&&(s=ue(s));const a=ue(this);return Cr(a).has.call(a,s)||(a.add(s),xt(a,"add",s,s)),this},set(s,a){!t&&!Qe(a)&&!Mt(a)&&(a=ue(a));const i=ue(this),{has:o,get:l}=Cr(i);let u=o.call(i,s);u||(s=ue(s),u=o.call(i,s));const c=l.call(i,s);return i.set(s,a),u?Ht(a,c)&&xt(i,"set",s,a):xt(i,"add",s,a),this},delete(s){const a=ue(this),{has:i,get:o}=Cr(a);let l=i.call(a,s);l||(s=ue(s),l=i.call(a,s)),o&&o.call(a,s);const u=a.delete(s);return l&&xt(a,"delete",s,void 0),u},clear(){const s=ue(this),a=s.size!==0,i=s.clear();return a&&xt(s,"clear",void 0,void 0),i}}),["keys","values","entries",Symbol.iterator].forEach(s=>{n[s]=Xu(s,e,t)}),n}function fa(e,t){const n=ed(e,t);return(r,s,a)=>s==="__v_isReactive"?!e:s==="__v_isReadonly"?e:s==="__v_raw"?r:Reflect.get(he(n,s)&&s in r?n:r,s,a)}const td={get:fa(!1,!1)},nd={get:fa(!1,!0)},rd={get:fa(!0,!1)};const Io=new WeakMap,Ro=new WeakMap,Lo=new WeakMap,sd=new WeakMap;function ad(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function id(e){return e.__v_skip||!Object.isExtensible(e)?0:ad(Ru(e))}function rs(e){return Mt(e)?e:ha(e,!1,Gu,td,Io)}function od(e){return ha(e,!1,Ju,nd,Ro)}function Fs(e){return ha(e,!0,Qu,rd,Lo)}function ha(e,t,n,r,s){if(!me(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const a=id(e);if(a===0)return e;const i=s.get(e);if(i)return i;const o=new Proxy(e,a===2?r:n);return s.set(e,o),o}function Et(e){return Mt(e)?Et(e.__v_raw):!!(e&&e.__v_isReactive)}function Mt(e){return!!(e&&e.__v_isReadonly)}function Qe(e){return!!(e&&e.__v_isShallow)}function ss(e){return e?!!e.__v_raw:!1}function ue(e){const t=e&&e.__v_raw;return t?ue(t):e}function ga(e){return!he(e,"__v_skip")&&Object.isExtensible(e)&&uo(e,"__v_skip",!0),e}const st=e=>me(e)?rs(e):e,En=e=>me(e)?Fs(e):e;function we(e){return e?e.__v_isRef===!0:!1}function w(e){return ld(e,!1)}function ld(e,t){return we(e)?e:new cd(e,t)}class cd{constructor(t,n){this.dep=new da,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:ue(t),this._value=n?t:st(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,r=this.__v_isShallow||Qe(t)||Mt(t);t=r?t:ue(t),Ht(t,n)&&(this._rawValue=t,this._value=r?t:st(t),this.dep.trigger())}}function F(e){return we(e)?e.value:e}const ud={get:(e,t,n)=>t==="__v_raw"?e:F(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const s=e[t];return we(s)&&!we(n)?(s.value=n,!0):Reflect.set(e,t,n,r)}};function Mo(e){return Et(e)?e:new Proxy(e,ud)}function dd(e){const t=Z(e)?new Array(e.length):{};for(const n in e)t[n]=hd(e,n);return t}class fd{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0,this._value=void 0,this._raw=ue(t);let s=!0,a=t;if(!Z(t)||!Jr(String(n)))do s=!ss(a)||Qe(a);while(s&&(a=a.__v_raw));this._shallow=s}get value(){let t=this._object[this._key];return this._shallow&&(t=F(t)),this._value=t===void 0?this._defaultValue:t}set value(t){if(this._shallow&&we(this._raw[this._key])){const n=this._object[this._key];if(we(n)){n.value=t;return}}this._object[this._key]=t}get dep(){return Wu(this._raw,this._key)}}function hd(e,t,n){return new fd(e,t,n)}class gd{constructor(t,n,r){this.fn=t,this.setter=n,this._value=void 0,this.dep=new da(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Qn-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=r}notify(){if(this.flags|=16,!(this.flags&8)&&ve!==this)return Co(this,!0),!0}get value(){const t=this.dep.track();return So(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function pd(e,t,n=!1){let r,s;return J(e)?r=e:(r=e.get,s=e.set),new gd(r,s,n)}const wr={},Rr=new WeakMap;let nn;function md(e,t=!1,n=nn){if(n){let r=Rr.get(n);r||Rr.set(n,r=[]),r.push(e)}}function vd(e,t,n=pe){const{immediate:r,deep:s,once:a,scheduler:i,augmentJob:o,call:l}=n,u=N=>s?N:Qe(N)||s===!1||s===0?Pt(N,1):Pt(N);let c,h,y,m,T=!1,v=!1;if(we(e)?(h=()=>e.value,T=Qe(e)):Et(e)?(h=()=>u(e),T=!0):Z(e)?(v=!0,T=e.some(N=>Et(N)||Qe(N)),h=()=>e.map(N=>{if(we(N))return N.value;if(Et(N))return u(N);if(J(N))return l?l(N,2):N()})):J(e)?t?h=l?()=>l(e,2):e:h=()=>{if(y){Rt();try{y()}finally{Lt()}}const N=nn;nn=c;try{return l?l(e,3,[m]):e(m)}finally{nn=N}}:h=gt,t&&s){const N=h,Q=s===!0?1/0:s;h=()=>Pt(N(),Q)}const O=yo(),E=()=>{c.stop(),O&&O.active&&aa(O.effects,c)};if(a&&t){const N=t;t=(...Q)=>{N(...Q),E()}}let V=v?new Array(e.length).fill(wr):wr;const K=N=>{if(!(!(c.flags&1)||!c.dirty&&!N))if(t){const Q=c.run();if(s||T||(v?Q.some((W,oe)=>Ht(W,V[oe])):Ht(Q,V))){y&&y();const W=nn;nn=c;try{const oe=[Q,V===wr?void 0:v&&V[0]===wr?[]:V,m];V=Q,l?l(t,3,oe):t(...oe)}finally{nn=W}}}else c.run()};return o&&o(K),c=new bo(h),c.scheduler=i?()=>i(K,!1):K,m=N=>md(N,!1,c),y=c.onStop=()=>{const N=Rr.get(c);if(N){if(l)l(N,4);else for(const Q of N)Q();Rr.delete(c)}},t?r?K(!0):V=c.run():i?i(K.bind(null,!0),!0):c.run(),E.pause=c.pause.bind(c),E.resume=c.resume.bind(c),E.stop=E,E}function Pt(e,t=1/0,n){if(t<=0||!me(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,we(e))Pt(e.value,t,n);else if(Z(e))for(let r=0;r{Pt(r,t,n)});else if(lo(e)){for(const r in e)Pt(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&Pt(e[r],t,n)}return e}function lr(e,t,n,r){try{return r?e(...r):e()}catch(s){cr(s,t,n)}}function mt(e,t,n,r){if(J(e)){const s=lr(e,t,n,r);return s&&io(s)&&s.catch(a=>{cr(a,t,n)}),s}if(Z(e)){const s=[];for(let a=0;a>>1,s=Be[r],a=Xn(s);a=Xn(n)?Be.push(e):Be.splice(bd(t),0,e),e.flags|=1,No()}}function No(){Lr||(Lr=Do.then(zo))}function _d(e){Z(e)?xn.push(...e):Vt&&e.id===-1?Vt.splice(_n+1,0,e):e.flags&1||(xn.push(e),e.flags|=1),No()}function di(e,t,n=dt+1){for(;nXn(n)-Xn(r));if(xn.length=0,Vt){Vt.push(...t);return}for(Vt=t,_n=0;_ne.id==null?e.flags&2?-1:1/0:e.id;function zo(e){try{for(dt=0;dt{r._d&&Or(-1);const a=Mr(t);let i;try{i=e(...s)}finally{Mr(a),r._d&&Or(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function lp(e,t){if(De===null)return e;const n=ls(De),r=e.dirs||(e.dirs=[]);for(let s=0;s1)return n&&J(t)?t.call(r&&r.proxy):t}}function kd(){return!!(fl()||cn)}const wd=Symbol.for("v-scx"),Sd=()=>Hn(wd);function tt(e,t,n){return Fo(e,t,n)}function Fo(e,t,n=pe){const{immediate:r,deep:s,flush:a,once:i}=n,o=Ne({},n),l=t&&r||!t&&a!=="post";let u;if(Rn){if(a==="sync"){const m=Sd();u=m.__watcherHandles||(m.__watcherHandles=[])}else if(!l){const m=()=>{};return m.stop=gt,m.resume=gt,m.pause=gt,m}}const c=Me;o.call=(m,T,v)=>mt(m,c,T,v);let h=!1;a==="post"?o.scheduler=m=>{Fe(m,c&&c.suspense)}:a!=="sync"&&(h=!0,o.scheduler=(m,T)=>{T?m():pa(m)}),o.augmentJob=m=>{t&&(m.flags|=4),h&&(m.flags|=2,c&&(m.id=c.uid,m.i=c))};const y=vd(e,t,o);return Rn&&(u?u.push(y):l&&y()),y}function Td(e,t,n){const r=this.proxy,s=Se(e)?e.includes(".")?Bo(r,e):()=>r[e]:e.bind(r,r);let a;J(t)?a=t:(a=t.handler,n=t);const i=ur(this),o=Fo(s,a.bind(r),n);return i(),o}function Bo(e,t){const n=t.split(".");return()=>{let r=e;for(let s=0;se.__isTeleport,Kn=e=>e&&(e.disabled||e.disabled===""),fi=e=>e&&(e.defer||e.defer===""),hi=e=>typeof SVGElement<"u"&&e instanceof SVGElement,gi=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,Bs=(e,t)=>{const n=e&&e.to;return Se(n)?t?t(n):null:n},Vo={name:"Teleport",__isTeleport:!0,process(e,t,n,r,s,a,i,o,l,u){const{mc:c,pc:h,pbc:y,o:{insert:m,querySelector:T,createText:v,createComment:O}}=u,E=Kn(t.props);let{shapeFlag:V,children:K,dynamicChildren:N}=t;if(e==null){const Q=t.el=v(""),W=t.anchor=v("");m(Q,n,r),m(W,n,r);const oe=(B,re)=>{V&16&&c(K,B,re,s,a,i,o,l)},z=()=>{const B=t.target=Bs(t.props,T),re=$o(B,t,v,m);B&&(i!=="svg"&&hi(B)?i="svg":i!=="mathml"&&gi(B)&&(i="mathml"),s&&s.isCE&&(s.ce._teleportTargets||(s.ce._teleportTargets=new Set)).add(B),E||(oe(B,re),Pr(t,!1)))};E&&(oe(n,W),Pr(t,!0)),fi(t.props)?(t.el.__isMounted=!1,Fe(()=>{z(),delete t.el.__isMounted},a)):z()}else{if(fi(t.props)&&e.el.__isMounted===!1){Fe(()=>{Vo.process(e,t,n,r,s,a,i,o,l,u)},a);return}t.el=e.el,t.targetStart=e.targetStart;const Q=t.anchor=e.anchor,W=t.target=e.target,oe=t.targetAnchor=e.targetAnchor,z=Kn(e.props),B=z?n:W,re=z?Q:oe;if(i==="svg"||hi(W)?i="svg":(i==="mathml"||gi(W))&&(i="mathml"),N?(y(e.dynamicChildren,N,B,s,a,i,o),Ca(e,t,!0)):l||h(e,t,B,re,s,a,i,o,!1),E)z?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):Sr(t,n,Q,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const H=t.target=Bs(t.props,T);H&&Sr(t,H,null,u,0)}else z&&Sr(t,W,oe,u,1);Pr(t,E)}},remove(e,t,n,{um:r,o:{remove:s}},a){const{shapeFlag:i,children:o,anchor:l,targetStart:u,targetAnchor:c,target:h,props:y}=e;if(h&&(s(u),s(c)),a&&s(l),i&16){const m=a||!Kn(y);for(let T=0;TZn(T,t&&(Z(t)?t[v]:t),n,r,s));return}if(Pn(r)&&!s){r.shapeFlag&512&&r.type.__asyncResolved&&r.component.subTree.component&&Zn(e,t,n,r.component.subTree);return}const a=r.shapeFlag&4?ls(r.component):r.el,i=s?null:a,{i:o,r:l}=e,u=t&&t.r,c=o.refs===pe?o.refs={}:o.refs,h=o.setupState,y=ue(h),m=h===pe?ao:T=>he(y,T);if(u!=null&&u!==l){if(mi(t),Se(u))c[u]=null,m(u)&&(h[u]=null);else if(we(u)){u.value=null;const T=t;T.k&&(c[T.k]=null)}}if(J(l))lr(l,o,12,[i,c]);else{const T=Se(l),v=we(l);if(T||v){const O=()=>{if(e.f){const E=T?m(l)?h[l]:c[l]:l.value;if(s)Z(E)&&aa(E,a);else if(Z(E))E.includes(a)||E.push(a);else if(T)c[l]=[a],m(l)&&(h[l]=c[l]);else{const V=[a];l.value=V,e.k&&(c[e.k]=V)}}else T?(c[l]=i,m(l)&&(h[l]=i)):v&&(l.value=i,e.k&&(c[e.k]=i))};if(i){const E=()=>{O(),Dr.delete(e)};E.id=-1,Dr.set(e,E),Fe(E,n)}else mi(e),O()}}}function mi(e){const t=Dr.get(e);t&&(t.flags|=8,Dr.delete(e))}const vi=e=>e.nodeType===8;es().requestIdleCallback;es().cancelIdleCallback;function Id(e,t){if(vi(e)&&e.data==="["){let n=1,r=e.nextSibling;for(;r;){if(r.nodeType===1){if(t(r)===!1)break}else if(vi(r))if(r.data==="]"){if(--n===0)break}else r.data==="["&&n++;r=r.nextSibling}}else t(e)}const Pn=e=>!!e.type.__asyncLoader;function ct(e){J(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:s=200,hydrate:a,timeout:i,suspensible:o=!0,onError:l}=e;let u=null,c,h=0;const y=()=>(h++,u=null,m()),m=()=>{let T;return u||(T=u=t().catch(v=>{if(v=v instanceof Error?v:new Error(String(v)),l)return new Promise((O,E)=>{l(v,()=>O(y()),()=>E(v),h+1)});throw v}).then(v=>T!==u&&u?u:(v&&(v.__esModule||v[Symbol.toStringTag]==="Module")&&(v=v.default),c=v,v)))};return Ed({name:"AsyncComponentWrapper",__asyncLoader:m,__asyncHydrate(T,v,O){let E=!1;(v.bu||(v.bu=[])).push(()=>E=!0);const V=()=>{E||O()},K=a?()=>{const N=a(V,Q=>Id(T,Q));N&&(v.bum||(v.bum=[])).push(N)}:V;c?K():m().then(()=>!v.isUnmounted&&K())},get __asyncResolved(){return c},setup(){const T=Me;if(va(T),c)return()=>Tr(c,T);const v=K=>{u=null,cr(K,T,13,!r)};if(o&&T.suspense||Rn)return m().then(K=>()=>Tr(K,T)).catch(K=>(v(K),()=>r?ye(r,{error:K}):null));const O=w(!1),E=w(),V=w(!!s);return s&&setTimeout(()=>{V.value=!1},s),i!=null&&setTimeout(()=>{if(!O.value&&!E.value){const K=new Error(`Async component timed out after ${i}ms.`);v(K),E.value=K}},i),m().then(()=>{O.value=!0,T.parent&&ya(T.parent.vnode)&&T.parent.update()}).catch(K=>{v(K),E.value=K}),()=>{if(O.value&&c)return Tr(c,T);if(E.value&&r)return ye(r,{error:E.value});if(n&&!V.value)return Tr(n,T)}}})}function Tr(e,t){const{ref:n,props:r,children:s,ce:a}=t.vnode,i=ye(e,r,s);return i.ref=n,i.ce=a,delete t.vnode.ce,i}const ya=e=>e.type.__isKeepAlive;function Rd(e,t){Wo(e,"a",t)}function Ld(e,t){Wo(e,"da",t)}function Wo(e,t,n=Me){const r=e.__wdc||(e.__wdc=()=>{let s=n;for(;s;){if(s.isDeactivated)return;s=s.parent}return e()});if(as(t,r,n),n){let s=n.parent;for(;s&&s.parent;)ya(s.parent.vnode)&&Md(r,t,n,s),s=s.parent}}function Md(e,t,n,r){const s=as(t,e,r,!0);Zo(()=>{aa(r[t],s)},n)}function as(e,t,n=Me,r=!1){if(n){const s=n[e]||(n[e]=[]),a=t.__weh||(t.__weh=(...i)=>{Rt();const o=ur(n),l=mt(t,n,e,i);return o(),Lt(),l});return r?s.unshift(a):s.push(a),a}}const Ot=e=>(t,n=Me)=>{(!Rn||e==="sp")&&as(e,(...r)=>t(...r),n)},Dd=Ot("bm"),Ho=Ot("m"),Nd=Ot("bu"),Od=Ot("u"),Ko=Ot("bum"),Zo=Ot("um"),zd=Ot("sp"),Ud=Ot("rtg"),Fd=Ot("rtc");function Bd(e,t=Me){as("ec",e,t)}const jd=Symbol.for("v-ndc");function cp(e,t,n,r){let s;const a=n,i=Z(e);if(i||Se(e)){const o=i&&Et(e);let l=!1,u=!1;o&&(l=!Qe(e),u=Mt(e),e=ns(e)),s=new Array(e.length);for(let c=0,h=e.length;ct(o,l,void 0,a));else{const o=Object.keys(e);s=new Array(o.length);for(let l=0,u=o.length;l0;return t!=="default"&&(n.name=t),ft(),an(Ye,null,[ye("slot",n,r)],u?-2:64)}let a=e[t];a&&a._c&&(a._d=!1),ft();const i=a&&qo(a(n)),o=n.key||i&&i.key,l=an(Ye,{key:(o&&!rt(o)?o:`_${t}`)+(!i&&r?"_fb":"")},i||[],i&&e._===1?64:-2);return l.scopeId&&(l.slotScopeIds=[l.scopeId+"-s"]),a&&a._c&&(a._d=!0),l}function qo(e){return e.some(t=>tr(t)?!(t.type===Dt||t.type===Ye&&!qo(t.children)):!0)?e:null}const js=e=>e?hl(e)?ls(e):js(e.parent):null,qn=Ne(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=>js(e.parent),$root:e=>js(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Go(e),$forceUpdate:e=>e.f||(e.f=()=>{pa(e.update)}),$nextTick:e=>e.n||(e.n=Wn.bind(e.proxy)),$watch:e=>Td.bind(e)}),Ps=(e,t)=>e!==pe&&!e.__isScriptSetup&&he(e,t),Vd={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:r,data:s,props:a,accessCache:i,type:o,appContext:l}=e;if(t[0]!=="$"){const y=i[t];if(y!==void 0)switch(y){case 1:return r[t];case 2:return s[t];case 4:return n[t];case 3:return a[t]}else{if(Ps(r,t))return i[t]=1,r[t];if(s!==pe&&he(s,t))return i[t]=2,s[t];if(he(a,t))return i[t]=3,a[t];if(n!==pe&&he(n,t))return i[t]=4,n[t];Vs&&(i[t]=0)}}const u=qn[t];let c,h;if(u)return t==="$attrs"&&Le(e.attrs,"get",""),u(e);if((c=o.__cssModules)&&(c=c[t]))return c;if(n!==pe&&he(n,t))return i[t]=4,n[t];if(h=l.config.globalProperties,he(h,t))return h[t]},set({_:e},t,n){const{data:r,setupState:s,ctx:a}=e;return Ps(s,t)?(s[t]=n,!0):r!==pe&&he(r,t)?(r[t]=n,!0):he(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(a[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:s,props:a,type:i}},o){let l;return!!(n[o]||e!==pe&&o[0]!=="$"&&he(e,o)||Ps(t,o)||he(a,o)||he(r,o)||he(qn,o)||he(s.config.globalProperties,o)||(l=i.__cssModules)&&l[o])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:he(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function yi(e){return Z(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Vs=!0;function $d(e){const t=Go(e),n=e.proxy,r=e.ctx;Vs=!1,t.beforeCreate&&bi(t.beforeCreate,e,"bc");const{data:s,computed:a,methods:i,watch:o,provide:l,inject:u,created:c,beforeMount:h,mounted:y,beforeUpdate:m,updated:T,activated:v,deactivated:O,beforeDestroy:E,beforeUnmount:V,destroyed:K,unmounted:N,render:Q,renderTracked:W,renderTriggered:oe,errorCaptured:z,serverPrefetch:B,expose:re,inheritAttrs:H,components:be,directives:_e,filters:at}=t;if(u&&Wd(u,r,null),i)for(const te in i){const de=i[te];J(de)&&(r[te]=de.bind(n))}if(s){const te=s.call(n,n);me(te)&&(e.data=rs(te))}if(Vs=!0,a)for(const te in a){const de=a[te],et=J(de)?de.bind(n,n):J(de.get)?de.get.bind(n,n):gt,qt=!J(de)&&J(de.set)?de.set.bind(n):gt,it=ge({get:et,set:qt});Object.defineProperty(r,te,{enumerable:!0,configurable:!0,get:()=>it.value,set:Je=>it.value=Je})}if(o)for(const te in o)Yo(o[te],r,n,te);if(l){const te=J(l)?l.call(n):l;Reflect.ownKeys(te).forEach(de=>{Cn(de,te[de])})}c&&bi(c,e,"c");function ae(te,de){Z(de)?de.forEach(et=>te(et.bind(n))):de&&te(de.bind(n))}if(ae(Dd,h),ae(Ho,y),ae(Nd,m),ae(Od,T),ae(Rd,v),ae(Ld,O),ae(Bd,z),ae(Fd,W),ae(Ud,oe),ae(Ko,V),ae(Zo,N),ae(zd,B),Z(re))if(re.length){const te=e.exposed||(e.exposed={});re.forEach(de=>{Object.defineProperty(te,de,{get:()=>n[de],set:et=>n[de]=et,enumerable:!0})})}else e.exposed||(e.exposed={});Q&&e.render===gt&&(e.render=Q),H!=null&&(e.inheritAttrs=H),be&&(e.components=be),_e&&(e.directives=_e),B&&va(e)}function Wd(e,t,n=gt){Z(e)&&(e=$s(e));for(const r in e){const s=e[r];let a;me(s)?"default"in s?a=Hn(s.from||r,s.default,!0):a=Hn(s.from||r):a=Hn(s),we(a)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>a.value,set:i=>a.value=i}):t[r]=a}}function bi(e,t,n){mt(Z(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function Yo(e,t,n,r){let s=r.includes(".")?Bo(n,r):()=>n[r];if(Se(e)){const a=t[e];J(a)&&tt(s,a)}else if(J(e))tt(s,e.bind(n));else if(me(e))if(Z(e))e.forEach(a=>Yo(a,t,n,r));else{const a=J(e.handler)?e.handler.bind(n):t[e.handler];J(a)&&tt(s,a,e)}}function Go(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:s,optionsCache:a,config:{optionMergeStrategies:i}}=e.appContext,o=a.get(t);let l;return o?l=o:!s.length&&!n&&!r?l=t:(l={},s.length&&s.forEach(u=>Nr(l,u,i,!0)),Nr(l,t,i)),me(t)&&a.set(t,l),l}function Nr(e,t,n,r=!1){const{mixins:s,extends:a}=t;a&&Nr(e,a,n,!0),s&&s.forEach(i=>Nr(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const o=Hd[i]||n&&n[i];e[i]=o?o(e[i],t[i]):t[i]}return e}const Hd={data:_i,props:Ci,emits:Ci,methods:Fn,computed:Fn,beforeCreate:Ue,created:Ue,beforeMount:Ue,mounted:Ue,beforeUpdate:Ue,updated:Ue,beforeDestroy:Ue,beforeUnmount:Ue,destroyed:Ue,unmounted:Ue,activated:Ue,deactivated:Ue,errorCaptured:Ue,serverPrefetch:Ue,components:Fn,directives:Fn,watch:Zd,provide:_i,inject:Kd};function _i(e,t){return t?e?function(){return Ne(J(e)?e.call(this,this):e,J(t)?t.call(this,this):t)}:t:e}function Kd(e,t){return Fn($s(e),$s(t))}function $s(e){if(Z(e)){const t={};for(let n=0;nt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Kt(t)}Modifiers`]||e[`${gn(t)}Modifiers`];function Qd(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||pe;let s=n;const a=t.startsWith("update:"),i=a&&Gd(r,t.slice(7));i&&(i.trim&&(s=n.map(c=>Se(c)?c.trim():c)),i.number&&(s=n.map(ia)));let o,l=r[o=ks(t)]||r[o=ks(Kt(t))];!l&&a&&(l=r[o=ks(gn(t))]),l&&mt(l,e,6,s);const u=r[o+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[o])return;e.emitted[o]=!0,mt(u,e,6,s)}}const Jd=new WeakMap;function Jo(e,t,n=!1){const r=n?Jd:t.emitsCache,s=r.get(e);if(s!==void 0)return s;const a=e.emits;let i={},o=!1;if(!J(e)){const l=u=>{const c=Jo(u,t,!0);c&&(o=!0,Ne(i,c))};!n&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!a&&!o?(me(e)&&r.set(e,null),null):(Z(a)?a.forEach(l=>i[l]=null):Ne(i,a),me(e)&&r.set(e,i),i)}function is(e,t){return!e||!Gr(t)?!1:(t=t.slice(2).replace(/Once$/,""),he(e,t[0].toLowerCase()+t.slice(1))||he(e,gn(t))||he(e,t))}function ki(e){const{type:t,vnode:n,proxy:r,withProxy:s,propsOptions:[a],slots:i,attrs:o,emit:l,render:u,renderCache:c,props:h,data:y,setupState:m,ctx:T,inheritAttrs:v}=e,O=Mr(e);let E,V;try{if(n.shapeFlag&4){const N=s||r,Q=N;E=ht(u.call(Q,N,c,h,m,y,T)),V=o}else{const N=t;E=ht(N.length>1?N(h,{attrs:o,slots:i,emit:l}):N(h,null)),V=t.props?o:Xd(o)}}catch(N){Yn.length=0,cr(N,e,1),E=ye(Dt)}let K=E;if(V&&v!==!1){const N=Object.keys(V),{shapeFlag:Q}=K;N.length&&Q&7&&(a&&N.some(sa)&&(V=ef(V,a)),K=In(K,V,!1,!0))}return n.dirs&&(K=In(K,null,!1,!0),K.dirs=K.dirs?K.dirs.concat(n.dirs):n.dirs),n.transition&&ma(K,n.transition),E=K,Mr(O),E}const Xd=e=>{let t;for(const n in e)(n==="class"||n==="style"||Gr(n))&&((t||(t={}))[n]=e[n]);return t},ef=(e,t)=>{const n={};for(const r in e)(!sa(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function tf(e,t,n){const{props:r,children:s,component:a}=e,{props:i,children:o,patchFlag:l}=t,u=a.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&l>=0){if(l&1024)return!0;if(l&16)return r?wi(r,i,u):!!i;if(l&8){const c=t.dynamicProps;for(let h=0;hObject.create(Xo),tl=e=>Object.getPrototypeOf(e)===Xo;function rf(e,t,n,r=!1){const s={},a=el();e.propsDefaults=Object.create(null),nl(e,t,s,a);for(const i in e.propsOptions[0])i in s||(s[i]=void 0);n?e.props=r?s:od(s):e.type.props?e.props=s:e.props=a,e.attrs=a}function sf(e,t,n,r){const{props:s,attrs:a,vnode:{patchFlag:i}}=e,o=ue(s),[l]=e.propsOptions;let u=!1;if((r||i>0)&&!(i&16)){if(i&8){const c=e.vnode.dynamicProps;for(let h=0;h{l=!0;const[y,m]=rl(h,t,!0);Ne(i,y),m&&o.push(...m)};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}if(!a&&!l)return me(e)&&r.set(e,Sn),Sn;if(Z(a))for(let c=0;ce==="_"||e==="_ctx"||e==="$stable",_a=e=>Z(e)?e.map(ht):[ht(e)],of=(e,t,n)=>{if(t._n)return t;const r=Cd((...s)=>_a(t(...s)),n);return r._c=!1,r},sl=(e,t,n)=>{const r=e._ctx;for(const s in e){if(ba(s))continue;const a=e[s];if(J(a))t[s]=of(s,a,r);else if(a!=null){const i=_a(a);t[s]=()=>i}}},al=(e,t)=>{const n=_a(t);e.slots.default=()=>n},il=(e,t,n)=>{for(const r in t)(n||!ba(r))&&(e[r]=t[r])},lf=(e,t,n)=>{const r=e.slots=el();if(e.vnode.shapeFlag&32){const s=t._;s?(il(r,t,n),n&&uo(r,"_",s,!0)):sl(t,r)}else t&&al(e,t)},cf=(e,t,n)=>{const{vnode:r,slots:s}=e;let a=!0,i=pe;if(r.shapeFlag&32){const o=t._;o?n&&o===1?a=!1:il(s,t,n):(a=!t.$stable,sl(t,s)),i=t}else t&&(al(e,t),i={default:1});if(a)for(const o in s)!ba(o)&&i[o]==null&&delete s[o]},Fe=gf;function uf(e){return df(e)}function df(e,t){const n=es();n.__VUE__=!0;const{insert:r,remove:s,patchProp:a,createElement:i,createText:o,createComment:l,setText:u,setElementText:c,parentNode:h,nextSibling:y,setScopeId:m=gt,insertStaticContent:T}=e,v=(d,f,p,k=null,b=null,_=null,R=void 0,I=null,A=!!f.dynamicChildren)=>{if(d===f)return;d&&!zn(d,f)&&(k=Yt(d),Je(d,b,_,!0),d=null),f.patchFlag===-2&&(A=!1,f.dynamicChildren=null);const{type:C,ref:$,shapeFlag:L}=f;switch(C){case os:O(d,f,p,k);break;case Dt:E(d,f,p,k);break;case Es:d==null&&V(f,p,k,R);break;case Ye:be(d,f,p,k,b,_,R,I,A);break;default:L&1?Q(d,f,p,k,b,_,R,I,A):L&6?_e(d,f,p,k,b,_,R,I,A):(L&64||L&128)&&C.process(d,f,p,k,b,_,R,I,A,Qt)}$!=null&&b?Zn($,d&&d.ref,_,f||d,!f):$==null&&d&&d.ref!=null&&Zn(d.ref,null,_,d,!0)},O=(d,f,p,k)=>{if(d==null)r(f.el=o(f.children),p,k);else{const b=f.el=d.el;f.children!==d.children&&u(b,f.children)}},E=(d,f,p,k)=>{d==null?r(f.el=l(f.children||""),p,k):f.el=d.el},V=(d,f,p,k)=>{[d.el,d.anchor]=T(d.children,f,p,k,d.el,d.anchor)},K=({el:d,anchor:f},p,k)=>{let b;for(;d&&d!==f;)b=y(d),r(d,p,k),d=b;r(f,p,k)},N=({el:d,anchor:f})=>{let p;for(;d&&d!==f;)p=y(d),s(d),d=p;s(f)},Q=(d,f,p,k,b,_,R,I,A)=>{if(f.type==="svg"?R="svg":f.type==="math"&&(R="mathml"),d==null)W(f,p,k,b,_,R,I,A);else{const C=d.el&&d.el._isVueCE?d.el:null;try{C&&C._beginPatch(),B(d,f,b,_,R,I,A)}finally{C&&C._endPatch()}}},W=(d,f,p,k,b,_,R,I)=>{let A,C;const{props:$,shapeFlag:L,transition:j,dirs:q}=d;if(A=d.el=i(d.type,_,$&&$.is,$),L&8?c(A,d.children):L&16&&z(d.children,A,null,k,b,As(d,_),R,I),q&&en(d,null,k,"created"),oe(A,d,d.scopeId,R,k),$){for(const fe in $)fe!=="value"&&!jn(fe)&&a(A,fe,null,$[fe],_,k);"value"in $&&a(A,"value",null,$.value,_),(C=$.onVnodeBeforeMount)&&ut(C,k,d)}q&&en(d,null,k,"beforeMount");const ne=ff(b,j);ne&&j.beforeEnter(A),r(A,f,p),((C=$&&$.onVnodeMounted)||ne||q)&&Fe(()=>{C&&ut(C,k,d),ne&&j.enter(A),q&&en(d,null,k,"mounted")},b)},oe=(d,f,p,k,b)=>{if(p&&m(d,p),k)for(let _=0;_{for(let C=A;C{const I=f.el=d.el;let{patchFlag:A,dynamicChildren:C,dirs:$}=f;A|=d.patchFlag&16;const L=d.props||pe,j=f.props||pe;let q;if(p&&tn(p,!1),(q=j.onVnodeBeforeUpdate)&&ut(q,p,f,d),$&&en(f,d,p,"beforeUpdate"),p&&tn(p,!0),(L.innerHTML&&j.innerHTML==null||L.textContent&&j.textContent==null)&&c(I,""),C?re(d.dynamicChildren,C,I,p,k,As(f,b),_):R||de(d,f,I,null,p,k,As(f,b),_,!1),A>0){if(A&16)H(I,L,j,p,b);else if(A&2&&L.class!==j.class&&a(I,"class",null,j.class,b),A&4&&a(I,"style",L.style,j.style,b),A&8){const ne=f.dynamicProps;for(let fe=0;fe{q&&ut(q,p,f,d),$&&en(f,d,p,"updated")},k)},re=(d,f,p,k,b,_,R)=>{for(let I=0;I{if(f!==p){if(f!==pe)for(const _ in f)!jn(_)&&!(_ in p)&&a(d,_,f[_],null,b,k);for(const _ in p){if(jn(_))continue;const R=p[_],I=f[_];R!==I&&_!=="value"&&a(d,_,I,R,b,k)}"value"in p&&a(d,"value",f.value,p.value,b)}},be=(d,f,p,k,b,_,R,I,A)=>{const C=f.el=d?d.el:o(""),$=f.anchor=d?d.anchor:o("");let{patchFlag:L,dynamicChildren:j,slotScopeIds:q}=f;q&&(I=I?I.concat(q):q),d==null?(r(C,p,k),r($,p,k),z(f.children||[],p,$,b,_,R,I,A)):L>0&&L&64&&j&&d.dynamicChildren&&d.dynamicChildren.length===j.length?(re(d.dynamicChildren,j,p,b,_,R,I),(f.key!=null||b&&f===b.subTree)&&Ca(d,f,!0)):de(d,f,p,$,b,_,R,I,A)},_e=(d,f,p,k,b,_,R,I,A)=>{f.slotScopeIds=I,d==null?f.shapeFlag&512?b.ctx.activate(f,p,k,R,A):at(f,p,k,b,_,R,A):yt(d,f,A)},at=(d,f,p,k,b,_,R)=>{const I=d.component=kf(d,k,b);if(ya(d)&&(I.ctx.renderer=Qt),wf(I,!1,R),I.asyncDep){if(b&&b.registerDep(I,ae,R),!d.el){const A=I.subTree=ye(Dt);E(null,A,f,p),d.placeholder=A.el}}else ae(I,d,f,p,b,_,R)},yt=(d,f,p)=>{const k=f.component=d.component;if(tf(d,f,p))if(k.asyncDep&&!k.asyncResolved){te(k,f,p);return}else k.next=f,k.update();else f.el=d.el,k.vnode=f},ae=(d,f,p,k,b,_,R)=>{const I=()=>{if(d.isMounted){let{next:L,bu:j,u:q,parent:ne,vnode:fe}=d;{const He=ol(d);if(He){L&&(L.el=fe.el,te(d,L,R)),He.asyncDep.then(()=>{d.isUnmounted||I()});return}}let ie=L,Ae;tn(d,!1),L?(L.el=fe.el,te(d,L,R)):L=fe,j&&xr(j),(Ae=L.props&&L.props.onVnodeBeforeUpdate)&&ut(Ae,ne,L,fe),tn(d,!0);const Ee=ki(d),We=d.subTree;d.subTree=Ee,v(We,Ee,h(We.el),Yt(We),d,b,_),L.el=Ee.el,ie===null&&nf(d,Ee.el),q&&Fe(q,b),(Ae=L.props&&L.props.onVnodeUpdated)&&Fe(()=>ut(Ae,ne,L,fe),b)}else{let L;const{el:j,props:q}=f,{bm:ne,m:fe,parent:ie,root:Ae,type:Ee}=d,We=Pn(f);tn(d,!1),ne&&xr(ne),!We&&(L=q&&q.onVnodeBeforeMount)&&ut(L,ie,f),tn(d,!0);{Ae.ce&&Ae.ce._def.shadowRoot!==!1&&Ae.ce._injectChildStyle(Ee);const He=d.subTree=ki(d);v(null,He,p,k,d,b,_),f.el=He.el}if(fe&&Fe(fe,b),!We&&(L=q&&q.onVnodeMounted)){const He=f;Fe(()=>ut(L,ie,He),b)}(f.shapeFlag&256||ie&&Pn(ie.vnode)&&ie.vnode.shapeFlag&256)&&d.a&&Fe(d.a,b),d.isMounted=!0,f=p=k=null}};d.scope.on();const A=d.effect=new bo(I);d.scope.off();const C=d.update=A.run.bind(A),$=d.job=A.runIfDirty.bind(A);$.i=d,$.id=d.uid,A.scheduler=()=>pa($),tn(d,!0),C()},te=(d,f,p)=>{f.component=d;const k=d.vnode.props;d.vnode=f,d.next=null,sf(d,f.props,k,p),cf(d,f.children,p),Rt(),di(d),Lt()},de=(d,f,p,k,b,_,R,I,A=!1)=>{const C=d&&d.children,$=d?d.shapeFlag:0,L=f.children,{patchFlag:j,shapeFlag:q}=f;if(j>0){if(j&128){qt(C,L,p,k,b,_,R,I,A);return}else if(j&256){et(C,L,p,k,b,_,R,I,A);return}}q&8?($&16&&Ut(C,b,_),L!==C&&c(p,L)):$&16?q&16?qt(C,L,p,k,b,_,R,I,A):Ut(C,b,_,!0):($&8&&c(p,""),q&16&&z(L,p,k,b,_,R,I,A))},et=(d,f,p,k,b,_,R,I,A)=>{d=d||Sn,f=f||Sn;const C=d.length,$=f.length,L=Math.min(C,$);let j;for(j=0;j$?Ut(d,b,_,!0,!1,L):z(f,p,k,b,_,R,I,A,L)},qt=(d,f,p,k,b,_,R,I,A)=>{let C=0;const $=f.length;let L=d.length-1,j=$-1;for(;C<=L&&C<=j;){const q=d[C],ne=f[C]=A?$t(f[C]):ht(f[C]);if(zn(q,ne))v(q,ne,p,null,b,_,R,I,A);else break;C++}for(;C<=L&&C<=j;){const q=d[L],ne=f[j]=A?$t(f[j]):ht(f[j]);if(zn(q,ne))v(q,ne,p,null,b,_,R,I,A);else break;L--,j--}if(C>L){if(C<=j){const q=j+1,ne=q<$?f[q].el:k;for(;C<=j;)v(null,f[C]=A?$t(f[C]):ht(f[C]),p,ne,b,_,R,I,A),C++}}else if(C>j)for(;C<=L;)Je(d[C],b,_,!0),C++;else{const q=C,ne=C,fe=new Map;for(C=ne;C<=j;C++){const ze=f[C]=A?$t(f[C]):ht(f[C]);ze.key!=null&&fe.set(ze.key,C)}let ie,Ae=0;const Ee=j-ne+1;let We=!1,He=0;const Jt=new Array(Ee);for(C=0;C=Ee){Je(ze,b,_,!0);continue}let Ve;if(ze.key!=null)Ve=fe.get(ze.key);else for(ie=ne;ie<=j;ie++)if(Jt[ie-ne]===0&&zn(ze,f[ie])){Ve=ie;break}Ve===void 0?Je(ze,b,_,!0):(Jt[Ve-ne]=C+1,Ve>=He?He=Ve:We=!0,v(ze,f[Ve],p,null,b,_,R,I,A),Ae++)}const dr=We?hf(Jt):Sn;for(ie=dr.length-1,C=Ee-1;C>=0;C--){const ze=ne+C,Ve=f[ze],Xt=f[ze+1],Dn=ze+1<$?Xt.el||ll(Xt):k;Jt[C]===0?v(null,Ve,p,Dn,b,_,R,I,A):We&&(ie<0||C!==dr[ie]?it(Ve,p,Dn,2):ie--)}}},it=(d,f,p,k,b=null)=>{const{el:_,type:R,transition:I,children:A,shapeFlag:C}=d;if(C&6){it(d.component.subTree,f,p,k);return}if(C&128){d.suspense.move(f,p,k);return}if(C&64){R.move(d,f,p,Qt);return}if(R===Ye){r(_,f,p);for(let L=0;LI.enter(_),b);else{const{leave:L,delayLeave:j,afterLeave:q}=I,ne=()=>{d.ctx.isUnmounted?s(_):r(_,f,p)},fe=()=>{_._isLeaving&&_[Ad](!0),L(_,()=>{ne(),q&&q()})};j?j(_,ne,fe):fe()}else r(_,f,p)},Je=(d,f,p,k=!1,b=!1)=>{const{type:_,props:R,ref:I,children:A,dynamicChildren:C,shapeFlag:$,patchFlag:L,dirs:j,cacheIndex:q}=d;if(L===-2&&(b=!1),I!=null&&(Rt(),Zn(I,null,p,d,!0),Lt()),q!=null&&(f.renderCache[q]=void 0),$&256){f.ctx.deactivate(d);return}const ne=$&1&&j,fe=!Pn(d);let ie;if(fe&&(ie=R&&R.onVnodeBeforeUnmount)&&ut(ie,f,d),$&6)Oe(d.component,p,k);else{if($&128){d.suspense.unmount(p,k);return}ne&&en(d,null,f,"beforeUnmount"),$&64?d.type.remove(d,f,p,Qt,k):C&&!C.hasOnce&&(_!==Ye||L>0&&L&64)?Ut(C,f,p,!1,!0):(_===Ye&&L&384||!b&&$&16)&&Ut(A,f,p),k&&zt(d)}(fe&&(ie=R&&R.onVnodeUnmounted)||ne)&&Fe(()=>{ie&&ut(ie,f,d),ne&&en(d,null,f,"unmounted")},p)},zt=d=>{const{type:f,el:p,anchor:k,transition:b}=d;if(f===Ye){bt(p,k);return}if(f===Es){N(d);return}const _=()=>{s(p),b&&!b.persisted&&b.afterLeave&&b.afterLeave()};if(d.shapeFlag&1&&b&&!b.persisted){const{leave:R,delayLeave:I}=b,A=()=>R(p,_);I?I(d.el,_,A):A()}else _()},bt=(d,f)=>{let p;for(;d!==f;)p=y(d),s(d),d=p;s(f)},Oe=(d,f,p)=>{const{bum:k,scope:b,job:_,subTree:R,um:I,m:A,a:C}=d;Ti(A),Ti(C),k&&xr(k),b.stop(),_&&(_.flags|=8,Je(R,d,f,p)),I&&Fe(I,f),Fe(()=>{d.isUnmounted=!0},f)},Ut=(d,f,p,k=!1,b=!1,_=0)=>{for(let R=_;R{if(d.shapeFlag&6)return Yt(d.component.subTree);if(d.shapeFlag&128)return d.suspense.next();const f=y(d.anchor||d.el),p=f&&f[jo];return p?y(p):f};let Gt=!1;const pn=(d,f,p)=>{let k;d==null?f._vnode&&(Je(f._vnode,null,null,!0),k=f._vnode.component):v(f._vnode||null,d,f,null,null,null,p),f._vnode=d,Gt||(Gt=!0,di(k),Oo(),Gt=!1)},Qt={p:v,um:Je,m:it,r:zt,mt:at,mc:z,pc:de,pbc:re,n:Yt,o:e};return{render:pn,hydrate:void 0,createApp:Yd(pn)}}function As({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 tn({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function ff(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Ca(e,t,n=!1){const r=e.children,s=t.children;if(Z(r)&&Z(s))for(let a=0;a>1,e[n[o]]0&&(t[r]=n[a-1]),n[a]=r)}}for(a=n.length,i=n[a-1];a-- >0;)n[a]=i,i=t[i];return n}function ol(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:ol(t)}function Ti(e){if(e)for(let t=0;te.__isSuspense;function gf(e,t){t&&t.pendingBranch?Z(e)?t.effects.push(...e):t.effects.push(e):_d(e)}const Ye=Symbol.for("v-fgt"),os=Symbol.for("v-txt"),Dt=Symbol.for("v-cmt"),Es=Symbol.for("v-stc"),Yn=[];let Ge=null;function ft(e=!1){Yn.push(Ge=e?null:[])}function pf(){Yn.pop(),Ge=Yn[Yn.length-1]||null}let er=1;function Or(e,t=!1){er+=e,e<0&&Ge&&t&&(Ge.hasOnce=!0)}function ul(e){return e.dynamicChildren=er>0?Ge||Sn:null,pf(),er>0&&Ge&&Ge.push(e),e}function Is(e,t,n,r,s,a){return ul(X(e,t,n,r,s,a,!0))}function an(e,t,n,r,s){return ul(ye(e,t,n,r,s,!0))}function tr(e){return e?e.__v_isVNode===!0:!1}function zn(e,t){return e.type===t.type&&e.key===t.key}const dl=({key:e})=>e??null,Ar=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?Se(e)||we(e)||J(e)?{i:De,r:e,k:t,f:!!n}:e:null);function X(e,t=null,n=null,r=0,s=null,a=e===Ye?0:1,i=!1,o=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&dl(t),ref:t&&Ar(t),scopeId:Uo,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:a,patchFlag:r,dynamicProps:s,dynamicChildren:null,appContext:null,ctx:De};return o?(ka(l,n),a&128&&e.normalize(l)):n&&(l.shapeFlag|=Se(n)?8:16),er>0&&!i&&Ge&&(l.patchFlag>0||a&6)&&l.patchFlag!==32&&Ge.push(l),l}const ye=mf;function mf(e,t=null,n=null,r=0,s=null,a=!1){if((!e||e===jd)&&(e=Dt),tr(e)){const o=In(e,t,!0);return n&&ka(o,n),er>0&&!a&&Ge&&(o.shapeFlag&6?Ge[Ge.indexOf(e)]=o:Ge.push(o)),o.patchFlag=-2,o}if(Pf(e)&&(e=e.__vccOpts),t){t=vf(t);let{class:o,style:l}=t;o&&!Se(o)&&(t.class=sn(o)),me(l)&&(ss(l)&&!Z(l)&&(l=Ne({},l)),t.style=oa(l))}const i=Se(e)?1:cl(e)?128:xd(e)?64:me(e)?4:J(e)?2:0;return X(e,t,n,r,s,i,a,!0)}function vf(e){return e?ss(e)||tl(e)?Ne({},e):e:null}function In(e,t,n=!1,r=!1){const{props:s,ref:a,patchFlag:i,children:o,transition:l}=e,u=t?bf(s||{},t):s,c={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&dl(u),ref:t&&t.ref?n&&a?Z(a)?a.concat(Ar(t)):[a,Ar(t)]:Ar(t):a,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:o,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ye?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:l,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&In(e.ssContent),ssFallback:e.ssFallback&&In(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return l&&r&&ma(c,l.clone(c)),c}function yf(e=" ",t=0){return ye(os,null,e,t)}function dp(e="",t=!1){return t?(ft(),an(Dt,null,e)):ye(Dt,null,e)}function ht(e){return e==null||typeof e=="boolean"?ye(Dt):Z(e)?ye(Ye,null,e.slice()):tr(e)?$t(e):ye(os,null,String(e))}function $t(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:In(e)}function ka(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(Z(t))n=16;else if(typeof t=="object")if(r&65){const s=t.default;s&&(s._c&&(s._d=!1),ka(e,s()),s._c&&(s._d=!0));return}else{n=32;const s=t._;!s&&!tl(t)?t._ctx=De:s===3&&De&&(De.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else J(t)?(t={default:t,_ctx:De},n=32):(t=String(t),r&64?(n=16,t=[yf(t)]):n=8);e.children=t,e.shapeFlag|=n}function bf(...e){const t={};for(let n=0;nMe||De;let zr,Hs;{const e=es(),t=(n,r)=>{let s;return(s=e[n])||(s=e[n]=[]),s.push(r),a=>{s.length>1?s.forEach(i=>i(a)):s[0](a)}};zr=t("__VUE_INSTANCE_SETTERS__",n=>Me=n),Hs=t("__VUE_SSR_SETTERS__",n=>Rn=n)}const ur=e=>{const t=Me;return zr(e),e.scope.on(),()=>{e.scope.off(),zr(t)}},xi=()=>{Me&&Me.scope.off(),zr(null)};function hl(e){return e.vnode.shapeFlag&4}let Rn=!1;function wf(e,t=!1,n=!1){t&&Hs(t);const{props:r,children:s}=e.vnode,a=hl(e);rf(e,r,a,t),lf(e,s,n||t);const i=a?Sf(e,t):void 0;return t&&Hs(!1),i}function Sf(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Vd);const{setup:r}=n;if(r){Rt();const s=e.setupContext=r.length>1?xf(e):null,a=ur(e),i=lr(r,e,0,[e.props,s]),o=io(i);if(Lt(),a(),(o||e.sp)&&!Pn(e)&&va(e),o){if(i.then(xi,xi),t)return i.then(l=>{Pi(e,l)}).catch(l=>{cr(l,e,0)});e.asyncDep=i}else Pi(e,i)}else gl(e)}function Pi(e,t,n){J(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:me(t)&&(e.setupState=Mo(t)),gl(e)}function gl(e,t,n){const r=e.type;e.render||(e.render=r.render||gt);{const s=ur(e);Rt();try{$d(e)}finally{Lt(),s()}}}const Tf={get(e,t){return Le(e,"get",""),e[t]}};function xf(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Tf),slots:e.slots,emit:e.emit,expose:t}}function ls(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Mo(ga(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in qn)return qn[n](e)},has(t,n){return n in t||n in qn}})):e.proxy}function Pf(e){return J(e)&&"__vccOpts"in e}const ge=(e,t)=>pd(e,t,Rn);function fp(e,t,n){try{Or(-1);const r=arguments.length;return r===2?me(t)&&!Z(t)?tr(t)?ye(e,null,[t]):ye(e,t):ye(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&tr(n)&&(n=[n]),ye(e,t,n))}finally{Or(1)}}const Af="3.5.26";let Ks;const Ai=typeof window<"u"&&window.trustedTypes;if(Ai)try{Ks=Ai.createPolicy("vue",{createHTML:e=>e})}catch{}const pl=Ks?e=>Ks.createHTML(e):e=>e,Ef="http://www.w3.org/2000/svg",If="http://www.w3.org/1998/Math/MathML",Tt=typeof document<"u"?document:null,Ei=Tt&&Tt.createElement("template"),Rf={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const s=t==="svg"?Tt.createElementNS(Ef,e):t==="mathml"?Tt.createElementNS(If,e):n?Tt.createElement(e,{is:n}):Tt.createElement(e);return e==="select"&&r&&r.multiple!=null&&s.setAttribute("multiple",r.multiple),s},createText:e=>Tt.createTextNode(e),createComment:e=>Tt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Tt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,s,a){const i=n?n.previousSibling:t.lastChild;if(s&&(s===a||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===a||!(s=s.nextSibling)););else{Ei.innerHTML=pl(r==="svg"?`${e}`:r==="mathml"?`${e}`:e);const o=Ei.content;if(r==="svg"||r==="mathml"){const l=o.firstChild;for(;l.firstChild;)o.appendChild(l.firstChild);o.removeChild(l)}t.insertBefore(o,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Lf=Symbol("_vtc");function Mf(e,t,n){const r=e[Lf];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Ii=Symbol("_vod"),Df=Symbol("_vsh"),Nf=Symbol(""),Of=/(?:^|;)\s*display\s*:/;function zf(e,t,n){const r=e.style,s=Se(n);let a=!1;if(n&&!s){if(t)if(Se(t))for(const i of t.split(";")){const o=i.slice(0,i.indexOf(":")).trim();n[o]==null&&Er(r,o,"")}else for(const i in t)n[i]==null&&Er(r,i,"");for(const i in n)i==="display"&&(a=!0),Er(r,i,n[i])}else if(s){if(t!==n){const i=r[Nf];i&&(n+=";"+i),r.cssText=n,a=Of.test(n)}}else t&&e.removeAttribute("style");Ii in e&&(e[Ii]=a?r.display:"",e[Df]&&(r.display="none"))}const Ri=/\s*!important$/;function Er(e,t,n){if(Z(n))n.forEach(r=>Er(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=Uf(e,t);Ri.test(n)?e.setProperty(gn(r),n.replace(Ri,""),"important"):e[r]=n}}const Li=["Webkit","Moz","ms"],Rs={};function Uf(e,t){const n=Rs[t];if(n)return n;let r=Kt(t);if(r!=="filter"&&r in e)return Rs[t]=r;r=co(r);for(let s=0;sLs||(Vf.then(()=>Ls=0),Ls=Date.now());function Wf(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;mt(Hf(r,n.value),t,5,[r])};return n.value=e,n.attached=$f(),n}function Hf(e,t){if(Z(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>s=>!s._stopped&&r&&r(s))}else return t}const Ui=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Kf=(e,t,n,r,s,a)=>{const i=s==="svg";t==="class"?Mf(e,r,i):t==="style"?zf(e,n,r):Gr(t)?sa(t)||Bf(e,t,n,r,a):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Zf(e,t,r,i))?(Ni(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Di(e,t,r,i,a,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!Se(r))?Ni(e,Kt(t),r,a,t):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Di(e,t,r,i))};function Zf(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&Ui(t)&&J(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 s=e.tagName;if(s==="IMG"||s==="VIDEO"||s==="CANVAS"||s==="SOURCE")return!1}return Ui(t)&&Se(n)?!1:t in e}const Ur=e=>{const t=e.props["onUpdate:modelValue"]||!1;return Z(t)?n=>xr(t,n):t};function qf(e){e.target.composing=!0}function Fi(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const An=Symbol("_assign");function Bi(e,t,n){return t&&(e=e.trim()),n&&(e=ia(e)),e}const hp={created(e,{modifiers:{lazy:t,trim:n,number:r}},s){e[An]=Ur(s);const a=r||s.props&&s.props.type==="number";rn(e,t?"change":"input",i=>{i.target.composing||e[An](Bi(e.value,n,a))}),(n||a)&&rn(e,"change",()=>{e.value=Bi(e.value,n,a)}),t||(rn(e,"compositionstart",qf),rn(e,"compositionend",Fi),rn(e,"change",Fi))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:s,number:a}},i){if(e[An]=Ur(i),e.composing)return;const o=(a||e.type==="number")&&!/^0\d/.test(e.value)?ia(e.value):e.value,l=t??"";o!==l&&(document.activeElement===e&&e.type!=="range"&&(r&&t===n||s&&e.value.trim()===l)||(e.value=l))}},gp={deep:!0,created(e,t,n){e[An]=Ur(n),rn(e,"change",()=>{const r=e._modelValue,s=Yf(e),a=e.checked,i=e[An];if(Z(r)){const o=ho(r,s),l=o!==-1;if(a&&!l)i(r.concat(s));else if(!a&&l){const u=[...r];u.splice(o,1),i(u)}}else if(Qr(r)){const o=new Set(r);a?o.add(s):o.delete(s),i(o)}else i(ml(e,a))})},mounted:ji,beforeUpdate(e,t,n){e[An]=Ur(n),ji(e,t,n)}};function ji(e,{value:t,oldValue:n},r){e._modelValue=t;let s;if(Z(t))s=ho(t,r.props.value)>-1;else if(Qr(t))s=t.has(r.props.value);else{if(t===n)return;s=ts(t,ml(e,!0))}e.checked!==s&&(e.checked=s)}function Yf(e){return"_value"in e?e._value:e.value}function ml(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const Gf=["ctrl","shift","alt","meta"],Qf={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)=>Gf.some(n=>e[`${n}Key`]&&!t.includes(n))},xe=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=((s,...a)=>{for(let i=0;i{const t=Xf().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=nh(r);if(!s)return;const a=t._component;!J(a)&&!a.render&&!a.template&&(a.template=s.innerHTML),s.nodeType===1&&(s.textContent="");const i=n(s,!1,th(s));return s instanceof Element&&(s.removeAttribute("v-cloak"),s.setAttribute("data-v-app","")),i},t});function th(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function nh(e){return Se(e)?document.querySelector(e):e}let vl;const cs=e=>vl=e,yl=Symbol();function Zs(e){return e&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"&&typeof e.toJSON!="function"}var Gn;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(Gn||(Gn={}));function rh(){const e=vo(!0),t=e.run(()=>w({}));let n=[],r=[];const s=ga({install(a){cs(s),s._a=a,a.provide(yl,s),a.config.globalProperties.$pinia=s,r.forEach(i=>n.push(i)),r=[]},use(a){return this._a?n.push(a):r.push(a),this},_p:n,_a:null,_e:e,_s:new Map,state:t});return s}const bl=()=>{};function $i(e,t,n,r=bl){e.push(t);const s=()=>{const a=e.indexOf(t);a>-1&&(e.splice(a,1),r())};return!n&&yo()&&ju(s),s}function yn(e,...t){e.slice().forEach(n=>{n(...t)})}const sh=e=>e(),Wi=Symbol(),Ms=Symbol();function qs(e,t){e instanceof Map&&t instanceof Map?t.forEach((n,r)=>e.set(r,n)):e instanceof Set&&t instanceof Set&&t.forEach(e.add,e);for(const n in t){if(!t.hasOwnProperty(n))continue;const r=t[n],s=e[n];Zs(s)&&Zs(r)&&e.hasOwnProperty(n)&&!we(r)&&!Et(r)?e[n]=qs(s,r):e[n]=r}return e}const ah=Symbol();function ih(e){return!Zs(e)||!e.hasOwnProperty(ah)}const{assign:Bt}=Object;function oh(e){return!!(we(e)&&e.effect)}function lh(e,t,n,r){const{state:s,actions:a,getters:i}=t,o=n.state.value[e];let l;function u(){o||(n.state.value[e]=s?s():{});const c=dd(n.state.value[e]);return Bt(c,a,Object.keys(i||{}).reduce((h,y)=>(h[y]=ga(ge(()=>{cs(n);const m=n._s.get(e);return i[y].call(m,m)})),h),{}))}return l=_l(e,u,t,n,r,!0),l}function _l(e,t,n={},r,s,a){let i;const o=Bt({actions:{}},n),l={deep:!0};let u,c,h=[],y=[],m;const T=r.state.value[e];!a&&!T&&(r.state.value[e]={}),w({});let v;function O(z){let B;u=c=!1,typeof z=="function"?(z(r.state.value[e]),B={type:Gn.patchFunction,storeId:e,events:m}):(qs(r.state.value[e],z),B={type:Gn.patchObject,payload:z,storeId:e,events:m});const re=v=Symbol();Wn().then(()=>{v===re&&(u=!0)}),c=!0,yn(h,B,r.state.value[e])}const E=a?function(){const{state:B}=n,re=B?B():{};this.$patch(H=>{Bt(H,re)})}:bl;function V(){i.stop(),h=[],y=[],r._s.delete(e)}const K=(z,B="")=>{if(Wi in z)return z[Ms]=B,z;const re=function(){cs(r);const H=Array.from(arguments),be=[],_e=[];function at(te){be.push(te)}function yt(te){_e.push(te)}yn(y,{args:H,name:re[Ms],store:Q,after:at,onError:yt});let ae;try{ae=z.apply(this&&this.$id===e?this:Q,H)}catch(te){throw yn(_e,te),te}return ae instanceof Promise?ae.then(te=>(yn(be,te),te)).catch(te=>(yn(_e,te),Promise.reject(te))):(yn(be,ae),ae)};return re[Wi]=!0,re[Ms]=B,re},N={_p:r,$id:e,$onAction:$i.bind(null,y),$patch:O,$reset:E,$subscribe(z,B={}){const re=$i(h,z,B.detached,()=>H()),H=i.run(()=>tt(()=>r.state.value[e],be=>{(B.flush==="sync"?c:u)&&z({storeId:e,type:Gn.direct,events:m},be)},Bt({},l,B)));return re},$dispose:V},Q=rs(N);r._s.set(e,Q);const oe=(r._a&&r._a.runWithContext||sh)(()=>r._e.run(()=>(i=vo()).run(()=>t({action:K}))));for(const z in oe){const B=oe[z];if(we(B)&&!oh(B)||Et(B))a||(T&&ih(B)&&(we(B)?B.value=T[z]:qs(B,T[z])),r.state.value[e][z]=B);else if(typeof B=="function"){const re=K(B,z);oe[z]=re,o.actions[z]=B}}return Bt(Q,oe),Bt(ue(Q),oe),Object.defineProperty(Q,"$state",{get:()=>r.state.value[e],set:z=>{O(B=>{Bt(B,z)})}}),r._p.forEach(z=>{Bt(Q,i.run(()=>z({store:Q,app:r._a,pinia:r,options:o})))}),T&&a&&n.hydrate&&n.hydrate(Q.$state,T),u=!0,c=!0,Q}function ch(e,t,n){let r,s;const a=typeof t=="function";r=e,s=a?n:t;function i(o,l){const u=kd();return o=o||(u?Hn(yl,null):null),o&&cs(o),o=vl,o._s.has(r)||(a?_l(r,t,s,o):lh(r,s,o)),o._s.get(r)}return i.$id=r,i}const uh="modulepreload",dh=function(e,t){return new URL(e,t).href},Hi={},Ie=function(t,n,r){let s=Promise.resolve();if(n&&n.length>0){let u=function(c){return Promise.all(c.map(h=>Promise.resolve(h).then(y=>({status:"fulfilled",value:y}),y=>({status:"rejected",reason:y}))))};const i=document.getElementsByTagName("link"),o=document.querySelector("meta[property=csp-nonce]"),l=o?.nonce||o?.getAttribute("nonce");s=u(n.map(c=>{if(c=dh(c,r),c in Hi)return;Hi[c]=!0;const h=c.endsWith(".css"),y=h?'[rel="stylesheet"]':"";if(r)for(let T=i.length-1;T>=0;T--){const v=i[T];if(v.href===c&&(!h||v.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${c}"]${y}`))return;const m=document.createElement("link");if(m.rel=h?"stylesheet":uh,h||(m.as="script"),m.crossOrigin="",m.href=c,l&&m.setAttribute("nonce",l),document.head.appendChild(m),h)return new Promise((T,v)=>{m.addEventListener("load",T),m.addEventListener("error",()=>v(new Error(`Unable to preload CSS for ${c}`)))})}))}function a(i){const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=i,window.dispatchEvent(o),!o.defaultPrevented)throw i}return s.then(i=>{for(const o of i||[])o.status==="rejected"&&a(o.reason);return t().catch(a)})};var ce;(function(e){e.assertEqual=s=>{};function t(s){}e.assertIs=t;function n(s){throw new Error}e.assertNever=n,e.arrayToEnum=s=>{const a={};for(const i of s)a[i]=i;return a},e.getValidEnumValues=s=>{const a=e.objectKeys(s).filter(o=>typeof s[s[o]]!="number"),i={};for(const o of a)i[o]=s[o];return e.objectValues(i)},e.objectValues=s=>e.objectKeys(s).map(function(a){return s[a]}),e.objectKeys=typeof Object.keys=="function"?s=>Object.keys(s):s=>{const a=[];for(const i in s)Object.prototype.hasOwnProperty.call(s,i)&&a.push(i);return a},e.find=(s,a)=>{for(const i of s)if(a(i))return i},e.isInteger=typeof Number.isInteger=="function"?s=>Number.isInteger(s):s=>typeof s=="number"&&Number.isFinite(s)&&Math.floor(s)===s;function r(s,a=" | "){return s.map(i=>typeof i=="string"?`'${i}'`:i).join(a)}e.joinValues=r,e.jsonStringifyReplacer=(s,a)=>typeof a=="bigint"?a.toString():a})(ce||(ce={}));var Ki;(function(e){e.mergeShapes=(t,n)=>({...t,...n})})(Ki||(Ki={}));const D=ce.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),Wt=e=>{switch(typeof e){case"undefined":return D.undefined;case"string":return D.string;case"number":return Number.isNaN(e)?D.nan:D.number;case"boolean":return D.boolean;case"function":return D.function;case"bigint":return D.bigint;case"symbol":return D.symbol;case"object":return Array.isArray(e)?D.array:e===null?D.null:e.then&&typeof e.then=="function"&&e.catch&&typeof e.catch=="function"?D.promise:typeof Map<"u"&&e instanceof Map?D.map:typeof Set<"u"&&e instanceof Set?D.set:typeof Date<"u"&&e instanceof Date?D.date:D.object;default:return D.unknown}},P=ce.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]);class Nt extends Error{get errors(){return this.issues}constructor(t){super(),this.issues=[],this.addIssue=r=>{this.issues=[...this.issues,r]},this.addIssues=(r=[])=>{this.issues=[...this.issues,...r]};const n=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,n):this.__proto__=n,this.name="ZodError",this.issues=t}format(t){const n=t||function(a){return a.message},r={_errors:[]},s=a=>{for(const i of a.issues)if(i.code==="invalid_union")i.unionErrors.map(s);else if(i.code==="invalid_return_type")s(i.returnTypeError);else if(i.code==="invalid_arguments")s(i.argumentsError);else if(i.path.length===0)r._errors.push(n(i));else{let o=r,l=0;for(;ln.message){const n={},r=[];for(const s of this.issues)if(s.path.length>0){const a=s.path[0];n[a]=n[a]||[],n[a].push(t(s))}else r.push(t(s));return{formErrors:r,fieldErrors:n}}get formErrors(){return this.flatten()}}Nt.create=e=>new Nt(e);const Ys=(e,t)=>{let n;switch(e.code){case P.invalid_type:e.received===D.undefined?n="Required":n=`Expected ${e.expected}, received ${e.received}`;break;case P.invalid_literal:n=`Invalid literal value, expected ${JSON.stringify(e.expected,ce.jsonStringifyReplacer)}`;break;case P.unrecognized_keys:n=`Unrecognized key(s) in object: ${ce.joinValues(e.keys,", ")}`;break;case P.invalid_union:n="Invalid input";break;case P.invalid_union_discriminator:n=`Invalid discriminator value. Expected ${ce.joinValues(e.options)}`;break;case P.invalid_enum_value:n=`Invalid enum value. Expected ${ce.joinValues(e.options)}, received '${e.received}'`;break;case P.invalid_arguments:n="Invalid function arguments";break;case P.invalid_return_type:n="Invalid function return type";break;case P.invalid_date:n="Invalid date";break;case P.invalid_string:typeof e.validation=="object"?"includes"in e.validation?(n=`Invalid input: must include "${e.validation.includes}"`,typeof e.validation.position=="number"&&(n=`${n} at one or more positions greater than or equal to ${e.validation.position}`)):"startsWith"in e.validation?n=`Invalid input: must start with "${e.validation.startsWith}"`:"endsWith"in e.validation?n=`Invalid input: must end with "${e.validation.endsWith}"`:ce.assertNever(e.validation):e.validation!=="regex"?n=`Invalid ${e.validation}`:n="Invalid";break;case P.too_small:e.type==="array"?n=`Array must contain ${e.exact?"exactly":e.inclusive?"at least":"more than"} ${e.minimum} element(s)`:e.type==="string"?n=`String must contain ${e.exact?"exactly":e.inclusive?"at least":"over"} ${e.minimum} character(s)`:e.type==="number"?n=`Number must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${e.minimum}`:e.type==="bigint"?n=`Number must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${e.minimum}`:e.type==="date"?n=`Date must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(e.minimum))}`:n="Invalid input";break;case P.too_big:e.type==="array"?n=`Array must contain ${e.exact?"exactly":e.inclusive?"at most":"less than"} ${e.maximum} element(s)`:e.type==="string"?n=`String must contain ${e.exact?"exactly":e.inclusive?"at most":"under"} ${e.maximum} character(s)`:e.type==="number"?n=`Number must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="bigint"?n=`BigInt must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="date"?n=`Date must be ${e.exact?"exactly":e.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(e.maximum))}`:n="Invalid input";break;case P.custom:n="Invalid input";break;case P.invalid_intersection_types:n="Intersection results could not be merged";break;case P.not_multiple_of:n=`Number must be a multiple of ${e.multipleOf}`;break;case P.not_finite:n="Number must be finite";break;default:n=t.defaultError,ce.assertNever(e)}return{message:n}};let fh=Ys;function hh(){return fh}const gh=e=>{const{data:t,path:n,errorMaps:r,issueData:s}=e,a=[...n,...s.path||[]],i={...s,path:a};if(s.message!==void 0)return{...s,path:a,message:s.message};let o="";const l=r.filter(u=>!!u).slice().reverse();for(const u of l)o=u(i,{data:t,defaultError:o}).message;return{...s,path:a,message:o}};function M(e,t){const n=hh(),r=gh({issueData:t,data:e.data,path:e.path,errorMaps:[e.common.contextualErrorMap,e.schemaErrorMap,n,n===Ys?void 0:Ys].filter(s=>!!s)});e.common.issues.push(r)}class je{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(t,n){const r=[];for(const s of n){if(s.status==="aborted")return Y;s.status==="dirty"&&t.dirty(),r.push(s.value)}return{status:t.value,value:r}}static async mergeObjectAsync(t,n){const r=[];for(const s of n){const a=await s.key,i=await s.value;r.push({key:a,value:i})}return je.mergeObjectSync(t,r)}static mergeObjectSync(t,n){const r={};for(const s of n){const{key:a,value:i}=s;if(a.status==="aborted"||i.status==="aborted")return Y;a.status==="dirty"&&t.dirty(),i.status==="dirty"&&t.dirty(),a.value!=="__proto__"&&(typeof i.value<"u"||s.alwaysSet)&&(r[a.value]=i.value)}return{status:t.value,value:r}}}const Y=Object.freeze({status:"aborted"}),Bn=e=>({status:"dirty",value:e}),Xe=e=>({status:"valid",value:e}),Zi=e=>e.status==="aborted",qi=e=>e.status==="dirty",Ln=e=>e.status==="valid",Fr=e=>typeof Promise<"u"&&e instanceof Promise;var U;(function(e){e.errToObj=t=>typeof t=="string"?{message:t}:t||{},e.toString=t=>typeof t=="string"?t:t?.message})(U||(U={}));class vt{constructor(t,n,r,s){this._cachedPath=[],this.parent=t,this.data=n,this._path=r,this._key=s}get path(){return this._cachedPath.length||(Array.isArray(this._key)?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}}const Yi=(e,t)=>{if(Ln(t))return{success:!0,data:t.value};if(!e.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;const n=new Nt(e.common.issues);return this._error=n,this._error}}};function ee(e){if(!e)return{};const{errorMap:t,invalid_type_error:n,required_error:r,description:s}=e;if(t&&(n||r))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return t?{errorMap:t,description:s}:{errorMap:(i,o)=>{const{message:l}=e;return i.code==="invalid_enum_value"?{message:l??o.defaultError}:typeof o.data>"u"?{message:l??r??o.defaultError}:i.code!=="invalid_type"?{message:o.defaultError}:{message:l??n??o.defaultError}},description:s}}class se{get description(){return this._def.description}_getType(t){return Wt(t.data)}_getOrReturnCtx(t,n){return n||{common:t.parent.common,data:t.data,parsedType:Wt(t.data),schemaErrorMap:this._def.errorMap,path:t.path,parent:t.parent}}_processInputParams(t){return{status:new je,ctx:{common:t.parent.common,data:t.data,parsedType:Wt(t.data),schemaErrorMap:this._def.errorMap,path:t.path,parent:t.parent}}}_parseSync(t){const n=this._parse(t);if(Fr(n))throw new Error("Synchronous parse encountered promise.");return n}_parseAsync(t){const n=this._parse(t);return Promise.resolve(n)}parse(t,n){const r=this.safeParse(t,n);if(r.success)return r.data;throw r.error}safeParse(t,n){const r={common:{issues:[],async:n?.async??!1,contextualErrorMap:n?.errorMap},path:n?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:Wt(t)},s=this._parseSync({data:t,path:r.path,parent:r});return Yi(r,s)}"~validate"(t){const n={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:Wt(t)};if(!this["~standard"].async)try{const r=this._parseSync({data:t,path:[],parent:n});return Ln(r)?{value:r.value}:{issues:n.common.issues}}catch(r){r?.message?.toLowerCase()?.includes("encountered")&&(this["~standard"].async=!0),n.common={issues:[],async:!0}}return this._parseAsync({data:t,path:[],parent:n}).then(r=>Ln(r)?{value:r.value}:{issues:n.common.issues})}async parseAsync(t,n){const r=await this.safeParseAsync(t,n);if(r.success)return r.data;throw r.error}async safeParseAsync(t,n){const r={common:{issues:[],contextualErrorMap:n?.errorMap,async:!0},path:n?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:Wt(t)},s=this._parse({data:t,path:r.path,parent:r}),a=await(Fr(s)?s:Promise.resolve(s));return Yi(r,a)}refine(t,n){const r=s=>typeof n=="string"||typeof n>"u"?{message:n}:typeof n=="function"?n(s):n;return this._refinement((s,a)=>{const i=t(s),o=()=>a.addIssue({code:P.custom,...r(s)});return typeof Promise<"u"&&i instanceof Promise?i.then(l=>l?!0:(o(),!1)):i?!0:(o(),!1)})}refinement(t,n){return this._refinement((r,s)=>t(r)?!0:(s.addIssue(typeof n=="function"?n(r,s):n),!1))}_refinement(t){return new fn({schema:this,typeName:G.ZodEffects,effect:{type:"refinement",refinement:t}})}superRefine(t){return this._refinement(t)}constructor(t){this.spa=this.safeParseAsync,this._def=t,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:n=>this["~validate"](n)}}optional(){return It.create(this,this._def)}nullable(){return hn.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return pt.create(this)}promise(){return Kr.create(this,this._def)}or(t){return jr.create([this,t],this._def)}and(t){return Vr.create(this,t,this._def)}transform(t){return new fn({...ee(this._def),schema:this,typeName:G.ZodEffects,effect:{type:"transform",transform:t}})}default(t){const n=typeof t=="function"?t:()=>t;return new Zr({...ee(this._def),innerType:this,defaultValue:n,typeName:G.ZodDefault})}brand(){return new Sl({typeName:G.ZodBranded,type:this,...ee(this._def)})}catch(t){const n=typeof t=="function"?t:()=>t;return new qr({...ee(this._def),innerType:this,catchValue:n,typeName:G.ZodCatch})}describe(t){const n=this.constructor;return new n({...this._def,description:t})}pipe(t){return Sa.create(this,t)}readonly(){return Yr.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}const ph=/^c[^\s-]{8,}$/i,mh=/^[0-9a-z]+$/,vh=/^[0-9A-HJKMNP-TV-Z]{26}$/i,yh=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,bh=/^[a-z0-9_-]{21}$/i,_h=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,Ch=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,kh=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,wh="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$";let Ds;const Sh=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,Th=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,xh=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,Ph=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,Ah=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,Eh=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,Cl="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",Ih=new RegExp(`^${Cl}$`);function kl(e){let t="[0-5]\\d";e.precision?t=`${t}\\.\\d{${e.precision}}`:e.precision==null&&(t=`${t}(\\.\\d+)?`);const n=e.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${t})${n}`}function Rh(e){return new RegExp(`^${kl(e)}$`)}function Lh(e){let t=`${Cl}T${kl(e)}`;const n=[];return n.push(e.local?"Z?":"Z"),e.offset&&n.push("([+-]\\d{2}:?\\d{2})"),t=`${t}(${n.join("|")})`,new RegExp(`^${t}$`)}function Mh(e,t){return!!((t==="v4"||!t)&&Sh.test(e)||(t==="v6"||!t)&&xh.test(e))}function Dh(e,t){if(!_h.test(e))return!1;try{const[n]=e.split(".");if(!n)return!1;const r=n.replace(/-/g,"+").replace(/_/g,"/").padEnd(n.length+(4-n.length%4)%4,"="),s=JSON.parse(atob(r));return!(typeof s!="object"||s===null||"typ"in s&&s?.typ!=="JWT"||!s.alg||t&&s.alg!==t)}catch{return!1}}function Nh(e,t){return!!((t==="v4"||!t)&&Th.test(e)||(t==="v6"||!t)&&Ph.test(e))}class At extends se{_parse(t){if(this._def.coerce&&(t.data=String(t.data)),this._getType(t)!==D.string){const a=this._getOrReturnCtx(t);return M(a,{code:P.invalid_type,expected:D.string,received:a.parsedType}),Y}const r=new je;let s;for(const a of this._def.checks)if(a.kind==="min")t.data.lengtha.value&&(s=this._getOrReturnCtx(t,s),M(s,{code:P.too_big,maximum:a.value,type:"string",inclusive:!0,exact:!1,message:a.message}),r.dirty());else if(a.kind==="length"){const i=t.data.length>a.value,o=t.data.lengtht.test(s),{validation:n,code:P.invalid_string,...U.errToObj(r)})}_addCheck(t){return new At({...this._def,checks:[...this._def.checks,t]})}email(t){return this._addCheck({kind:"email",...U.errToObj(t)})}url(t){return this._addCheck({kind:"url",...U.errToObj(t)})}emoji(t){return this._addCheck({kind:"emoji",...U.errToObj(t)})}uuid(t){return this._addCheck({kind:"uuid",...U.errToObj(t)})}nanoid(t){return this._addCheck({kind:"nanoid",...U.errToObj(t)})}cuid(t){return this._addCheck({kind:"cuid",...U.errToObj(t)})}cuid2(t){return this._addCheck({kind:"cuid2",...U.errToObj(t)})}ulid(t){return this._addCheck({kind:"ulid",...U.errToObj(t)})}base64(t){return this._addCheck({kind:"base64",...U.errToObj(t)})}base64url(t){return this._addCheck({kind:"base64url",...U.errToObj(t)})}jwt(t){return this._addCheck({kind:"jwt",...U.errToObj(t)})}ip(t){return this._addCheck({kind:"ip",...U.errToObj(t)})}cidr(t){return this._addCheck({kind:"cidr",...U.errToObj(t)})}datetime(t){return typeof t=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:t}):this._addCheck({kind:"datetime",precision:typeof t?.precision>"u"?null:t?.precision,offset:t?.offset??!1,local:t?.local??!1,...U.errToObj(t?.message)})}date(t){return this._addCheck({kind:"date",message:t})}time(t){return typeof t=="string"?this._addCheck({kind:"time",precision:null,message:t}):this._addCheck({kind:"time",precision:typeof t?.precision>"u"?null:t?.precision,...U.errToObj(t?.message)})}duration(t){return this._addCheck({kind:"duration",...U.errToObj(t)})}regex(t,n){return this._addCheck({kind:"regex",regex:t,...U.errToObj(n)})}includes(t,n){return this._addCheck({kind:"includes",value:t,position:n?.position,...U.errToObj(n?.message)})}startsWith(t,n){return this._addCheck({kind:"startsWith",value:t,...U.errToObj(n)})}endsWith(t,n){return this._addCheck({kind:"endsWith",value:t,...U.errToObj(n)})}min(t,n){return this._addCheck({kind:"min",value:t,...U.errToObj(n)})}max(t,n){return this._addCheck({kind:"max",value:t,...U.errToObj(n)})}length(t,n){return this._addCheck({kind:"length",value:t,...U.errToObj(n)})}nonempty(t){return this.min(1,U.errToObj(t))}trim(){return new At({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new At({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new At({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(t=>t.kind==="datetime")}get isDate(){return!!this._def.checks.find(t=>t.kind==="date")}get isTime(){return!!this._def.checks.find(t=>t.kind==="time")}get isDuration(){return!!this._def.checks.find(t=>t.kind==="duration")}get isEmail(){return!!this._def.checks.find(t=>t.kind==="email")}get isURL(){return!!this._def.checks.find(t=>t.kind==="url")}get isEmoji(){return!!this._def.checks.find(t=>t.kind==="emoji")}get isUUID(){return!!this._def.checks.find(t=>t.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(t=>t.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(t=>t.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(t=>t.kind==="cuid2")}get isULID(){return!!this._def.checks.find(t=>t.kind==="ulid")}get isIP(){return!!this._def.checks.find(t=>t.kind==="ip")}get isCIDR(){return!!this._def.checks.find(t=>t.kind==="cidr")}get isBase64(){return!!this._def.checks.find(t=>t.kind==="base64")}get isBase64url(){return!!this._def.checks.find(t=>t.kind==="base64url")}get minLength(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxLength(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.valuenew At({checks:[],typeName:G.ZodString,coerce:e?.coerce??!1,...ee(e)});function Oh(e,t){const n=(e.toString().split(".")[1]||"").length,r=(t.toString().split(".")[1]||"").length,s=n>r?n:r,a=Number.parseInt(e.toFixed(s).replace(".","")),i=Number.parseInt(t.toFixed(s).replace(".",""));return a%i/10**s}class nr extends se{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(t){if(this._def.coerce&&(t.data=Number(t.data)),this._getType(t)!==D.number){const a=this._getOrReturnCtx(t);return M(a,{code:P.invalid_type,expected:D.number,received:a.parsedType}),Y}let r;const s=new je;for(const a of this._def.checks)a.kind==="int"?ce.isInteger(t.data)||(r=this._getOrReturnCtx(t,r),M(r,{code:P.invalid_type,expected:"integer",received:"float",message:a.message}),s.dirty()):a.kind==="min"?(a.inclusive?t.dataa.value:t.data>=a.value)&&(r=this._getOrReturnCtx(t,r),M(r,{code:P.too_big,maximum:a.value,type:"number",inclusive:a.inclusive,exact:!1,message:a.message}),s.dirty()):a.kind==="multipleOf"?Oh(t.data,a.value)!==0&&(r=this._getOrReturnCtx(t,r),M(r,{code:P.not_multiple_of,multipleOf:a.value,message:a.message}),s.dirty()):a.kind==="finite"?Number.isFinite(t.data)||(r=this._getOrReturnCtx(t,r),M(r,{code:P.not_finite,message:a.message}),s.dirty()):ce.assertNever(a);return{status:s.value,value:t.data}}gte(t,n){return this.setLimit("min",t,!0,U.toString(n))}gt(t,n){return this.setLimit("min",t,!1,U.toString(n))}lte(t,n){return this.setLimit("max",t,!0,U.toString(n))}lt(t,n){return this.setLimit("max",t,!1,U.toString(n))}setLimit(t,n,r,s){return new nr({...this._def,checks:[...this._def.checks,{kind:t,value:n,inclusive:r,message:U.toString(s)}]})}_addCheck(t){return new nr({...this._def,checks:[...this._def.checks,t]})}int(t){return this._addCheck({kind:"int",message:U.toString(t)})}positive(t){return this._addCheck({kind:"min",value:0,inclusive:!1,message:U.toString(t)})}negative(t){return this._addCheck({kind:"max",value:0,inclusive:!1,message:U.toString(t)})}nonpositive(t){return this._addCheck({kind:"max",value:0,inclusive:!0,message:U.toString(t)})}nonnegative(t){return this._addCheck({kind:"min",value:0,inclusive:!0,message:U.toString(t)})}multipleOf(t,n){return this._addCheck({kind:"multipleOf",value:t,message:U.toString(n)})}finite(t){return this._addCheck({kind:"finite",message:U.toString(t)})}safe(t){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:U.toString(t)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:U.toString(t)})}get minValue(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxValue(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.valuet.kind==="int"||t.kind==="multipleOf"&&ce.isInteger(t.value))}get isFinite(){let t=null,n=null;for(const r of this._def.checks){if(r.kind==="finite"||r.kind==="int"||r.kind==="multipleOf")return!0;r.kind==="min"?(n===null||r.value>n)&&(n=r.value):r.kind==="max"&&(t===null||r.valuenew nr({checks:[],typeName:G.ZodNumber,coerce:e?.coerce||!1,...ee(e)});class rr extends se{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(t){if(this._def.coerce)try{t.data=BigInt(t.data)}catch{return this._getInvalidInput(t)}if(this._getType(t)!==D.bigint)return this._getInvalidInput(t);let r;const s=new je;for(const a of this._def.checks)a.kind==="min"?(a.inclusive?t.dataa.value:t.data>=a.value)&&(r=this._getOrReturnCtx(t,r),M(r,{code:P.too_big,type:"bigint",maximum:a.value,inclusive:a.inclusive,message:a.message}),s.dirty()):a.kind==="multipleOf"?t.data%a.value!==BigInt(0)&&(r=this._getOrReturnCtx(t,r),M(r,{code:P.not_multiple_of,multipleOf:a.value,message:a.message}),s.dirty()):ce.assertNever(a);return{status:s.value,value:t.data}}_getInvalidInput(t){const n=this._getOrReturnCtx(t);return M(n,{code:P.invalid_type,expected:D.bigint,received:n.parsedType}),Y}gte(t,n){return this.setLimit("min",t,!0,U.toString(n))}gt(t,n){return this.setLimit("min",t,!1,U.toString(n))}lte(t,n){return this.setLimit("max",t,!0,U.toString(n))}lt(t,n){return this.setLimit("max",t,!1,U.toString(n))}setLimit(t,n,r,s){return new rr({...this._def,checks:[...this._def.checks,{kind:t,value:n,inclusive:r,message:U.toString(s)}]})}_addCheck(t){return new rr({...this._def,checks:[...this._def.checks,t]})}positive(t){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:U.toString(t)})}negative(t){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:U.toString(t)})}nonpositive(t){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:U.toString(t)})}nonnegative(t){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:U.toString(t)})}multipleOf(t,n){return this._addCheck({kind:"multipleOf",value:t,message:U.toString(n)})}get minValue(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxValue(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.valuenew rr({checks:[],typeName:G.ZodBigInt,coerce:e?.coerce??!1,...ee(e)});class Gi extends se{_parse(t){if(this._def.coerce&&(t.data=!!t.data),this._getType(t)!==D.boolean){const r=this._getOrReturnCtx(t);return M(r,{code:P.invalid_type,expected:D.boolean,received:r.parsedType}),Y}return Xe(t.data)}}Gi.create=e=>new Gi({typeName:G.ZodBoolean,coerce:e?.coerce||!1,...ee(e)});class Br extends se{_parse(t){if(this._def.coerce&&(t.data=new Date(t.data)),this._getType(t)!==D.date){const a=this._getOrReturnCtx(t);return M(a,{code:P.invalid_type,expected:D.date,received:a.parsedType}),Y}if(Number.isNaN(t.data.getTime())){const a=this._getOrReturnCtx(t);return M(a,{code:P.invalid_date}),Y}const r=new je;let s;for(const a of this._def.checks)a.kind==="min"?t.data.getTime()a.value&&(s=this._getOrReturnCtx(t,s),M(s,{code:P.too_big,message:a.message,inclusive:!0,exact:!1,maximum:a.value,type:"date"}),r.dirty()):ce.assertNever(a);return{status:r.value,value:new Date(t.data.getTime())}}_addCheck(t){return new Br({...this._def,checks:[...this._def.checks,t]})}min(t,n){return this._addCheck({kind:"min",value:t.getTime(),message:U.toString(n)})}max(t,n){return this._addCheck({kind:"max",value:t.getTime(),message:U.toString(n)})}get minDate(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t!=null?new Date(t):null}get maxDate(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.valuenew Br({checks:[],coerce:e?.coerce||!1,typeName:G.ZodDate,...ee(e)});class Qi extends se{_parse(t){if(this._getType(t)!==D.symbol){const r=this._getOrReturnCtx(t);return M(r,{code:P.invalid_type,expected:D.symbol,received:r.parsedType}),Y}return Xe(t.data)}}Qi.create=e=>new Qi({typeName:G.ZodSymbol,...ee(e)});class Gs extends se{_parse(t){if(this._getType(t)!==D.undefined){const r=this._getOrReturnCtx(t);return M(r,{code:P.invalid_type,expected:D.undefined,received:r.parsedType}),Y}return Xe(t.data)}}Gs.create=e=>new Gs({typeName:G.ZodUndefined,...ee(e)});class Qs extends se{_parse(t){if(this._getType(t)!==D.null){const r=this._getOrReturnCtx(t);return M(r,{code:P.invalid_type,expected:D.null,received:r.parsedType}),Y}return Xe(t.data)}}Qs.create=e=>new Qs({typeName:G.ZodNull,...ee(e)});class Js extends se{constructor(){super(...arguments),this._any=!0}_parse(t){return Xe(t.data)}}Js.create=e=>new Js({typeName:G.ZodAny,...ee(e)});class Ji extends se{constructor(){super(...arguments),this._unknown=!0}_parse(t){return Xe(t.data)}}Ji.create=e=>new Ji({typeName:G.ZodUnknown,...ee(e)});class Zt extends se{_parse(t){const n=this._getOrReturnCtx(t);return M(n,{code:P.invalid_type,expected:D.never,received:n.parsedType}),Y}}Zt.create=e=>new Zt({typeName:G.ZodNever,...ee(e)});class Xi extends se{_parse(t){if(this._getType(t)!==D.undefined){const r=this._getOrReturnCtx(t);return M(r,{code:P.invalid_type,expected:D.void,received:r.parsedType}),Y}return Xe(t.data)}}Xi.create=e=>new Xi({typeName:G.ZodVoid,...ee(e)});class pt extends se{_parse(t){const{ctx:n,status:r}=this._processInputParams(t),s=this._def;if(n.parsedType!==D.array)return M(n,{code:P.invalid_type,expected:D.array,received:n.parsedType}),Y;if(s.exactLength!==null){const i=n.data.length>s.exactLength.value,o=n.data.lengths.maxLength.value&&(M(n,{code:P.too_big,maximum:s.maxLength.value,type:"array",inclusive:!0,exact:!1,message:s.maxLength.message}),r.dirty()),n.common.async)return Promise.all([...n.data].map((i,o)=>s.type._parseAsync(new vt(n,i,n.path,o)))).then(i=>je.mergeArray(r,i));const a=[...n.data].map((i,o)=>s.type._parseSync(new vt(n,i,n.path,o)));return je.mergeArray(r,a)}get element(){return this._def.type}min(t,n){return new pt({...this._def,minLength:{value:t,message:U.toString(n)}})}max(t,n){return new pt({...this._def,maxLength:{value:t,message:U.toString(n)}})}length(t,n){return new pt({...this._def,exactLength:{value:t,message:U.toString(n)}})}nonempty(t){return this.min(1,t)}}pt.create=(e,t)=>new pt({type:e,minLength:null,maxLength:null,exactLength:null,typeName:G.ZodArray,...ee(t)});function kn(e){if(e instanceof Te){const t={};for(const n in e.shape){const r=e.shape[n];t[n]=It.create(kn(r))}return new Te({...e._def,shape:()=>t})}else return e instanceof pt?new pt({...e._def,type:kn(e.element)}):e instanceof It?It.create(kn(e.unwrap())):e instanceof hn?hn.create(kn(e.unwrap())):e instanceof un?un.create(e.items.map(t=>kn(t))):e}class Te extends se{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;const t=this._def.shape(),n=ce.objectKeys(t);return this._cached={shape:t,keys:n},this._cached}_parse(t){if(this._getType(t)!==D.object){const u=this._getOrReturnCtx(t);return M(u,{code:P.invalid_type,expected:D.object,received:u.parsedType}),Y}const{status:r,ctx:s}=this._processInputParams(t),{shape:a,keys:i}=this._getCached(),o=[];if(!(this._def.catchall instanceof Zt&&this._def.unknownKeys==="strip"))for(const u in s.data)i.includes(u)||o.push(u);const l=[];for(const u of i){const c=a[u],h=s.data[u];l.push({key:{status:"valid",value:u},value:c._parse(new vt(s,h,s.path,u)),alwaysSet:u in s.data})}if(this._def.catchall instanceof Zt){const u=this._def.unknownKeys;if(u==="passthrough")for(const c of o)l.push({key:{status:"valid",value:c},value:{status:"valid",value:s.data[c]}});else if(u==="strict")o.length>0&&(M(s,{code:P.unrecognized_keys,keys:o}),r.dirty());else if(u!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{const u=this._def.catchall;for(const c of o){const h=s.data[c];l.push({key:{status:"valid",value:c},value:u._parse(new vt(s,h,s.path,c)),alwaysSet:c in s.data})}}return s.common.async?Promise.resolve().then(async()=>{const u=[];for(const c of l){const h=await c.key,y=await c.value;u.push({key:h,value:y,alwaysSet:c.alwaysSet})}return u}).then(u=>je.mergeObjectSync(r,u)):je.mergeObjectSync(r,l)}get shape(){return this._def.shape()}strict(t){return U.errToObj,new Te({...this._def,unknownKeys:"strict",...t!==void 0?{errorMap:(n,r)=>{const s=this._def.errorMap?.(n,r).message??r.defaultError;return n.code==="unrecognized_keys"?{message:U.errToObj(t).message??s}:{message:s}}}:{}})}strip(){return new Te({...this._def,unknownKeys:"strip"})}passthrough(){return new Te({...this._def,unknownKeys:"passthrough"})}extend(t){return new Te({...this._def,shape:()=>({...this._def.shape(),...t})})}merge(t){return new Te({unknownKeys:t._def.unknownKeys,catchall:t._def.catchall,shape:()=>({...this._def.shape(),...t._def.shape()}),typeName:G.ZodObject})}setKey(t,n){return this.augment({[t]:n})}catchall(t){return new Te({...this._def,catchall:t})}pick(t){const n={};for(const r of ce.objectKeys(t))t[r]&&this.shape[r]&&(n[r]=this.shape[r]);return new Te({...this._def,shape:()=>n})}omit(t){const n={};for(const r of ce.objectKeys(this.shape))t[r]||(n[r]=this.shape[r]);return new Te({...this._def,shape:()=>n})}deepPartial(){return kn(this)}partial(t){const n={};for(const r of ce.objectKeys(this.shape)){const s=this.shape[r];t&&!t[r]?n[r]=s:n[r]=s.optional()}return new Te({...this._def,shape:()=>n})}required(t){const n={};for(const r of ce.objectKeys(this.shape))if(t&&!t[r])n[r]=this.shape[r];else{let a=this.shape[r];for(;a instanceof It;)a=a._def.innerType;n[r]=a}return new Te({...this._def,shape:()=>n})}keyof(){return wl(ce.objectKeys(this.shape))}}Te.create=(e,t)=>new Te({shape:()=>e,unknownKeys:"strip",catchall:Zt.create(),typeName:G.ZodObject,...ee(t)});Te.strictCreate=(e,t)=>new Te({shape:()=>e,unknownKeys:"strict",catchall:Zt.create(),typeName:G.ZodObject,...ee(t)});Te.lazycreate=(e,t)=>new Te({shape:e,unknownKeys:"strip",catchall:Zt.create(),typeName:G.ZodObject,...ee(t)});class jr extends se{_parse(t){const{ctx:n}=this._processInputParams(t),r=this._def.options;function s(a){for(const o of a)if(o.result.status==="valid")return o.result;for(const o of a)if(o.result.status==="dirty")return n.common.issues.push(...o.ctx.common.issues),o.result;const i=a.map(o=>new Nt(o.ctx.common.issues));return M(n,{code:P.invalid_union,unionErrors:i}),Y}if(n.common.async)return Promise.all(r.map(async a=>{const i={...n,common:{...n.common,issues:[]},parent:null};return{result:await a._parseAsync({data:n.data,path:n.path,parent:i}),ctx:i}})).then(s);{let a;const i=[];for(const l of r){const u={...n,common:{...n.common,issues:[]},parent:null},c=l._parseSync({data:n.data,path:n.path,parent:u});if(c.status==="valid")return c;c.status==="dirty"&&!a&&(a={result:c,ctx:u}),u.common.issues.length&&i.push(u.common.issues)}if(a)return n.common.issues.push(...a.ctx.common.issues),a.result;const o=i.map(l=>new Nt(l));return M(n,{code:P.invalid_union,unionErrors:o}),Y}}get options(){return this._def.options}}jr.create=(e,t)=>new jr({options:e,typeName:G.ZodUnion,...ee(t)});const St=e=>e instanceof Wr?St(e.schema):e instanceof fn?St(e.innerType()):e instanceof Hr?[e.value]:e instanceof dn?e.options:e instanceof ea?ce.objectValues(e.enum):e instanceof Zr?St(e._def.innerType):e instanceof Gs?[void 0]:e instanceof Qs?[null]:e instanceof It?[void 0,...St(e.unwrap())]:e instanceof hn?[null,...St(e.unwrap())]:e instanceof Sl||e instanceof Yr?St(e.unwrap()):e instanceof qr?St(e._def.innerType):[];class wa extends se{_parse(t){const{ctx:n}=this._processInputParams(t);if(n.parsedType!==D.object)return M(n,{code:P.invalid_type,expected:D.object,received:n.parsedType}),Y;const r=this.discriminator,s=n.data[r],a=this.optionsMap.get(s);return a?n.common.async?a._parseAsync({data:n.data,path:n.path,parent:n}):a._parseSync({data:n.data,path:n.path,parent:n}):(M(n,{code:P.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[r]}),Y)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(t,n,r){const s=new Map;for(const a of n){const i=St(a.shape[t]);if(!i.length)throw new Error(`A discriminator value for key \`${t}\` could not be extracted from all schema options`);for(const o of i){if(s.has(o))throw new Error(`Discriminator property ${String(t)} has duplicate value ${String(o)}`);s.set(o,a)}}return new wa({typeName:G.ZodDiscriminatedUnion,discriminator:t,options:n,optionsMap:s,...ee(r)})}}function Xs(e,t){const n=Wt(e),r=Wt(t);if(e===t)return{valid:!0,data:e};if(n===D.object&&r===D.object){const s=ce.objectKeys(t),a=ce.objectKeys(e).filter(o=>s.indexOf(o)!==-1),i={...e,...t};for(const o of a){const l=Xs(e[o],t[o]);if(!l.valid)return{valid:!1};i[o]=l.data}return{valid:!0,data:i}}else if(n===D.array&&r===D.array){if(e.length!==t.length)return{valid:!1};const s=[];for(let a=0;a{if(Zi(a)||Zi(i))return Y;const o=Xs(a.value,i.value);return o.valid?((qi(a)||qi(i))&&n.dirty(),{status:n.value,value:o.data}):(M(r,{code:P.invalid_intersection_types}),Y)};return r.common.async?Promise.all([this._def.left._parseAsync({data:r.data,path:r.path,parent:r}),this._def.right._parseAsync({data:r.data,path:r.path,parent:r})]).then(([a,i])=>s(a,i)):s(this._def.left._parseSync({data:r.data,path:r.path,parent:r}),this._def.right._parseSync({data:r.data,path:r.path,parent:r}))}}Vr.create=(e,t,n)=>new Vr({left:e,right:t,typeName:G.ZodIntersection,...ee(n)});class un extends se{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==D.array)return M(r,{code:P.invalid_type,expected:D.array,received:r.parsedType}),Y;if(r.data.lengththis._def.items.length&&(M(r,{code:P.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),n.dirty());const a=[...r.data].map((i,o)=>{const l=this._def.items[o]||this._def.rest;return l?l._parse(new vt(r,i,r.path,o)):null}).filter(i=>!!i);return r.common.async?Promise.all(a).then(i=>je.mergeArray(n,i)):je.mergeArray(n,a)}get items(){return this._def.items}rest(t){return new un({...this._def,rest:t})}}un.create=(e,t)=>{if(!Array.isArray(e))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new un({items:e,typeName:G.ZodTuple,rest:null,...ee(t)})};class $r extends se{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==D.object)return M(r,{code:P.invalid_type,expected:D.object,received:r.parsedType}),Y;const s=[],a=this._def.keyType,i=this._def.valueType;for(const o in r.data)s.push({key:a._parse(new vt(r,o,r.path,o)),value:i._parse(new vt(r,r.data[o],r.path,o)),alwaysSet:o in r.data});return r.common.async?je.mergeObjectAsync(n,s):je.mergeObjectSync(n,s)}get element(){return this._def.valueType}static create(t,n,r){return n instanceof se?new $r({keyType:t,valueType:n,typeName:G.ZodRecord,...ee(r)}):new $r({keyType:At.create(),valueType:t,typeName:G.ZodRecord,...ee(n)})}}class eo extends se{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==D.map)return M(r,{code:P.invalid_type,expected:D.map,received:r.parsedType}),Y;const s=this._def.keyType,a=this._def.valueType,i=[...r.data.entries()].map(([o,l],u)=>({key:s._parse(new vt(r,o,r.path,[u,"key"])),value:a._parse(new vt(r,l,r.path,[u,"value"]))}));if(r.common.async){const o=new Map;return Promise.resolve().then(async()=>{for(const l of i){const u=await l.key,c=await l.value;if(u.status==="aborted"||c.status==="aborted")return Y;(u.status==="dirty"||c.status==="dirty")&&n.dirty(),o.set(u.value,c.value)}return{status:n.value,value:o}})}else{const o=new Map;for(const l of i){const u=l.key,c=l.value;if(u.status==="aborted"||c.status==="aborted")return Y;(u.status==="dirty"||c.status==="dirty")&&n.dirty(),o.set(u.value,c.value)}return{status:n.value,value:o}}}}eo.create=(e,t,n)=>new eo({valueType:t,keyType:e,typeName:G.ZodMap,...ee(n)});class sr extends se{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==D.set)return M(r,{code:P.invalid_type,expected:D.set,received:r.parsedType}),Y;const s=this._def;s.minSize!==null&&r.data.sizes.maxSize.value&&(M(r,{code:P.too_big,maximum:s.maxSize.value,type:"set",inclusive:!0,exact:!1,message:s.maxSize.message}),n.dirty());const a=this._def.valueType;function i(l){const u=new Set;for(const c of l){if(c.status==="aborted")return Y;c.status==="dirty"&&n.dirty(),u.add(c.value)}return{status:n.value,value:u}}const o=[...r.data.values()].map((l,u)=>a._parse(new vt(r,l,r.path,u)));return r.common.async?Promise.all(o).then(l=>i(l)):i(o)}min(t,n){return new sr({...this._def,minSize:{value:t,message:U.toString(n)}})}max(t,n){return new sr({...this._def,maxSize:{value:t,message:U.toString(n)}})}size(t,n){return this.min(t,n).max(t,n)}nonempty(t){return this.min(1,t)}}sr.create=(e,t)=>new sr({valueType:e,minSize:null,maxSize:null,typeName:G.ZodSet,...ee(t)});class Wr extends se{get schema(){return this._def.getter()}_parse(t){const{ctx:n}=this._processInputParams(t);return this._def.getter()._parse({data:n.data,path:n.path,parent:n})}}Wr.create=(e,t)=>new Wr({getter:e,typeName:G.ZodLazy,...ee(t)});class Hr extends se{_parse(t){if(t.data!==this._def.value){const n=this._getOrReturnCtx(t);return M(n,{received:n.data,code:P.invalid_literal,expected:this._def.value}),Y}return{status:"valid",value:t.data}}get value(){return this._def.value}}Hr.create=(e,t)=>new Hr({value:e,typeName:G.ZodLiteral,...ee(t)});function wl(e,t){return new dn({values:e,typeName:G.ZodEnum,...ee(t)})}class dn extends se{_parse(t){if(typeof t.data!="string"){const n=this._getOrReturnCtx(t),r=this._def.values;return M(n,{expected:ce.joinValues(r),received:n.parsedType,code:P.invalid_type}),Y}if(this._cache||(this._cache=new Set(this._def.values)),!this._cache.has(t.data)){const n=this._getOrReturnCtx(t),r=this._def.values;return M(n,{received:n.data,code:P.invalid_enum_value,options:r}),Y}return Xe(t.data)}get options(){return this._def.values}get enum(){const t={};for(const n of this._def.values)t[n]=n;return t}get Values(){const t={};for(const n of this._def.values)t[n]=n;return t}get Enum(){const t={};for(const n of this._def.values)t[n]=n;return t}extract(t,n=this._def){return dn.create(t,{...this._def,...n})}exclude(t,n=this._def){return dn.create(this.options.filter(r=>!t.includes(r)),{...this._def,...n})}}dn.create=wl;class ea extends se{_parse(t){const n=ce.getValidEnumValues(this._def.values),r=this._getOrReturnCtx(t);if(r.parsedType!==D.string&&r.parsedType!==D.number){const s=ce.objectValues(n);return M(r,{expected:ce.joinValues(s),received:r.parsedType,code:P.invalid_type}),Y}if(this._cache||(this._cache=new Set(ce.getValidEnumValues(this._def.values))),!this._cache.has(t.data)){const s=ce.objectValues(n);return M(r,{received:r.data,code:P.invalid_enum_value,options:s}),Y}return Xe(t.data)}get enum(){return this._def.values}}ea.create=(e,t)=>new ea({values:e,typeName:G.ZodNativeEnum,...ee(t)});class Kr extends se{unwrap(){return this._def.type}_parse(t){const{ctx:n}=this._processInputParams(t);if(n.parsedType!==D.promise&&n.common.async===!1)return M(n,{code:P.invalid_type,expected:D.promise,received:n.parsedType}),Y;const r=n.parsedType===D.promise?n.data:Promise.resolve(n.data);return Xe(r.then(s=>this._def.type.parseAsync(s,{path:n.path,errorMap:n.common.contextualErrorMap})))}}Kr.create=(e,t)=>new Kr({type:e,typeName:G.ZodPromise,...ee(t)});class fn extends se{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===G.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(t){const{status:n,ctx:r}=this._processInputParams(t),s=this._def.effect||null,a={addIssue:i=>{M(r,i),i.fatal?n.abort():n.dirty()},get path(){return r.path}};if(a.addIssue=a.addIssue.bind(a),s.type==="preprocess"){const i=s.transform(r.data,a);if(r.common.async)return Promise.resolve(i).then(async o=>{if(n.value==="aborted")return Y;const l=await this._def.schema._parseAsync({data:o,path:r.path,parent:r});return l.status==="aborted"?Y:l.status==="dirty"||n.value==="dirty"?Bn(l.value):l});{if(n.value==="aborted")return Y;const o=this._def.schema._parseSync({data:i,path:r.path,parent:r});return o.status==="aborted"?Y:o.status==="dirty"||n.value==="dirty"?Bn(o.value):o}}if(s.type==="refinement"){const i=o=>{const l=s.refinement(o,a);if(r.common.async)return Promise.resolve(l);if(l instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return o};if(r.common.async===!1){const o=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});return o.status==="aborted"?Y:(o.status==="dirty"&&n.dirty(),i(o.value),{status:n.value,value:o.value})}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(o=>o.status==="aborted"?Y:(o.status==="dirty"&&n.dirty(),i(o.value).then(()=>({status:n.value,value:o.value}))))}if(s.type==="transform")if(r.common.async===!1){const i=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});if(!Ln(i))return Y;const o=s.transform(i.value,a);if(o instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:n.value,value:o}}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(i=>Ln(i)?Promise.resolve(s.transform(i.value,a)).then(o=>({status:n.value,value:o})):Y);ce.assertNever(s)}}fn.create=(e,t,n)=>new fn({schema:e,typeName:G.ZodEffects,effect:t,...ee(n)});fn.createWithPreprocess=(e,t,n)=>new fn({schema:t,effect:{type:"preprocess",transform:e},typeName:G.ZodEffects,...ee(n)});class It extends se{_parse(t){return this._getType(t)===D.undefined?Xe(void 0):this._def.innerType._parse(t)}unwrap(){return this._def.innerType}}It.create=(e,t)=>new It({innerType:e,typeName:G.ZodOptional,...ee(t)});class hn extends se{_parse(t){return this._getType(t)===D.null?Xe(null):this._def.innerType._parse(t)}unwrap(){return this._def.innerType}}hn.create=(e,t)=>new hn({innerType:e,typeName:G.ZodNullable,...ee(t)});class Zr extends se{_parse(t){const{ctx:n}=this._processInputParams(t);let r=n.data;return n.parsedType===D.undefined&&(r=this._def.defaultValue()),this._def.innerType._parse({data:r,path:n.path,parent:n})}removeDefault(){return this._def.innerType}}Zr.create=(e,t)=>new Zr({innerType:e,typeName:G.ZodDefault,defaultValue:typeof t.default=="function"?t.default:()=>t.default,...ee(t)});class qr extends se{_parse(t){const{ctx:n}=this._processInputParams(t),r={...n,common:{...n.common,issues:[]}},s=this._def.innerType._parse({data:r.data,path:r.path,parent:{...r}});return Fr(s)?s.then(a=>({status:"valid",value:a.status==="valid"?a.value:this._def.catchValue({get error(){return new Nt(r.common.issues)},input:r.data})})):{status:"valid",value:s.status==="valid"?s.value:this._def.catchValue({get error(){return new Nt(r.common.issues)},input:r.data})}}removeCatch(){return this._def.innerType}}qr.create=(e,t)=>new qr({innerType:e,typeName:G.ZodCatch,catchValue:typeof t.catch=="function"?t.catch:()=>t.catch,...ee(t)});class to extends se{_parse(t){if(this._getType(t)!==D.nan){const r=this._getOrReturnCtx(t);return M(r,{code:P.invalid_type,expected:D.nan,received:r.parsedType}),Y}return{status:"valid",value:t.data}}}to.create=e=>new to({typeName:G.ZodNaN,...ee(e)});class Sl extends se{_parse(t){const{ctx:n}=this._processInputParams(t),r=n.data;return this._def.type._parse({data:r,path:n.path,parent:n})}unwrap(){return this._def.type}}class Sa extends se{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.common.async)return(async()=>{const a=await this._def.in._parseAsync({data:r.data,path:r.path,parent:r});return a.status==="aborted"?Y:a.status==="dirty"?(n.dirty(),Bn(a.value)):this._def.out._parseAsync({data:a.value,path:r.path,parent:r})})();{const s=this._def.in._parseSync({data:r.data,path:r.path,parent:r});return s.status==="aborted"?Y:s.status==="dirty"?(n.dirty(),{status:"dirty",value:s.value}):this._def.out._parseSync({data:s.value,path:r.path,parent:r})}}static create(t,n){return new Sa({in:t,out:n,typeName:G.ZodPipeline})}}class Yr extends se{_parse(t){const n=this._def.innerType._parse(t),r=s=>(Ln(s)&&(s.value=Object.freeze(s.value)),s);return Fr(n)?n.then(s=>r(s)):r(n)}unwrap(){return this._def.innerType}}Yr.create=(e,t)=>new Yr({innerType:e,typeName:G.ZodReadonly,...ee(t)});var G;(function(e){e.ZodString="ZodString",e.ZodNumber="ZodNumber",e.ZodNaN="ZodNaN",e.ZodBigInt="ZodBigInt",e.ZodBoolean="ZodBoolean",e.ZodDate="ZodDate",e.ZodSymbol="ZodSymbol",e.ZodUndefined="ZodUndefined",e.ZodNull="ZodNull",e.ZodAny="ZodAny",e.ZodUnknown="ZodUnknown",e.ZodNever="ZodNever",e.ZodVoid="ZodVoid",e.ZodArray="ZodArray",e.ZodObject="ZodObject",e.ZodUnion="ZodUnion",e.ZodDiscriminatedUnion="ZodDiscriminatedUnion",e.ZodIntersection="ZodIntersection",e.ZodTuple="ZodTuple",e.ZodRecord="ZodRecord",e.ZodMap="ZodMap",e.ZodSet="ZodSet",e.ZodFunction="ZodFunction",e.ZodLazy="ZodLazy",e.ZodLiteral="ZodLiteral",e.ZodEnum="ZodEnum",e.ZodEffects="ZodEffects",e.ZodNativeEnum="ZodNativeEnum",e.ZodOptional="ZodOptional",e.ZodNullable="ZodNullable",e.ZodDefault="ZodDefault",e.ZodCatch="ZodCatch",e.ZodPromise="ZodPromise",e.ZodBranded="ZodBranded",e.ZodPipeline="ZodPipeline",e.ZodReadonly="ZodReadonly"})(G||(G={}));const wn=At.create,zh=Js.create;Zt.create;const ta=pt.create,ar=Te.create;jr.create;const Uh=wa.create;Vr.create;un.create;const Fh=$r.create,Bh=Wr.create,no=Hr.create,jh=dn.create;Kr.create;It.create;hn.create;const Vh=ar({id:wn().min(1),type:wn().min(1),props:Fh(zh()).optional().default({}),bind:wn().optional(),emit:wn().optional()}),Tl=Bh(()=>Uh("type",[ar({type:no("split"),orientation:jh(["horizontal","vertical"]),children:ta(Tl).min(1)}),ar({type:no("leaf"),title:wn().optional(),widgets:ta(wn()).min(1)})])),$h=ar({ui:ar({widgets:ta(Vh).default([]),layout:Tl})});function Wh(e){const t=$h.safeParse(e);if(!t.success){const o=t.error.issues[0],l=o.path.length?o.path.join("."):"ui";return{ok:!1,error:{message:o.message,path:l}}}const n=t.data,r=new Set;for(const o of n.ui.widgets){if(r.has(o.id))return{ok:!1,error:{message:`duplicate widget id: ${o.id}`,path:"ui.widgets"}};r.add(o.id)}const s=new Set(n.ui.widgets.map(o=>o.id)),a=[];function i(o,l){o.type==="split"?o.children.forEach((u,c)=>i(u,`${l}.children[${c}]`)):o.widgets.forEach((u,c)=>{s.has(u)||a.push(`${l}.widgets[${c}] -> ${u}`)})}return i(n.ui.layout,"ui.layout"),a.length?{ok:!1,error:{message:`unknown widget id: ${a[0]}`,path:"ui.layout"}}:{ok:!0,value:n}}const Hh=`ui: + widgets: + - id: wifi-ssid + type: input.text + props: + label: WiFi SSID + hint: 输入网络名称 + default: Office_Network + bind: wifi.ssid + - id: wifi-enabled + type: input.switch + props: + label: 启用 WiFi + default: true + bind: wifi.enabled + - id: apply + type: action.button + props: + label: 应用设置 + payload: + scope: wifi + emit: action.wifi.apply + - id: log-panel + type: log.viewer + props: + title: WiFi 事件日志 + bind: wifi.events + layout: + type: split + orientation: horizontal + children: + - type: leaf + title: 网络配置 + widgets: [wifi-ssid, wifi-enabled, apply] + - type: leaf + title: 事件流 + widgets: [log-panel] +`,Kh=ch("uiRuntime",{state:()=>({yamlText:Hh,lastGoodConfig:null,parseError:null,widgetsById:{},selectedWidgetId:null,inputValues:{},eventLog:[],dataBus:{},_debounceTimer:0}),actions:{setYamlText(e){this.yamlText=e},tryParseAndValidate(){this._debounceTimer&&clearTimeout(this._debounceTimer),this._debounceTimer=window.setTimeout(()=>{this._parseWithBridge()},300)},async _parseWithBridge(){const e=window.bridge;if(e&&e.parse_ui_yaml)try{const t=await Promise.resolve(e.parse_ui_yaml(this.yamlText));this._handleParseResult(t);return}catch(t){this.parseError={message:String(t||"bridge parse error")};return}this.parseError={message:"WebBridge unavailable for YAML parsing"}},_handleParseResult(e){if(!e.ok){const s=e.error||{message:"YAML parse error"};this.parseError={message:s.message,line:s.line,column:s.column};return}const t=Wh(e.value);if(!t.ok){this.parseError={message:t.error.message,path:t.error.path};return}const n=t.value,r={};n.ui.widgets.forEach(s=>{r[s.id]={...s,props:s.props||{}}}),this.widgetsById=r,this.lastGoodConfig=n,this.parseError=null},selectWidget(e){this.selectedWidgetId=e},getInputValue(e,t){return this.inputValues[e]===void 0&&t!==void 0&&(this.inputValues[e]=t),this.inputValues[e]},setInputValue(e,t,n){this.inputValues[e]=t,n&&this.pushData(n,t)},dispatchEvent(e){this.eventLog.push({ts:Date.now(),...e});const t=window.bridge;t&&t.dispatch_ui_event&&t.dispatch_ui_event({ts:Date.now(),...e})},pushData(e,t){this.dataBus[e]||(this.dataBus[e]=[]),this.dataBus[e].push({ts:Date.now(),value:t}),this.dataBus[e].length>200&&(this.dataBus[e]=this.dataBus[e].slice(-200))},bindBridge(e){!e||!e.ui_event_log||e.ui_event_log.connect(t=>{t&&this.eventLog.push({ts:t.ts?Number(t.ts):Date.now(),emit:t.emit||"",payload:t.payload,source:t.source})})}}}),Zh={"nav.manual":"串口终端","nav.scripts":"自动脚本","nav.proxy":"代理监控","nav.protocols":"协议管理","nav.settings":"设置","nav.workspace":"管理员工作区","header.manual.title":"串口终端","header.manual.desc":"传统串口调试工具:发送命令,监听 I/O 与日志回显。","header.scripts.title":"自动脚本","header.scripts.desc":"用于协议解析与测试脚本自动化执行。","header.proxy.title":"代理监控","header.proxy.desc":"管理转发链路并实时监控数据流状态。","header.protocols.title":"协议管理","header.protocols.desc":"配置通信协议定义,绑定通道并设置解析规则。","header.settings.title":"应用设置","header.settings.desc":"管理全局偏好、协议默认值和运行时环境配置。","action.refresh":"刷新","action.createProtocol":"新建协议","action.discardChanges":"放弃更改","action.saveChanges":"保存修改","action.loadScript":"加载脚本","action.save":"保存","badge.readOnly":"只读","action.refreshStatus":"刷新状态","action.newProxy":"新建转发对","action.connect":"连接","action.disconnect":"断开","filter.all":"全部","filter.running":"运行中","filter.stopped":"已停止","filter.error":"异常","status.connected":"已连接","status.disconnected":"未连接","status.error":"错误","status.connecting":"连接中","protocol.tab.all":"全部协议","protocol.tab.modbus":"Modbus","protocol.tab.tcp":"TCP/IP","protocol.tab.custom":"自定义","settings.tab.general":"通用","settings.tab.plugins":"插件","settings.tab.runtime":"运行时","settings.tab.logs":"日志","settings.language":"界面语言","settings.theme":"主题偏好","settings.autoConnect.title":"启动时自动连接","settings.autoConnect.desc":"自动尝试重连上次活动的通道。","settings.workspace":"工作目录","settings.chooseFolder":"选择目录","settings.plugins.title":"插件管理","settings.plugins.refresh":"刷新列表","settings.plugins.directory":"插件目录","settings.protocols.title":"协议包","settings.filter.enabled":"已启用","settings.filter.available":"可用","settings.meta.unversioned":"未标注版本","settings.empty.filtered":"当前筛选无结果","settings.empty.noPlugins":"未发现可用插件","settings.empty.noProtocols":"未发现可用协议包","settings.runtime.placeholder":"暂无可配置项,运行时设置将随着模块扩展开放。","settings.logs.placeholder":"日志采集与归档策略将在后续版本中提供。","lang.zhCN":"简体中文","lang.zhTW":"繁體中文","lang.enUS":"English (US)","lang.jaJP":"日本語","lang.koKR":"한국어","lang.frFR":"Français","lang.deDE":"Deutsch","lang.esES":"Español","lang.ptBR":"Português (Brasil)","lang.ruRU":"Русский","lang.ar":"العربية","lang.hi":"हिन्दी","lang.itIT":"Italiano","lang.nlNL":"Nederlands","lang.thTH":"ไทย","lang.viVN":"Tiếng Việt","lang.idID":"Bahasa Indonesia","lang.trTR":"Türkçe","lang.plPL":"Polski","lang.ukUA":"Українська","theme.system":"系统默认","theme.dark":"深色 (工程模式)","theme.light":"浅色"},Pe={"nav.manual":"Serial Terminal","nav.scripts":"Automation Scripts","nav.proxy":"Proxy Monitor","nav.protocols":"Protocol Manager","nav.settings":"Settings","nav.workspace":"Admin Workspace","header.manual.title":"Serial Terminal","header.manual.desc":"Classic serial console for sending commands, monitoring I/O and logs.","header.scripts.title":"Automation Scripts","header.scripts.desc":"Run parsing and test automation scripts.","header.proxy.title":"Proxy Monitor","header.proxy.desc":"Manage forwarding links and monitor data streams.","header.protocols.title":"Protocol Manager","header.protocols.desc":"Define protocols, bind channels, and configure parsing rules.","header.settings.title":"App Settings","header.settings.desc":"Manage global preferences, defaults, and runtime configuration.","action.refresh":"Refresh","action.createProtocol":"New Protocol","action.discardChanges":"Discard Changes","action.saveChanges":"Save Changes","action.loadScript":"Load Script","action.save":"Save","badge.readOnly":"Read-only","action.refreshStatus":"Refresh Status","action.newProxy":"New Forward Pair","action.connect":"Connect","action.disconnect":"Disconnect","filter.all":"All","filter.running":"Running","filter.stopped":"Stopped","filter.error":"Error","status.connected":"Connected","status.disconnected":"Disconnected","status.error":"Error","status.connecting":"Connecting","protocol.tab.all":"All Protocols","protocol.tab.modbus":"Modbus","protocol.tab.tcp":"TCP/IP","protocol.tab.custom":"Custom","settings.tab.general":"General","settings.tab.plugins":"Plugins","settings.tab.runtime":"Runtime","settings.tab.logs":"Logs","settings.language":"Language","settings.theme":"Theme","settings.autoConnect.title":"Auto-connect on launch","settings.autoConnect.desc":"Reconnect to the last active channel automatically.","settings.workspace":"Workspace","settings.chooseFolder":"Choose Folder","settings.plugins.title":"Plugins","settings.plugins.refresh":"Refresh List","settings.plugins.directory":"Plugin Directory","settings.protocols.title":"Protocol Packages","settings.filter.enabled":"Enabled","settings.filter.available":"Available","settings.meta.unversioned":"Version not specified","settings.empty.filtered":"No results for current filter","settings.empty.noPlugins":"No available plugins found","settings.empty.noProtocols":"No available protocol packages found","settings.runtime.placeholder":"No configurable items yet. Runtime settings will be opened as modules expand.","settings.logs.placeholder":"Log collection and archive policy will be provided in a later release.","lang.zhCN":"简体中文","lang.zhTW":"繁體中文","lang.enUS":"English (US)","lang.jaJP":"日本語","lang.koKR":"한국어","lang.frFR":"Français","lang.deDE":"Deutsch","lang.esES":"Español","lang.ptBR":"Português (Brasil)","lang.ruRU":"Русский","lang.ar":"العربية","lang.hi":"हिन्दी","lang.itIT":"Italiano","lang.nlNL":"Nederlands","lang.thTH":"ไทย","lang.viVN":"Tiếng Việt","lang.idID":"Bahasa Indonesia","lang.trTR":"Türkçe","lang.plPL":"Polski","lang.ukUA":"Українська","theme.system":"System","theme.dark":"Dark (Engineer)","theme.light":"Light",Copy:"Copy","DSL 编辑器":"DSL Editor","GPS 模块数据流":"GPS Module Data Stream","IO 监控":"I/O Monitor","MQTT 适配器":"MQTT Adapter","TCP / 网络":"TCP / Network","TCP 客户端":"TCP Client","TCP 服务端":"TCP Server","TCP 端口":"TCP Port","UI YAML 预览":"UI YAML Preview","YAML UI 编辑器":"YAML UI Editor",复制:"Copy",展开:"Expand",搜索:"Search",收起:"Collapse",清空日志:"Clear Logs",滚动到底部:"Scroll to Bottom","v0.9.8 - 未安装":"v0.9.8 - Not Installed","v1.2.4 - 已启用":"v1.2.4 - Enabled","丢包率 (Packet Loss)":"Packet Loss","串口 (Serial)":"Serial","串口 (UART)":"Serial (UART)",串口参数:"Serial Parameters",串口参数配置:"Serial Parameter Setup",串口端口:"Serial Port",串口设置:"Serial Settings",串口通道:"Serial Channel",串口配置:"Serial Configuration",主控制器链路:"Main Controller Link",主机源端口:"Host Source Port",主机端口:"Host Port",代理名称:"Proxy Name","例如:192.168.1.10":"Example: 192.168.1.10","例如:CMD PING":"Example: CMD PING","例如:传感器A接口":"Example: Sensor A Interface",保存:"Save",保存修改:"Save Changes",保存后立即连接:"Connect after saving",保存配置:"Save Configuration",停止:"Stop",停止位:"Stop Bits",偶校验:"Even Parity",全部日志:"All Logs",共:"Total","写超时 (ms)":"Write Timeout (ms)",分类:"Category",列:"Columns",创建后立即启动连接:"Start connection after creation",创建指令:"Create Command",创建新的快捷调试指令:"Create a new quick command",创建通道:"Create Channel",删除:"Delete","删除前将停止转发。":"Forwarding will stop before deletion.",删除协议:"Delete Protocol",删除快捷指令:"Delete Quick Command",刷新:"Refresh",刷新串口:"Refresh Ports",动作:"Action",协议:"Protocol",协议名称:"Protocol Name","协议层级解析 (PROTOCOL TREE)":"Protocol Tree (PROTOCOL TREE)",协议桥接:"Protocol Bridge",协议详情:"Protocol Details",原始值:"Raw Value","原始十六进制 (RAW HEX)":"Raw Hex (RAW HEX)",原始数据:"Raw Data",发布规格页:"Publish Spec Page",发送数据:"Send Data",发送选项:"Send Options",取消:"Cancel",变量名:"Variable Name",变量监控:"Variable Monitor",可用:"Available","吗?":" ?",基本信息:"Basic Info",复制原始十六进制:"Copy Raw Hex",多协议通用报文分析引擎:"Multi-Protocol Packet Analysis Engine","通用动态解析 (Agnostic Engine)":"Agnostic Parsing Engine",奇校验:"Odd Parity",字段:"Fields",字节:"Bytes",实时带宽:"Live Bandwidth",实时渲染:"Live Rendering",实时网络指标:"Live Network Metrics",导出:"Export",导出分析结果:"Export Analysis",导出数据格式:"Export Format",已停止:"Stopped","已匹配协议解析插件,当前展示该报文的解析详情。":"A protocol parser is matched. Showing parsed details for this packet.",已启用:"Enabled",已用时间:"Elapsed",已禁用:"Disabled",序号:"No.",异常:"Error",引擎状态:"Engine Status",当前值:"Current Value","当前步骤:":"Current Step:","往返延时 (RTT)":"Round-trip time (RTT)",循环发送:"Loop Send",快捷指令:"Quick Commands",快捷指令编辑:"Quick Command Editor",手动解析:"Manual Parse",执行控制:"Execution Control",批量运行:"Batch Run",抓包:"Capture",报文:"Packets",报文解析详情:"Packet Analysis Details",指令内容:"Command Content",指令名称:"Command Name",接收缓冲区:"Receive Buffer",描述:"Description",搜索关键词:"Search keywords","搜索标识、十六进制、协议、原始数据...":"Search IDs, hex, protocol, raw data...","摘要 (解析结果/HEX/ASCII)":"Summary (Parsed/HEX/ASCII)",数据位:"Data Bits",文本:"Text",文档中心:"Documentation",新增快捷指令:"Add Quick Command",新建协议:"New Protocol",新建转发对:"New Forward Pair",新建通道:"New Channel",方向:"Direction",无:"None",无可用串口:"No available serial ports",无校验:"No Parity","日志采集与归档策略将在后续版本中提供。":"Log collection and archiving policies will be available in a future release.",时间戳:"Timestamp",映射模式:"Mapping Mode",显示:"Showing",暂停:"Pause",暂无十六进制数据:"No hex data",暂无协议:"No protocols",暂无协议解析数据:"No protocol parsing data","暂无可渲染的 UI 配置":"No renderable UI configuration","暂无可用协议,可从内置模板创建或新增自定义协议。":"No protocols available. Create from built-in templates or add custom.","暂无可配置项,运行时设置将随着模块扩展开放。":"No configurable items. Runtime settings will open as modules expand.",暂无报文数据:"No packet data",暂无描述:"No description",未命名指令:"Untitled Command",未命名转发对:"Unnamed Forward Pair",未安装:"Not Installed",未知:"Unknown","未知协议报文 (Unknown Protocol)":"Unknown Protocol Packet (Unknown Protocol)",未选择任何组件:"No component selected",条日志记录:"log entries",查看:"View","查看或更新协议描述与分类。":"View or update protocol description and category.",查看详情:"View Details",校验位:"Parity","格式:":"Format:",波特率:"Baud Rate",活动通道:"Active Channel",流控:"Flow Control","浏览...":"Browse...","添加 CR (\r)":"Add CR (\r)","添加 LF (\n)":`Add LF ( +)`,"添加自定义协议元数据,供解析引擎识别。":"Add custom protocol metadata for the parser engine.",清除:"Clear",清除日志:"Clear Logs",版本:"Version",状态:"Status",电机反馈继电器:"Motor Feedback Relay",目标地址:"Target Address",确认删除:"Confirm Delete",确认删除自定义协议:"Confirm delete custom protocol","确认删除该快捷指令,删除后无法恢复。":"Confirm delete this quick command? This action cannot be undone.",确认删除转发对:"Confirm delete forward pair",离线:"Offline",空闲:"Idle",端口:"Port",第:"Page","等待 YAML 配置...":"Waiting for YAML configuration...","系统未能自动匹配已知的解析插件。您可以尝试手动配置解析规则,或使用万能解析脚本。":"The system could not match a known parser. Try manual rules or use the universal parsing script.",继续捕获:"Resume Capture",编译日期:"Build Date",编辑:"Edit",编辑或更新现有的快捷调试指令:"Edit or update an existing quick command",编辑转发代理:"Edit Forward Proxy","网络 (TCP)":"Network (TCP)","脚本运行中展示 UI 渲染结果":"Show UI rendering while script runs",自动重连:"Auto Reconnect",自定义:"Custom",行:"Rows",解析值:"Parsed Value",解析失败:"Parse Failed",解析错误:"Parse Error",设备代理端口:"Device Proxy Port",设备端口:"Device Port",详细日志:"Verbose Logs",请输入指令名称和内容:"Enter command name and content","读超时 (ms)":"Read Timeout (ms)",调整解析规则:"Adjust parsing rules",路径:"Path",转发中:"Forwarding","输入搜索...":"Enter search...",输入要发送的指令内容:"Enter command content to send","输入要发送的数据...":"Enter data to send...","过滤日志...":"Filter logs...",运行:"Run",运行中:"Running",运行日志:"Run Logs",连接失败:"Connection Failed",连接模式:"Connection Mode",选择串口:"Select Serial Port",选择工作区:"Select Workspace",选择路径:"Select Path",透传模式:"Transparent Mode",通道名称:"Channel Name",配置:"Configure",配置串口连接参数:"Configure serial connection parameters",配置协议:"Configure Protocol",配置新的通信连接参数:"Configure new connection parameters",配置解析规则:"Configure parsing rules",重置:"Reset","链路层 (Data Link Layer)":"Data Link Layer",错误数:"Error Count",键名:"Key",长度:"Length",问题反馈:"Feedback",页:"",驱动:"Driver",驱动类:"Driver Class",高级选项:"Advanced Options","(两端需一致)":"(Both ends must match)"},qh={...Pe,"nav.manual":"串口終端","nav.scripts":"自動腳本","nav.proxy":"代理監控","nav.protocols":"協議管理","nav.settings":"設定","nav.workspace":"管理員工作區","header.manual.title":"串口終端","header.manual.desc":"傳統串口調試工具:發送命令,監聽 I/O 與日誌回顯。","header.scripts.title":"自動腳本","header.scripts.desc":"用於協議解析與測試腳本自動化執行。","header.proxy.title":"代理監控","header.proxy.desc":"管理轉發鏈路並即時監控資料流狀態。","header.protocols.title":"協議管理","header.protocols.desc":"配置通訊協議定義,綁定通道並設定解析規則。","header.settings.title":"應用設定","header.settings.desc":"管理全域偏好、協議預設值與執行時環境配置。","action.refresh":"重新整理","action.createProtocol":"新增協議","action.discardChanges":"放棄變更","action.saveChanges":"儲存變更","action.loadScript":"載入腳本","action.save":"儲存","badge.readOnly":"唯讀","action.refreshStatus":"重新整理狀態","action.newProxy":"新增轉發對","action.connect":"連線","action.disconnect":"中斷連線","filter.all":"全部","filter.running":"執行中","filter.stopped":"已停止","filter.error":"異常","status.connected":"已連線","status.disconnected":"未連線","status.error":"錯誤","status.connecting":"連線中","protocol.tab.all":"全部協議","protocol.tab.modbus":"Modbus","protocol.tab.tcp":"TCP/IP","protocol.tab.custom":"自訂","settings.tab.general":"通用","settings.tab.plugins":"外掛","settings.tab.runtime":"執行時","settings.tab.logs":"日誌","settings.language":"介面語言","settings.theme":"主題偏好","settings.autoConnect.title":"啟動時自動連線","settings.autoConnect.desc":"自動嘗試重新連線上次活動的通道。","settings.workspace":"工作目錄","settings.chooseFolder":"選擇目錄","settings.plugins.title":"外掛管理","settings.plugins.refresh":"重新整理清單","lang.zhCN":"簡體中文","lang.zhTW":"繁體中文","lang.enUS":"English (US)","lang.jaJP":"日本語","lang.koKR":"한국어","lang.frFR":"Français","lang.deDE":"Deutsch","lang.esES":"Español","lang.ptBR":"Português (Brasil)","lang.ruRU":"Русский","lang.ar":"العربية","lang.hi":"हिन्दी","lang.itIT":"Italiano","lang.nlNL":"Nederlands","lang.thTH":"ไทย","lang.viVN":"Tiếng Việt","lang.idID":"Bahasa Indonesia","lang.trTR":"Türkçe","lang.plPL":"Polski","lang.ukUA":"Українська","theme.system":"系統預設","theme.dark":"深色 (工程模式)","theme.light":"淺色","MQTT 适配器":"MQTT 適配器","TCP / 网络":"TCP / 網路","TCP 客户端":"TCP 用戶端","TCP 服务端":"TCP 伺服端","TCP 端口":"TCP 連接埠","UI YAML 预览":"UI YAML 預覽","v0.9.8 - 未安装":"v0.9.8 - 未安裝","v1.2.4 - 已启用":"v1.2.4 - 已啟用","串口 (Serial)":"串口 (Serial)",串口参数:"串口參數",串口端口:"串口埠",串口通道:"串口通道",串口配置:"串口設定","例如:192.168.1.10":"例如:192.168.1.10","例如:传感器A接口":"例如:感測器A介面",保存:"儲存",保存后立即连接:"儲存後立即連線",保存配置:"儲存設定",停止位:"停止位",偶校验:"偶校驗","写超时 (ms)":"寫入逾時 (ms)",分类:"分類",创建后立即启动连接:"建立後立即啟動連線",创建通道:"建立通道",删除协议:"刪除協定",协议:"協定",协议名称:"協定名稱",协议详情:"協定詳情",取消:"取消",可用:"可用","吗?":"嗎?",基本信息:"基本資訊",奇校验:"奇校驗",已启用:"已啟用",已禁用:"已停用",描述:"描述",搜索关键词:"搜尋關鍵字",数据位:"資料位",新建协议:"新增協定",新建通道:"新增通道",无:"無",无可用串口:"無可用串口",无校验:"無校驗","日志采集与归档策略将在后续版本中提供。":"日誌採集與歸檔策略將在後續版本中提供。",暂无协议:"暫無協定","暂无可渲染的 UI 配置":"暫無可渲染的 UI 設定","暂无可用协议,可从内置模板创建或新增自定义协议。":"暫無可用協定,可從內建範本建立或新增自訂協定。","暂无可配置项,运行时设置将随着模块扩展开放。":"暫無可設定項,執行時設定將隨模組擴充開放。",暂无描述:"暫無描述",未安装:"未安裝",未知:"未知",查看:"檢視","查看或更新协议描述与分类。":"檢視或更新協定描述與分類。",校验位:"校驗位",波特率:"波特率",流控:"流控","添加自定义协议元数据,供解析引擎识别。":"新增自訂協定中繼資料,供解析引擎識別。",状态:"狀態",目标地址:"目標位址",确认删除:"確認刪除",确认删除自定义协议:"確認刪除自訂協定",空闲:"閒置",端口:"埠","脚本运行中展示 UI 渲染结果":"腳本執行中顯示 UI 渲染結果",自定义:"自訂",解析失败:"解析失敗",请输入指令名称和内容:"請輸入指令名稱與內容","读超时 (ms)":"讀取逾時 (ms)",运行中:"執行中",选择串口:"選擇串口",选择工作区:"選擇工作區",通道名称:"通道名稱",配置:"設定",配置串口连接参数:"設定串口連線參數",配置协议:"設定協定",配置新的通信连接参数:"設定新的通訊連線參數",键名:"鍵名",驱动:"驅動",驱动类:"驅動類別"},Yh={...Pe,"nav.manual":"シリアルターミナル","nav.scripts":"自動スクリプト","nav.proxy":"プロキシ監視","nav.protocols":"プロトコル管理","nav.settings":"設定","nav.workspace":"管理ワークスペース","header.manual.title":"シリアルターミナル","header.manual.desc":"コマンド送信と I/O・ログを監視する従来型シリアルツール。","header.scripts.title":"自動スクリプト","header.scripts.desc":"プロトコル解析とテストスクリプトの自動実行。","header.proxy.title":"プロキシ監視","header.proxy.desc":"転送リンクを管理し、データストリームをリアルタイム監視します。","header.protocols.title":"プロトコル管理","header.protocols.desc":"通信プロトコルを定義し、チャネルを割り当て、解析ルールを設定します。","header.settings.title":"アプリ設定","header.settings.desc":"全体の設定、プロトコル既定値、実行時環境を管理します。","action.refresh":"更新","action.createProtocol":"新規プロトコル","action.discardChanges":"変更を破棄","action.saveChanges":"変更を保存","action.loadScript":"スクリプト読込","action.save":"保存","badge.readOnly":"読み取り専用","action.refreshStatus":"状態を更新","action.newProxy":"新規転送ペア","action.connect":"接続","action.disconnect":"切断","filter.all":"すべて","filter.running":"稼働中","filter.stopped":"停止","filter.error":"異常","status.connected":"接続済み","status.disconnected":"未接続","status.error":"エラー","status.connecting":"接続中","protocol.tab.all":"すべてのプロトコル","protocol.tab.modbus":"Modbus","protocol.tab.tcp":"TCP/IP","protocol.tab.custom":"カスタム","settings.tab.general":"一般","settings.tab.plugins":"プラグイン","settings.tab.runtime":"ランタイム","settings.tab.logs":"ログ","settings.language":"表示言語","settings.theme":"テーマ","settings.autoConnect.title":"起動時に自動接続","settings.autoConnect.desc":"前回のアクティブチャネルに自動再接続します。","settings.workspace":"ワークスペース","settings.chooseFolder":"フォルダを選択","settings.plugins.title":"プラグイン管理","settings.plugins.refresh":"一覧を更新","lang.zhCN":"簡体中文","lang.zhTW":"繁體中文","lang.enUS":"English (US)","lang.jaJP":"日本語","lang.koKR":"한국어","lang.frFR":"Français","lang.deDE":"Deutsch","lang.esES":"Español","lang.ptBR":"Português (Brasil)","lang.ruRU":"Русский","lang.ar":"العربية","lang.hi":"हिन्दी","lang.itIT":"Italiano","lang.nlNL":"Nederlands","lang.thTH":"ไทย","lang.viVN":"Tiếng Việt","lang.idID":"Bahasa Indonesia","lang.trTR":"Türkçe","lang.plPL":"Polski","lang.ukUA":"Українська","theme.system":"システム","theme.dark":"ダーク(エンジニア)","theme.light":"ライト","MQTT 适配器":"MQTT アダプター","TCP / 网络":"TCP / ネットワーク","TCP 客户端":"TCP クライアント","TCP 服务端":"TCP サーバー","TCP 端口":"TCP ポート","UI YAML 预览":"UI YAML プレビュー","v0.9.8 - 未安装":"v0.9.8 - 未インストール","v1.2.4 - 已启用":"v1.2.4 - 有効","串口 (Serial)":"シリアル (Serial)",串口参数:"シリアルパラメータ",串口端口:"シリアルポート",串口通道:"シリアルチャネル",串口配置:"シリアル設定","例如:192.168.1.10":"例:192.168.1.10","例如:传感器A接口":"例:センサーAインターフェース",保存:"保存",保存后立即连接:"保存後すぐに接続",保存配置:"設定を保存",停止位:"ストップビット",偶校验:"偶数パリティ","写超时 (ms)":"書き込みタイムアウト (ms)",分类:"分類",创建后立即启动连接:"作成後すぐに接続を開始",创建通道:"チャネルを作成",删除协议:"プロトコルを削除",协议:"プロトコル",协议名称:"プロトコル名",协议详情:"プロトコル詳細",取消:"キャンセル",可用:"利用可能","吗?":"?",基本信息:"基本情報",奇校验:"奇数パリティ",已启用:"有効",已禁用:"無効",描述:"説明",搜索关键词:"検索キーワード",数据位:"データビット",新建协议:"新規プロトコル",新建通道:"新規チャネル",无:"なし",无可用串口:"利用可能なシリアルポートがありません",无校验:"パリティなし","日志采集与归档策略将在后续版本中提供。":"ログ収集とアーカイブ方針は後続バージョンで提供予定です。",暂无协议:"プロトコルがありません","暂无可渲染的 UI 配置":"レンダリング可能な UI 設定がありません","暂无可用协议,可从内置模板创建或新增自定义协议。":"利用可能なプロトコルがありません。内蔵テンプレートから作成するか、カスタムを追加してください。","暂无可配置项,运行时设置将随着模块扩展开放。":"設定可能な項目がありません。実行時設定はモジュール拡張に合わせて公開されます。",暂无描述:"説明なし",未安装:"未インストール",未知:"不明",查看:"表示","查看或更新协议描述与分类。":"プロトコルの説明と分類を表示または更新します。",校验位:"パリティ",波特率:"ボーレート",流控:"フロー制御","添加自定义协议元数据,供解析引擎识别。":"解析エンジンが識別できるようにカスタムプロトコルのメタデータを追加します。",状态:"状態",目标地址:"宛先アドレス",确认删除:"削除を確認",确认删除自定义协议:"カスタムプロトコルの削除を確認",空闲:"アイドル",端口:"ポート","脚本运行中展示 UI 渲染结果":"スクリプト実行中に UI レンダリング結果を表示",自定义:"カスタム",解析失败:"解析失敗",请输入指令名称和内容:"コマンド名と内容を入力してください","读超时 (ms)":"読み取りタイムアウト (ms)",运行中:"実行中",选择串口:"シリアルポートを選択",选择工作区:"ワークスペースを選択",通道名称:"チャネル名",配置:"設定",配置串口连接参数:"シリアル接続パラメータを設定",配置协议:"プロトコルを設定",配置新的通信连接参数:"新しい通信接続パラメータを設定",键名:"キー名",驱动:"ドライバー",驱动类:"ドライバークラス"},Gh={...Pe,"nav.manual":"시리얼 터미널","nav.scripts":"자동화 스크립트","nav.proxy":"프록시 모니터","nav.protocols":"프로토콜 관리자","nav.settings":"설정","nav.workspace":"관리자 작업공간","status.connected":"연결됨","status.connecting":"연결 중","status.error":"오류","status.disconnected":"연결 끊김","theme.system":"시스템","theme.dark":"다크(엔지니어)","theme.light":"라이트","header.protocols.title":"프로토콜 관리자","header.protocols.desc":"프로토콜을 정의하고 채널을 바인딩하며 파싱 규칙을 구성합니다.","action.refresh":"새로고침","action.createProtocol":"새 프로토콜","protocol.tab.all":"모든 프로토콜","protocol.tab.custom":"사용자 정의","header.settings.title":"앱 설정","header.settings.desc":"전역 환경설정, 기본값 및 런타임 구성을 관리합니다.","action.discardChanges":"변경 사항 취소","action.saveChanges":"변경 사항 저장","settings.tab.general":"일반","settings.tab.plugins":"플러그인","settings.tab.runtime":"런타임","settings.tab.logs":"로그","settings.language":"언어","settings.theme":"테마","settings.autoConnect.title":"시작 시 자동 연결","settings.autoConnect.desc":"마지막 활성 채널에 자동으로 다시 연결합니다.","settings.workspace":"작업공간","settings.chooseFolder":"폴더 선택","settings.plugins.title":"플러그인","settings.plugins.refresh":"목록 새로고침",空闲:"유휴",串口通道:"시리얼 채널","TCP 客户端":"TCP 클라이언트","TCP 服务端":"TCP 서버",端口:"포트",运行中:"실행 중",请输入指令名称和内容:"명령 이름과 내용을 입력하세요",协议:"프로토콜",可用:"사용 가능",自定义:"사용자 정의",已禁用:"비활성화",未知:"알 수 없음",键名:"키",驱动:"드라이버",分类:"카테고리",搜索关键词:"키워드 검색",选择工作区:"작업공간 선택",暂无描述:"설명 없음",配置:"구성",查看:"보기",暂无协议:"프로토콜 없음","暂无可用协议,可从内置模板创建或新增自定义协议。":"사용 가능한 프로토콜이 없습니다. 내장 템플릿에서 만들거나 사용자 정의를 추가하세요.","v1.2.4 - 已启用":"v1.2.4 - 사용",已启用:"활성화","MQTT 适配器":"MQTT 어댑터","v0.9.8 - 未安装":"v0.9.8 - 미설치",未安装:"미설치","暂无可配置项,运行时设置将随着模块扩展开放。":"구성할 항목이 없습니다. 런타임 설정은 모듈 확장에 따라 제공됩니다.","日志采集与归档策略将在后续版本中提供。":"로그 수집 및 아카이브 정책은 이후 버전에서 제공됩니다.",串口配置:"시리얼 구성",新建通道:"새 채널",配置串口连接参数:"시리얼 연결 파라미터 구성",配置新的通信连接参数:"새 통신 연결 파라미터 구성","串口 (Serial)":"시리얼 (Serial)","TCP / 网络":"TCP / 네트워크",基本信息:"기본 정보",通道名称:"채널 이름","例如:传感器A接口":"예: 센서 A 인터페이스",串口端口:"시리얼 포트",选择串口:"시리얼 포트 선택",无可用串口:"사용 가능한 시리얼 포트 없음",目标地址:"대상 주소","例如:192.168.1.10":"예: 192.168.1.10",串口参数:"시리얼 파라미터",波特率:"보드레이트",数据位:"데이터 비트",停止位:"정지 비트",校验位:"패리티",无校验:"패리티 없음",奇校验:"홀수 패리티",偶校验:"짝수 패리티",流控:"흐름 제어",无:"없음","读超时 (ms)":"읽기 타임아웃 (ms)","写超时 (ms)":"쓰기 타임아웃 (ms)","TCP 端口":"TCP 포트",保存后立即连接:"저장 후 즉시 연결",创建后立即启动连接:"생성 후 즉시 연결 시작",取消:"취소",保存配置:"구성 저장",创建通道:"채널 생성",新建协议:"새 프로토콜",配置协议:"프로토콜 구성",协议详情:"프로토콜 상세","添加自定义协议元数据,供解析引擎识别。":"파서 엔진이 인식하도록 사용자 정의 프로토콜 메타데이터를 추가합니다.","查看或更新协议描述与分类。":"프로토콜 설명과 분류를 보기 또는 업데이트합니다.",协议名称:"프로토콜 이름",状态:"상태",描述:"설명",驱动类:"드라이버 클래스",保存:"저장",删除协议:"프로토콜 삭제",确认删除自定义协议:"사용자 정의 프로토콜 삭제 확인","吗?":"?",确认删除:"삭제 확인","UI YAML 预览":"UI YAML 미리보기","脚本运行中展示 UI 渲染结果":"스크립트 실행 중 UI 렌더링 결과 표시",解析失败:"파싱 실패","暂无可渲染的 UI 配置":"렌더링 가능한 UI 설정 없음"},Qh={...Pe,"nav.manual":"Terminal série","nav.scripts":"Scripts d’automatisation","nav.proxy":"Surveillance proxy","nav.protocols":"Gestionnaire de protocoles","nav.settings":"Paramètres","nav.workspace":"Espace de travail admin","status.connected":"Connecté","status.connecting":"Connexion","status.error":"Erreur","status.disconnected":"Déconnecté","theme.system":"Système","theme.dark":"Sombre (Ingénieur)","theme.light":"Clair","header.protocols.title":"Gestionnaire de protocoles","header.protocols.desc":"Définissez les protocoles, associez les canaux et configurez les règles d’analyse.","action.refresh":"Actualiser","action.createProtocol":"Nouveau protocole","protocol.tab.all":"Tous les protocoles","protocol.tab.custom":"Personnalisé","header.settings.title":"Paramètres de l’application","header.settings.desc":"Gérez les préférences globales, les valeurs par défaut et la configuration d’exécution.","action.discardChanges":"Ignorer les modifications","action.saveChanges":"Enregistrer les modifications","settings.tab.general":"Général","settings.tab.plugins":"Plugins","settings.tab.runtime":"Exécution","settings.tab.logs":"Journaux","settings.language":"Langue","settings.theme":"Thème","settings.autoConnect.title":"Connexion automatique au démarrage","settings.autoConnect.desc":"Reconnecter automatiquement le dernier canal actif.","settings.workspace":"Espace de travail","settings.chooseFolder":"Choisir un dossier","settings.plugins.title":"Plugins","settings.plugins.refresh":"Actualiser la liste",空闲:"Inactif",串口通道:"Canal série","TCP 客户端":"Client TCP","TCP 服务端":"Serveur TCP",端口:"Port",运行中:"En cours",请输入指令名称和内容:"Saisissez le nom et le contenu de la commande",协议:"Protocole",可用:"Disponible",自定义:"Personnalisé",已禁用:"Désactivé",未知:"Inconnu",键名:"Clé",驱动:"Pilote",分类:"Catégorie",搜索关键词:"Rechercher des mots-clés",选择工作区:"Sélectionner l’espace de travail",暂无描述:"Aucune description",配置:"Configurer",查看:"Voir",暂无协议:"Aucun protocole","暂无可用协议,可从内置模板创建或新增自定义协议。":"Aucun protocole disponible. Créez-en depuis les modèles intégrés ou ajoutez un personnalisé.","v1.2.4 - 已启用":"v1.2.4 - Activé",已启用:"Activé","MQTT 适配器":"Adaptateur MQTT","v0.9.8 - 未安装":"v0.9.8 - Non installé",未安装:"Non installé","暂无可配置项,运行时设置将随着模块扩展开放。":"Aucun élément configurable. Les paramètres d’exécution seront disponibles à mesure que les modules s’étendent.","日志采集与归档策略将在后续版本中提供。":"Les politiques de collecte et d’archivage des journaux seront disponibles dans une version ultérieure.",串口配置:"Configuration série",新建通道:"Nouveau canal",配置串口连接参数:"Configurer les paramètres de connexion série",配置新的通信连接参数:"Configurer de nouveaux paramètres de connexion","串口 (Serial)":"Série (Serial)","TCP / 网络":"TCP / Réseau",基本信息:"Infos de base",通道名称:"Nom du canal","例如:传感器A接口":"Exemple : interface du capteur A",串口端口:"Port série",选择串口:"Sélectionner le port série",无可用串口:"Aucun port série disponible",目标地址:"Adresse cible","例如:192.168.1.10":"Exemple : 192.168.1.10",串口参数:"Paramètres série",波特率:"Débit en bauds",数据位:"Bits de données",停止位:"Bits d’arrêt",校验位:"Parité",无校验:"Aucune parité",奇校验:"Parité impaire",偶校验:"Parité paire",流控:"Contrôle de flux",无:"Aucun","读超时 (ms)":"Délai de lecture (ms)","写超时 (ms)":"Délai d’écriture (ms)","TCP 端口":"Port TCP",保存后立即连接:"Connecter après l’enregistrement",创建后立即启动连接:"Démarrer la connexion après la création",取消:"Annuler",保存配置:"Enregistrer la configuration",创建通道:"Créer un canal",新建协议:"Nouveau protocole",配置协议:"Configurer le protocole",协议详情:"Détails du protocole","添加自定义协议元数据,供解析引擎识别。":"Ajouter des métadonnées de protocole personnalisées pour que le moteur d’analyse les reconnaisse.","查看或更新协议描述与分类。":"Afficher ou mettre à jour la description et la catégorie du protocole.",协议名称:"Nom du protocole",状态:"Statut",描述:"Description",驱动类:"Classe de pilote",保存:"Enregistrer",删除协议:"Supprimer le protocole",确认删除自定义协议:"Confirmer la suppression du protocole personnalisé","吗?":"?",确认删除:"Confirmer la suppression","UI YAML 预览":"Aperçu UI YAML","脚本运行中展示 UI 渲染结果":"Afficher le rendu UI pendant l’exécution du script",解析失败:"Échec de l’analyse","暂无可渲染的 UI 配置":"Aucune configuration UI rendable"},Jh={...Pe,"nav.manual":"Serielles Terminal","nav.scripts":"Automationsskripte","nav.proxy":"Proxy-Monitor","nav.protocols":"Protokoll-Manager","nav.settings":"Einstellungen","nav.workspace":"Admin-Arbeitsbereich","status.connected":"Verbunden","status.connecting":"Verbindung wird hergestellt","status.error":"Fehler","status.disconnected":"Getrennt","theme.system":"System","theme.dark":"Dunkel (Ingenieur)","theme.light":"Hell","header.protocols.title":"Protokoll-Manager","header.protocols.desc":"Protokolle definieren, Kanäle binden und Parsing-Regeln konfigurieren.","action.refresh":"Aktualisieren","action.createProtocol":"Neues Protokoll","protocol.tab.all":"Alle Protokolle","protocol.tab.custom":"Benutzerdefiniert","header.settings.title":"App-Einstellungen","header.settings.desc":"Globale Einstellungen, Standardwerte und Laufzeitkonfiguration verwalten.","action.discardChanges":"Änderungen verwerfen","action.saveChanges":"Änderungen speichern","settings.tab.general":"Allgemein","settings.tab.plugins":"Plugins","settings.tab.runtime":"Laufzeit","settings.tab.logs":"Protokolle","settings.language":"Sprache","settings.theme":"Design","settings.autoConnect.title":"Beim Start automatisch verbinden","settings.autoConnect.desc":"Automatisch mit dem zuletzt aktiven Kanal verbinden.","settings.workspace":"Arbeitsbereich","settings.chooseFolder":"Ordner auswählen","settings.plugins.title":"Plugins","settings.plugins.refresh":"Liste aktualisieren",空闲:"Leerlauf",串口通道:"Serieller Kanal","TCP 客户端":"TCP-Client","TCP 服务端":"TCP-Server",端口:"Port",运行中:"Läuft",请输入指令名称和内容:"Befehlname und Inhalt eingeben",协议:"Protokoll",可用:"Verfügbar",自定义:"Benutzerdefiniert",已禁用:"Deaktiviert",未知:"Unbekannt",键名:"Schlüssel",驱动:"Treiber",分类:"Kategorie",搜索关键词:"Schlüsselwörter suchen",选择工作区:"Arbeitsbereich auswählen",暂无描述:"Keine Beschreibung",配置:"Konfigurieren",查看:"Anzeigen",暂无协议:"Keine Protokolle","暂无可用协议,可从内置模板创建或新增自定义协议。":"Keine Protokolle verfügbar. Aus integrierten Vorlagen erstellen oder benutzerdefiniert hinzufügen.","v1.2.4 - 已启用":"v1.2.4 - Aktiviert",已启用:"Aktiviert","MQTT 适配器":"MQTT-Adapter","v0.9.8 - 未安装":"v0.9.8 - Nicht installiert",未安装:"Nicht installiert","暂无可配置项,运行时设置将随着模块扩展开放。":"Keine konfigurierbaren Elemente. Laufzeiteinstellungen werden mit Modulerweiterungen verfügbar.","日志采集与归档策略将在后续版本中提供。":"Richtlinien zur Protokollerfassung und Archivierung werden in einer zukünftigen Version verfügbar sein.",串口配置:"Serielle Konfiguration",新建通道:"Neuer Kanal",配置串口连接参数:"Serielle Verbindungsparameter konfigurieren",配置新的通信连接参数:"Neue Verbindungsparameter konfigurieren","串口 (Serial)":"Seriell (Serial)","TCP / 网络":"TCP / Netzwerk",基本信息:"Grundinformationen",通道名称:"Kanalname","例如:传感器A接口":"Beispiel: Sensor-A-Schnittstelle",串口端口:"Serieller Port",选择串口:"Seriellen Port auswählen",无可用串口:"Keine seriellen Ports verfügbar",目标地址:"Zieladresse","例如:192.168.1.10":"Beispiel: 192.168.1.10",串口参数:"Serielle Parameter",波特率:"Baudrate",数据位:"Datenbits",停止位:"Stoppbits",校验位:"Parität",无校验:"Keine Parität",奇校验:"Ungerade Parität",偶校验:"Gerade Parität",流控:"Flusskontrolle",无:"Keine","读超时 (ms)":"Lese-Timeout (ms)","写超时 (ms)":"Schreib-Timeout (ms)","TCP 端口":"TCP-Port",保存后立即连接:"Nach dem Speichern verbinden",创建后立即启动连接:"Verbindung nach Erstellung starten",取消:"Abbrechen",保存配置:"Konfiguration speichern",创建通道:"Kanal erstellen",新建协议:"Neues Protokoll",配置协议:"Protokoll konfigurieren",协议详情:"Protokolldetails","添加自定义协议元数据,供解析引擎识别。":"Benutzerdefinierte Protokoll-Metadaten hinzufügen, damit die Engine sie erkennt.","查看或更新协议描述与分类。":"Protokollbeschreibung und Kategorie anzeigen oder aktualisieren.",协议名称:"Protokollname",状态:"Status",描述:"Beschreibung",驱动类:"Treiberklasse",保存:"Speichern",删除协议:"Protokoll löschen",确认删除自定义协议:"Benutzerdefiniertes Protokoll löschen bestätigen","吗?":"?",确认删除:"Löschen bestätigen","UI YAML 预览":"UI-YAML-Vorschau","脚本运行中展示 UI 渲染结果":"UI-Rendering während der Skriptausführung anzeigen",解析失败:"Parsing fehlgeschlagen","暂无可渲染的 UI 配置":"Keine renderbare UI-Konfiguration"},Xh={...Pe,"nav.manual":"Terminal serie","nav.scripts":"Scripts de automatización","nav.proxy":"Monitor de proxy","nav.protocols":"Gestor de protocolos","nav.settings":"Ajustes","nav.workspace":"Espacio de trabajo admin","status.connected":"Conectado","status.connecting":"Conectando","status.error":"Error","status.disconnected":"Desconectado","theme.system":"Sistema","theme.dark":"Oscuro (Ingeniero)","theme.light":"Claro","header.protocols.title":"Gestor de protocolos","header.protocols.desc":"Defina protocolos, vincule canales y configure reglas de análisis.","action.refresh":"Actualizar","action.createProtocol":"Nuevo protocolo","protocol.tab.all":"Todos los protocolos","protocol.tab.custom":"Personalizado","header.settings.title":"Ajustes de la aplicación","header.settings.desc":"Gestione preferencias globales, valores predeterminados y la configuración de ejecución.","action.discardChanges":"Descartar cambios","action.saveChanges":"Guardar cambios","settings.tab.general":"General","settings.tab.plugins":"Plugins","settings.tab.runtime":"Tiempo de ejecución","settings.tab.logs":"Registros","settings.language":"Idioma","settings.theme":"Tema","settings.autoConnect.title":"Conexión automática al iniciar","settings.autoConnect.desc":"Reconectar automáticamente al último canal activo.","settings.workspace":"Espacio de trabajo","settings.chooseFolder":"Elegir carpeta","settings.plugins.title":"Plugins","settings.plugins.refresh":"Actualizar lista",空闲:"Inactivo",串口通道:"Canal serie","TCP 客户端":"Cliente TCP","TCP 服务端":"Servidor TCP",端口:"Puerto",运行中:"En ejecución",请输入指令名称和内容:"Introduzca el nombre y el contenido del comando",协议:"Protocolo",可用:"Disponible",自定义:"Personalizado",已禁用:"Deshabilitado",未知:"Desconocido",键名:"Clave",驱动:"Controlador",分类:"Categoría",搜索关键词:"Buscar palabras clave",选择工作区:"Seleccionar espacio de trabajo",暂无描述:"Sin descripción",配置:"Configurar",查看:"Ver",暂无协议:"Sin protocolos","暂无可用协议,可从内置模板创建或新增自定义协议。":"No hay protocolos disponibles. Cree desde plantillas integradas o añada uno personalizado.","v1.2.4 - 已启用":"v1.2.4 - Habilitado",已启用:"Habilitado","MQTT 适配器":"Adaptador MQTT","v0.9.8 - 未安装":"v0.9.8 - No instalado",未安装:"No instalado","暂无可配置项,运行时设置将随着模块扩展开放。":"No hay elementos configurables. Los ajustes de ejecución se abrirán a medida que se amplíen los módulos.","日志采集与归档策略将在后续版本中提供。":"Las políticas de recopilación y archivado de registros estarán disponibles en una versión futura.",串口配置:"Configuración serie",新建通道:"Nuevo canal",配置串口连接参数:"Configurar parámetros de conexión serie",配置新的通信连接参数:"Configurar nuevos parámetros de conexión","串口 (Serial)":"Serie (Serial)","TCP / 网络":"TCP / Red",基本信息:"Información básica",通道名称:"Nombre del canal","例如:传感器A接口":"Ejemplo: interfaz del sensor A",串口端口:"Puerto serie",选择串口:"Seleccionar puerto serie",无可用串口:"No hay puertos serie disponibles",目标地址:"Dirección de destino","例如:192.168.1.10":"Ejemplo: 192.168.1.10",串口参数:"Parámetros serie",波特率:"Velocidad en baudios",数据位:"Bits de datos",停止位:"Bits de parada",校验位:"Paridad",无校验:"Sin paridad",奇校验:"Paridad impar",偶校验:"Paridad par",流控:"Control de flujo",无:"Ninguno","读超时 (ms)":"Tiempo de espera de lectura (ms)","写超时 (ms)":"Tiempo de espera de escritura (ms)","TCP 端口":"Puerto TCP",保存后立即连接:"Conectar después de guardar",创建后立即启动连接:"Iniciar conexión después de la creación",取消:"Cancelar",保存配置:"Guardar configuración",创建通道:"Crear canal",新建协议:"Nuevo protocolo",配置协议:"Configurar protocolo",协议详情:"Detalles del protocolo","添加自定义协议元数据,供解析引擎识别。":"Añadir metadatos de protocolo personalizados para que el motor los reconozca.","查看或更新协议描述与分类。":"Ver o actualizar la descripción y la categoría del protocolo.",协议名称:"Nombre del protocolo",状态:"Estado",描述:"Descripción",驱动类:"Clase de controlador",保存:"Guardar",删除协议:"Eliminar protocolo",确认删除自定义协议:"Confirmar eliminación del protocolo personalizado","吗?":"?",确认删除:"Confirmar eliminación","UI YAML 预览":"Vista previa de UI YAML","脚本运行中展示 UI 渲染结果":"Mostrar renderizado de UI mientras se ejecuta el script",解析失败:"Error de análisis","暂无可渲染的 UI 配置":"No hay configuración de UI renderizable"},eg={...Pe,"nav.manual":"Terminal serial","nav.scripts":"Scripts de automação","nav.proxy":"Monitor de proxy","nav.protocols":"Gerenciador de protocolos","nav.settings":"Configurações","nav.workspace":"Espaço de trabalho admin","status.connected":"Conectado","status.connecting":"Conectando","status.error":"Erro","status.disconnected":"Desconectado","theme.system":"Sistema","theme.dark":"Escuro (Engenheiro)","theme.light":"Claro","header.protocols.title":"Gerenciador de protocolos","header.protocols.desc":"Defina protocolos, vincule canais e configure regras de parsing.","action.refresh":"Atualizar","action.createProtocol":"Novo protocolo","protocol.tab.all":"Todos os protocolos","protocol.tab.custom":"Personalizado","header.settings.title":"Configurações do app","header.settings.desc":"Gerencie preferências globais, padrões e configuração de execução.","action.discardChanges":"Descartar alterações","action.saveChanges":"Salvar alterações","settings.tab.general":"Geral","settings.tab.plugins":"Plugins","settings.tab.runtime":"Tempo de execução","settings.tab.logs":"Logs","settings.language":"Idioma","settings.theme":"Tema","settings.autoConnect.title":"Conectar automaticamente ao iniciar","settings.autoConnect.desc":"Reconectar automaticamente ao último canal ativo.","settings.workspace":"Espaço de trabalho","settings.chooseFolder":"Escolher pasta","settings.plugins.title":"Plugins","settings.plugins.refresh":"Atualizar lista",空闲:"Inativo",串口通道:"Canal serial","TCP 客户端":"Cliente TCP","TCP 服务端":"Servidor TCP",端口:"Porta",运行中:"Em execução",请输入指令名称和内容:"Digite o nome e o conteúdo do comando",协议:"Protocolo",可用:"Disponível",自定义:"Personalizado",已禁用:"Desativado",未知:"Desconhecido",键名:"Chave",驱动:"Driver",分类:"Categoria",搜索关键词:"Buscar palavras-chave",选择工作区:"Selecionar espaço de trabalho",暂无描述:"Sem descrição",配置:"Configurar",查看:"Ver",暂无协议:"Nenhum protocolo","暂无可用协议,可从内置模板创建或新增自定义协议。":"Nenhum protocolo disponível. Crie a partir de modelos embutidos ou adicione um personalizado.","v1.2.4 - 已启用":"v1.2.4 - Habilitado",已启用:"Habilitado","MQTT 适配器":"Adaptador MQTT","v0.9.8 - 未安装":"v0.9.8 - Não instalado",未安装:"Não instalado","暂无可配置项,运行时设置将随着模块扩展开放。":"Nenhum item configurável. As configurações de execução ficarão disponíveis conforme os módulos se expandirem.","日志采集与归档策略将在后续版本中提供。":"Políticas de coleta e arquivamento de logs estarão disponíveis em uma versão futura.",串口配置:"Configuração serial",新建通道:"Novo canal",配置串口连接参数:"Configurar parâmetros de conexão serial",配置新的通信连接参数:"Configurar novos parâmetros de conexão","串口 (Serial)":"Serial (Serial)","TCP / 网络":"TCP / Rede",基本信息:"Informações básicas",通道名称:"Nome do canal","例如:传感器A接口":"Exemplo: interface do sensor A",串口端口:"Porta serial",选择串口:"Selecionar porta serial",无可用串口:"Nenhuma porta serial disponível",目标地址:"Endereço de destino","例如:192.168.1.10":"Exemplo: 192.168.1.10",串口参数:"Parâmetros seriais",波特率:"Taxa de baud",数据位:"Bits de dados",停止位:"Bits de parada",校验位:"Paridade",无校验:"Sem paridade",奇校验:"Paridade ímpar",偶校验:"Paridade par",流控:"Controle de fluxo",无:"Nenhum","读超时 (ms)":"Tempo limite de leitura (ms)","写超时 (ms)":"Tempo limite de escrita (ms)","TCP 端口":"Porta TCP",保存后立即连接:"Conectar após salvar",创建后立即启动连接:"Iniciar conexão após a criação",取消:"Cancelar",保存配置:"Salvar configuração",创建通道:"Criar canal",新建协议:"Novo protocolo",配置协议:"Configurar protocolo",协议详情:"Detalhes do protocolo","添加自定义协议元数据,供解析引擎识别。":"Adicionar metadados de protocolo personalizados para que o motor de análise reconheça.","查看或更新协议描述与分类。":"Ver ou atualizar a descrição e a categoria do protocolo.",协议名称:"Nome do protocolo",状态:"Status",描述:"Descrição",驱动类:"Classe do driver",保存:"Salvar",删除协议:"Excluir protocolo",确认删除自定义协议:"Confirmar exclusão do protocolo personalizado","吗?":"?",确认删除:"Confirmar exclusão","UI YAML 预览":"Pré-visualização de UI YAML","脚本运行中展示 UI 渲染结果":"Mostrar renderização da UI enquanto o script é executado",解析失败:"Falha na análise","暂无可渲染的 UI 配置":"Nenhuma configuração de UI renderizável"},tg={...Pe,"nav.manual":"Последовательный терминал","nav.scripts":"Скрипты автоматизации","nav.proxy":"Монитор прокси","nav.protocols":"Менеджер протоколов","nav.settings":"Настройки","nav.workspace":"Рабочее пространство администратора","status.connected":"Подключено","status.connecting":"Подключение","status.error":"Ошибка","status.disconnected":"Отключено","theme.system":"Система","theme.dark":"Темная (Инженер)","theme.light":"Светлая","header.protocols.title":"Менеджер протоколов","header.protocols.desc":"Определяйте протоколы, привязывайте каналы и настраивайте правила разбора.","action.refresh":"Обновить","action.createProtocol":"Новый протокол","protocol.tab.all":"Все протоколы","protocol.tab.custom":"Пользовательский","header.settings.title":"Настройки приложения","header.settings.desc":"Управление глобальными предпочтениями, значениями по умолчанию и конфигурацией выполнения.","action.discardChanges":"Отменить изменения","action.saveChanges":"Сохранить изменения","settings.tab.general":"Общие","settings.tab.plugins":"Плагины","settings.tab.runtime":"Выполнение","settings.tab.logs":"Журналы","settings.language":"Язык","settings.theme":"Тема","settings.autoConnect.title":"Автоподключение при запуске","settings.autoConnect.desc":"Автоматически переподключаться к последнему активному каналу.","settings.workspace":"Рабочее пространство","settings.chooseFolder":"Выбрать папку","settings.plugins.title":"Плагины","settings.plugins.refresh":"Обновить список",空闲:"Простой",串口通道:"Последовательный канал","TCP 客户端":"TCP-клиент","TCP 服务端":"TCP-сервер",端口:"Порт",运行中:"Выполняется",请输入指令名称和内容:"Введите имя и содержимое команды",协议:"Протокол",可用:"Доступно",自定义:"Пользовательский",已禁用:"Отключено",未知:"Неизвестно",键名:"Ключ",驱动:"Драйвер",分类:"Категория",搜索关键词:"Поиск по ключевым словам",选择工作区:"Выбрать рабочее пространство",暂无描述:"Нет описания",配置:"Настроить",查看:"Просмотреть",暂无协议:"Нет протоколов","暂无可用协议,可从内置模板创建或新增自定义协议。":"Протоколы отсутствуют. Создайте из встроенных шаблонов или добавьте пользовательский.","v1.2.4 - 已启用":"v1.2.4 - Включено",已启用:"Включено","MQTT 适配器":"MQTT-адаптер","v0.9.8 - 未安装":"v0.9.8 - Не установлено",未安装:"Не установлено","暂无可配置项,运行时设置将随着模块扩展开放。":"Нет настраиваемых элементов. Настройки выполнения будут доступны по мере расширения модулей.","日志采集与归档策略将在后续版本中提供。":"Политики сбора и архивирования журналов будут доступны в будущей версии.",串口配置:"Конфигурация последовательного порта",新建通道:"Новый канал",配置串口连接参数:"Настроить параметры последовательного соединения",配置新的通信连接参数:"Настроить новые параметры соединения","串口 (Serial)":"Последовательный (Serial)","TCP / 网络":"TCP / Сеть",基本信息:"Основная информация",通道名称:"Имя канала","例如:传感器A接口":"Пример: интерфейс датчика A",串口端口:"Последовательный порт",选择串口:"Выбрать последовательный порт",无可用串口:"Нет доступных последовательных портов",目标地址:"Целевой адрес","例如:192.168.1.10":"Пример: 192.168.1.10",串口参数:"Параметры последовательного порта",波特率:"Скорость (бод)",数据位:"Биты данных",停止位:"Стоп-биты",校验位:"Четность",无校验:"Без четности",奇校验:"Нечетная четность",偶校验:"Четная четность",流控:"Управление потоком",无:"Нет","读超时 (ms)":"Тайм-аут чтения (мс)","写超时 (ms)":"Тайм-аут записи (мс)","TCP 端口":"TCP-порт",保存后立即连接:"Подключить после сохранения",创建后立即启动连接:"Запустить подключение после создания",取消:"Отмена",保存配置:"Сохранить конфигурацию",创建通道:"Создать канал",新建协议:"Новый протокол",配置协议:"Настроить протокол",协议详情:"Сведения о протоколе","添加自定义协议元数据,供解析引擎识别。":"Добавить метаданные пользовательского протокола для распознавания движком.","查看或更新协议描述与分类。":"Просмотреть или обновить описание и категорию протокола.",协议名称:"Имя протокола",状态:"Статус",描述:"Описание",驱动类:"Класс драйвера",保存:"Сохранить",删除协议:"Удалить протокол",确认删除自定义协议:"Подтвердить удаление пользовательского протокола","吗?":"?",确认删除:"Подтвердить удаление","UI YAML 预览":"Предпросмотр UI YAML","脚本运行中展示 UI 渲染结果":"Показывать рендеринг UI во время выполнения скрипта",解析失败:"Ошибка разбора","暂无可渲染的 UI 配置":"Нет конфигурации UI для рендера"},ng={...Pe,"nav.manual":"طرفية تسلسلية","nav.scripts":"نصوص الأتمتة","nav.proxy":"مراقب الوكيل","nav.protocols":"مدير البروتوكولات","nav.settings":"الإعدادات","nav.workspace":"مساحة عمل المسؤول","status.connected":"متصل","status.connecting":"جارٍ الاتصال","status.error":"خطأ","status.disconnected":"غير متصل","theme.system":"النظام","theme.dark":"داكن (مهندس)","theme.light":"فاتح","header.protocols.title":"مدير البروتوكولات","header.protocols.desc":"عرّف البروتوكولات، واربط القنوات، واضبط قواعد التحليل.","action.refresh":"تحديث","action.createProtocol":"بروتوكول جديد","protocol.tab.all":"كل البروتوكولات","protocol.tab.custom":"مخصص","header.settings.title":"إعدادات التطبيق","header.settings.desc":"إدارة التفضيلات العامة والقيم الافتراضية وتكوين وقت التشغيل.","action.discardChanges":"تجاهل التغييرات","action.saveChanges":"حفظ التغييرات","settings.tab.general":"عام","settings.tab.plugins":"الإضافات","settings.tab.runtime":"وقت التشغيل","settings.tab.logs":"السجلات","settings.language":"اللغة","settings.theme":"السمة","settings.autoConnect.title":"اتصال تلقائي عند التشغيل","settings.autoConnect.desc":"إعادة الاتصال تلقائياً بآخر قناة نشطة.","settings.workspace":"مساحة العمل","settings.chooseFolder":"اختر مجلداً","settings.plugins.title":"الإضافات","settings.plugins.refresh":"تحديث القائمة",空闲:"خامل",串口通道:"قناة تسلسلية","TCP 客户端":"عميل TCP","TCP 服务端":"خادم TCP",端口:"منفذ",运行中:"قيد التشغيل",请输入指令名称和内容:"أدخل اسم الأمر ومحتواه",协议:"بروتوكول",可用:"متاح",自定义:"مخصص",已禁用:"معطل",未知:"غير معروف",键名:"مفتاح",驱动:"برنامج تشغيل",分类:"فئة",搜索关键词:"ابحث عن كلمات مفتاحية",选择工作区:"اختر مساحة العمل",暂无描述:"لا وصف",配置:"تهيئة",查看:"عرض",暂无协议:"لا توجد بروتوكولات","暂无可用协议,可从内置模板创建或新增自定义协议。":"لا توجد بروتوكولات متاحة. أنشئ من القوالب المضمنة أو أضف مخصصاً.","v1.2.4 - 已启用":"v1.2.4 - مفعّل",已启用:"مفعّل","MQTT 适配器":"محوّل MQTT","v0.9.8 - 未安装":"v0.9.8 - غير مثبت",未安装:"غير مثبت","暂无可配置项,运行时设置将随着模块扩展开放。":"لا توجد عناصر قابلة للتهيئة. ستتوفر إعدادات وقت التشغيل مع توسع الوحدات.","日志采集与归档策略将在后续版本中提供。":"ستتوفر سياسات جمع السجلات وأرشفتها في إصدار لاحق.",串口配置:"تهيئة تسلسلية",新建通道:"قناة جديدة",配置串口连接参数:"تهيئة معلمات الاتصال التسلسلي",配置新的通信连接参数:"تهيئة معلمات الاتصال الجديدة","串口 (Serial)":"تسلسلي (Serial)","TCP / 网络":"TCP / الشبكة",基本信息:"معلومات أساسية",通道名称:"اسم القناة","例如:传感器A接口":"مثال: واجهة المستشعر A",串口端口:"منفذ تسلسلي",选择串口:"اختر منفذًا تسلسليًا",无可用串口:"لا توجد منافذ تسلسلية متاحة",目标地址:"عنوان الهدف","例如:192.168.1.10":"مثال: 192.168.1.10",串口参数:"معلمات التسلسل",波特率:"معدل البود",数据位:"بتات البيانات",停止位:"بتات التوقف",校验位:"التماثل",无校验:"بدون تماثل",奇校验:"تماثل فردي",偶校验:"تماثل زوجي",流控:"التحكم في التدفق",无:"لا شيء","读超时 (ms)":"مهلة القراءة (ms)","写超时 (ms)":"مهلة الكتابة (ms)","TCP 端口":"منفذ TCP",保存后立即连接:"الاتصال بعد الحفظ",创建后立即启动连接:"بدء الاتصال بعد الإنشاء",取消:"إلغاء",保存配置:"حفظ التهيئة",创建通道:"إنشاء قناة",新建协议:"بروتوكول جديد",配置协议:"تهيئة البروتوكول",协议详情:"تفاصيل البروتوكول","添加自定义协议元数据,供解析引擎识别。":"أضف بيانات تعريف بروتوكول مخصصة ليتعرف عليها محرك التحليل.","查看或更新协议描述与分类。":"عرض أو تحديث وصف البروتوكول وفئته.",协议名称:"اسم البروتوكول",状态:"الحالة",描述:"الوصف",驱动类:"فئة برنامج التشغيل",保存:"حفظ",删除协议:"حذف البروتوكول",确认删除自定义协议:"تأكيد حذف البروتوكول المخصص","吗?":"؟",确认删除:"تأكيد الحذف","UI YAML 预览":"معاينة UI YAML","脚本运行中展示 UI 渲染结果":"عرض ناتج عرض UI أثناء تشغيل السكربت",解析失败:"فشل التحليل","暂无可渲染的 UI 配置":"لا توجد تهيئة UI قابلة للعرض"},rg={...Pe,"nav.manual":"सीरियल टर्मिनल","nav.scripts":"ऑटोमेशन स्क्रिप्ट्स","nav.proxy":"प्रॉक्सी मॉनिटर","nav.protocols":"प्रोटोकॉल मैनेजर","nav.settings":"सेटिंग्स","nav.workspace":"एडमिन वर्कस्पेस","status.connected":"कनेक्टेड","status.connecting":"कनेक्ट हो रहा है","status.error":"त्रुटि","status.disconnected":"डिसकनेक्टेड","theme.system":"सिस्टम","theme.dark":"डार्क (इंजीनियर)","theme.light":"लाइट","header.protocols.title":"प्रोटोकॉल मैनेजर","header.protocols.desc":"प्रोटोकॉल परिभाषित करें, चैनल बाँधें और पार्सिंग नियम कॉन्फ़िगर करें।","action.refresh":"रीफ़्रेश","action.createProtocol":"नया प्रोटोकॉल","protocol.tab.all":"सभी प्रोटोकॉल","protocol.tab.custom":"कस्टम","header.settings.title":"ऐप सेटिंग्स","header.settings.desc":"वैश्विक प्राथमिकताएँ, डिफ़ॉल्ट और रनटाइम कॉन्फ़िगरेशन प्रबंधित करें।","action.discardChanges":"परिवर्तन त्यागें","action.saveChanges":"परिवर्तन सहेजें","settings.tab.general":"सामान्य","settings.tab.plugins":"प्लगइन्स","settings.tab.runtime":"रनटाइम","settings.tab.logs":"लॉग्स","settings.language":"भाषा","settings.theme":"थीम","settings.autoConnect.title":"लॉन्च पर ऑटो-कनेक्ट","settings.autoConnect.desc":"आख़िरी सक्रिय चैनल से स्वतः पुनः कनेक्ट करें।","settings.workspace":"वर्कस्पेस","settings.chooseFolder":"फ़ोल्डर चुनें","settings.plugins.title":"प्लगइन्स","settings.plugins.refresh":"सूची रीफ़्रेश करें",空闲:"निष्क्रिय",串口通道:"सीरियल चैनल","TCP 客户端":"TCP क्लाइंट","TCP 服务端":"TCP सर्वर",端口:"पोर्ट",运行中:"चल रहा है",请输入指令名称和内容:"कमांड का नाम और सामग्री दर्ज करें",协议:"प्रोटोकॉल",可用:"उपलब्ध",自定义:"कस्टम",已禁用:"अक्षम",未知:"अज्ञात",键名:"कुंजी",驱动:"ड्राइवर",分类:"श्रेणी",搜索关键词:"कीवर्ड खोजें",选择工作区:"वर्कस्पेस चुनें",暂无描述:"कोई विवरण नहीं",配置:"कॉन्फ़िगर करें",查看:"देखें",暂无协议:"कोई प्रोटोकॉल नहीं","暂无可用协议,可从内置模板创建或新增自定义协议。":"कोई प्रोटोकॉल उपलब्ध नहीं। अंतर्निर्मित टेम्पलेट से बनाएं या कस्टम जोड़ें।","v1.2.4 - 已启用":"v1.2.4 - सक्षम",已启用:"सक्षम","MQTT 适配器":"MQTT एडेप्टर","v0.9.8 - 未安装":"v0.9.8 - इंस्टॉल नहीं",未安装:"इंस्टॉल नहीं","暂无可配置项,运行时设置将随着模块扩展开放。":"कोई कॉन्फ़िगर करने योग्य आइटम नहीं। मॉड्यूल बढ़ने पर रनटाइम सेटिंग्स उपलब्ध होंगी।","日志采集与归档策略将在后续版本中提供。":"लॉग संग्रह और संग्रहण नीतियाँ भविष्य के संस्करण में उपलब्ध होंगी।",串口配置:"सीरियल कॉन्फ़िगरेशन",新建通道:"नया चैनल",配置串口连接参数:"सीरियल कनेक्शन पैरामीटर कॉन्फ़िगर करें",配置新的通信连接参数:"नए संचार कनेक्शन पैरामीटर कॉन्फ़िगर करें","串口 (Serial)":"सीरियल (Serial)","TCP / 网络":"TCP / नेटवर्क",基本信息:"मूल जानकारी",通道名称:"चैनल नाम","例如:传感器A接口":"उदाहरण: सेंसर A इंटरफ़ेस",串口端口:"सीरियल पोर्ट",选择串口:"सीरियल पोर्ट चुनें",无可用串口:"कोई सीरियल पोर्ट उपलब्ध नहीं",目标地址:"लक्ष्य पता","例如:192.168.1.10":"उदाहरण: 192.168.1.10",串口参数:"सीरियल पैरामीटर",波特率:"बॉड रेट",数据位:"डेटा बिट्स",停止位:"स्टॉप बिट्स",校验位:"पैरिटी",无校验:"कोई पैरिटी नहीं",奇校验:"विषम पैरिटी",偶校验:"सम पैरिटी",流控:"फ़्लो कंट्रोल",无:"कोई नहीं","读超时 (ms)":"रीड टाइमआउट (ms)","写超时 (ms)":"राइट टाइमआउट (ms)","TCP 端口":"TCP पोर्ट",保存后立即连接:"सहेजने के बाद कनेक्ट करें",创建后立即启动连接:"निर्माण के बाद कनेक्शन शुरू करें",取消:"रद्द करें",保存配置:"कॉन्फ़िगरेशन सहेजें",创建通道:"चैनल बनाएँ",新建协议:"नया प्रोटोकॉल",配置协议:"प्रोटोकॉल कॉन्फ़िगर करें",协议详情:"प्रोटोकॉल विवरण","添加自定义协议元数据,供解析引擎识别。":"पार्सर इंजन के लिए कस्टम प्रोटोकॉल मेटाडेटा जोड़ें।","查看或更新协议描述与分类。":"प्रोटोकॉल विवरण और श्रेणी देखें या अपडेट करें।",协议名称:"प्रोटोकॉल नाम",状态:"स्थिति",描述:"विवरण",驱动类:"ड्राइवर क्लास",保存:"सहेजें",删除协议:"प्रोटोकॉल हटाएँ",确认删除自定义协议:"कस्टम प्रोटोकॉल हटाने की पुष्टि करें","吗?":"?",确认删除:"हटाने की पुष्टि","UI YAML 预览":"UI YAML प्रीव्यू","脚本运行中展示 UI 渲染结果":"स्क्रिप्ट चलने के दौरान UI रेंडरिंग दिखाएँ",解析失败:"पार्स विफल","暂无可渲染的 UI 配置":"कोई UI कॉन्फ़िगरेशन रेंडर करने योग्य नहीं"},sg={...Pe,"nav.manual":"Terminale seriale","nav.scripts":"Script di automazione","nav.proxy":"Monitor proxy","nav.protocols":"Gestore protocolli","nav.settings":"Impostazioni","nav.workspace":"Area di lavoro admin","status.connected":"Connesso","status.connecting":"Connessione in corso","status.error":"Errore","status.disconnected":"Disconnesso","theme.system":"Sistema","theme.dark":"Scuro (Ingegnere)","theme.light":"Chiaro","header.protocols.title":"Gestore protocolli","header.protocols.desc":"Definisci i protocolli, associa i canali e configura le regole di parsing.","action.refresh":"Aggiorna","action.createProtocol":"Nuovo protocollo","protocol.tab.all":"Tutti i protocolli","protocol.tab.custom":"Personalizzato","header.settings.title":"Impostazioni app","header.settings.desc":"Gestisci preferenze globali, valori predefiniti e configurazione di runtime.","action.discardChanges":"Annulla modifiche","action.saveChanges":"Salva modifiche","settings.tab.general":"Generale","settings.tab.plugins":"Plugin","settings.tab.runtime":"Runtime","settings.tab.logs":"Log","settings.language":"Lingua","settings.theme":"Tema","settings.autoConnect.title":"Connessione automatica all’avvio","settings.autoConnect.desc":"Riconnetti automaticamente l’ultimo canale attivo.","settings.workspace":"Area di lavoro","settings.chooseFolder":"Scegli cartella","settings.plugins.title":"Plugin","settings.plugins.refresh":"Aggiorna elenco",空闲:"Inattivo",串口通道:"Canale seriale","TCP 客户端":"Client TCP","TCP 服务端":"Server TCP",端口:"Porta",运行中:"In esecuzione",请输入指令名称和内容:"Inserisci nome e contenuto del comando",协议:"Protocollo",可用:"Disponibile",自定义:"Personalizzato",已禁用:"Disabilitato",未知:"Sconosciuto",键名:"Chiave",驱动:"Driver",分类:"Categoria",搜索关键词:"Cerca parole chiave",选择工作区:"Seleziona area di lavoro",暂无描述:"Nessuna descrizione",配置:"Configura",查看:"Visualizza",暂无协议:"Nessun protocollo","暂无可用协议,可从内置模板创建或新增自定义协议。":"Nessun protocollo disponibile. Crea da modelli integrati o aggiungi un personalizzato.","v1.2.4 - 已启用":"v1.2.4 - Abilitato",已启用:"Abilitato","MQTT 适配器":"Adattatore MQTT","v0.9.8 - 未安装":"v0.9.8 - Non installato",未安装:"Non installato","暂无可配置项,运行时设置将随着模块扩展开放。":"Nessun elemento configurabile. Le impostazioni runtime saranno disponibili con l’espansione dei moduli.","日志采集与归档策略将在后续版本中提供。":"Le politiche di raccolta e archiviazione dei log saranno disponibili in una versione futura.",串口配置:"Configurazione seriale",新建通道:"Nuovo canale",配置串口连接参数:"Configura i parametri di connessione seriale",配置新的通信连接参数:"Configura i nuovi parametri di connessione","串口 (Serial)":"Seriale (Serial)","TCP / 网络":"TCP / Rete",基本信息:"Informazioni di base",通道名称:"Nome canale","例如:传感器A接口":"Esempio: interfaccia sensore A",串口端口:"Porta seriale",选择串口:"Seleziona porta seriale",无可用串口:"Nessuna porta seriale disponibile",目标地址:"Indirizzo di destinazione","例如:192.168.1.10":"Esempio: 192.168.1.10",串口参数:"Parametri seriali",波特率:"Baud rate",数据位:"Bit di dati",停止位:"Bit di stop",校验位:"Parità",无校验:"Nessuna parità",奇校验:"Parità dispari",偶校验:"Parità pari",流控:"Controllo di flusso",无:"Nessuno","读超时 (ms)":"Timeout lettura (ms)","写超时 (ms)":"Timeout scrittura (ms)","TCP 端口":"Porta TCP",保存后立即连接:"Connetti dopo il salvataggio",创建后立即启动连接:"Avvia la connessione dopo la creazione",取消:"Annulla",保存配置:"Salva configurazione",创建通道:"Crea canale",新建协议:"Nuovo protocollo",配置协议:"Configura protocollo",协议详情:"Dettagli protocollo","添加自定义协议元数据,供解析引擎识别。":"Aggiungi metadati di protocollo personalizzati per il motore di parsing.","查看或更新协议描述与分类。":"Visualizza o aggiorna descrizione e categoria del protocollo.",协议名称:"Nome protocollo",状态:"Stato",描述:"Descrizione",驱动类:"Classe driver",保存:"Salva",删除协议:"Elimina protocollo",确认删除自定义协议:"Conferma eliminazione protocollo personalizzato","吗?":"?",确认删除:"Conferma eliminazione","UI YAML 预览":"Anteprima UI YAML","脚本运行中展示 UI 渲染结果":"Mostra il rendering UI durante l’esecuzione dello script",解析失败:"Analisi non riuscita","暂无可渲染的 UI 配置":"Nessuna configurazione UI renderizzabile"},ag={...Pe,"nav.manual":"Seriële terminal","nav.scripts":"Automatiseringsscripts","nav.proxy":"Proxy-monitor","nav.protocols":"Protocolbeheer","nav.settings":"Instellingen","nav.workspace":"Admin-werkruimte","status.connected":"Verbonden","status.connecting":"Bezig met verbinden","status.error":"Fout","status.disconnected":"Niet verbonden","theme.system":"Systeem","theme.dark":"Donker (Engineer)","theme.light":"Licht","header.protocols.title":"Protocolbeheer","header.protocols.desc":"Definieer protocollen, koppel kanalen en configureer parse-regels.","action.refresh":"Vernieuwen","action.createProtocol":"Nieuw protocol","protocol.tab.all":"Alle protocollen","protocol.tab.custom":"Aangepast","header.settings.title":"App-instellingen","header.settings.desc":"Beheer globale voorkeuren, standaardwaarden en runtimeconfiguratie.","action.discardChanges":"Wijzigingen verwerpen","action.saveChanges":"Wijzigingen opslaan","settings.tab.general":"Algemeen","settings.tab.plugins":"Plugins","settings.tab.runtime":"Runtime","settings.tab.logs":"Logboeken","settings.language":"Taal","settings.theme":"Thema","settings.autoConnect.title":"Automatisch verbinden bij starten","settings.autoConnect.desc":"Automatisch opnieuw verbinden met het laatst actieve kanaal.","settings.workspace":"Werkruimte","settings.chooseFolder":"Map kiezen","settings.plugins.title":"Plugins","settings.plugins.refresh":"Lijst vernieuwen",空闲:"Inactief",串口通道:"Serieel kanaal","TCP 客户端":"TCP-client","TCP 服务端":"TCP-server",端口:"Poort",运行中:"Actief",请输入指令名称和内容:"Voer de opdrachtnaam en inhoud in",协议:"Protocol",可用:"Beschikbaar",自定义:"Aangepast",已禁用:"Uitgeschakeld",未知:"Onbekend",键名:"Sleutel",驱动:"Driver",分类:"Categorie",搜索关键词:"Zoek trefwoorden",选择工作区:"Werkruimte kiezen",暂无描述:"Geen beschrijving",配置:"Configureren",查看:"Bekijken",暂无协议:"Geen protocollen","暂无可用协议,可从内置模板创建或新增自定义协议。":"Geen protocollen beschikbaar. Maak aan vanuit ingebouwde sjablonen of voeg een aangepast protocol toe.","v1.2.4 - 已启用":"v1.2.4 - Ingeschakeld",已启用:"Ingeschakeld","MQTT 适配器":"MQTT-adapter","v0.9.8 - 未安装":"v0.9.8 - Niet geïnstalleerd",未安装:"Niet geïnstalleerd","暂无可配置项,运行时设置将随着模块扩展开放。":"Geen configureerbare items. Runtime-instellingen worden beschikbaar naarmate modules uitbreiden.","日志采集与归档策略将在后续版本中提供。":"Beleid voor logverzameling en archivering is beschikbaar in een toekomstige release.",串口配置:"Seriële configuratie",新建通道:"Nieuw kanaal",配置串口连接参数:"Seriële verbindingsparameters configureren",配置新的通信连接参数:"Nieuwe verbindingsparameters configureren","串口 (Serial)":"Serieel (Serial)","TCP / 网络":"TCP / Netwerk",基本信息:"Basisinformatie",通道名称:"Kanaalnaam","例如:传感器A接口":"Voorbeeld: sensor A-interface",串口端口:"Seriële poort",选择串口:"Seriële poort selecteren",无可用串口:"Geen beschikbare seriële poorten",目标地址:"Doeladres","例如:192.168.1.10":"Voorbeeld: 192.168.1.10",串口参数:"Seriële parameters",波特率:"Baudsnelheid",数据位:"Databits",停止位:"Stopbits",校验位:"Pariteit",无校验:"Geen pariteit",奇校验:"Oneven pariteit",偶校验:"Even pariteit",流控:"Flow control",无:"Geen","读超时 (ms)":"Lees-timeout (ms)","写超时 (ms)":"Schrijf-timeout (ms)","TCP 端口":"TCP-poort",保存后立即连接:"Verbinden na opslaan",创建后立即启动连接:"Verbinding starten na aanmaken",取消:"Annuleren",保存配置:"Configuratie opslaan",创建通道:"Kanaal maken",新建协议:"Nieuw protocol",配置协议:"Protocol configureren",协议详情:"Protocoldetails","添加自定义协议元数据,供解析引擎识别。":"Aangepaste protocolmetadata toevoegen zodat de parser-engine deze herkent.","查看或更新协议描述与分类。":"Protocolbeschrijving en categorie bekijken of bijwerken.",协议名称:"Protocolnaam",状态:"Status",描述:"Beschrijving",驱动类:"Driver-klasse",保存:"Opslaan",删除协议:"Protocol verwijderen",确认删除自定义协议:"Bevestig verwijderen van aangepast protocol","吗?":"?",确认删除:"Verwijderen bevestigen","UI YAML 预览":"UI YAML-voorvertoning","脚本运行中展示 UI 渲染结果":"UI-rendering tonen tijdens het uitvoeren van het script",解析失败:"Parseren mislukt","暂无可渲染的 UI 配置":"Geen renderbare UI-configuratie"},ig={...Pe,"nav.manual":"เทอร์มินัลอนุกรม","nav.scripts":"สคริปต์อัตโนมัติ","nav.proxy":"มอนิเตอร์พร็อกซี","nav.protocols":"ตัวจัดการโปรโตคอล","nav.settings":"การตั้งค่า","nav.workspace":"เวิร์กสเปซผู้ดูแล","status.connected":"เชื่อมต่อแล้ว","status.connecting":"กำลังเชื่อมต่อ","status.error":"ข้อผิดพลาด","status.disconnected":"ยกเลิกการเชื่อมต่อ","theme.system":"ระบบ","theme.dark":"มืด (วิศวกร)","theme.light":"สว่าง","header.protocols.title":"ตัวจัดการโปรโตคอล","header.protocols.desc":"กำหนดโปรโตคอล ผูกช่องทาง และกำหนดกฎการแยกวิเคราะห์","action.refresh":"รีเฟรช","action.createProtocol":"โปรโตคอลใหม่","protocol.tab.all":"โปรโตคอลทั้งหมด","protocol.tab.custom":"กำหนดเอง","header.settings.title":"การตั้งค่าแอป","header.settings.desc":"จัดการค่ากำหนดทั่วไประดับโลก ค่าเริ่มต้น และการกำหนดค่าขณะทำงาน","action.discardChanges":"ยกเลิกการเปลี่ยนแปลง","action.saveChanges":"บันทึกการเปลี่ยนแปลง","settings.tab.general":"ทั่วไป","settings.tab.plugins":"ปลั๊กอิน","settings.tab.runtime":"ขณะทำงาน","settings.tab.logs":"บันทึก","settings.language":"ภาษา","settings.theme":"ธีม","settings.autoConnect.title":"เชื่อมต่ออัตโนมัติเมื่อเปิด","settings.autoConnect.desc":"เชื่อมต่อกับช่องทางที่ใช้งานล่าสุดโดยอัตโนมัติ","settings.workspace":"เวิร์กสเปซ","settings.chooseFolder":"เลือกโฟลเดอร์","settings.plugins.title":"ปลั๊กอิน","settings.plugins.refresh":"รีเฟรชรายการ",空闲:"ว่าง",串口通道:"ช่องทางอนุกรม","TCP 客户端":"ไคลเอนต์ TCP","TCP 服务端":"เซิร์ฟเวอร์ TCP",端口:"พอร์ต",运行中:"กำลังทำงาน",请输入指令名称和内容:"ป้อนชื่อคำสั่งและเนื้อหา",协议:"โปรโตคอล",可用:"พร้อมใช้งาน",自定义:"กำหนดเอง",已禁用:"ปิดใช้งาน",未知:"ไม่ทราบ",键名:"คีย์",驱动:"ไดรเวอร์",分类:"หมวดหมู่",搜索关键词:"ค้นหาคีย์เวิร์ด",选择工作区:"เลือกเวิร์กสเปซ",暂无描述:"ไม่มีคำอธิบาย",配置:"กำหนดค่า",查看:"ดู",暂无协议:"ไม่มีโปรโตคอล","暂无可用协议,可从内置模板创建或新增自定义协议。":"ไม่มีโปรโตคอลที่ใช้ได้ สร้างจากเทมเพลตในตัวหรือเพิ่มแบบกำหนดเอง","v1.2.4 - 已启用":"v1.2.4 - เปิดใช้งาน",已启用:"เปิดใช้งาน","MQTT 适配器":"อะแดปเตอร์ MQTT","v0.9.8 - 未安装":"v0.9.8 - ยังไม่ได้ติดตั้ง",未安装:"ยังไม่ได้ติดตั้ง","暂无可配置项,运行时设置将随着模块扩展开放。":"ไม่มีรายการที่กำหนดค่าได้ การตั้งค่าขณะทำงานจะพร้อมใช้งานเมื่อโมดูลขยาย","日志采集与归档策略将在后续版本中提供。":"นโยบายการเก็บรวบรวมและการจัดเก็บบันทึกจะมีในเวอร์ชันถัดไป",串口配置:"การกำหนดค่าอนุกรม",新建通道:"ช่องทางใหม่",配置串口连接参数:"กำหนดค่าพารามิเตอร์การเชื่อมต่ออนุกรม",配置新的通信连接参数:"กำหนดค่าพารามิเตอร์การเชื่อมต่อใหม่","串口 (Serial)":"อนุกรม (Serial)","TCP / 网络":"TCP / เครือข่าย",基本信息:"ข้อมูลพื้นฐาน",通道名称:"ชื่อช่องทาง","例如:传感器A接口":"ตัวอย่าง: อินเทอร์เฟซเซ็นเซอร์ A",串口端口:"พอร์ตอนุกรม",选择串口:"เลือกพอร์ตอนุกรม",无可用串口:"ไม่มีพอร์ตอนุกรมที่ใช้ได้",目标地址:"ที่อยู่เป้าหมาย","例如:192.168.1.10":"ตัวอย่าง: 192.168.1.10",串口参数:"พารามิเตอร์อนุกรม",波特率:"อัตรา baud",数据位:"บิตข้อมูล",停止位:"บิตหยุด",校验位:"พาริตี้",无校验:"ไม่มีพาริตี้",奇校验:"พาริตี้คี่",偶校验:"พาริตี้คู่",流控:"การควบคุมโฟลว์",无:"ไม่มี","读超时 (ms)":"หมดเวลาอ่าน (ms)","写超时 (ms)":"หมดเวลาเขียน (ms)","TCP 端口":"พอร์ต TCP",保存后立即连接:"เชื่อมต่อหลังบันทึก",创建后立即启动连接:"เริ่มเชื่อมต่อหลังสร้าง",取消:"ยกเลิก",保存配置:"บันทึกการกำหนดค่า",创建通道:"สร้างช่องทาง",新建协议:"โปรโตคอลใหม่",配置协议:"กำหนดค่าโปรโตคอล",协议详情:"รายละเอียดโปรโตคอล","添加自定义协议元数据,供解析引擎识别。":"เพิ่มเมตาดาตาโปรโตคอลกำหนดเองให้เครื่องมือแยกวิเคราะห์รู้จัก","查看或更新协议描述与分类。":"ดูหรืออัปเดตคำอธิบายและหมวดหมู่โปรโตคอล",协议名称:"ชื่อโปรโตคอล",状态:"สถานะ",描述:"คำอธิบาย",驱动类:"คลาสไดรเวอร์",保存:"บันทึก",删除协议:"ลบโปรโตคอล",确认删除自定义协议:"ยืนยันการลบโปรโตคอลกำหนดเอง","吗?":"?",确认删除:"ยืนยันการลบ","UI YAML 预览":"ตัวอย่าง UI YAML","脚本运行中展示 UI 渲染结果":"แสดงผลการเรนเดอร์ UI ขณะสคริปต์ทำงาน",解析失败:"การแยกวิเคราะห์ล้มเหลว","暂无可渲染的 UI 配置":"ไม่มีการกำหนดค่า UI ที่เรนเดอร์ได้"},og={...Pe,"nav.manual":"Terminal nối tiếp","nav.scripts":"Script tự động hóa","nav.proxy":"Giám sát proxy","nav.protocols":"Trình quản lý giao thức","nav.settings":"Cài đặt","nav.workspace":"Không gian làm việc quản trị","status.connected":"Đã kết nối","status.connecting":"Đang kết nối","status.error":"Lỗi","status.disconnected":"Đã ngắt kết nối","theme.system":"Hệ thống","theme.dark":"Tối (Kỹ sư)","theme.light":"Sáng","header.protocols.title":"Trình quản lý giao thức","header.protocols.desc":"Định nghĩa giao thức, liên kết kênh và cấu hình quy tắc phân tích.","action.refresh":"Làm mới","action.createProtocol":"Giao thức mới","protocol.tab.all":"Tất cả giao thức","protocol.tab.custom":"Tùy chỉnh","header.settings.title":"Cài đặt ứng dụng","header.settings.desc":"Quản lý tùy chọn toàn cục, giá trị mặc định và cấu hình thời gian chạy.","action.discardChanges":"Hủy thay đổi","action.saveChanges":"Lưu thay đổi","settings.tab.general":"Chung","settings.tab.plugins":"Plugin","settings.tab.runtime":"Runtime","settings.tab.logs":"Nhật ký","settings.language":"Ngôn ngữ","settings.theme":"Chủ đề","settings.autoConnect.title":"Tự động kết nối khi khởi động","settings.autoConnect.desc":"Tự động kết nối lại kênh hoạt động gần nhất.","settings.workspace":"Không gian làm việc","settings.chooseFolder":"Chọn thư mục","settings.plugins.title":"Plugin","settings.plugins.refresh":"Làm mới danh sách",空闲:"Nhàn rỗi",串口通道:"Kênh nối tiếp","TCP 客户端":"Máy khách TCP","TCP 服务端":"Máy chủ TCP",端口:"Cổng",运行中:"Đang chạy",请输入指令名称和内容:"Nhập tên và nội dung lệnh",协议:"Giao thức",可用:"Có sẵn",自定义:"Tùy chỉnh",已禁用:"Vô hiệu hóa",未知:"Không xác định",键名:"Khóa",驱动:"Trình điều khiển",分类:"Danh mục",搜索关键词:"Tìm từ khóa",选择工作区:"Chọn không gian làm việc",暂无描述:"Không có mô tả",配置:"Cấu hình",查看:"Xem",暂无协议:"Không có giao thức","暂无可用协议,可从内置模板创建或新增自定义协议。":"Không có giao thức nào. Tạo từ mẫu tích hợp hoặc thêm tùy chỉnh.","v1.2.4 - 已启用":"v1.2.4 - Đã bật",已启用:"Đã bật","MQTT 适配器":"Bộ chuyển đổi MQTT","v0.9.8 - 未安装":"v0.9.8 - Chưa cài đặt",未安装:"Chưa cài đặt","暂无可配置项,运行时设置将随着模块扩展开放。":"Không có mục nào có thể cấu hình. Cài đặt runtime sẽ mở khi mô-đun mở rộng.","日志采集与归档策略将在后续版本中提供。":"Chính sách thu thập và lưu trữ nhật ký sẽ có trong phiên bản tương lai.",串口配置:"Cấu hình nối tiếp",新建通道:"Kênh mới",配置串口连接参数:"Cấu hình tham số kết nối nối tiếp",配置新的通信连接参数:"Cấu hình tham số kết nối mới","串口 (Serial)":"Nối tiếp (Serial)","TCP / 网络":"TCP / Mạng",基本信息:"Thông tin cơ bản",通道名称:"Tên kênh","例如:传感器A接口":"Ví dụ: giao diện cảm biến A",串口端口:"Cổng nối tiếp",选择串口:"Chọn cổng nối tiếp",无可用串口:"Không có cổng nối tiếp khả dụng",目标地址:"Địa chỉ đích","例如:192.168.1.10":"Ví dụ: 192.168.1.10",串口参数:"Tham số nối tiếp",波特率:"Tốc độ baud",数据位:"Bit dữ liệu",停止位:"Bit dừng",校验位:"Chẵn lẻ",无校验:"Không chẵn lẻ",奇校验:"Chẵn lẻ lẻ",偶校验:"Chẵn lẻ chẵn",流控:"Điều khiển luồng",无:"Không","读超时 (ms)":"Hết thời gian đọc (ms)","写超时 (ms)":"Hết thời gian ghi (ms)","TCP 端口":"Cổng TCP",保存后立即连接:"Kết nối sau khi lưu",创建后立即启动连接:"Bắt đầu kết nối sau khi tạo",取消:"Hủy",保存配置:"Lưu cấu hình",创建通道:"Tạo kênh",新建协议:"Giao thức mới",配置协议:"Cấu hình giao thức",协议详情:"Chi tiết giao thức","添加自定义协议元数据,供解析引擎识别。":"Thêm siêu dữ liệu giao thức tùy chỉnh để bộ phân tích nhận diện.","查看或更新协议描述与分类。":"Xem hoặc cập nhật mô tả và danh mục giao thức.",协议名称:"Tên giao thức",状态:"Trạng thái",描述:"Mô tả",驱动类:"Lớp trình điều khiển",保存:"Lưu",删除协议:"Xóa giao thức",确认删除自定义协议:"Xác nhận xóa giao thức tùy chỉnh","吗?":"?",确认删除:"Xác nhận xóa","UI YAML 预览":"Xem trước UI YAML","脚本运行中展示 UI 渲染结果":"Hiển thị kết quả render UI khi script chạy",解析失败:"Phân tích thất bại","暂无可渲染的 UI 配置":"Không có cấu hình UI có thể render"},lg={...Pe,"nav.manual":"Terminal serial","nav.scripts":"Skrip otomatisasi","nav.proxy":"Monitor proxy","nav.protocols":"Manajer protokol","nav.settings":"Pengaturan","nav.workspace":"Ruang kerja admin","status.connected":"Terhubung","status.connecting":"Menghubungkan","status.error":"Kesalahan","status.disconnected":"Terputus","theme.system":"Sistem","theme.dark":"Gelap (Insinyur)","theme.light":"Terang","header.protocols.title":"Manajer protokol","header.protocols.desc":"Tentukan protokol, kaitkan kanal, dan konfigurasi aturan parsing.","action.refresh":"Muat ulang","action.createProtocol":"Protokol baru","protocol.tab.all":"Semua protokol","protocol.tab.custom":"Kustom","header.settings.title":"Pengaturan aplikasi","header.settings.desc":"Kelola preferensi global, nilai default, dan konfigurasi runtime.","action.discardChanges":"Batalkan perubahan","action.saveChanges":"Simpan perubahan","settings.tab.general":"Umum","settings.tab.plugins":"Plugin","settings.tab.runtime":"Runtime","settings.tab.logs":"Log","settings.language":"Bahasa","settings.theme":"Tema","settings.autoConnect.title":"Sambung otomatis saat mulai","settings.autoConnect.desc":"Sambungkan kembali ke kanal aktif terakhir secara otomatis.","settings.workspace":"Ruang kerja","settings.chooseFolder":"Pilih folder","settings.plugins.title":"Plugin","settings.plugins.refresh":"Muat ulang daftar",空闲:"Menganggur",串口通道:"Kanal serial","TCP 客户端":"Klien TCP","TCP 服务端":"Server TCP",端口:"Port",运行中:"Berjalan",请输入指令名称和内容:"Masukkan nama dan isi perintah",协议:"Protokol",可用:"Tersedia",自定义:"Kustom",已禁用:"Dinonaktifkan",未知:"Tidak diketahui",键名:"Kunci",驱动:"Driver",分类:"Kategori",搜索关键词:"Cari kata kunci",选择工作区:"Pilih ruang kerja",暂无描述:"Tidak ada deskripsi",配置:"Konfigurasi",查看:"Lihat",暂无协议:"Tidak ada protokol","暂无可用协议,可从内置模板创建或新增自定义协议。":"Tidak ada protokol tersedia. Buat dari template bawaan atau tambah kustom.","v1.2.4 - 已启用":"v1.2.4 - Diaktifkan",已启用:"Diaktifkan","MQTT 适配器":"Adaptor MQTT","v0.9.8 - 未安装":"v0.9.8 - Belum terpasang",未安装:"Belum terpasang","暂无可配置项,运行时设置将随着模块扩展开放。":"Tidak ada item yang dapat dikonfigurasi. Pengaturan runtime akan tersedia saat modul diperluas.","日志采集与归档策略将在后续版本中提供。":"Kebijakan pengumpulan dan pengarsipan log akan tersedia pada rilis mendatang.",串口配置:"Konfigurasi serial",新建通道:"Kanal baru",配置串口连接参数:"Konfigurasi parameter koneksi serial",配置新的通信连接参数:"Konfigurasi parameter koneksi baru","串口 (Serial)":"Serial (Serial)","TCP / 网络":"TCP / Jaringan",基本信息:"Info dasar",通道名称:"Nama kanal","例如:传感器A接口":"Contoh: antarmuka sensor A",串口端口:"Port serial",选择串口:"Pilih port serial",无可用串口:"Tidak ada port serial yang tersedia",目标地址:"Alamat target","例如:192.168.1.10":"Contoh: 192.168.1.10",串口参数:"Parameter serial",波特率:"Laju baud",数据位:"Bit data",停止位:"Bit stop",校验位:"Paritas",无校验:"Tanpa paritas",奇校验:"Paritas ganjil",偶校验:"Paritas genap",流控:"Kontrol aliran",无:"Tidak ada","读超时 (ms)":"Batas waktu baca (ms)","写超时 (ms)":"Batas waktu tulis (ms)","TCP 端口":"Port TCP",保存后立即连接:"Hubungkan setelah menyimpan",创建后立即启动连接:"Mulai koneksi setelah dibuat",取消:"Batal",保存配置:"Simpan konfigurasi",创建通道:"Buat kanal",新建协议:"Protokol baru",配置协议:"Konfigurasi protokol",协议详情:"Detail protokol","添加自定义协议元数据,供解析引擎识别。":"Tambahkan metadata protokol kustom agar mesin parser mengenalinya.","查看或更新协议描述与分类。":"Lihat atau perbarui deskripsi dan kategori protokol.",协议名称:"Nama protokol",状态:"Status",描述:"Deskripsi",驱动类:"Kelas driver",保存:"Simpan",删除协议:"Hapus protokol",确认删除自定义协议:"Konfirmasi hapus protokol kustom","吗?":"?",确认删除:"Konfirmasi hapus","UI YAML 预览":"Pratinjau UI YAML","脚本运行中展示 UI 渲染结果":"Tampilkan rendering UI saat skrip berjalan",解析失败:"Gagal parsing","暂无可渲染的 UI 配置":"Tidak ada konfigurasi UI yang dapat dirender"},cg={...Pe,"nav.manual":"Seri terminal","nav.scripts":"Otomasyon betikleri","nav.proxy":"Proxy izleyici","nav.protocols":"Protokol yöneticisi","nav.settings":"Ayarlar","nav.workspace":"Yönetici çalışma alanı","status.connected":"Bağlı","status.connecting":"Bağlanıyor","status.error":"Hata","status.disconnected":"Bağlı değil","theme.system":"Sistem","theme.dark":"Koyu (Mühendis)","theme.light":"Açık","header.protocols.title":"Protokol yöneticisi","header.protocols.desc":"Protokolleri tanımlayın, kanalları bağlayın ve ayrıştırma kurallarını yapılandırın.","action.refresh":"Yenile","action.createProtocol":"Yeni protokol","protocol.tab.all":"Tüm protokoller","protocol.tab.custom":"Özel","header.settings.title":"Uygulama ayarları","header.settings.desc":"Genel tercihleri, varsayılanları ve çalışma zamanı yapılandırmasını yönetin.","action.discardChanges":"Değişiklikleri at","action.saveChanges":"Değişiklikleri kaydet","settings.tab.general":"Genel","settings.tab.plugins":"Eklentiler","settings.tab.runtime":"Çalışma zamanı","settings.tab.logs":"Günlükler","settings.language":"Dil","settings.theme":"Tema","settings.autoConnect.title":"Başlangıçta otomatik bağlan","settings.autoConnect.desc":"Son etkin kanala otomatik olarak yeniden bağlan.","settings.workspace":"Çalışma alanı","settings.chooseFolder":"Klasör seç","settings.plugins.title":"Eklentiler","settings.plugins.refresh":"Listeyi yenile",空闲:"Boşta",串口通道:"Seri kanal","TCP 客户端":"TCP istemcisi","TCP 服务端":"TCP sunucusu",端口:"Port",运行中:"Çalışıyor",请输入指令名称和内容:"Komut adı ve içeriğini girin",协议:"Protokol",可用:"Kullanılabilir",自定义:"Özel",已禁用:"Devre dışı",未知:"Bilinmeyen",键名:"Anahtar",驱动:"Sürücü",分类:"Kategori",搜索关键词:"Anahtar kelime ara",选择工作区:"Çalışma alanı seç",暂无描述:"Açıklama yok",配置:"Yapılandır",查看:"Görüntüle",暂无协议:"Protokol yok","暂无可用协议,可从内置模板创建或新增自定义协议。":"Kullanılabilir protokol yok. Dahili şablonlardan oluşturun veya özel ekleyin.","v1.2.4 - 已启用":"v1.2.4 - Etkin",已启用:"Etkin","MQTT 适配器":"MQTT adaptörü","v0.9.8 - 未安装":"v0.9.8 - Yüklü değil",未安装:"Yüklü değil","暂无可配置项,运行时设置将随着模块扩展开放。":"Yapılandırılabilir öğe yok. Çalışma zamanı ayarları modüller genişledikçe açılacaktır.","日志采集与归档策略将在后续版本中提供。":"Günlük toplama ve arşivleme politikaları gelecekteki bir sürümde sunulacak.",串口配置:"Seri yapılandırma",新建通道:"Yeni kanal",配置串口连接参数:"Seri bağlantı parametrelerini yapılandır",配置新的通信连接参数:"Yeni bağlantı parametrelerini yapılandır","串口 (Serial)":"Seri (Serial)","TCP / 网络":"TCP / Ağ",基本信息:"Temel bilgiler",通道名称:"Kanal adı","例如:传感器A接口":"Örnek: Sensör A arayüzü",串口端口:"Seri port",选择串口:"Seri port seç",无可用串口:"Kullanılabilir seri port yok",目标地址:"Hedef adres","例如:192.168.1.10":"Örnek: 192.168.1.10",串口参数:"Seri parametreler",波特率:"Baud hızı",数据位:"Veri bitleri",停止位:"Stop bitleri",校验位:"Parite",无校验:"Parite yok",奇校验:"Tek parite",偶校验:"Çift parite",流控:"Akış kontrolü",无:"Yok","读超时 (ms)":"Okuma zaman aşımı (ms)","写超时 (ms)":"Yazma zaman aşımı (ms)","TCP 端口":"TCP portu",保存后立即连接:"Kaydettikten sonra bağlan",创建后立即启动连接:"Oluşturulduktan sonra bağlantıyı başlat",取消:"İptal",保存配置:"Yapılandırmayı kaydet",创建通道:"Kanal oluştur",新建协议:"Yeni protokol",配置协议:"Protokolü yapılandır",协议详情:"Protokol ayrıntıları","添加自定义协议元数据,供解析引擎识别。":"Çözümleyici motorun tanıması için özel protokol meta verileri ekle.","查看或更新协议描述与分类。":"Protokol açıklaması ve kategorisini görüntüleyin veya güncelleyin.",协议名称:"Protokol adı",状态:"Durum",描述:"Açıklama",驱动类:"Sürücü sınıfı",保存:"Kaydet",删除协议:"Protokolü sil",确认删除自定义协议:"Özel protokolü silmeyi onayla","吗?":"?",确认删除:"Silmeyi onayla","UI YAML 预览":"UI YAML önizleme","脚本运行中展示 UI 渲染结果":"Betik çalışırken UI render sonucunu göster",解析失败:"Ayrıştırma başarısız","暂无可渲染的 UI 配置":"Render edilebilir UI yapılandırması yok"},ug={...Pe,"nav.manual":"Terminal szeregowy","nav.scripts":"Skrypty automatyzacji","nav.proxy":"Monitor proxy","nav.protocols":"Menedżer protokołów","nav.settings":"Ustawienia","nav.workspace":"Obszar roboczy administratora","status.connected":"Połączono","status.connecting":"Łączenie","status.error":"Błąd","status.disconnected":"Rozłączono","theme.system":"System","theme.dark":"Ciemny (Inżynier)","theme.light":"Jasny","header.protocols.title":"Menedżer protokołów","header.protocols.desc":"Definiuj protokoły, przypisuj kanały i konfiguruj reguły parsowania.","action.refresh":"Odśwież","action.createProtocol":"Nowy protokół","protocol.tab.all":"Wszystkie protokoły","protocol.tab.custom":"Niestandardowy","header.settings.title":"Ustawienia aplikacji","header.settings.desc":"Zarządzaj globalnymi preferencjami, domyślnymi wartościami i konfiguracją uruchomieniową.","action.discardChanges":"Odrzuć zmiany","action.saveChanges":"Zapisz zmiany","settings.tab.general":"Ogólne","settings.tab.plugins":"Wtyczki","settings.tab.runtime":"Środowisko wykonawcze","settings.tab.logs":"Logi","settings.language":"Język","settings.theme":"Motyw","settings.autoConnect.title":"Automatyczne łączenie przy starcie","settings.autoConnect.desc":"Automatycznie łącz z ostatnim aktywnym kanałem.","settings.workspace":"Obszar roboczy","settings.chooseFolder":"Wybierz folder","settings.plugins.title":"Wtyczki","settings.plugins.refresh":"Odśwież listę",空闲:"Bezczynny",串口通道:"Kanał szeregowy","TCP 客户端":"Klient TCP","TCP 服务端":"Serwer TCP",端口:"Port",运行中:"Uruchomiony",请输入指令名称和内容:"Wprowadź nazwę i treść polecenia",协议:"Protokół",可用:"Dostępne",自定义:"Niestandardowy",已禁用:"Wyłączony",未知:"Nieznany",键名:"Klucz",驱动:"Sterownik",分类:"Kategoria",搜索关键词:"Szukaj słów kluczowych",选择工作区:"Wybierz obszar roboczy",暂无描述:"Brak opisu",配置:"Konfiguruj",查看:"Wyświetl",暂无协议:"Brak protokołów","暂无可用协议,可从内置模板创建或新增自定义协议。":"Brak dostępnych protokołów. Utwórz z wbudowanych szablonów lub dodaj niestandardowy.","v1.2.4 - 已启用":"v1.2.4 - Włączony",已启用:"Włączony","MQTT 适配器":"Adapter MQTT","v0.9.8 - 未安装":"v0.9.8 - Nie zainstalowano",未安装:"Nie zainstalowano","暂无可配置项,运行时设置将随着模块扩展开放。":"Brak konfigurowalnych elementów. Ustawienia uruchomieniowe będą dostępne wraz z rozbudową modułów.","日志采集与归档策略将在后续版本中提供。":"Zasady zbierania i archiwizacji logów będą dostępne w przyszłej wersji.",串口配置:"Konfiguracja szeregowa",新建通道:"Nowy kanał",配置串口连接参数:"Skonfiguruj parametry połączenia szeregowego",配置新的通信连接参数:"Skonfiguruj nowe parametry połączenia","串口 (Serial)":"Szeregowy (Serial)","TCP / 网络":"TCP / Sieć",基本信息:"Podstawowe informacje",通道名称:"Nazwa kanału","例如:传感器A接口":"Przykład: interfejs czujnika A",串口端口:"Port szeregowy",选择串口:"Wybierz port szeregowy",无可用串口:"Brak dostępnych portów szeregowych",目标地址:"Adres docelowy","例如:192.168.1.10":"Przykład: 192.168.1.10",串口参数:"Parametry szeregowe",波特率:"Prędkość baud",数据位:"Bity danych",停止位:"Bity stopu",校验位:"Parzystość",无校验:"Brak parzystości",奇校验:"Parzystość nieparzysta",偶校验:"Parzystość parzysta",流控:"Kontrola przepływu",无:"Brak","读超时 (ms)":"Limit czasu odczytu (ms)","写超时 (ms)":"Limit czasu zapisu (ms)","TCP 端口":"Port TCP",保存后立即连接:"Połącz po zapisaniu",创建后立即启动连接:"Uruchom połączenie po utworzeniu",取消:"Anuluj",保存配置:"Zapisz konfigurację",创建通道:"Utwórz kanał",新建协议:"Nowy protokół",配置协议:"Konfiguruj protokół",协议详情:"Szczegóły protokołu","添加自定义协议元数据,供解析引擎识别。":"Dodaj niestandardowe metadane protokołu, aby silnik parsera je rozpoznał.","查看或更新协议描述与分类。":"Wyświetl lub zaktualizuj opis i kategorię protokołu.",协议名称:"Nazwa protokołu",状态:"Status",描述:"Opis",驱动类:"Klasa sterownika",保存:"Zapisz",删除协议:"Usuń protokół",确认删除自定义协议:"Potwierdź usunięcie niestandardowego protokołu","吗?":"?",确认删除:"Potwierdź usunięcie","UI YAML 预览":"Podgląd UI YAML","脚本运行中展示 UI 渲染结果":"Pokaż renderowanie UI podczas działania skryptu",解析失败:"Nieudane parsowanie","暂无可渲染的 UI 配置":"Brak renderowalnej konfiguracji UI"},dg={...Pe,"nav.manual":"Послідовний термінал","nav.scripts":"Скрипти автоматизації","nav.proxy":"Монітор проксі","nav.protocols":"Менеджер протоколів","nav.settings":"Налаштування","nav.workspace":"Робочий простір адміністратора","status.connected":"Підключено","status.connecting":"Підключення","status.error":"Помилка","status.disconnected":"Відключено","theme.system":"Система","theme.dark":"Темна (Інженер)","theme.light":"Світла","header.protocols.title":"Менеджер протоколів","header.protocols.desc":"Визначайте протоколи, прив’язуйте канали та налаштовуйте правила розбору.","action.refresh":"Оновити","action.createProtocol":"Новий протокол","protocol.tab.all":"Усі протоколи","protocol.tab.custom":"Користувацький","header.settings.title":"Налаштування застосунку","header.settings.desc":"Керуйте глобальними параметрами, значеннями за замовчуванням і конфігурацією виконання.","action.discardChanges":"Скасувати зміни","action.saveChanges":"Зберегти зміни","settings.tab.general":"Загальні","settings.tab.plugins":"Плагіни","settings.tab.runtime":"Виконання","settings.tab.logs":"Журнали","settings.language":"Мова","settings.theme":"Тема","settings.autoConnect.title":"Автопідключення під час запуску","settings.autoConnect.desc":"Автоматично перепідключатися до останнього активного каналу.","settings.workspace":"Робочий простір","settings.chooseFolder":"Вибрати папку","settings.plugins.title":"Плагіни","settings.plugins.refresh":"Оновити список",空闲:"Бездіяльний",串口通道:"Послідовний канал","TCP 客户端":"TCP-клієнт","TCP 服务端":"TCP-сервер",端口:"Порт",运行中:"Працює",请输入指令名称和内容:"Введіть назву та вміст команди",协议:"Протокол",可用:"Доступний",自定义:"Користувацький",已禁用:"Вимкнений",未知:"Невідомо",键名:"Ключ",驱动:"Драйвер",分类:"Категорія",搜索关键词:"Пошук ключових слів",选择工作区:"Вибрати робочий простір",暂无描述:"Без опису",配置:"Налаштувати",查看:"Переглянути",暂无协议:"Немає протоколів","暂无可用协议,可从内置模板创建或新增自定义协议。":"Немає доступних протоколів. Створіть із вбудованих шаблонів або додайте власний.","v1.2.4 - 已启用":"v1.2.4 - Увімкнено",已启用:"Увімкнено","MQTT 适配器":"MQTT-адаптер","v0.9.8 - 未安装":"v0.9.8 - Не встановлено",未安装:"Не встановлено","暂无可配置项,运行时设置将随着模块扩展开放。":"Немає елементів для налаштування. Налаштування виконання будуть доступні зі зростанням модулів.","日志采集与归档策略将在后续版本中提供。":"Політики збору та архівації журналів будуть доступні у майбутньому випуску.",串口配置:"Послідовна конфігурація",新建通道:"Новий канал",配置串口连接参数:"Налаштувати параметри послідовного з’єднання",配置新的通信连接参数:"Налаштувати нові параметри з’єднання","串口 (Serial)":"Послідовний (Serial)","TCP / 网络":"TCP / Мережа",基本信息:"Основна інформація",通道名称:"Назва каналу","例如:传感器A接口":"Приклад: інтерфейс датчика A",串口端口:"Послідовний порт",选择串口:"Вибрати послідовний порт",无可用串口:"Немає доступних послідовних портів",目标地址:"Цільова адреса","例如:192.168.1.10":"Приклад: 192.168.1.10",串口参数:"Параметри послідовного порту",波特率:"Швидкість бод",数据位:"Біти даних",停止位:"Стоп-біти",校验位:"Парність",无校验:"Без парності",奇校验:"Непарна парність",偶校验:"Парна парність",流控:"Керування потоком",无:"Немає","读超时 (ms)":"Тайм-аут читання (мс)","写超时 (ms)":"Тайм-аут запису (мс)","TCP 端口":"TCP-порт",保存后立即连接:"Підключити після збереження",创建后立即启动连接:"Запустити підключення після створення",取消:"Скасувати",保存配置:"Зберегти конфігурацію",创建通道:"Створити канал",新建协议:"Новий протокол",配置协议:"Налаштувати протокол",协议详情:"Деталі протоколу","添加自定义协议元数据,供解析引擎识别。":"Додайте користувацькі метадані протоколу, щоб рушій аналізу їх розпізнав.","查看或更新协议描述与分类。":"Переглянути або оновити опис і категорію протоколу.",协议名称:"Назва протоколу",状态:"Статус",描述:"Опис",驱动类:"Клас драйвера",保存:"Зберегти",删除协议:"Видалити протокол",确认删除自定义协议:"Підтвердити видалення користувацького протоколу","吗?":"?",确认删除:"Підтвердити видалення","UI YAML 预览":"Попередній перегляд UI YAML","脚本运行中展示 UI 渲染结果":"Показувати рендеринг UI під час виконання скрипту",解析失败:"Помилка розбору","暂无可渲染的 UI 配置":"Немає конфігурації UI для рендерингу"},xl={"zh-CN":Zh,"zh-TW":qh,"en-US":Pe,"ja-JP":Yh,"ko-KR":Gh,"fr-FR":Qh,"de-DE":Jh,"es-ES":Xh,"pt-BR":eg,"ru-RU":tg,ar:ng,hi:rg,"it-IT":sg,"nl-NL":ag,"th-TH":ig,"vi-VN":og,"id-ID":lg,"tr-TR":cg,"pl-PL":ug,"uk-UA":dg},fg=new Set(Object.keys(xl)),hg="zh-CN",gg=Object.freeze(Object.defineProperty({__proto__:null,DEFAULT_LANGUAGE:hg,supportedLanguages:fg,translations:xl},Symbol.toStringTag,{value:"Module"})),na=Array.from({length:32},(e,t)=>`COM${t+1}`),pg=[9600,19200,38400,57600,115200],$e={portPlaceholder:"COM1",baud:115200,dataBits:"8",stopBits:"1",parity:"none",flowControl:"none",readTimeoutMs:1e3,writeTimeoutMs:1e3},wt={host:"127.0.0.1",port:502,timeoutMs:5e3,heartbeatSec:60,retryCount:3},Un={language:"zh-CN",theme:"light",autoConnectOnStart:!0,appVersionFallback:"v0.0.0"};function ir(e){const t=String(e??"").trim();if(!t)return"";const n=t.match(/COM\d+/i);return n?n[0].toUpperCase():t}function mg(e){if(!Array.isArray(e))return[];const t=new Set,n=[];for(const r of e){const s=ir(r);!s||t.has(s)||(t.add(s),n.push(s))}return n}function on(e,t){if(e&&typeof e.then=="function"){e.then(t);return}t(e)}function vg(e,t){const n=ge(()=>e.value.length===0),r=ge(()=>(e.value.length?e.value:na).map(o=>({label:o,value:o,icon:"usb"})));function s(i){e.value=mg(i),t.value=ir(t.value),!t.value&&e.value.length&&(t.value=e.value[0])}function a(i){const o=ir(i);o&&(t.value=o)}return{noPorts:n,portOptionsList:r,applyPorts:s,selectPort:a}}function yg(){function e(t){return ir(t)}return{resolveSerialPort:e}}function bg(e){function t(i){i&&(e.selectChannelPort(i),e.channelMode.value="serial")}function n(){if(!e.bridge.value||e.isConnecting.value||e.isConnected.value)return;const i=e.resolveSerialPort(e.selectedPort.value);i&&(e.selectedPort.value=i,e.isConnecting.value=!0,e.bridge.value.connect_serial(i,Number(e.baud.value)))}function r(){e.bridge.value&&(e.isConnecting.value||e.isConnected.value||(e.isConnecting.value=!0,e.bridge.value.connect_tcp(e.tcpHost.value,Number(e.tcpPort.value))))}function s(){if(e.channelMode.value==="tcp"){r();return}n()}function a(){e.bridge.value&&e.bridge.value.disconnect()}return{selectPort:t,connectSerial:n,connectTcp:r,connectPrimary:s,disconnect:a}}function _g(e){let t=null,n=0,r=null;function s(u){e.channels.value=Array.isArray(u)?u:[];const c=e.channels.value[0];if(c){if(c.status==="connected"){const h=c.address||c.port||c.type||"";e.emitStatus(`Connected: ${h}`,Date.now()/1e3),e.connectionInfo.value={state:"connected",detail:c.address||c.port||c.type||""},e.isConnecting.value=!1;return}c.status==="error"&&(e.emitStatus(`Error: ${c.error||""}`,Date.now()/1e3),e.connectionInfo.value={state:"error",detail:c.error||""},e.isConnecting.value=!1)}}function a(u){r=u,!n&&(n=window.requestAnimationFrame(()=>{n=0;const c=r;r=null,s(c)}))}function i(){!e.bridge.value||!e.bridge.value.list_channels||on(e.bridge.value.list_channels(),u=>{s(u)})}function o(){t||(t=window.setTimeout(()=>{t=null,i()},150))}function l(){t&&(window.clearTimeout(t),t=null),n&&(window.cancelAnimationFrame(n),n=0),r=null}return{setChannels:s,scheduleSetChannels:a,refreshChannels:i,scheduleChannelRefresh:o,disposeChannelSync:l}}function Cg(e){const{refs:t}=e;function n(){t.channelDialogMode.value="create",t.channelType.value="serial",t.channelName.value="",t.channelPort.value=e.normalizeSerialPortName(t.selectedPort.value||t.ports.value[0]||e.defaults.fallbackPorts[0]),t.channelBaud.value=Number(t.defaultBaud.value||e.defaults.serialDefaults.baud),t.channelDataBits.value="8",t.channelParity.value=t.defaultParity.value||"none",t.channelStopBits.value=t.defaultStopBits.value||"1",t.channelFlowControl.value="none",t.channelReadTimeout.value=1e3,t.channelWriteTimeout.value=1e3,t.channelHost.value=t.tcpHost.value||e.defaults.networkDefaults.host,t.channelTcpPort.value=Number(t.tcpPort.value||502),t.channelAutoConnect.value=!!t.autoConnectOnStart.value,t.channelDialogOpen.value=!0}function r(){n(),t.channelDialogMode.value="serial",t.channelType.value="serial"}function s(){t.channelDialogOpen.value=!1}function a(){if(e.bridge.value){if(t.channelType.value==="serial"){if(t.channelAutoConnect.value){const i=e.normalizeSerialPortName(t.channelPort.value);i&&(t.channelPort.value=i,e.bridge.value.connect_serial(i,Number(t.channelBaud.value||115200)))}}else t.channelType.value==="tcp"&&t.channelAutoConnect.value&&e.bridge.value.connect_tcp(t.channelHost.value,Number(t.channelTcpPort.value||502));t.channelDialogOpen.value=!1}}return{handleNewChannel:n,openChannelSettings:r,closeChannelDialog:s,submitChannelDialog:a}}function ro(e,t=!1,n=!1){let r=e;return t&&(r+="\r"),n&&(r+=` +`),r}function so(e,t=!1,n=!1){const r=String(e||"").trim().split(/\s+/).filter(Boolean);return t&&r.push("0D"),n&&r.push("0A"),r.join(" ")}function kg(e){function t(){if(!e.bridge.value||!e.sendText.value)return;const a=ro(e.sendText.value,e.appendCR.value,e.appendLF.value);e.bridge.value.send_text(a)}function n(){if(!e.bridge.value||!e.sendHex.value)return;const a=so(e.sendHex.value,e.appendCR.value,e.appendLF.value);e.bridge.value.send_hex(a)}function r(){if(e.sendMode.value==="hex"){n();return}t()}function s(a){if(!a)return;const i=typeof a=="string"?a:a.payload||a.name||"";if(!i)return;const o=typeof a=="string"?"text":a.mode||"text",l=typeof a=="string"?e.appendCR.value:a.appendCR??e.appendCR.value,u=typeof a=="string"?e.appendLF.value:a.appendLF??e.appendLF.value;if(o==="hex"){if(e.sendMode.value="hex",e.sendHex.value=i,!e.bridge.value)return;const h=so(i,l,u);e.bridge.value.send_hex(h);return}if(e.sendMode.value="text",e.sendText.value=i,!e.bridge.value)return;const c=ro(i,l,u);e.bridge.value.send_text(c)}return{sendPayload:r,sendQuickCommand:s}}function wg(e){function t(r){if(typeof r!="string")return r;try{return JSON.parse(r)}catch{return{text:String(r)}}}function n(r){if(!e.commPaused.value&&(r=t(r),!!Array.isArray(r)))for(const s of r){if(!s)continue;const a=s.kind||"RX";if(a==="FRAME"){e.addCommLog("FRAME",{text:JSON.stringify(s.payload),ts:s.ts});continue}let i=s.payload||{};i&&typeof i=="object"&&!i.text&&!i.hex&&(s.text||s.hex)&&(i={text:s.text||"",hex:s.hex||"",ts:s.ts||i.ts}),i&&typeof i=="object"&&!i.text&&!i.hex&&(i={text:JSON.stringify(s),ts:s.ts||i.ts}),e.addCommLog(a,i)}}return{parseBridgePayload:t,addCommBatch:n}}function Sg(e){const t=e.createObjectUrl||(o=>URL.createObjectURL(o)),n=e.revokeObjectUrl||(o=>URL.revokeObjectURL(o)),r=e.createAnchor||(()=>document.createElement("a"));function s(o){return o?e.displayMode.value==="hex"&&o.hex?o.hex:o.text||o.hex||"":""}function a(o){if(!o)return"";const l=o.ts?e.formatTime(o.ts):"",u=o.kind||"",c=s(o).replace(/\r?\n/g,"\\n");return`${l} ${u} ${c}`}function i(){const l=e.commLogs.value.map(m=>a(m)).filter(Boolean).join(` +`),u=`io_logs_${new Date().toISOString().replace(/[:.]/g,"-")}.log`,c=new Blob([l],{type:"text/plain"}),h=t(c),y=r();y.href=h,y.download=u,document.body.appendChild(y),y.click(),y.remove(),n(h)}return{formatPayload:s,formatCommLine:a,exportCommLogs:i}}const Tg=e=>window.alert(e),xg=()=>`qc_${Date.now()}_${Math.random().toString(16).slice(2,6)}`;function Pg(e,t){const n=String(e||"");if(t==="hex"){const r=n.replace(/[^0-9a-fA-F]/g,"");return Math.floor(r.length/2)}return n.length}function Ag(e){const t=e.alert||Tg,n=e.generateId||xg;function r(m){if(!Array.isArray(m))return e.quickCommands.value;const T=[];return m.forEach((v,O)=>{if(!v)return;if(typeof v=="string"){T.push({id:`qc_${O}`,name:v,payload:v,mode:"text",appendCR:!0,appendLF:!0});return}const E=String(v.name||v.payload||"").trim(),V=String(v.payload||v.name||"").trim();!E||!V||T.push({id:v.id||`qc_${O}`,name:E,payload:V,mode:v.mode==="hex"?"hex":"text",appendCR:v.appendCR??!0,appendLF:v.appendLF??!0})}),T.length?T:e.quickCommands.value}function s(m){m&&(e.quickDeleting.value=m,e.quickDeleteOpen.value=!0)}function a(){e.quickDeleteOpen.value=!1,e.quickDeleting.value=null}function i(){e.quickDeleting.value&&(e.quickCommands.value=e.quickCommands.value.filter(m=>m.id!==e.quickDeleting.value.id),a())}function o(m){m?(e.quickDialogMode.value="edit",e.quickEditingId.value=m.id,e.quickDraft.value={name:m.name||"",payload:m.payload||m.name||"",mode:m.mode==="hex"?"hex":"text",appendCR:m.appendCR??!0,appendLF:m.appendLF??!0}):(e.quickDialogMode.value="create",e.quickEditingId.value="",e.quickDraft.value={name:"",payload:"",mode:e.sendMode.value==="hex"?"hex":"text",appendCR:e.appendCR.value,appendLF:e.appendLF.value}),e.quickDialogOpen.value=!0}function l(){e.quickDialogOpen.value=!1}function u(){const m=String(e.quickDraft.value.name||"").trim(),T=String(e.quickDraft.value.payload||"").trim();if(!m||!T){t(e.tr("请输入指令名称和内容"));return}const v={name:m,payload:e.quickDraft.value.payload,mode:e.quickDraft.value.mode==="hex"?"hex":"text",appendCR:e.quickDraft.value.appendCR??!0,appendLF:e.quickDraft.value.appendLF??!0};if(e.quickDialogMode.value==="edit"&&e.quickEditingId.value){const O=e.quickCommands.value.find(E=>E.id===e.quickEditingId.value);O?Object.assign(O,v):e.quickCommands.value.push({id:e.quickEditingId.value,...v})}else e.quickCommands.value.push({id:n(),...v});l()}function c(){o()}function h(m){o(m)}function y(m){s(m)}return{normalizeQuickCommands:r,openQuickDeleteDialog:s,closeQuickDeleteDialog:a,confirmQuickDelete:i,openQuickCommandDialog:o,closeQuickCommandDialog:l,saveQuickCommand:u,addQuickCommand:c,editQuickCommand:h,removeQuickCommand:y,countQuickPayload:Pg}}function Eg(e){function t(){if(e.bridge.value&&e.bridge.value.load_yaml){e.withResult(e.bridge.value.load_yaml(),a=>{!a||!a.text||(e.yamlText.value=a.text,e.scriptFileName.value=a.name||e.scriptFileName.value,e.scriptFilePath.value=a.path||e.scriptFilePath.value,e.refreshScriptVariables(),e.addScriptLog(`[INFO] Loaded: ${e.scriptFileName.value}`))});return}e.yamlFileInputRef.value&&(e.yamlFileInputRef.value.value="",e.yamlFileInputRef.value.click())}function n(){const a=e.yamlText.value.trim();if(!a){e.addScriptLog("[WARN] YAML is empty, not saved.");return}if(e.bridge.value&&e.bridge.value.save_yaml){e.withResult(e.bridge.value.save_yaml(a,e.scriptFileName.value||"workflow.yaml"),c=>{c&&(c.name&&(e.scriptFileName.value=c.name),c.path&&(e.scriptFilePath.value=c.path),e.addScriptLog(`[INFO] Saved: ${e.scriptFileName.value}`))});return}const i=e.scriptFileName.value||"script.yaml",o=new Blob([a],{type:"text/yaml"}),l=URL.createObjectURL(o),u=document.createElement("a");u.href=l,u.download=i,document.body.appendChild(u),u.click(),u.remove(),URL.revokeObjectURL(l),e.addScriptLog(`[INFO] Saved: ${i}`)}function r(a){const i=a&&a.target&&a.target.files?a.target.files[0]:null;if(!i)return;const o=new FileReader;o.onload=()=>{const l=typeof o.result=="string"?o.result:"";e.yamlText.value=l,e.scriptFileName.value=i.name,e.scriptFilePath.value=i.name,e.refreshScriptVariables(),e.addScriptLog(`[INFO] Loaded: ${i.name}`)},o.readAsText(i)}async function s(){const a=e.yamlText.value.trim();if(!a){e.addScriptLog("[WARN] YAML is empty, nothing to copy.");return}if(navigator.clipboard&&navigator.clipboard.writeText)try{await navigator.clipboard.writeText(a),e.addScriptLog("[INFO] YAML copied to clipboard.");return}catch{e.addScriptLog("[WARN] Clipboard API failed, falling back.")}const i=document.createElement("textarea");i.value=a,document.body.appendChild(i),i.select(),document.execCommand("copy"),i.remove(),e.addScriptLog("[INFO] YAML copied to clipboard.")}return{loadYaml:t,saveYaml:n,handleYamlFile:r,copyYaml:s}}function Ig(e){async function t(){e.uiModalOpen.value||(e.uiModalOpen.value=!0),e.uiRuntime.yamlText=e.yamlText.value,await e.uiRuntime._parseWithBridge()}function n(){e.uiModalOpen.value=!1}function r(){if(!e.bridge.value)return;const a=e.yamlText.value.trim();if(!a){e.addScriptLog("[WARN] YAML is empty, abort run.");return}e.scriptRunning.value=!0,e.scriptState.value="starting",e.scriptStartMs.value=Date.now(),e.scriptElapsedMs.value=0,e.scriptProgress.value=0,t(),e.bridge.value.run_script(a)}function s(){e.bridge.value&&(e.scriptState.value="stopping",e.bridge.value.stop_script(),e.addScriptLog("[INFO] Stop requested."))}return{openUiYamlModal:t,closeUiYamlModal:n,runScript:r,stopScript:s}}function Rg(e){function t(){e.scriptLogs.value=[],e.scriptLogBuffer.length=0}function n(){if(!e.scriptLogRef.value)return;const s=e.scriptLogRef.value.rootEl,a=s&&s.value?s.value:s;a&&(a.scrollTop=a.scrollHeight)}function r(){e.clearScriptVarTimer(),e.scriptVariablesList.value=e.parseScriptVariables(e.yamlText.value)}return{clearScriptLogs:t,scrollScriptLogsToBottom:n,refreshScriptVariables:r}}function Lg(e){function t(){const n=window.prompt(e.tr("搜索关键词"));if(!n)return;const r=e.getEditor();if(r){const o=r.state.doc.toString().toLowerCase().indexOf(n.toLowerCase());if(o===-1){e.addScriptLog(`[INFO] Not found: ${n}`);return}r.dispatch({selection:{anchor:o,head:o+n.length},scrollIntoView:!0});return}window.find(n)||e.addScriptLog(`[INFO] Not found: ${n}`)}return{searchYaml:t}}function Mg(e){function t(n){n&&(n.script_log&&typeof n.script_log.connect=="function"&&n.script_log.connect(r=>e.addScriptLog(r)),n.script_state&&typeof n.script_state.connect=="function"&&n.script_state.connect(r=>{if(r==="__running__"){e.scriptRunning.value=!0,e.scriptState.value="running";return}if(r==="__finished__"){e.scriptRunning.value=!1,e.scriptState.value="idle",e.scriptProgress.value=100;return}if(r==="__stopped__"){e.scriptRunning.value=!1,e.scriptState.value="idle";return}if(r==="__error__"){e.scriptRunning.value=!1,e.scriptState.value="error";return}e.scriptState.value=r,r&&(e.scriptRunning.value=!0)}),n.script_progress&&typeof n.script_progress.connect=="function"&&n.script_progress.connect(r=>{e.scriptProgress.value=r}),n.channel_update&&typeof n.channel_update.connect=="function"&&n.channel_update.connect(r=>{e.scheduleSetChannels(r)}))}return{bindScriptBridgeSignals:t}}function Dg(e){function t(n){n&&(n.comm_rx&&n.comm_tx&&typeof n.comm_rx.connect=="function"&&typeof n.comm_tx.connect=="function"?(n.comm_rx.connect(r=>{const s=e.parseBridgePayload(r);e.addCommLog("RX",s)}),n.comm_tx.connect(r=>{const s=e.parseBridgePayload(r);e.addCommLog("TX",s)})):n.comm_batch&&typeof n.comm_batch.connect=="function"&&n.comm_batch.connect(r=>e.addCommBatch(r)),n.protocol_frame&&typeof n.protocol_frame.connect=="function"&&n.protocol_frame.connect(r=>{const s=r&&r.ts?r.ts:Date.now()/1e3;e.addCommLog("FRAME",{text:JSON.stringify(r),ts:s})}),n.capture_frame&&typeof n.capture_frame.connect=="function"&&n.capture_frame.connect(r=>{const s=r&&r.ts?r.ts:Date.now()/1e3;e.addCommLog("CAPTURE",{text:JSON.stringify(r),ts:s}),e.ingestCaptureFrame(r)}),n.comm_status&&typeof n.comm_status.connect=="function"&&n.comm_status.connect(r=>{const s=r&&r.payload!==void 0?r.payload:r,a=r&&r.ts?r.ts:Date.now()/1e3;if(e.setConnectingFalse(),!s){const i=r&&r.reason?String(r.reason):"",o=i?`Disconnected: ${i}`:"Disconnected";e.shouldEmitDisconnected(i)&&e.emitStatus(o,a),e.onConnectionInfo({state:"disconnected",detail:""}),e.scheduleChannelRefresh();return}if(typeof s=="string"){e.emitStatus(`Error: ${s}`,a),e.onConnectionInfo({state:"error",detail:s}),e.scheduleChannelRefresh();return}if(s&&typeof s=="object"){const i=s.address||s.port||s.type||"";e.emitStatus(`Connected: ${i}`,a)}e.onConnectionInfo({state:"connected",detail:s.address||s.port||s.type||""}),e.scheduleChannelRefresh()}))}return{bindCommBridgeSignals:t}}function Ng(e){const t=w(!1),n=w(!1),r=w(!1),s=w({x:0,y:0}),a=w("");let i=!1;function o(){const H=e.sidebarRef.value;if(!H||!H.getBoundingClientRect)return;const be=Math.round(H.getBoundingClientRect().width);document.documentElement.style.setProperty("--sidebar-width",`${be}px`)}function l(){document.documentElement.style.removeProperty("--sidebar-width")}function u(H){H&&(H.detail&&H.detail>1||(n.value=!0,r.value=!1,s.value={x:H.screenX,y:H.screenY},K()))}function c(H){if(!n.value||r.value||!H)return;const be=Math.abs(H.screenX-s.value.x),_e=Math.abs(H.screenY-s.value.y);be<10&&_e<10||(o(),e.bridge.value&&(e.bridge.value.window_start_move_at?e.bridge.value.window_start_move_at(Math.round(H.screenX),Math.round(H.screenY)):e.bridge.value.window_start_move&&e.bridge.value.window_start_move()),r.value=!0,t.value=!0,N(),document.body.classList.add("dragging-window"),e.lockPageScroll(),a.value="",Q())}function h(){e.bridge.value&&e.bridge.value.window_minimize&&e.bridge.value.window_minimize()}function y(){e.bridge.value&&e.bridge.value.window_toggle_maximize&&e.bridge.value.window_toggle_maximize()}function m(){e.bridge.value&&e.bridge.value.window_close&&e.bridge.value.window_close()}function T(H){e.bridge.value&&H&&r.value&&e.bridge.value.window_apply_snap&&e.bridge.value.window_apply_snap(Math.round(H.screenX),Math.round(H.screenY)),z()}function v(H){e.bridge.value&&H&&e.bridge.value.window_show_system_menu&&e.bridge.value.window_show_system_menu(Math.round(H.screenX),Math.round(H.screenY))}function O(H,be){!e.bridge.value||!H||!be||!e.bridge.value.window_start_resize||(document.body.classList.add("resizing"),e.lockPageScroll(),e.bridge.value.window_start_resize(H))}function E(H){t.value&&T(H)}function V(){t.value||(n.value=!1,r.value=!1),N()}function K(){i||(i=!0,window.addEventListener("mousemove",c),window.addEventListener("mouseup",V),window.addEventListener("blur",V))}function N(){i&&(i=!1,window.removeEventListener("mousemove",c),window.removeEventListener("mouseup",V),window.removeEventListener("blur",V))}function Q(){window.addEventListener("mouseup",E),window.addEventListener("blur",oe),document.addEventListener("visibilitychange",oe)}function W(){window.removeEventListener("mouseup",E),window.removeEventListener("blur",oe),document.removeEventListener("visibilitychange",oe)}function oe(){z()}function z(){t.value=!1,n.value=!1,r.value=!1,a.value="",l(),document.body.classList.remove("dragging-window"),document.body.classList.remove("resizing"),e.unlockPageScroll(),N(),W()}function B(){z()}function re(){t.value||(n.value=!1,r.value=!1,N())}return{draggingWindow:t,snapPreview:a,armWindowMove:u,maybeStartWindowMove:c,minimizeWindow:h,toggleMaximize:y,closeWindow:m,applyWindowSnap:T,showSystemMenu:v,startResize:O,cancelWindowMoveArm:re,disposeWindowChrome:B}}function Og(e){const t=ge(()=>{if(!e.settingsSnapshot.value)return!1;const a=e.normalize(e.buildPayload());return JSON.stringify(a)!==JSON.stringify(e.settingsSnapshot.value)});function n(a){e.settingsSnapshot.value=e.normalize(a)}function r(){n(e.buildPayload())}function s(){e.settingsSnapshot.value&&e.apply(e.settingsSnapshot.value)}return{settingsDirty:t,setSnapshot:n,commitCurrent:r,discard:s}}function zg(e,t,n){const r=String(e||""),s=r.toLowerCase();let i={"zh-cn":"zh-CN","zh-tw":"zh-TW","en-us":"en-US","ja-jp":"ja-JP","ko-kr":"ko-KR","fr-fr":"fr-FR","de-de":"de-DE","es-es":"es-ES","pt-br":"pt-BR","ru-ru":"ru-RU",ar:"ar",hi:"hi","it-it":"it-IT","nl-nl":"nl-NL","th-th":"th-TH","vi-vn":"vi-VN","id-id":"id-ID","tr-tr":"tr-TR","pl-pl":"pl-PL","uk-ua":"uk-UA"}[s]||"";return i||(r==="简体中文"?i="zh-CN":r==="繁體中文"||r==="繁体中文"?i="zh-TW":r==="English (US)"&&(i="en-US")),i&&t.has(i)?i:n}function Ug(e){const t=String(e||""),n=t.toLowerCase();return t==="system"||n==="system"||t==="系统默认"?"system":t==="dark"||n==="dark"||t==="深色 (工程模式)"?"dark":"light"}function Fg(e){const{refs:t,defaults:n,normalizeQuickCommands:r}=e;function s(){return{uiLanguage:t.uiLanguage.value,uiTheme:t.uiTheme.value,autoConnectOnStart:!!t.autoConnectOnStart.value,dslWorkspacePath:t.dslWorkspacePath.value,quickCommands:t.quickCommands.value,serial:{defaultBaud:Number(t.defaultBaud.value||n.serialDefaults.baud),defaultParity:t.defaultParity.value,defaultStopBits:t.defaultStopBits.value},network:{tcpTimeoutMs:Number(t.tcpTimeoutMs.value||0),tcpHeartbeatSec:Number(t.tcpHeartbeatSec.value||0),tcpRetryCount:Number(t.tcpRetryCount.value||0)}}}function a(o){const l=n.workspaceFallback||"/usr/local/protoflow/workflows",u={uiLanguage:n.uiDefaults.language,uiTheme:n.uiDefaults.theme,autoConnectOnStart:n.uiDefaults.autoConnectOnStart,dslWorkspacePath:l,quickCommands:t.quickCommands.value,serial:{defaultBaud:n.serialDefaults.baud,defaultParity:n.serialDefaults.parity,defaultStopBits:n.serialDefaults.stopBits},network:{tcpTimeoutMs:n.networkDefaults.timeoutMs,tcpHeartbeatSec:n.networkDefaults.heartbeatSec,tcpRetryCount:n.networkDefaults.retryCount}};return!o||typeof o!="object"?u:{...u,...o,uiLanguage:zg(o.uiLanguage,n.supportedLanguages,n.defaultLanguage),uiTheme:Ug(o.uiTheme),serial:{...u.serial,...o.serial||{}},network:{...u.network,...o.network||{}}}}function i(o){const l=a(o);t.uiLanguage.value=l.uiLanguage,t.uiTheme.value=l.uiTheme,t.autoConnectOnStart.value=!!l.autoConnectOnStart,t.dslWorkspacePath.value=l.dslWorkspacePath,t.quickCommands.value=r(l.quickCommands),t.defaultBaud.value=Number(l.serial.defaultBaud||n.serialDefaults.baud),t.defaultParity.value=l.serial.defaultParity||n.serialDefaults.parity,t.defaultStopBits.value=l.serial.defaultStopBits||n.serialDefaults.stopBits,t.tcpTimeoutMs.value=Number(l.network.tcpTimeoutMs||0),t.tcpHeartbeatSec.value=Number(l.network.tcpHeartbeatSec||0),t.tcpRetryCount.value=Number(l.network.tcpRetryCount||0),t.baud.value=Number(t.defaultBaud.value||n.serialDefaults.baud)}return{buildSettingsPayload:s,normalizeSettings:a,applySettings:i}}function Bg(e){function t(){if(e.bridge.value&&e.bridge.value.load_settings){e.withResult(e.bridge.value.load_settings(),a=>{const i=e.normalizeSettings(a);e.applySettings(i),e.setSettingsSnapshot(i)});return}const s=e.normalizeSettings(null);e.applySettings(s),e.setSettingsSnapshot(s)}function n(){const s=e.buildSettingsPayload();e.settingsSaving.value=!0;const a=()=>{e.commitSettingsSnapshot(),e.settingsSaving.value=!1};e.bridge.value&&e.bridge.value.save_settings?e.withResult(e.bridge.value.save_settings(s),()=>a()):a()}function r(){!e.bridge.value||!e.bridge.value.select_directory||e.withResult(e.bridge.value.select_directory(e.tr("选择工作区"),e.dslWorkspacePath.value||""),s=>{s&&(e.dslWorkspacePath.value=s)})}return{loadSettings:t,saveSettings:n,chooseDslWorkspace:r}}function jg(e){const t=String(e||"").toLowerCase();return t==="modbus_rtu"||t==="modbus-rtu"?"modbus-rtu":t==="modbus_ascii"||t==="modbus-ascii"?"modbus-ascii":t==="modbus_tcp"||t==="modbus-tcp"?"modbus-tcp":t.includes("tcp")?"tcp":"custom"}function Vg(e,t,n){const r=String(e||"").trim();return r?r.split("_").map(a=>{const i=a.toUpperCase();return["RTU","TCP","SCPI","AT","XMODEM","YMODEM"].includes(i)||i.length<=2?i:a.charAt(0).toUpperCase()+a.slice(1)}).join(" "):t||n("协议")}function $g(e,t){return e==="available"?{text:t("可用"),className:"badge-green"}:e==="custom"?{text:t("自定义"),className:"badge-blue"}:e==="disabled"?{text:t("已禁用"),className:"badge-gray"}:{text:e||t("未知"),className:"badge-gray"}}function Wg(e){const t=w("all"),n=w(!1),r=w("create"),s=w(null),a=w(!1),i=w(null),o=w({id:"",key:"",name:"",desc:"",category:"custom",status:"custom"}),l=w([]),u=ge(()=>t.value==="all"?l.value:l.value.filter(W=>W.category===t.value));function c(W){const oe=Array.isArray(W)?W:[];l.value=oe.map(z=>{const B=String(z.key||z.id||""),re=String(z.driver||""),H=String(z.name||""),be=String(z.category||jg(B)),_e=String(z.status||"available"),at=String(z.source||"builtin"),yt=String(z.desc||""),ae=$g(_e,e.tr);return{id:B||re||Math.random().toString(36).slice(2),key:B,name:H||Vg(B,re,e.tr),driver:re,category:be,desc:yt,statusText:ae.text,statusClass:ae.className,status:_e,source:at,rows:[{label:e.tr("键名"),value:B||"--"},{label:e.tr("驱动"),value:re||"--"},{label:e.tr("分类"),value:be||"--"}]}})}function h(){!e.bridge.value||!e.bridge.value.list_protocols||e.withResult(e.bridge.value.list_protocols(),W=>{c(W)})}function y(){o.value={id:"",key:"",name:"",desc:"",category:"custom",status:"custom"}}function m(){r.value="create",s.value=null,y(),n.value=!0}function T(W){W&&(s.value=W,r.value=W.source==="custom"?"edit":"view",o.value={id:W.id||"",key:W.key||"",name:W.name||"",desc:W.desc||"",category:W.category||"custom",status:W.status||"available"},n.value=!0)}function v(){n.value=!1}function O({field:W,value:oe}){W&&(o.value={...o.value,[W]:oe})}function E(){if(!e.bridge.value){n.value=!1;return}const W={id:o.value.id,key:o.value.key,name:o.value.name,desc:o.value.desc,category:o.value.category,status:o.value.status};if(r.value==="create"){if(!e.bridge.value.create_protocol)return;e.withResult(e.bridge.value.create_protocol(W),()=>{h(),n.value=!1});return}if(r.value==="edit"){if(!e.bridge.value.update_protocol)return;e.withResult(e.bridge.value.update_protocol(W),()=>{h(),n.value=!1});return}n.value=!1}function V(W){!W||W.source!=="custom"||(i.value=W,a.value=!0)}function K(){a.value=!1,i.value=null}function N(){if(!e.bridge.value||!e.bridge.value.delete_protocol||!i.value){K();return}const W=i.value.id;e.withResult(e.bridge.value.delete_protocol(W),()=>{h(),K()})}function Q(W){t.value=W}return{protocolTab:t,protocolDialogOpen:n,protocolDialogMode:r,protocolEditing:s,protocolDeleteOpen:a,protocolDeleting:i,protocolDraft:o,protocolCards:l,filteredProtocolCards:u,setProtocols:c,refreshProtocols:h,openCreateProtocol:m,openProtocolDetails:T,closeProtocolDialog:v,updateProtocolDraft:O,saveProtocol:E,openProtocolDelete:V,closeProtocolDelete:K,confirmProtocolDelete:N,setProtocolTab:Q}}function Hg(e){let t=null,n=null;function r(i){!i||t===i||(t=i,e.bridge.value=i,i.get_app_version&&on(i.get_app_version(),o=>{o&&(e.appVersion.value=String(o).trim())}),i.get_feature_flags&&on(i.get_feature_flags(),o=>{o&&typeof o=="object"&&e.applyFeatureFlags(o)}),e.bindCommBridgeSignals(i),e.bindScriptBridgeSignals(i),e.refreshPorts(),e.refreshChannels(),e.refreshProtocols(),e.refreshPlugins(),e.loadSettings())}function s(i=()=>window.bridge,o=200){n||(n=window.setInterval(()=>{const l=i();l&&(r(l),n&&(window.clearInterval(n),n=null))},o))}function a(){n&&(window.clearInterval(n),n=null)}return{attachBridge:r,startBridgeBootstrap:s,disposeBridgeBootstrap:a}}function Kg(e){const t=[],n=[],r=w(!1);let s=0,a=0,i=0,o="";function l(){if(t.length){const O=t.splice(0,t.length);e.commLogs.value.push(...O),e.commLogs.value.length>e.maxCommLogs&&e.commLogs.value.splice(0,e.commLogs.value.length-e.maxCommLogs)}n.length&&(e.scriptLogs.value.push(...n.splice(0,n.length)),e.scriptLogs.value.length>e.maxScriptLogs&&e.scriptLogs.value.splice(0,e.scriptLogs.value.length-e.maxScriptLogs))}function u(){s||(s=window.requestAnimationFrame(()=>{s=0,l()}))}function c(O,E){e.commPaused.value||(!E||typeof E!="object"?E={text:String(E||""),hex:"",ts:Date.now()/1e3}:!E.text&&!E.hex&&(E={text:JSON.stringify(E),hex:"",ts:E.ts||Date.now()/1e3}),t.push({id:`c${a++}`,kind:O,text:E.text||"",hex:E.hex||"",ts:E.ts||Date.now()/1e3}),u())}function h(O,E){const V=String(O||"");!V||V===o||(o=V,r.value=!0,c("STATUS",{text:V,ts:E}))}function y(O){const E=String(O||"");n.push({id:`s${i++}`,text:E}),u(),(E.includes("Script finished")||E.includes("Script stopped")||E.toLowerCase().includes("[error]"))&&(e.scriptRunning.value=!1,e.scriptState.value="idle")}function m(){e.commLogs.value=[],t.length=0}function T(){e.commPaused.value=!e.commPaused.value}function v(){s&&(window.cancelAnimationFrame(s),s=0)}return{scriptLogBuffer:n,hasStatusActivity:r,addCommLog:c,emitStatus:h,addScriptLog:y,clearCommLogs:m,toggleCommPaused:T,disposeLogBuffers:v}}const Zg={class:"app"},qg={class:"title-actions"},Yg={class:"app-shell"},Gg={class:"sidebar-header"},Qg={class:"brand-meta"},Jg={class:"sidebar-nav"},Xg={class:"main"},ep={key:2,class:"page"},tp={key:3,class:"page"},np=200,rp=200,Ns=120,sp=256,ap={__name:"App",setup(e){const t=ct(()=>Ie(()=>import("./ManualView-CkxwU3vG.js"),__vite__mapDeps([0,1,2]),import.meta.url)),n=ct(()=>Ie(()=>import("./ScriptsView-CW4YNIup.js"),__vite__mapDeps([3,2]),import.meta.url)),r=ct(()=>Ie(()=>import("./ChannelDialogModal-CkCBEJ0r.js"),__vite__mapDeps([4,1]),import.meta.url)),s=ct(()=>Ie(()=>import("./SettingsPanels-EL5jW2Q-.js"),__vite__mapDeps([5,1]),import.meta.url)),a=ct(()=>Ie(()=>import("./SettingsHeader-CRhKwNzV.js"),[],import.meta.url)),i=ct(()=>Ie(()=>import("./ProtocolCardsSection-D1zESQTn.js"),[],import.meta.url)),o=ct(()=>Ie(()=>import("./ProtocolHeader-4VYFv1lh.js"),[],import.meta.url)),l=ct(()=>Ie(()=>import("./ProtocolEditModal-RbcnUl73.js"),[],import.meta.url)),u=ct(()=>Ie(()=>import("./ProtocolDeleteModal-BpFjVLgh.js"),[],import.meta.url)),c=ct(()=>Ie(()=>import("./UiYamlPreviewModal-C52QIjor.js"),[],import.meta.url)),h=w(null),y=w(null),m=w({state:"disconnected",detail:""}),T=w([]),v=w(na[0]||"COM1"),O=w($e.baud),E=w(wt.host),V=w(wt.port),K=w("serial"),N=w("text"),Q=w("ascii"),W=w(""),oe=w(""),z=w([]),B=w([]),re=w(!1),H=w("idle"),be=w(0),_e=w("# paste DSL YAML here"),at=w("production_test_suite_v2.yaml"),yt=w("/usr/local/scripts/auto/prod/..."),ae=w(!1),te=w(0),de=w(0),et=w([]),qt=w(null),it=w(null),Je=w(!0),zt=w(!0),bt=w(null),Oe=w("manual"),Ut=w(""),Yt=w("all"),Gt=w(!0),pn=w(!0),Qt=w(!1),Mn=w(!1),d=$e.portPlaceholder,f=w(!1),p=w("create"),k=w("serial"),b=w(""),_=w(""),R=w($e.baud),I=w($e.dataBits),A=w($e.parity),C=w($e.stopBits),$=w($e.flowControl),L=w($e.readTimeoutMs),j=w($e.writeTimeoutMs),q=w(wt.host),ne=w(wt.port),fe=w(!0),ie=w(Un.language),Ae=w(Un.theme),Ee=w($e.baud),We=w($e.parity),He=w($e.stopBits),Jt=w(wt.timeoutMs),dr=w(wt.heartbeatSec),ze=w(wt.retryCount),Ve=w("/usr/local/protoflow/workflows"),Xt=w(Un.autoConnectOnStart),Dn=w(!1),Pl=w(null),Ta=w("general"),{translations:fr,supportedLanguages:Al,DEFAULT_LANGUAGE:Nn}=gg,le=(x,g="")=>{const S=ie.value||Nn;return fr[S]?.[x]??fr[Nn]?.[x]??g??x},Ke=x=>{const g=ie.value||Nn,S=String(x??"");return fr[g]?.[S]??fr[Nn]?.[S]??S},hr=ge(()=>({manual:le("nav.manual"),scripts:le("nav.scripts"),protocols:le("nav.protocols"),settings:le("nav.settings"),workspace:le("nav.workspace")})),xa=w("all"),Pa=Kh(),gr=w(!1),Aa=w(""),El=w(!1),{scriptLogBuffer:Il,hasStatusActivity:Rl,addCommLog:Ea,emitStatus:Ia,addScriptLog:pr,clearCommLogs:Ll,toggleCommPaused:Ml,disposeLogBuffers:Dl}=Kg({commLogs:z,scriptLogs:B,commPaused:re,scriptRunning:ae,scriptState:H,maxCommLogs:np,maxScriptLogs:rp}),{parseBridgePayload:Nl,addCommBatch:Ol}=wg({commPaused:re,addCommLog:Ea}),{formatPayload:zl,exportCommLogs:Ul}=Sg({displayMode:Q,commLogs:z,formatTime:qa}),Fl=()=>{},{noPorts:Bl,portOptionsList:Ra,applyPorts:jl,selectPort:Vl}=vg(T,v),{resolveSerialPort:$l}=yg(),us=w([{id:"qc_at_gmr",name:"AT+GMR",payload:"AT+GMR",mode:"text",appendCR:!0,appendLF:!0},{id:"qc_reset",name:"RESET_DEVICE_01",payload:"RESET_DEVICE_01",mode:"text",appendCR:!0,appendLF:!0},{id:"qc_wifi",name:"GET_WIFI_STATUS",payload:"GET_WIFI_STATUS",mode:"text",appendCR:!0,appendLF:!0},{id:"qc_ping",name:"PING_SERVER",payload:"PING_SERVER",mode:"text",appendCR:!0,appendLF:!0}]),ds=w(!1),La=w("create"),Wl=w(""),fs=w(!1),Ma=w(null),mr=w({name:"",payload:"",mode:"text",appendCR:!0,appendLF:!0}),{normalizeQuickCommands:Hl,openQuickDeleteDialog:Kl,closeQuickDeleteDialog:Zl,confirmQuickDelete:ql,openQuickCommandDialog:Yl,closeQuickCommandDialog:Gl,saveQuickCommand:Ql,addQuickCommand:Jl,editQuickCommand:Xl,removeQuickCommand:ec,countQuickPayload:tc}=Ag({quickCommands:us,quickDialogOpen:ds,quickDialogMode:La,quickEditingId:Wl,quickDeleteOpen:fs,quickDeleting:Ma,quickDraft:mr,sendMode:N,appendCR:Gt,appendLF:pn,tr:Ke}),Da=w([]),Na=ge(()=>Da.value.map(x=>{const g=x.type||"unknown",S=x.status||"disconnected",Ce={connected:{text:le("status.connected"),className:"status-ok"},connecting:{text:le("status.connecting"),className:"status-warn"},error:{text:le("status.error"),className:"status-error"},disconnected:{text:le("status.disconnected"),className:"status-idle"},idle:{text:Ke("空闲"),className:"status-idle"}},ke=Ce[S]||Ce.disconnected,Ze=g==="serial",ot=g==="tcp-client",bs=Ke(Ze?"串口通道":ot?"TCP 客户端":"TCP 服务端"),lt=Ze?[x.port||"--",x.baud?`${x.baud} bps`:"--"]:[x.host||x.address||"--",x.port?`${Ke("端口")}: ${x.port}`:"--"],_s=`TX: ${Ya(x.tx_bytes||0)} / RX: ${Ya(x.rx_bytes||0)}`;return{id:x.id||`${g}:${lt[0]}`,name:bs,type:Ze?"Serial":ot?"TCP Client":"TCP Server",category:g,statusText:ke.text,statusClass:ke.className,details:lt,traffic:_s,error:x.error||""}})),Oa=ge(()=>m.value.state==="connected"),{selectPort:nc,connectSerial:rc,disconnect:sc}=bg({bridge:h,isConnecting:Mn,isConnected:Oa,selectedPort:v,baud:O,tcpHost:E,tcpPort:V,channelMode:K,resolveSerialPort:$l,selectChannelPort:Vl}),{scheduleSetChannels:ac,refreshChannels:ic,scheduleChannelRefresh:oc,disposeChannelSync:lc}=_g({bridge:h,channels:Da,connectionInfo:m,isConnecting:Mn,emitStatus:Ia}),hs=(x,g)=>Array.isArray(x)?x.length<=g?x:x.slice(x.length-g):[],za=ge(()=>cu(z.value,Yt.value,Ut.value)),cc=ge(()=>hs(z.value,Ns)),uc=ge(()=>hs(za.value,Ns)),dc=ge(()=>hs(B.value,Ns)),fc=ge(()=>et.value),hc=ge(()=>B.value.filter(x=>String(x.text||"").toLowerCase().includes("[error]")).length),vr=ge(()=>du(_e.value)),gc=ge(()=>vr.value?Math.max(0,Math.min(vr.value,Math.round(be.value/100*vr.value))):0),pc=ge(()=>uu(de.value)),mc=ge(()=>!ae.value&&_e.value.trim().length>0),vc=ge(()=>ae.value),yc=ge(()=>ae.value?H.value?`${Ke("运行中")} ${H.value}`:Ke("运行中"):Ke("空闲")),bc=ge(()=>ae.value?"running":"idle"),_c=ge(()=>tc(mr.value.payload,mr.value.mode)),Cc=ge(()=>[{value:"zh-CN",label:le("lang.zhCN")},{value:"zh-TW",label:le("lang.zhTW")},{value:"en-US",label:le("lang.enUS")},{value:"ja-JP",label:le("lang.jaJP")},{value:"ko-KR",label:le("lang.koKR")},{value:"fr-FR",label:le("lang.frFR")},{value:"de-DE",label:le("lang.deDE")},{value:"es-ES",label:le("lang.esES")},{value:"pt-BR",label:le("lang.ptBR")},{value:"ru-RU",label:le("lang.ruRU")},{value:"ar",label:le("lang.ar")},{value:"hi",label:le("lang.hi")},{value:"it-IT",label:le("lang.itIT")},{value:"nl-NL",label:le("lang.nlNL")},{value:"th-TH",label:le("lang.thTH")},{value:"vi-VN",label:le("lang.viVN")},{value:"id-ID",label:le("lang.idID")},{value:"tr-TR",label:le("lang.trTR")},{value:"pl-PL",label:le("lang.plPL")},{value:"uk-UA",label:le("lang.ukUA")}]),kc=ge(()=>[{value:"system",label:le("theme.system")},{value:"dark",label:le("theme.dark")},{value:"light",label:le("theme.light")}]),wc=ge(()=>Aa.value||Un.appVersionFallback);ge(()=>xa.value==="all"?Na.value:Na.value.filter(x=>x.category===xa.value));const{protocolTab:Sc,protocolDialogOpen:Ua,protocolDialogMode:Tc,protocolEditing:xc,protocolDeleteOpen:Fa,protocolDeleting:Pc,protocolDraft:Ac,filteredProtocolCards:Ec,refreshProtocols:gs,openCreateProtocol:Ba,openProtocolDetails:Ic,closeProtocolDialog:Rc,updateProtocolDraft:Lc,saveProtocol:Mc,openProtocolDelete:Dc,closeProtocolDelete:Nc,confirmProtocolDelete:Oc,setProtocolTab:zc}=Wg({bridge:h,tr:Ke,withResult:on}),{openChannelSettings:Uc,closeChannelDialog:ja,submitChannelDialog:Fc}=Cg({refs:{channelDialogOpen:f,channelDialogMode:p,channelType:k,channelName:b,channelPort:_,channelBaud:R,channelDataBits:I,channelParity:A,channelStopBits:C,channelFlowControl:$,channelReadTimeout:L,channelWriteTimeout:j,channelHost:q,channelTcpPort:ne,channelAutoConnect:fe,selectedPort:v,ports:T,defaultBaud:Ee,defaultParity:We,defaultStopBits:He,tcpHost:E,tcpPort:V,autoConnectOnStart:Xt},defaults:{fallbackPorts:na,serialDefaults:{baud:$e.baud},networkDefaults:{host:wt.host}},bridge:h,normalizeSerialPortName:ir}),{sendPayload:Bc,sendQuickCommand:jc}=kg({bridge:h,sendMode:N,sendText:W,sendHex:oe,appendCR:Gt,appendLF:pn}),{clearScriptLogs:Vc,scrollScriptLogsToBottom:Va,refreshScriptVariables:$a}=Rg({scriptLogs:B,scriptLogBuffer:Il,scriptLogRef:it,scriptVariablesList:et,yamlText:_e,parseScriptVariables:Ga,clearScriptVarTimer:()=>{Ct&&(window.clearTimeout(Ct),Ct=null)}}),{loadYaml:$c,saveYaml:Wc,handleYamlFile:Hc,copyYaml:Kc}=Eg({bridge:h,withResult:on,yamlText:_e,scriptFileName:at,scriptFilePath:yt,yamlFileInputRef:qt,refreshScriptVariables:$a,addScriptLog:pr}),{openUiYamlModal:Zc,closeUiYamlModal:qc,runScript:Yc,stopScript:Gc}=Ig({bridge:h,uiRuntime:Pa,uiModalOpen:gr,yamlText:_e,scriptRunning:ae,scriptState:H,scriptStartMs:te,scriptElapsedMs:de,scriptProgress:be,addScriptLog:pr}),{searchYaml:Qc}=Lg({tr:Ke,addScriptLog:pr,getEditor:()=>_t}),{bindScriptBridgeSignals:Jc}=Mg({scriptRunning:ae,scriptState:H,scriptProgress:be,addScriptLog:pr,scheduleSetChannels:ac}),{bindCommBridgeSignals:Xc}=Dg({parseBridgePayload:Nl,addCommLog:Ea,addCommBatch:Ol,ingestCaptureFrame:Fl,emitStatus:Ia,scheduleChannelRefresh:oc,setConnectingFalse:()=>{Mn.value=!1},onConnectionInfo:x=>{m.value=x},shouldEmitDisconnected:x=>Rl.value||!!x}),{armWindowMove:Wa,minimizeWindow:Ha,toggleMaximize:ps,closeWindow:Ka,showSystemMenu:Za,startResize:Ft,cancelWindowMoveArm:eu,disposeWindowChrome:tu}=Ng({bridge:h,sidebarRef:y,lockPageScroll:ou,unlockPageScroll:lu});function nu(){eu(),ps()}function ru(x){Ta.value=x}const su={connectionInfo:m,isConnected:Oa,isConnecting:Mn,selectedPort:v,portOptionsList:Ra,portPlaceholder:d,noPorts:Bl,sendMode:N,sendText:W,sendHex:oe,appendCR:Gt,appendLF:pn,loopSend:Qt,displayMode:Q,quickCommands:us,logTab:Yt,logKeyword:Ut,visibleCommLogs:za,renderedCommLogs:cc,renderedVisibleCommLogs:uc,formatTime:qa,formatPayload:zl,commPaused:re,clearCommLogs:Ll,toggleCommPaused:Ml,exportCommLogs:Ul,quickDialogOpen:ds,quickDialogMode:La,quickDraft:mr,quickPayloadCount:_c,quickPayloadLimit:sp,openQuickCommandDialog:Yl,closeQuickCommandDialog:Gl,saveQuickCommand:Ql,quickDeleteOpen:fs,quickDeleting:Ma,openQuickDeleteDialog:Kl,closeQuickDeleteDialog:Zl,confirmQuickDelete:ql,addQuickCommand:Jl,editQuickCommand:Xl,removeQuickCommand:ec,selectPort:nc,refreshPorts:Xa,openChannelSettings:Uc,disconnect:sc,connectSerial:rc,sendPayload:Bc,sendQuickCommand:jc},au={scriptFileName:at,scriptFilePath:yt,loadYaml:$c,saveYaml:Wc,yamlFileInputRef:qt,handleYamlFile:Hc,yamlCollapsed:zt,toggleYamlCollapsed:hu,copyYaml:Kc,searchYaml:Qc,yamlEditorRef:bt,scriptStatusClass:bc,scriptRunning:ae,scriptStatusLabel:yc,scriptCanRun:mc,scriptCanStop:vc,runScript:Yc,stopScript:Gc,scriptState:H,scriptStepIndex:gc,scriptStepTotal:vr,scriptProgress:be,scriptElapsedLabel:pc,scriptErrorCount:hc,scriptVariables:fc,refreshScriptVariables:$a,clearScriptLogs:Vc,scrollScriptLogsToBottom:Va,renderedScriptLogs:dc,scriptLogRef:it};Cn("manualView",su),Cn("scriptsView",au),Cn("bridge",h),Cn("t",le),Cn("tr",Ke);let yr=null,_t=null,ms=!1,Ct=null,mn=0,vs=null;const iu=[".page",".modal-body",".log-stream",".quick-list",".sidebar-nav",".select-menu"];let ys=[];function br(x){x&&x.preventDefault()}function ou(){const x=iu.join(", "),g=document.querySelectorAll(x);ys=Array.from(g).map(S=>({el:S,top:S.scrollTop||0})),document.addEventListener("wheel",br,{passive:!1}),document.addEventListener("touchmove",br,{passive:!1})}function lu(){ys.forEach(x=>{x.el&&(x.el.scrollTop=x.top)}),ys=[],document.removeEventListener("wheel",br),document.removeEventListener("touchmove",br)}function cu(x,g,S){if(g==="tcp")return[];const Ce=String(S||"").trim().toLowerCase();return Ce?x.filter(ke=>{const Ze=String(ke.text||"").toLowerCase(),ot=String(ke.hex||"").toLowerCase();return Ze.includes(Ce)||ot.includes(Ce)}):x}function qa(x){const g=new Date((x||0)*1e3),S=(Ce,ke=2)=>String(Ce).padStart(ke,"0");return`${S(g.getHours())}:${S(g.getMinutes())}:${S(g.getSeconds())}.${S(g.getMilliseconds(),3)}`}function uu(x){const g=Math.max(0,Math.floor(x/1e3)),S=Math.floor(g/60),Ce=g%60,ke=Math.floor(x%1e3/100);return`${String(S).padStart(2,"0")}:${String(Ce).padStart(2,"0")}.${ke}`}function Ya(x){const g=Number(x)||0;if(g<1024)return`${g} B`;const S=g/1024;if(S<1024)return`${S.toFixed(1)} KB`;const Ce=S/1024;return Ce<1024?`${Ce.toFixed(1)} MB`:`${(Ce/1024).toFixed(1)} GB`}function du(x){if(!x)return 0;const g=x.match(/^\s*-\s*step\s*:/gm);return g?g.length:0}function Ga(x){if(!x)return[];const g=x.split(/\r?\n/),S=[];let Ce=!1;for(const ke of g){if(!Ce){/^\s*variables\s*:\s*$/.test(ke)&&(Ce=!0);continue}if(!ke.trim())continue;if(!/^\s+/.test(ke))break;const Ze=ke.match(/^\s+([A-Za-z0-9_-]+)\s*:\s*(.*)$/);if(!Ze)continue;let ot=Ze[2].trim();ot=ot.replace(/^['"]|['"]$/g,""),S.push({name:Ze[1],value:ot})}return S}async function fu(){return vs||(vs=Promise.all([Ie(()=>import("./index-CWdEPjyK.js"),__vite__mapDeps([6,7,8,9,10]),import.meta.url),Ie(()=>import("./index-1CbRHFUW.js"),[],import.meta.url),Ie(()=>import("./index-DocLX96z.js").then(x=>x.t),__vite__mapDeps([7,8]),import.meta.url),Ie(()=>import("./index-CkqoOxGF.js"),__vite__mapDeps([9,10,8,7]),import.meta.url),Ie(()=>import("./index-CQY7N6SN.js").then(x=>x.i),[],import.meta.url),Ie(()=>import("./index-B9CtIV-P.js"),__vite__mapDeps([11,10,9,8,7]),import.meta.url)]).then(([x,g,S,Ce,ke,Ze])=>({basicSetup:x.basicSetup,EditorState:g.EditorState,RangeSetBuilder:g.RangeSetBuilder,Decoration:S.Decoration,EditorView:S.EditorView,ViewPlugin:S.ViewPlugin,HighlightStyle:Ce.HighlightStyle,syntaxHighlighting:Ce.syntaxHighlighting,tags:ke.tags,yamlLanguage:Ze.yaml}))),vs}async function Qa(){if(!bt.value||_t)return;const{basicSetup:x,EditorState:g,RangeSetBuilder:S,Decoration:Ce,EditorView:ke,ViewPlugin:Ze,HighlightStyle:ot,syntaxHighlighting:bs,tags:lt,yamlLanguage:_s}=await fu();bt.value&&(bt.value.style.height=zt.value?"360px":"640px");const wu=ke.theme({"&":{height:"100%",backgroundColor:"#fafafa",fontFamily:'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace',fontSize:"13px"},".cm-scroller":{overflow:"auto"},".cm-content":{padding:"16px"},".cm-gutters":{backgroundColor:"#f8fafc",borderRight:"1px solid #e2e8f0"},".cm-lineNumbers":{color:"#94a3b8"},".cm-activeLine":{backgroundColor:"#eef2ff"},".cm-activeLineGutter":{backgroundColor:"#e0e7ff"}},{dark:!1}),Su=Ze.fromClass(class{constructor(qe){this.decorations=this.build(qe)}update(qe){(qe.docChanged||qe.viewportChanged)&&(this.decorations=this.build(qe.view))}build(qe){const ai=new S;for(const{from:xu,to:Pu}of qe.visibleRanges){let Cs=xu;for(;Cs<=Pu;){const _r=qe.state.doc.lineAt(Cs),ii=_r.text.match(/^\s+/),Au=ii?ii[0].length:0,Eu=Math.min(5,Math.floor(Au/2)+1);ai.add(_r.from,_r.from,Ce.line({class:`yaml-indent-${Eu}`})),Cs=_r.to+1}}return ai.finish()}},{decorations:qe=>qe.decorations}),Tu=g.create({doc:_e.value,extensions:[x,_s(),bs(ot.define([{tag:lt.keyword,color:"#1d4ed8"},{tag:lt.atom,color:"#1d4ed8"},{tag:lt.string,color:"#16a34a"},{tag:lt.number,color:"#f97316"},{tag:lt.bool,color:"#1d4ed8"},{tag:lt.comment,color:"#94a3b8",fontStyle:"italic"},{tag:lt.punctuation,color:"#64748b"}])),wu,ke.lineWrapping,Su,ke.updateListener.of(qe=>{qe.docChanged&&(ms=!0,_e.value=qe.state.doc.toString(),ms=!1)})]});_t=new ke({state:Tu,parent:bt.value})}function Ja(){_t&&(_t.destroy(),_t=null)}function hu(){zt.value=!zt.value}function Xa(){h.value&&on(h.value.list_ports(),x=>{jl(x)})}Ho(()=>{Cu(),yr=window.setInterval(()=>{ae.value&&te.value&&(de.value=Date.now()-te.value)},200),Oe.value==="scripts"&&Wn(()=>Qa()),window.addEventListener("keydown",ei),si()}),Ko(()=>{yr&&(window.clearInterval(yr),yr=null),Ct&&(window.clearTimeout(Ct),Ct=null),Dl(),ku(),lc(),mn&&(window.cancelAnimationFrame(mn),mn=0),tu(),Ja(),window.removeEventListener("keydown",ei)}),tt(()=>B.value.length,()=>{Je.value&&(mn||(mn=window.requestAnimationFrame(async()=>{mn=0,await Wn(),Va()})))}),tt(()=>Oe.value,x=>{x==="scripts"?Wn(()=>Qa()):Ja(),x==="protocols"&&gs()}),tt(()=>zt.value,x=>{bt.value&&(bt.value.style.height=x?"360px":"640px")}),tt(()=>f.value||ds.value||fs.value||Ua.value||Fa.value||gr.value,x=>{document.body.classList.toggle("modal-open",x)}),tt(()=>ae.value,x=>{x&&!gr.value&&Zc()}),tt(()=>_e.value,x=>{if(!_t||ms)return;const g=_t.state.doc.toString();x!==g&&_t.dispatch({changes:{from:0,to:g.length,insert:x}})}),tt(()=>_e.value,x=>{Ct&&window.clearTimeout(Ct),Ct=window.setTimeout(()=>{et.value=Ga(x)},200)});function ei(x){x&&x.key==="Escape"&&f.value&&ja()}function gu(){try{if(h.value&&typeof h.value.open_manual_docs=="function"){h.value.open_manual_docs();return}if(h.value&&typeof h.value.open_external_url=="function"){h.value.open_external_url("https://github.com/11cookies11/ProtoFlow/blob/main/README.zh-CN.md");return}}catch{}window.open("https://github.com/11cookies11/ProtoFlow/blob/main/README.zh-CN.md","_blank","noopener,noreferrer")}const{buildSettingsPayload:ti,normalizeSettings:ni,applySettings:ri}=Fg({refs:{uiLanguage:ie,uiTheme:Ae,autoConnectOnStart:Xt,dslWorkspacePath:Ve,quickCommands:us,defaultBaud:Ee,defaultParity:We,defaultStopBits:He,tcpTimeoutMs:Jt,tcpHeartbeatSec:dr,tcpRetryCount:ze,baud:O},defaults:{uiDefaults:Un,serialDefaults:$e,networkDefaults:wt,defaultLanguage:Nn,supportedLanguages:Al,workspaceFallback:"/usr/local/protoflow/workflows"},normalizeQuickCommands:Hl}),{settingsDirty:pu,setSnapshot:mu,commitCurrent:vu,discard:yu}=Og({settingsSnapshot:Pl,buildPayload:ti,normalize:ni,apply:ri}),{loadSettings:si,saveSettings:bu,chooseDslWorkspace:_u}=Bg({bridge:h,settingsSaving:Dn,dslWorkspacePath:Ve,tr:Ke,withResult:on,normalizeSettings:ni,applySettings:ri,setSettingsSnapshot:mu,buildSettingsPayload:ti,commitSettingsSnapshot:vu}),{startBridgeBootstrap:Cu,disposeBridgeBootstrap:ku}=Hg({bridge:h,appVersion:Aa,applyFeatureFlags:x=>{El.value=!!x?.proxyMonitorEnabled},bindCommBridgeSignals:Xc,bindScriptBridgeSignals:Jc,refreshPorts:Xa,refreshChannels:ic,refreshProtocols:gs,loadSettings:si});return(x,g)=>(ft(),Is("div",Zg,[X("div",{class:"resize-handle top",onMousedown:g[0]||(g[0]=xe(S=>F(Ft)("top",S),["stop"]))},null,32),X("div",{class:"resize-handle bottom",onMousedown:g[1]||(g[1]=xe(S=>F(Ft)("bottom",S),["stop"]))},null,32),X("div",{class:"resize-handle left",onMousedown:g[2]||(g[2]=xe(S=>F(Ft)("left",S),["stop"]))},null,32),X("div",{class:"resize-handle right",onMousedown:g[3]||(g[3]=xe(S=>F(Ft)("right",S),["stop"]))},null,32),X("div",{class:"resize-handle top-left",onMousedown:g[4]||(g[4]=xe(S=>F(Ft)("top-left",S),["stop"]))},null,32),X("div",{class:"resize-handle top-right",onMousedown:g[5]||(g[5]=xe(S=>F(Ft)("top-right",S),["stop"]))},null,32),X("div",{class:"resize-handle bottom-left",onMousedown:g[6]||(g[6]=xe(S=>F(Ft)("bottom-left",S),["stop"]))},null,32),X("div",{class:"resize-handle bottom-right",onMousedown:g[7]||(g[7]=xe(S=>F(Ft)("bottom-right",S),["stop"]))},null,32),X("header",{class:"app-titlebar",onDblclick:nu,onMousedown:g[17]||(g[17]=xe((...S)=>F(Wa)&&F(Wa)(...S),["left"])),onContextmenu:g[18]||(g[18]=xe((...S)=>F(Za)&&F(Za)(...S),["prevent"]))},[g[42]||(g[42]=X("div",{class:"app-title"},"ProtoFlow",-1)),X("div",qg,[X("button",{class:"title-btn",type:"button",onMousedown:g[8]||(g[8]=xe(()=>{},["stop"])),onDblclick:g[9]||(g[9]=xe(()=>{},["stop"])),onClick:g[10]||(g[10]=xe((...S)=>F(Ha)&&F(Ha)(...S),["stop"]))},[...g[39]||(g[39]=[X("span",{class:"material-symbols-outlined"},"minimize",-1)])],32),X("button",{class:"title-btn",type:"button",onMousedown:g[11]||(g[11]=xe(()=>{},["stop"])),onDblclick:g[12]||(g[12]=xe(()=>{},["stop"])),onClick:g[13]||(g[13]=xe((...S)=>F(ps)&&F(ps)(...S),["stop"]))},[...g[40]||(g[40]=[X("span",{class:"material-symbols-outlined"},"crop_square",-1)])],32),X("button",{class:"title-btn close",type:"button",onMousedown:g[14]||(g[14]=xe(()=>{},["stop"])),onDblclick:g[15]||(g[15]=xe(()=>{},["stop"])),onClick:g[16]||(g[16]=xe((...S)=>F(Ka)&&F(Ka)(...S),["stop"]))},[...g[41]||(g[41]=[X("span",{class:"material-symbols-outlined"},"close",-1)])],32)])],32),X("div",Yg,[X("aside",{ref_key:"sidebarRef",ref:y,class:"sidebar"},[X("div",Gg,[g[44]||(g[44]=X("div",{class:"brand-mark"},[X("span",{class:"material-symbols-outlined"},"hub")],-1)),X("div",null,[g[43]||(g[43]=X("div",{class:"brand-name"},"ProtoFlow",-1)),X("div",Qg,bn(wc.value),1)])]),X("nav",Jg,[X("button",{class:sn(["nav-item",{active:Oe.value==="manual"}]),onClick:g[19]||(g[19]=S=>Oe.value="manual")},[g[45]||(g[45]=X("span",{class:"material-symbols-outlined"},"terminal",-1)),X("span",null,bn(hr.value.manual),1)],2),X("button",{class:sn(["nav-item",{active:Oe.value==="scripts"}]),onClick:g[20]||(g[20]=S=>Oe.value="scripts")},[g[46]||(g[46]=X("span",{class:"material-symbols-outlined"},"smart_toy",-1)),X("span",null,bn(hr.value.scripts),1)],2),X("button",{class:sn(["nav-item",{active:Oe.value==="protocols"}]),onClick:g[21]||(g[21]=S=>Oe.value="protocols")},[g[47]||(g[47]=X("span",{class:"material-symbols-outlined"},"cable",-1)),X("span",null,bn(hr.value.protocols),1)],2),g[49]||(g[49]=X("div",{class:"nav-divider"},null,-1)),X("button",{class:sn(["nav-item",{active:Oe.value==="settings"}]),onClick:g[22]||(g[22]=S=>Oe.value="settings")},[g[48]||(g[48]=X("span",{class:"material-symbols-outlined"},"settings",-1)),X("span",null,bn(hr.value.settings),1)],2)])],512),X("main",Xg,[Oe.value==="manual"?(ft(),an(F(t),{key:0})):Oe.value==="scripts"?(ft(),an(F(n),{key:1})):Oe.value==="protocols"?(ft(),Is("section",ep,[ye(F(o),{onRefresh:F(gs),onCreate:F(Ba)},null,8,["onRefresh","onCreate"]),ye(F(i),{"protocol-tab":F(Sc),"filtered-protocol-cards":F(Ec),onSetTab:F(zc),onCreate:F(Ba),onDetails:F(Ic),onDelete:F(Dc)},null,8,["protocol-tab","filtered-protocol-cards","onSetTab","onCreate","onDetails","onDelete"])])):(ft(),Is("section",tp,[ye(F(a),{"settings-dirty":F(pu),"settings-saving":Dn.value,onOpenManualDocs:gu,onDiscard:F(yu),onSave:F(bu)},null,8,["settings-dirty","settings-saving","onDiscard","onSave"]),ye(F(s),{"settings-tab":Ta.value,"ui-language":ie.value,"ui-theme":Ae.value,"auto-connect-on-start":Xt.value,"dsl-workspace-path":Ve.value,"language-options":Cc.value,"theme-options":kc.value,onSetTab:ru,onChooseDslWorkspace:F(_u),"onUpdate:uiLanguage":g[23]||(g[23]=S=>ie.value=S),"onUpdate:uiTheme":g[24]||(g[24]=S=>Ae.value=S),"onUpdate:autoConnectOnStart":g[25]||(g[25]=S=>Xt.value=S)},null,8,["settings-tab","ui-language","ui-theme","auto-connect-on-start","dsl-workspace-path","language-options","theme-options","onChooseDslWorkspace"])])),ye(F(r),{open:f.value,mode:p.value,"channel-type":k.value,"channel-name":b.value,"channel-port":_.value,"channel-baud":R.value,"channel-data-bits":I.value,"channel-parity":A.value,"channel-stop-bits":C.value,"channel-flow-control":$.value,"channel-read-timeout":L.value,"channel-write-timeout":j.value,"channel-host":q.value,"channel-tcp-port":ne.value,"channel-auto-connect":fe.value,"has-ports":T.value.length>0,"port-options-list":F(Ra),"supported-baud-rates":F(pg),onClose:F(ja),onSubmit:F(Fc),"onUpdate:channelType":g[26]||(g[26]=S=>k.value=S),"onUpdate:channelName":g[27]||(g[27]=S=>b.value=S),"onUpdate:channelPort":g[28]||(g[28]=S=>_.value=S),"onUpdate:channelBaud":g[29]||(g[29]=S=>R.value=S),"onUpdate:channelDataBits":g[30]||(g[30]=S=>I.value=S),"onUpdate:channelParity":g[31]||(g[31]=S=>A.value=S),"onUpdate:channelStopBits":g[32]||(g[32]=S=>C.value=S),"onUpdate:channelFlowControl":g[33]||(g[33]=S=>$.value=S),"onUpdate:channelReadTimeout":g[34]||(g[34]=S=>L.value=S),"onUpdate:channelWriteTimeout":g[35]||(g[35]=S=>j.value=S),"onUpdate:channelHost":g[36]||(g[36]=S=>q.value=S),"onUpdate:channelTcpPort":g[37]||(g[37]=S=>ne.value=S),"onUpdate:channelAutoConnect":g[38]||(g[38]=S=>fe.value=S)},null,8,["open","mode","channel-type","channel-name","channel-port","channel-baud","channel-data-bits","channel-parity","channel-stop-bits","channel-flow-control","channel-read-timeout","channel-write-timeout","channel-host","channel-tcp-port","channel-auto-connect","has-ports","port-options-list","supported-baud-rates","onClose","onSubmit"]),(ft(),an(pi,{to:"body"},[ye(F(l),{open:F(Ua),mode:F(Tc),draft:F(Ac),editing:F(xc),onClose:F(Rc),onSave:F(Mc),onUpdateDraft:F(Lc)},null,8,["open","mode","draft","editing","onClose","onSave","onUpdateDraft"]),ye(F(u),{open:F(Fa),deleting:F(Pc),onClose:F(Nc),onConfirm:F(Oc)},null,8,["open","deleting","onClose","onConfirm"])])),(ft(),an(pi,{to:"body"},[ye(F(c),{open:gr.value,runtime:F(Pa),onClose:F(qc)},null,8,["open","runtime","onClose"])]))])])]))}};function ip(){return!window.qt||!window.qt.webChannelTransport?Promise.resolve(null):new Promise(e=>{new QWebChannel(window.qt.webChannelTransport,t=>{const n=t.objects.bridge;window.bridge=n,e(n)})})}async function op(){const e=await ip();e&&(e.log.connect(n=>{console.log("[bridge]",n)}),e.notify_ready(),e.ping("frontend").then(n=>console.log(n)));const t=eh(ap);t.use(rh()),t.mount("#app")}op();export{Kh as A,fp as B,Ye as F,pi as T,X as a,dp as b,Is as c,yf as d,ye as e,we as f,gp as g,xe as h,Hn as i,oa as j,w as k,ge as l,tt as m,sn as n,ft as o,Wn as p,Ho as q,cp as r,Ko as s,bn as t,F as u,hp as v,lp as w,an as x,Ed as y,up as z}; diff --git a/ui/assets/web/assets/index-DocLX96z.js b/ui/assets/web/assets/index-DocLX96z.js new file mode 100644 index 0000000..834b09e --- /dev/null +++ b/ui/assets/web/assets/index-DocLX96z.js @@ -0,0 +1,7 @@ +import{Facet as C,StateEffect as nt,Prec as Si,StateField as vi,EditorState as It,Transaction as jn,Annotation as Yn,EditorSelection as v,RangeValue as Ci,RangeSet as E,RangeSetBuilder as Gn,ChangeSet as Ts,findClusterBreak as at,Text as X,MapMode as Mt,combineConfig as Mi,codePointAt as Ds,countColumn as Os,codePointSize as Xn,findColumn as $e,CharCategory as $n}from"./index-1CbRHFUW.js";const Ue="ͼ",Vi=typeof Symbol>"u"?"__"+Ue:Symbol.for(Ue),Qe=typeof Symbol>"u"?"__styleSet"+Math.floor(Math.random()*1e8):Symbol("styleSet"),Fi=typeof globalThis<"u"?globalThis:typeof window<"u"?window:{};class Dt{constructor(t,e){this.rules=[];let{finish:i}=e||{};function s(o){return/^@/.test(o)?[o]:o.split(/,\s*/)}function r(o,l,a,h){let c=[],f=/^@(\w+)\b/.exec(o[0]),d=f&&f[1]=="keyframes";if(f&&l==null)return a.push(o[0]+";");for(let u in l){let p=l[u];if(/&/.test(u))r(u.split(/,\s*/).map(g=>o.map(m=>g.replace(/&/,m))).reduce((g,m)=>g.concat(m)),p,a);else if(p&&typeof p=="object"){if(!f)throw new RangeError("The value of a property ("+u+") should be a primitive value.");r(s(u),p,c,d)}else p!=null&&c.push(u.replace(/_.*/,"").replace(/[A-Z]/g,g=>"-"+g.toLowerCase())+": "+p+";")}(c.length||d)&&a.push((i&&!f&&!h?o.map(i):o).join(", ")+" {"+c.join(" ")+"}")}for(let o in t)r(s(o),t[o],this.rules)}getRules(){return this.rules.join(` +`)}static newName(){let t=Fi[Vi]||1;return Fi[Vi]=t+1,Ue+t.toString(36)}static mount(t,e,i){let s=t[Qe],r=i&&i.nonce;s?r&&s.setNonce(r):s=new Un(t,r),s.mount(Array.isArray(e)?e:[e],t)}}let Ii=new Map;class Un{constructor(t,e){let i=t.ownerDocument||t,s=i.defaultView;if(!t.head&&t.adoptedStyleSheets&&s.CSSStyleSheet){let r=Ii.get(i);if(r)return t[Qe]=r;this.sheet=new s.CSSStyleSheet,Ii.set(i,this)}else this.styleTag=i.createElement("style"),e&&this.styleTag.setAttribute("nonce",e);this.modules=[],t[Qe]=this}mount(t,e){let i=this.sheet,s=0,r=0;for(let o=0;o-1&&(this.modules.splice(a,1),r--,a=-1),a==-1){if(this.modules.splice(r++,0,l),i)for(let h=0;h",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},Qn=typeof navigator<"u"&&/Mac/.test(navigator.platform),Jn=typeof navigator<"u"&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);for(var V=0;V<10;V++)ct[48+V]=ct[96+V]=String(V);for(var V=1;V<=24;V++)ct[V+111]="F"+V;for(var V=65;V<=90;V++)ct[V]=String.fromCharCode(V+32),Yt[V]=String.fromCharCode(V);for(var Ne in ct)Yt.hasOwnProperty(Ne)||(Yt[Ne]=ct[Ne]);function Zn(n){var t=Qn&&n.metaKey&&n.shiftKey&&!n.ctrlKey&&!n.altKey||Jn&&n.shiftKey&&n.key&&n.key.length==1||n.key=="Unidentified",e=!t&&n.key||(n.shiftKey?Yt:ct)[n.keyCode]||n.key||"Unidentified";return e=="Esc"&&(e="Escape"),e=="Del"&&(e="Delete"),e=="Left"&&(e="ArrowLeft"),e=="Up"&&(e="ArrowUp"),e=="Right"&&(e="ArrowRight"),e=="Down"&&(e="ArrowDown"),e}function St(){var n=arguments[0];typeof n=="string"&&(n=document.createElement(n));var t=1,e=arguments[1];if(e&&typeof e=="object"&&e.nodeType==null&&!Array.isArray(e)){for(var i in e)if(Object.prototype.hasOwnProperty.call(e,i)){var s=e[i];typeof s=="string"?n.setAttribute(i,s):s!=null&&(n[i]=s)}t++}for(;t2);var y={mac:Ki||/Mac/.test(I.platform),windows:/Win/.test(I.platform),linux:/Linux|X11/.test(I.platform),ie:Oe,ie_version:Rs?Je.documentMode||6:ti?+ti[1]:Ze?+Ze[1]:0,gecko:zi,gecko_version:zi?+(/Firefox\/(\d+)/.exec(I.userAgent)||[0,0])[1]:0,chrome:!!Ve,chrome_version:Ve?+Ve[1]:0,ios:Ki,android:/Android\b/.test(I.userAgent),webkit_version:tr?+(/\bAppleWebKit\/(\d+)/.exec(I.userAgent)||[0,0])[1]:0,safari:ei,safari_version:ei?+(/\bVersion\/(\d+(\.\d+)?)/.exec(I.userAgent)||[0,0])[1]:0,tabSize:Je.documentElement.style.tabSize!=null?"tab-size":"-moz-tab-size"};function ki(n,t){for(let e in n)e=="class"&&t.class?t.class+=" "+n.class:e=="style"&&t.style?t.style+=";"+n.style:t[e]=n[e];return t}const ve=Object.create(null);function Ai(n,t,e){if(n==t)return!0;n||(n=ve),t||(t=ve);let i=Object.keys(n),s=Object.keys(t);if(i.length-0!=s.length-0)return!1;for(let r of i)if(r!=e&&(s.indexOf(r)==-1||n[r]!==t[r]))return!1;return!0}function er(n,t){for(let e=n.attributes.length-1;e>=0;e--){let i=n.attributes[e].name;t[i]==null&&n.removeAttribute(i)}for(let e in t){let i=t[e];e=="style"?n.style.cssText=i:n.getAttribute(e)!=i&&n.setAttribute(e,i)}}function qi(n,t,e){let i=!1;if(t)for(let s in t)e&&s in e||(i=!0,s=="style"?n.style.cssText="":n.removeAttribute(s));if(e)for(let s in e)t&&t[s]==e[s]||(i=!0,s=="style"?n.style.cssText=e[s]:n.setAttribute(s,e[s]));return i}function ir(n){let t=Object.create(null);for(let e=0;e0?3e8:-4e8:e>0?1e8:-1e8,new bt(t,e,e,i,t.widget||null,!1)}static replace(t){let e=!!t.block,i,s;if(t.isBlockGap)i=-5e8,s=4e8;else{let{start:r,end:o}=Bs(t,e);i=(r?e?-3e8:-1:5e8)-1,s=(o?e?2e8:1:-6e8)+1}return new bt(t,i,s,e,t.widget||null,!0)}static line(t){return new te(t)}static set(t,e=!1){return E.of(t,e)}hasHeight(){return this.widget?this.widget.estimatedHeight>-1:!1}}O.none=E.empty;class Zt extends O{constructor(t){let{start:e,end:i}=Bs(t);super(e?-1:5e8,i?1:-6e8,null,t),this.tagName=t.tagName||"span",this.attrs=t.class&&t.attributes?ki(t.attributes,{class:t.class}):t.class?{class:t.class}:t.attributes||ve}eq(t){return this==t||t instanceof Zt&&this.tagName==t.tagName&&Ai(this.attrs,t.attrs)}range(t,e=t){if(t>=e)throw new RangeError("Mark decorations may not be empty");return super.range(t,e)}}Zt.prototype.point=!1;class te extends O{constructor(t){super(-2e8,-2e8,null,t)}eq(t){return t instanceof te&&this.spec.class==t.spec.class&&Ai(this.spec.attributes,t.spec.attributes)}range(t,e=t){if(e!=t)throw new RangeError("Line decoration ranges must be zero-length");return super.range(t,e)}}te.prototype.mapMode=Mt.TrackBefore;te.prototype.point=!0;class bt extends O{constructor(t,e,i,s,r,o){super(e,i,r,t),this.block=s,this.isReplace=o,this.mapMode=s?e<=0?Mt.TrackBefore:Mt.TrackAfter:Mt.TrackDel}get type(){return this.startSide!=this.endSide?H.WidgetRange:this.startSide<=0?H.WidgetBefore:H.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(t){return t instanceof bt&&sr(this.widget,t.widget)&&this.block==t.block&&this.startSide==t.startSide&&this.endSide==t.endSide}range(t,e=t){if(this.isReplace&&(t>e||t==e&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&e!=t)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(t,e)}}bt.prototype.point=!0;function Bs(n,t=!1){let{inclusiveStart:e,inclusiveEnd:i}=n;return e==null&&(e=n.inclusive),i==null&&(i=n.inclusive),{start:e??t,end:i??t}}function sr(n,t){return n==t||!!(n&&t&&n.compare(t))}function kt(n,t,e,i=0){let s=e.length-1;s>=0&&e[s]+i>=n?e[s]=Math.max(e[s],t):e.push(n,t)}class Ot extends Ci{constructor(t,e){super(),this.tagName=t,this.attributes=e}eq(t){return t==this||t instanceof Ot&&this.tagName==t.tagName&&Ai(this.attributes,t.attributes)}static create(t){return new Ot(t.tagName,t.attributes||ve)}static set(t,e=!1){return E.of(t,e)}}Ot.prototype.startSide=Ot.prototype.endSide=-1;function Gt(n){let t;return n.nodeType==11?t=n.getSelection?n:n.ownerDocument:t=n,t.getSelection()}function ii(n,t){return t?n==t||n.contains(t.nodeType!=1?t.parentNode:t):!1}function me(n,t){if(!t.anchorNode)return!1;try{return ii(n,t.anchorNode)}catch{return!1}}function zt(n){return n.nodeType==3?$t(n,0,n.nodeValue.length).getClientRects():n.nodeType==1?n.getClientRects():[]}function Kt(n,t,e,i){return e?_i(n,t,e,i,-1)||_i(n,t,e,i,1):!1}function ft(n){for(var t=0;;t++)if(n=n.previousSibling,!n)return t}function Ce(n){return n.nodeType==1&&/^(DIV|P|LI|UL|OL|BLOCKQUOTE|DD|DT|H\d|SECTION|PRE)$/.test(n.nodeName)}function _i(n,t,e,i,s){for(;;){if(n==e&&t==i)return!0;if(t==(s<0?0:it(n))){if(n.nodeName=="DIV")return!1;let r=n.parentNode;if(!r||r.nodeType!=1)return!1;t=ft(n)+(s<0?0:1),n=r}else if(n.nodeType==1){if(n=n.childNodes[t+(s<0?-1:0)],n.nodeType==1&&n.contentEditable=="false")return!1;t=s<0?it(n):0}else return!1}}function it(n){return n.nodeType==3?n.nodeValue.length:n.childNodes.length}function Xt(n,t){let e=t?n.left:n.right;return{left:e,right:e,top:n.top,bottom:n.bottom}}function nr(n){let t=n.visualViewport;return t?{left:0,right:t.width,top:0,bottom:t.height}:{left:0,right:n.innerWidth,top:0,bottom:n.innerHeight}}function Es(n,t){let e=t.width/n.offsetWidth,i=t.height/n.offsetHeight;return(e>.995&&e<1.005||!isFinite(e)||Math.abs(t.width-n.offsetWidth)<1)&&(e=1),(i>.995&&i<1.005||!isFinite(i)||Math.abs(t.height-n.offsetHeight)<1)&&(i=1),{scaleX:e,scaleY:i}}function rr(n,t,e,i,s,r,o,l){let a=n.ownerDocument,h=a.defaultView||window;for(let c=n,f=!1;c&&!f;)if(c.nodeType==1){let d,u=c==a.body,p=1,g=1;if(u)d=nr(h);else{if(/^(fixed|sticky)$/.test(getComputedStyle(c).position)&&(f=!0),c.scrollHeight<=c.clientHeight&&c.scrollWidth<=c.clientWidth){c=c.assignedSlot||c.parentNode;continue}let w=c.getBoundingClientRect();({scaleX:p,scaleY:g}=Es(c,w)),d={left:w.left,right:w.left+c.clientWidth*p,top:w.top,bottom:w.top+c.clientHeight*g}}let m=0,b=0;if(s=="nearest")t.top0&&t.bottom>d.bottom+b&&(b=t.bottom-d.bottom+o)):t.bottom>d.bottom&&(b=t.bottom-d.bottom+o,e<0&&t.top-b0&&t.right>d.right+m&&(m=t.right-d.right+r)):t.right>d.right&&(m=t.right-d.right+r,e<0&&t.leftd.bottom||t.leftd.right)&&(t={left:Math.max(t.left,d.left),right:Math.min(t.right,d.right),top:Math.max(t.top,d.top),bottom:Math.min(t.bottom,d.bottom)}),c=c.assignedSlot||c.parentNode}else if(c.nodeType==11)c=c.host;else break}function or(n){let t=n.ownerDocument,e,i;for(let s=n.parentNode;s&&!(s==t.body||e&&i);)if(s.nodeType==1)!i&&s.scrollHeight>s.clientHeight&&(i=s),!e&&s.scrollWidth>s.clientWidth&&(e=s),s=s.assignedSlot||s.parentNode;else if(s.nodeType==11)s=s.host;else break;return{x:e,y:i}}class lr{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(t){return this.anchorNode==t.anchorNode&&this.anchorOffset==t.anchorOffset&&this.focusNode==t.focusNode&&this.focusOffset==t.focusOffset}setRange(t){let{anchorNode:e,focusNode:i}=t;this.set(e,Math.min(t.anchorOffset,e?it(e):0),i,Math.min(t.focusOffset,i?it(i):0))}set(t,e,i,s){this.anchorNode=t,this.anchorOffset=e,this.focusNode=i,this.focusOffset=s}}let gt=null;y.safari&&y.safari_version>=26&&(gt=!1);function Hs(n){if(n.setActive)return n.setActive();if(gt)return n.focus(gt);let t=[];for(let e=n;e&&(t.push(e,e.scrollTop,e.scrollLeft),e!=e.ownerDocument);e=e.parentNode);if(n.focus(gt==null?{get preventScroll(){return gt={preventScroll:!0},!0}}:void 0),!gt){gt=!1;for(let e=0;eMath.max(1,n.scrollHeight-n.clientHeight-4)}function Ws(n,t){for(let e=n,i=t;;){if(e.nodeType==3&&i>0)return{node:e,offset:i};if(e.nodeType==1&&i>0){if(e.contentEditable=="false")return null;e=e.childNodes[i-1],i=it(e)}else if(e.parentNode&&!Ce(e))i=ft(e),e=e.parentNode;else return null}}function Ns(n,t){for(let e=n,i=t;;){if(e.nodeType==3&&i=e){if(l.level==i)return o;(r<0||(s!=0?s<0?l.frome:t[r].level>l.level))&&(r=o)}}if(r<0)throw new RangeError("Index out of range");return r}}function Is(n,t){if(n.length!=t.length)return!1;for(let e=0;e=0;g-=3)if(U[g+1]==-u){let m=U[g+2],b=m&2?s:m&4?m&1?r:s:0;b&&(D[f]=D[U[g]]=b),l=g;break}}else{if(U.length==189)break;U[l++]=f,U[l++]=d,U[l++]=a}else if((p=D[f])==2||p==1){let g=p==s;a=g?0:1;for(let m=l-3;m>=0;m-=3){let b=U[m+2];if(b&2)break;if(g)U[m+2]|=2;else{if(b&4)break;U[m+2]|=4}}}}}function gr(n,t,e,i){for(let s=0,r=i;s<=e.length;s++){let o=s?e[s-1].to:n,l=sa;)p==m&&(p=e[--g].from,m=g?e[g-1].to:n),D[--p]=u;a=c}else r=h,a++}}}function ni(n,t,e,i,s,r,o){let l=i%2?2:1;if(i%2==s%2)for(let a=t,h=0;aa&&o.push(new J(a,g.from,u));let m=g.direction==yt!=!(u%2);ri(n,m?i+1:i,s,g.inner,g.from,g.to,o),a=g.to}p=g.to}else{if(p==e||(c?D[p]!=l:D[p]==l))break;p++}d?ni(n,a,p,i+1,s,d,o):at;){let c=!0,f=!1;if(!h||a>r[h-1].to){let g=D[a-1];g!=l&&(c=!1,f=g==16)}let d=!c&&l==1?[]:null,u=c?i:i+1,p=a;t:for(;;)if(h&&p==r[h-1].to){if(f)break t;let g=r[--h];if(!c)for(let m=g.from,b=h;;){if(m==t)break t;if(b&&r[b-1].to==m)m=r[--b].from;else{if(D[m-1]==l)break t;break}}if(d)d.push(g);else{g.toD.length;)D[D.length]=256;let i=[],s=t==yt?0:1;return ri(n,s,s,e,0,n.length,i),i}function Ks(n){return[new J(0,n,0)]}let qs="";function _s(n,t,e,i,s){var r;let o=i.head-n.from,l=J.find(t,o,(r=i.bidiLevel)!==null&&r!==void 0?r:-1,i.assoc),a=t[l],h=a.side(s,e);if(o==h){let d=l+=s?1:-1;if(d<0||d>=t.length)return null;a=t[l=d],o=a.side(!s,e),h=a.side(s,e)}let c=at(n.text,o,a.forward(s,e));(ca.to)&&(c=h),qs=n.text.slice(Math.min(o,c),Math.max(o,c));let f=l==(s?t.length-1:0)?null:t[l+(s?1:-1)];return f&&c==h&&f.level+(s?0:1)n.some(t=>t)}),Js=C.define({combine:n=>n.some(t=>t)}),Zs=C.define();class Tt{constructor(t,e="nearest",i="nearest",s=5,r=5,o=!1){this.range=t,this.y=e,this.x=i,this.yMargin=s,this.xMargin=r,this.isSnapshot=o}map(t){return t.empty?this:new Tt(this.range.map(t),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(t){return this.range.to<=t.doc.length?this:new Tt(v.cursor(t.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}}const re=nt.define({map:(n,t)=>n.map(t)}),tn=nt.define();function G(n,t,e){let i=n.facet(Xs);i.length?i[0](t):window.onerror&&window.onerror(String(t),e,void 0,void 0,t)||(e?console.error(e+":",t):console.error(t))}const et=C.define({combine:n=>n.length?n[0]:!0});let br=0;const vt=C.define({combine(n){return n.filter((t,e)=>{for(let i=0;i{let a=[];return o&&a.push(Ut.of(h=>{let c=h.plugin(l);return c?o(c):O.none})),r&&a.push(r(l)),a})}static fromClass(t,e){return P.define((i,s)=>new t(i,s),e)}}class Fe{constructor(t){this.spec=t,this.mustUpdate=null,this.value=null}get plugin(){return this.spec&&this.spec.plugin}update(t){if(this.value){if(this.mustUpdate){let e=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(e)}catch(i){if(G(e.state,i,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch{}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.plugin.create(t,this.spec.arg)}catch(e){G(t.state,e,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(t){var e;if(!((e=this.value)===null||e===void 0)&&e.destroy)try{this.value.destroy()}catch(i){G(t.state,i,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}}const en=C.define(),Le=C.define(),Ut=C.define(),sn=C.define(),nn=C.define(),ee=C.define(),rn=C.define();function Yi(n,t){let e=n.state.facet(rn);if(!e.length)return e;let i=e.map(r=>r instanceof Function?r(n):r),s=[];return E.spans(i,t.from,t.to,{point(){},span(r,o,l,a){let h=r-t.from,c=o-t.from,f=s;for(let d=l.length-1;d>=0;d--,a--){let u=l[d].spec.bidiIsolate,p;if(u==null&&(u=mr(t.text,h,c)),a>0&&f.length&&(p=f[f.length-1]).to==h&&p.direction==u)p.to=c,f=p.inner;else{let g={from:h,to:c,direction:u,inner:[]};f.push(g),f=g.inner}}}}),s}const on=C.define();function Li(n){let t=0,e=0,i=0,s=0;for(let r of n.state.facet(on)){let o=r(n);o&&(o.left!=null&&(t=Math.max(t,o.left)),o.right!=null&&(e=Math.max(e,o.right)),o.top!=null&&(i=Math.max(i,o.top)),o.bottom!=null&&(s=Math.max(s,o.bottom)))}return{left:t,right:e,top:i,bottom:s}}const Wt=C.define();class q{constructor(t,e,i,s){this.fromA=t,this.toA=e,this.fromB=i,this.toB=s}join(t){return new q(Math.min(this.fromA,t.fromA),Math.max(this.toA,t.toA),Math.min(this.fromB,t.fromB),Math.max(this.toB,t.toB))}addToSet(t){let e=t.length,i=this;for(;e>0;e--){let s=t[e-1];if(!(s.fromA>i.toA)){if(s.toAs.push(new q(r,o,l,a))),this.changedRanges=s}static create(t,e,i){return new Qt(t,e,i)}get viewportChanged(){return(this.flags&4)>0}get viewportMoved(){return(this.flags&8)>0}get heightChanged(){return(this.flags&2)>0}get geometryChanged(){return this.docChanged||(this.flags&18)>0}get focusChanged(){return(this.flags&1)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some(t=>t.selection)}get empty(){return this.flags==0&&this.transactions.length==0}}const yr=[];class B{constructor(t,e,i=0){this.dom=t,this.length=e,this.flags=i,this.parent=null,t.cmTile=this}get breakAfter(){return this.flags&1}get children(){return yr}isWidget(){return!1}get isHidden(){return!1}isComposite(){return!1}isLine(){return!1}isText(){return!1}isBlock(){return!1}get domAttrs(){return null}sync(t){if(this.flags|=2,this.flags&4){this.flags&=-5;let e=this.domAttrs;e&&er(this.dom,e)}}toString(){return this.constructor.name+(this.children.length?`(${this.children})`:"")+(this.breakAfter?"#":"")}destroy(){this.parent=null}setDOM(t){this.dom=t,t.cmTile=this}get posAtStart(){return this.parent?this.parent.posBefore(this):0}get posAtEnd(){return this.posAtStart+this.length}posBefore(t,e=this.posAtStart){let i=e;for(let s of this.children){if(s==t)return i;i+=s.length+s.breakAfter}throw new RangeError("Invalid child in posBefore")}posAfter(t){return this.posBefore(t)+t.length}covers(t){return!0}coordsIn(t,e){return null}domPosFor(t,e){let i=ft(this.dom),s=this.length?t>0:e>0;return new Y(this.parent.dom,i+(s?1:0),t==0||t==this.length)}markDirty(t){this.flags&=-3,t&&(this.flags|=4),this.parent&&this.parent.flags&2&&this.parent.markDirty(!1)}get overrideDOMText(){return null}get root(){for(let t=this;t;t=t.parent)if(t instanceof Be)return t;return null}static get(t){return t.cmTile}}class Re extends B{constructor(t){super(t,0),this._children=[]}isComposite(){return!0}get children(){return this._children}get lastChild(){return this.children.length?this.children[this.children.length-1]:null}append(t){this.children.push(t),t.parent=this}sync(t){if(this.flags&2)return;super.sync(t);let e=this.dom,i=null,s,r=t?.node==e?t:null,o=0;for(let l of this.children){if(l.sync(t),o+=l.length+l.breakAfter,s=i?i.nextSibling:e.firstChild,r&&s!=l.dom&&(r.written=!0),l.dom.parentNode==e)for(;s&&s!=l.dom;)s=Gi(s);else e.insertBefore(l.dom,s);i=l.dom}for(s=i?i.nextSibling:e.firstChild,r&&s&&(r.written=!0);s;)s=Gi(s);this.length=o}}function Gi(n){let t=n.nextSibling;return n.parentNode.removeChild(n),t}class Be extends Re{constructor(t,e){super(e),this.view=t}owns(t){for(;t;t=t.parent)if(t==this)return!0;return!1}isBlock(){return!0}nearest(t){for(;;){if(!t)return null;let e=B.get(t);if(e&&this.owns(e))return e;t=t.parentNode}}blockTiles(t){for(let e=[],i=this,s=0,r=0;;)if(s==i.children.length){if(!e.length)return;i=i.parent,i.breakAfter&&r++,s=e.pop()}else{let o=i.children[s++];if(o instanceof ht)e.push(s),i=o,s=0;else{let l=r+o.length,a=t(o,r);if(a!==void 0)return a;r=l+o.breakAfter}}}resolveBlock(t,e){let i,s=-1,r,o=-1;if(this.blockTiles((l,a)=>{let h=a+l.length;if(t>=a&&t<=h){if(l.isWidget()&&e>=-1&&e<=1){if(l.flags&32)return!0;l.flags&16&&(i=void 0)}(at||t==a&&(e>1?l.length:l.covers(-1)))&&(!r||!l.isWidget()&&r.isWidget())&&(r=l,o=t-a)}}),!i&&!r)throw new Error("No tile at position "+t);return i&&e<0||!r?{tile:i,offset:s}:{tile:r,offset:o}}}class ht extends Re{constructor(t,e){super(t),this.wrapper=e}isBlock(){return!0}covers(t){return this.children.length?t<0?this.children[0].covers(-1):this.lastChild.covers(1):!1}get domAttrs(){return this.wrapper.attributes}static of(t,e){let i=new ht(e||document.createElement(t.tagName),t);return e||(i.flags|=4),i}}class Lt extends Re{constructor(t,e){super(t),this.attrs=e}isLine(){return!0}static start(t,e,i){let s=new Lt(e||document.createElement("div"),t);return(!e||!i)&&(s.flags|=4),s}get domAttrs(){return this.attrs}resolveInline(t,e,i){let s=null,r=-1,o=null,l=-1;function a(c,f){for(let d=0,u=0;d=f&&(p.isComposite()?a(p,f-u):(!o||o.isHidden&&(e>0||i&&xr(o,p)))&&(g>f||p.flags&32)?(o=p,l=f-u):(ui&&(t=i);let s=t,r=t,o=0;t==0&&e<0||t==i&&e>=0?y.chrome||y.gecko||(t?(s--,o=1):r=0)?0:l.length-1];return y.safari&&!o&&a.width==0&&(a=Array.prototype.find.call(l,h=>h.width)||a),o?Xt(a,o<0):a||null}static of(t,e){let i=new mt(e||document.createTextNode(t),t);return e||(i.flags|=2),i}}class Rt extends B{constructor(t,e,i,s){super(t,e,s),this.widget=i}isWidget(){return!0}get isHidden(){return this.widget.isHidden}covers(t){return this.flags&48?!1:(this.flags&(t<0?64:128))>0}coordsIn(t,e){return this.coordsInWidget(t,e,!1)}coordsInWidget(t,e,i){let s=this.widget.coordsAt(this.dom,t,e);if(s)return s;if(i)return Xt(this.dom.getBoundingClientRect(),this.length?t==0:e<=0);{let r=this.dom.getClientRects(),o=null;if(!r.length)return null;let l=this.flags&16?!0:this.flags&32?!1:t>0;for(let a=l?r.length-1:0;o=r[a],!(t>0?a==0:a==r.length-1||o.top0;)if(s.isComposite())if(o){if(!t)break;i&&i.break(),t--,o=!1}else if(r==s.children.length){if(!t&&!l.length)break;i&&i.leave(s),o=!!s.breakAfter,{tile:s,index:r}=l.pop(),r++}else{let a=s.children[r],h=a.breakAfter;(e>0?a.length<=t:a.length=0;l--){let a=e.marks[l],h=s.lastChild;if(h instanceof z&&h.mark.eq(a.mark))h.dom!=a.dom&&h.setDOM(Ie(a.dom)),s=h;else{if(this.cache.reused.get(a)){let f=B.get(a.dom);f&&f.setDOM(Ie(a.dom))}let c=z.of(a.mark,a.dom);s.append(c),s=c}this.cache.reused.set(a,2)}let r=B.get(t.text);r&&this.cache.reused.set(r,2);let o=new mt(t.text,t.text.nodeValue);o.flags|=8,s.append(o)}addInlineWidget(t,e,i){let s=this.afterWidget&&t.flags&48&&(this.afterWidget.flags&48)==(t.flags&48);s||this.flushBuffer();let r=this.ensureMarks(e,i);!s&&!(t.flags&16)&&r.append(this.getBuffer(1)),r.append(t),this.pos+=t.length,this.afterWidget=t}addMark(t,e,i){this.flushBuffer(),this.ensureMarks(e,i).append(t),this.pos+=t.length,this.afterWidget=null}addBlockWidget(t){this.getBlockPos().append(t),this.pos+=t.length,this.lastBlock=t,this.endLine()}continueWidget(t){let e=this.afterWidget||this.lastBlock;e.length+=t,this.pos+=t}addLineStart(t,e){var i;t||(t=ln);let s=Lt.start(t,e||((i=this.cache.find(Lt))===null||i===void 0?void 0:i.dom),!!e);this.getBlockPos().append(this.lastBlock=this.curLine=s)}addLine(t){this.getBlockPos().append(t),this.pos+=t.length,this.lastBlock=t,this.endLine()}addBreak(){this.lastBlock.flags|=1,this.endLine(),this.pos++}addLineStartIfNotCovered(t){this.blockPosCovered()||this.addLineStart(t)}ensureLine(t){this.curLine||this.addLineStart(t)}ensureMarks(t,e){var i;let s=this.curLine;for(let r=t.length-1;r>=0;r--){let o=t[r],l;if(e>0&&(l=s.lastChild)&&l instanceof z&&l.mark.eq(o))s=l,e--;else{let a=z.of(o,(i=this.cache.find(z,h=>h.mark.eq(o)))===null||i===void 0?void 0:i.dom);s.append(a),s=a,e=0}}return s}endLine(){if(this.curLine){this.flushBuffer();let t=this.curLine.lastChild;(!t||!Xi(this.curLine,!1)||t.dom.nodeName!="BR"&&t.isWidget()&&!(y.ios&&Xi(this.curLine,!0)))&&this.curLine.append(this.cache.findWidget(ze,0,32)||new Rt(ze.toDOM(),0,ze,32)),this.curLine=this.afterWidget=null}}updateBlockWrappers(){this.wrapperPos>this.pos+1e4&&(this.blockWrappers.goto(this.pos),this.wrappers.length=0);for(let t=this.wrappers.length-1;t>=0;t--)this.wrappers[t].to=this.pos){let e=new vr(t.from,t.to,t.value,t.rank),i=this.wrappers.length;for(;i>0&&(this.wrappers[i-1].rank-e.rank||this.wrappers[i-1].to-e.to)<0;)i--;this.wrappers.splice(i,0,e)}this.wrapperPos=this.pos}getBlockPos(){var t;this.updateBlockWrappers();let e=this.root;for(let i of this.wrappers){let s=e.lastChild;if(i.fromo.wrapper.eq(i.wrapper)))===null||t===void 0?void 0:t.dom);e.append(r),e=r}}return e}blockPosCovered(){let t=this.lastBlock;return t!=null&&!t.breakAfter&&(!t.isWidget()||(t.flags&160)>0)}getBuffer(t){let e=2|(t<0?16:32),i=this.cache.find(Me,void 0,1);return i&&(i.flags=e),i||new Me(e)}flushBuffer(){this.afterWidget&&!(this.afterWidget.flags&32)&&(this.afterWidget.parent.append(this.getBuffer(-1)),this.afterWidget=null)}}class Mr{constructor(t){this.skipCount=0,this.text="",this.textOff=0,this.cursor=t.iter()}skip(t){this.textOff+t<=this.text.length?this.textOff+=t:(this.skipCount+=t-(this.text.length-this.textOff),this.text="",this.textOff=0)}next(t){if(this.textOff==this.text.length){let{value:s,lineBreak:r,done:o}=this.cursor.next(this.skipCount);if(this.skipCount=0,o)throw new Error("Ran out of text content when drawing inline views");this.text=s;let l=this.textOff=Math.min(t,s.length);return r?null:s.slice(0,l)}let e=Math.min(this.text.length,this.textOff+t),i=this.text.slice(this.textOff,e);return this.textOff=e,i}}const ke=[Rt,Lt,mt,z,Me,ht,Be];for(let n=0;n[]),this.index=ke.map(()=>0),this.reused=new Map}add(t){let e=t.constructor.bucket,i=this.buckets[e];i.length<6?i.push(t):i[this.index[e]=(this.index[e]+1)%6]=t}find(t,e,i=2){let s=t.bucket,r=this.buckets[s],o=this.index[s];for(let l=r.length-1;l>=0;l--){let a=(l+o)%r.length,h=r[a];if((!e||e(h))&&!this.reused.has(h))return r.splice(a,1),a{if(this.cache.add(o),o.isComposite())return!1},enter:o=>this.cache.add(o),leave:()=>{},break:()=>{}}}run(t,e){let i=e&&this.getCompositionContext(e.text);for(let s=0,r=0,o=0;;){let l=os){let h=a-s;this.preserve(h,!o,!l),s=a,r+=h}if(!l)break;this.forward(l.fromA,l.toA),e&&l.fromA<=e.range.fromA&&l.toA>=e.range.toA?(this.emit(r,e.range.fromB),this.builder.addComposition(e,i),this.text.skip(e.range.toB-e.range.fromB),this.emit(e.range.toB,l.toB)):this.emit(r,l.toB),r=l.toB,s=l.toA}return this.builder.curLine&&this.builder.endLine(),this.builder.root}preserve(t,e,i){let s=Or(this.old),r=this.openMarks;this.old.advance(t,i?1:-1,{skip:(o,l,a)=>{if(o.isWidget())if(this.openWidget)this.builder.continueWidget(a-l);else{let h=a>0||l{o.isLine()?this.builder.addLineStart(o.attrs,this.cache.maybeReuse(o)):(this.cache.add(o),o instanceof z&&s.unshift(o.mark)),this.openWidget=!1},leave:o=>{o.isLine()?s.length&&(s.length=r=0):o instanceof z&&(s.shift(),r=Math.min(r,s.length))},break:()=>{this.builder.addBreak(),this.openWidget=!1}}),this.text.skip(t)}emit(t,e){let i=null,s=this.builder,r=0,o=E.spans(this.decorations,t,e,{point:(l,a,h,c,f,d)=>{if(h instanceof bt){if(this.disallowBlockEffectsFor[d]){if(h.block)throw new RangeError("Block decorations may not be specified via plugins");if(a>this.view.state.doc.lineAt(l).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}if(r=c.length,f>c.length)s.continueWidget(a-l);else{let u=h.widget||(h.block?Bt.block:Bt.inline),p=Tr(h),g=this.cache.findWidget(u,a-l,p)||Rt.of(u,this.view,a-l,p);h.block?(h.startSide>0&&s.addLineStartIfNotCovered(i),s.addBlockWidget(g)):(s.ensureLine(i),s.addInlineWidget(g,c,f))}i=null}else i=Dr(i,h);a>l&&this.text.skip(a-l)},span:(l,a,h,c)=>{for(let f=l;fr,this.openMarks=o}forward(t,e){e-t<=10?this.old.advance(e-t,1,this.reuseWalker):(this.old.advance(5,-1,this.reuseWalker),this.old.advance(e-t-10,-1),this.old.advance(5,1,this.reuseWalker))}getCompositionContext(t){let e=[],i=null;for(let s=t.parentNode;;s=s.parentNode){let r=B.get(s);if(s==this.view.contentDOM)break;r instanceof z?e.push(r):r?.isLine()?i=r:s.nodeName=="DIV"&&!i&&s!=this.view.contentDOM?i=new Lt(s,ln):e.push(z.of(new Zt({tagName:s.nodeName.toLowerCase(),attributes:ir(s)}),s))}return{line:i,marks:e}}}function Xi(n,t){let e=i=>{for(let s of i.children)if((t?s.isText():s.length)||e(s))return!0;return!1};return e(n)}function Tr(n){let t=n.isReplace?(n.startSide<0?64:0)|(n.endSide>0?128:0):n.startSide>0?32:16;return n.block&&(t|=256),t}const ln={class:"cm-line"};function Dr(n,t){let e=t.spec.attributes,i=t.spec.class;return!e&&!i||(n||(n={class:"cm-line"}),e&&ki(e,n),i&&(n.class+=" "+i)),n}function Or(n){let t=[];for(let e=n.parents.length;e>1;e--){let i=e==n.parents.length?n.tile:n.parents[e].tile;i instanceof z&&t.push(i.mark)}return t}function Ie(n){let t=B.get(n);return t&&t.setDOM(n.cloneNode()),n}class Bt extends dt{constructor(t){super(),this.tag=t}eq(t){return t.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(t){return t.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}}Bt.inline=new Bt("span");Bt.block=new Bt("div");const ze=new class extends dt{toDOM(){return document.createElement("br")}get isHidden(){return!0}get editable(){return!0}};class $i{constructor(t){this.view=t,this.decorations=[],this.blockWrappers=[],this.dynamicDecorationMap=[!1],this.domChanged=null,this.hasComposition=null,this.editContextFormatting=O.none,this.lastCompositionAfterCursor=!1,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.updateDeco(),this.tile=new Be(t,t.contentDOM),this.updateInner([new q(0,0,0,t.state.doc.length)],null)}update(t){var e;let i=t.changedRanges;this.minWidth>0&&i.length&&(i.every(({fromA:c,toA:f})=>fthis.minWidthTo)?(this.minWidthFrom=t.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=t.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0),this.updateEditContextFormatting(t);let s=-1;this.view.inputState.composing>=0&&!this.view.observer.editContext&&(!((e=this.domChanged)===null||e===void 0)&&e.newSel?s=this.domChanged.newSel.head:!Vr(t.changes,this.hasComposition)&&!t.selectionSet&&(s=t.state.selection.main.head));let r=s>-1?Rr(this.view,t.changes,s):null;if(this.domChanged=null,this.hasComposition){let{from:c,to:f}=this.hasComposition;i=new q(c,f,t.changes.mapPos(c,-1),t.changes.mapPos(f,1)).addToSet(i.slice())}this.hasComposition=r?{from:r.range.fromB,to:r.range.toB}:null,(y.ie||y.chrome)&&!r&&t&&t.state.doc.lines!=t.startState.doc.lines&&(this.forceSelection=!0);let o=this.decorations,l=this.blockWrappers;this.updateDeco();let a=Hr(o,this.decorations,t.changes);a.length&&(i=q.extendWithRanges(i,a));let h=Wr(l,this.blockWrappers,t.changes);return h.length&&(i=q.extendWithRanges(i,h)),r&&!i.some(c=>c.fromA<=r.range.fromA&&c.toA>=r.range.toA)&&(i=r.range.addToSet(i.slice())),this.tile.flags&2&&i.length==0?!1:(this.updateInner(i,r),t.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(t,e){this.view.viewState.mustMeasureContent=!0;let{observer:i}=this.view;i.ignore(()=>{if(e||t.length){let o=this.tile,l=new Ar(this.view,o,this.blockWrappers,this.decorations,this.dynamicDecorationMap);this.tile=l.run(t,e),li(o,l.cache.reused)}this.tile.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.tile.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let r=y.chrome||y.ios?{node:i.selectionRange.focusNode,written:!1}:void 0;this.tile.sync(r),r&&(r.written||i.selectionRange.focusNode!=r.node||!this.tile.dom.contains(r.node))&&(this.forceSelection=!0),this.tile.dom.style.height=""});let s=[];if(this.view.viewport.from||this.view.viewport.to-1)&&me(i,this.view.observer.selectionRange)&&!(s&&i.contains(s));if(!(r||e||o))return;let l=this.forceSelection;this.forceSelection=!1;let a=this.view.state.selection.main,h,c;if(a.empty?c=h=this.inlineDOMNearPos(a.anchor,a.assoc||1):(c=this.inlineDOMNearPos(a.head,a.head==a.from?1:-1),h=this.inlineDOMNearPos(a.anchor,a.anchor==a.from?1:-1)),y.gecko&&a.empty&&!this.hasComposition&&Lr(h)){let d=document.createTextNode("");this.view.observer.ignore(()=>h.node.insertBefore(d,h.node.childNodes[h.offset]||null)),h=c=new Y(d,0),l=!0}let f=this.view.observer.selectionRange;(l||!f.focusNode||(!Kt(h.node,h.offset,f.anchorNode,f.anchorOffset)||!Kt(c.node,c.offset,f.focusNode,f.focusOffset))&&!this.suppressWidgetCursorChange(f,a))&&(this.view.observer.ignore(()=>{y.android&&y.chrome&&i.contains(f.focusNode)&&Nr(f.focusNode,i)&&(i.blur(),i.focus({preventScroll:!0}));let d=Gt(this.view.root);if(d)if(a.empty){if(y.gecko){let u=Br(h.node,h.offset);if(u&&u!=3){let p=(u==1?Ws:Ns)(h.node,h.offset);p&&(h=new Y(p.node,p.offset))}}d.collapse(h.node,h.offset),a.bidiLevel!=null&&d.caretBidiLevel!==void 0&&(d.caretBidiLevel=a.bidiLevel)}else if(d.extend){d.collapse(h.node,h.offset);try{d.extend(c.node,c.offset)}catch{}}else{let u=document.createRange();a.anchor>a.head&&([h,c]=[c,h]),u.setEnd(c.node,c.offset),u.setStart(h.node,h.offset),d.removeAllRanges(),d.addRange(u)}o&&this.view.root.activeElement==i&&(i.blur(),s&&s.focus())}),this.view.observer.setSelectionRange(h,c)),this.impreciseAnchor=h.precise?null:new Y(f.anchorNode,f.anchorOffset),this.impreciseHead=c.precise?null:new Y(f.focusNode,f.focusOffset)}suppressWidgetCursorChange(t,e){return this.hasComposition&&e.empty&&Kt(t.focusNode,t.focusOffset,t.anchorNode,t.anchorOffset)&&this.posFromDOM(t.focusNode,t.focusOffset)==e.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:t}=this,e=t.state.selection.main,i=Gt(t.root),{anchorNode:s,anchorOffset:r}=t.observer.selectionRange;if(!i||!e.empty||!e.assoc||!i.modify)return;let o=this.lineAt(e.head,e.assoc);if(!o)return;let l=o.posAtStart;if(e.head==l||e.head==l+o.length)return;let a=this.coordsAt(e.head,-1),h=this.coordsAt(e.head,1);if(!a||!h||a.bottom>h.top)return;let c=this.domAtPos(e.head+e.assoc,e.assoc);i.collapse(c.node,c.offset),i.modify("move",e.assoc<0?"forward":"backward","lineboundary"),t.observer.readSelectionRange();let f=t.observer.selectionRange;t.docView.posFromDOM(f.anchorNode,f.anchorOffset)!=e.from&&i.collapse(s,r)}posFromDOM(t,e){let i=this.tile.nearest(t);if(!i)return this.tile.dom.compareDocumentPosition(t)&2?0:this.view.state.doc.length;let s=i.posAtStart;if(i.isComposite()){let r;if(t==i.dom)r=i.dom.childNodes[e];else{let o=it(t)==0?0:e==0?-1:1;for(;;){let l=t.parentNode;if(l==i.dom)break;o==0&&l.firstChild!=l.lastChild&&(t==l.firstChild?o=-1:o=1),t=l}o<0?r=t:r=t.nextSibling}if(r==i.dom.firstChild)return s;for(;r&&!B.get(r);)r=r.nextSibling;if(!r)return s+i.length;for(let o=0,l=s;;o++){let a=i.children[o];if(a.dom==r)return l;l+=a.length+a.breakAfter}}else return i.isText()?t==i.dom?s+e:s+(e?i.length:0):s}domAtPos(t,e){let{tile:i,offset:s}=this.tile.resolveBlock(t,e);return i.isWidget()?i.domPosFor(t,e):i.domIn(s,e)}inlineDOMNearPos(t,e){let i,s=-1,r=!1,o,l=-1,a=!1;return this.tile.blockTiles((h,c)=>{if(h.isWidget()){if(h.flags&32&&c>=t)return!0;h.flags&16&&(r=!0)}else{let f=c+h.length;if(c<=t&&(i=h,s=t-c,r=f=t&&!o&&(o=h,l=t-c,a=c>t),c>t&&o)return!0}}),!i&&!o?this.domAtPos(t,e):(r&&o?i=null:a&&i&&(o=null),i&&e<0||!o?i.domIn(s,e):o.domIn(l,e))}coordsAt(t,e){let{tile:i,offset:s}=this.tile.resolveBlock(t,e);return i.isWidget()?i.widget instanceof Ke?null:i.coordsInWidget(s,e,!0):i.coordsIn(s,e)}lineAt(t,e){let{tile:i}=this.tile.resolveBlock(t,e);return i.isLine()?i:null}coordsForChar(t){let{tile:e,offset:i}=this.tile.resolveBlock(t,1);if(!e.isLine())return null;function s(r,o){if(r.isComposite())for(let l of r.children){if(l.length>=o){let a=s(l,o);if(a)return a}if(o-=l.length,o<0)break}else if(r.isText()&&oMath.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,l=-1,a=this.view.textDirection==R.LTR,h=0,c=(f,d,u)=>{for(let p=0;ps);p++){let g=f.children[p],m=d+g.length,b=g.dom.getBoundingClientRect(),{height:w}=b;if(u&&!p&&(h+=b.top-u.top),g instanceof ht)m>i&&c(g,d,b);else if(d>=i&&(h>0&&e.push(-h),e.push(w+h),h=0,o)){let M=g.dom.lastChild,A=M?zt(M):[];if(A.length){let S=A[A.length-1],x=a?S.right-b.left:b.right-S.left;x>l&&(l=x,this.minWidth=r,this.minWidthFrom=d,this.minWidthTo=m)}}u&&p==f.children.length-1&&(h+=u.bottom-b.bottom),d=m+g.breakAfter}};return c(this.tile,0,null),e}textDirectionAt(t){let{tile:e}=this.tile.resolveBlock(t,1);return getComputedStyle(e.dom).direction=="rtl"?R.RTL:R.LTR}measureTextSize(){let t=this.tile.blockTiles(o=>{if(o.isLine()&&o.children.length&&o.length<=20){let l=0,a;for(let h of o.children){if(!h.isText()||/[^ -~]/.test(h.text))return;let c=zt(h.dom);if(c.length!=1)return;l+=c[0].width,a=c[0].height}if(l)return{lineHeight:o.dom.getBoundingClientRect().height,charWidth:l/o.length,textHeight:a}}});if(t)return t;let e=document.createElement("div"),i,s,r;return e.className="cm-line",e.style.width="99999px",e.style.position="absolute",e.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore(()=>{this.tile.dom.appendChild(e);let o=zt(e.firstChild)[0];i=e.getBoundingClientRect().height,s=o&&o.width?o.width/27:7,r=o&&o.height?o.height:i,e.remove()}),{lineHeight:i,charWidth:s,textHeight:r}}computeBlockGapDeco(){let t=[],e=this.view.viewState;for(let i=0,s=0;;s++){let r=s==e.viewports.length?null:e.viewports[s],o=r?r.from-1:this.view.state.doc.length;if(o>i){let l=(e.lineBlockAt(o).bottom-e.lineBlockAt(i).top)/this.view.scaleY;t.push(O.replace({widget:new Ke(l),block:!0,inclusive:!0,isBlockGap:!0}).range(i,o))}if(!r)break;i=r.to+1}return O.set(t)}updateDeco(){let t=1,e=this.view.state.facet(Ut).map(r=>(this.dynamicDecorationMap[t++]=typeof r=="function")?r(this.view):r),i=!1,s=this.view.state.facet(nn).map((r,o)=>{let l=typeof r=="function";return l&&(i=!0),l?r(this.view):r});for(s.length&&(this.dynamicDecorationMap[t++]=i,e.push(E.join(s))),this.decorations=[this.editContextFormatting,...e,this.computeBlockGapDeco(),this.view.viewState.lineGapDeco];ttypeof r=="function"?r(this.view):r)}scrollIntoView(t){if(t.isSnapshot){let h=this.view.viewState.lineBlockAt(t.range.head);this.view.scrollDOM.scrollTop=h.top-t.yMargin,this.view.scrollDOM.scrollLeft=t.xMargin;return}for(let h of this.view.state.facet(Zs))try{if(h(this.view,t.range,t))return!0}catch(c){G(this.view.state,c,"scroll handler")}let{range:e}=t,i=this.coordsAt(e.head,e.empty?e.assoc:e.head>e.anchor?-1:1),s;if(!i)return;!e.empty&&(s=this.coordsAt(e.anchor,e.anchor>e.head?-1:1))&&(i={left:Math.min(i.left,s.left),top:Math.min(i.top,s.top),right:Math.max(i.right,s.right),bottom:Math.max(i.bottom,s.bottom)});let r=Li(this.view),o={left:i.left-r.left,top:i.top-r.top,right:i.right+r.right,bottom:i.bottom+r.bottom},{offsetWidth:l,offsetHeight:a}=this.view.scrollDOM;rr(this.view.scrollDOM,o,e.headi.isWidget()||i.children.some(e);return e(this.tile.resolveBlock(t,1).tile)}destroy(){li(this.tile)}}function li(n,t){let e=t?.get(n);if(e!=1){e==null&&n.destroy();for(let i of n.children)li(i,t)}}function Lr(n){return n.node.nodeType==1&&n.node.firstChild&&(n.offset==0||n.node.childNodes[n.offset-1].contentEditable=="false")&&(n.offset==n.node.childNodes.length||n.node.childNodes[n.offset].contentEditable=="false")}function an(n,t){let e=n.observer.selectionRange;if(!e.focusNode)return null;let i=Ws(e.focusNode,e.focusOffset),s=Ns(e.focusNode,e.focusOffset),r=i||s;if(s&&i&&s.node!=i.node){let l=B.get(s.node);if(!l||l.isText()&&l.text!=s.node.nodeValue)r=s;else if(n.docView.lastCompositionAfterCursor){let a=B.get(i.node);!a||a.isText()&&a.text!=i.node.nodeValue||(r=s)}}if(n.docView.lastCompositionAfterCursor=r!=i,!r)return null;let o=t-r.offset;return{from:o,to:o+r.node.nodeValue.length,node:r.node}}function Rr(n,t,e){let i=an(n,e);if(!i)return null;let{node:s,from:r,to:o}=i,l=s.nodeValue;if(/[\n\r]/.test(l)||n.state.doc.sliceString(i.from,i.to)!=l)return null;let a=t.invertedDesc;return{range:new q(a.mapPos(r),a.mapPos(o),r,o),text:s}}function Br(n,t){return n.nodeType!=1?0:(t&&n.childNodes[t-1].contentEditable=="false"?1:0)|(t{it.from&&(e=!0)}),e}class Ke extends dt{constructor(t){super(),this.height=t}toDOM(){let t=document.createElement("div");return t.className="cm-gap",this.updateDOM(t),t}eq(t){return t.height==this.height}updateDOM(t){return t.style.height=this.height+"px",!0}get editable(){return!0}get estimatedHeight(){return this.height}ignoreEvent(){return!1}}function Fr(n,t,e=1){let i=n.charCategorizer(t),s=n.doc.lineAt(t),r=t-s.from;if(s.length==0)return v.cursor(t);r==0?e=1:r==s.length&&(e=-1);let o=r,l=r;e<0?o=at(s.text,r,!1):l=at(s.text,r);let a=i(s.text.slice(o,l));for(;o>0;){let h=at(s.text,o,!1);if(i(s.text.slice(h,o))!=a)break;o=h}for(;ln.defaultLineHeight*1.5){let l=n.viewState.heightOracle.textHeight,a=Math.floor((s-e.top-(n.defaultLineHeight-l)*.5)/l);r+=a*n.viewState.heightOracle.lineLength}let o=n.state.sliceDoc(e.from,e.to);return e.from+$e(o,r,n.state.tabSize)}function ai(n,t,e){let i=n.lineBlockAt(t);if(Array.isArray(i.type)){let s;for(let r of i.type){if(r.from>t)break;if(!(r.tot)return r;(!s||r.type==H.Text&&(s.type!=r.type||(e<0?r.fromt)))&&(s=r)}}return s||i}return i}function zr(n,t,e,i){let s=ai(n,t.head,t.assoc||-1),r=!i||s.type!=H.Text||!(n.lineWrapping||s.widgetLineBreaks)?null:n.coordsAtPos(t.assoc<0&&t.head>s.from?t.head-1:t.head);if(r){let o=n.dom.getBoundingClientRect(),l=n.textDirectionAt(s.from),a=n.posAtCoords({x:e==(l==R.LTR)?o.right-1:o.left+1,y:(r.top+r.bottom)/2});if(a!=null)return v.cursor(a,e?-1:1)}return v.cursor(e?s.to:s.from,e?-1:1)}function Ui(n,t,e,i){let s=n.state.doc.lineAt(t.head),r=n.bidiSpans(s),o=n.textDirectionAt(s.from);for(let l=t,a=null;;){let h=_s(s,r,o,l,e),c=qs;if(!h){if(s.number==(e?n.state.doc.lines:1))return l;c=` +`,s=n.state.doc.line(s.number+(e?1:-1)),r=n.bidiSpans(s),h=n.visualLineSide(s,!e)}if(a){if(!a(c))return l}else{if(!i)return h;a=i(c)}l=h}}function Kr(n,t,e){let i=n.state.charCategorizer(t),s=i(e);return r=>{let o=i(r);return s==$n.Space&&(s=o),s==o}}function qr(n,t,e,i){let s=t.head,r=e?1:-1;if(s==(e?n.state.doc.length:0))return v.cursor(s,t.assoc);let o=t.goalColumn,l,a=n.contentDOM.getBoundingClientRect(),h=n.coordsAtPos(s,t.assoc||-1),c=n.documentTop;if(h)o==null&&(o=h.left-a.left),l=r<0?h.top:h.bottom;else{let u=n.viewState.lineBlockAt(s);o==null&&(o=Math.min(a.right-a.left,n.defaultCharacterWidth*(s-u.from))),l=(r<0?u.top:u.bottom)+c}let f=a.left+o,d=i??n.viewState.heightOracle.textHeight>>1;for(let u=0;;u+=10){let p=l+(d+u)*r,g=hi(n,{x:f,y:p},!1,r);return v.cursor(g.pos,g.assoc,void 0,o)}}function qt(n,t,e){for(;;){let i=0;for(let s of n)s.between(t-1,t+1,(r,o,l)=>{if(t>r&&ts(n)),e.from,t.head>e.from?-1:1);return i==e.from?e:v.cursor(i,in.viewState.docHeight)return new Q(n.state.doc.length,-1);if(h=n.elementAtHeight(a),i==null)break;if(h.type==H.Text){let d=n.docView.coordsAt(i<0?h.from:h.to,i);if(d&&(i<0?d.top<=a+r:d.bottom>=a+r))break}let f=n.viewState.heightOracle.textHeight/2;a=i>0?h.bottom+f:h.top-f}if(n.viewport.from>=h.to||n.viewport.to<=h.from){if(e)return null;if(h.type==H.Text){let f=Ir(n,s,h,o,l);return new Q(f,f==h.from?1:-1)}}if(h.type!=H.Text)return a<(h.top+h.bottom)/2?new Q(h.from,1):new Q(h.to,-1);let c=n.docView.lineAt(h.from,2);return(!c||c.length!=h.length)&&(c=n.docView.lineAt(h.from,-2)),cn(n,c,h.from,o,l)}function cn(n,t,e,i,s){let r=-1,o=null,l=1e9,a=1e9,h=s,c=s,f=(d,u)=>{for(let p=0;pi?g.left-i:g.rights?g.top-s:g.bottom=h&&(h=Math.min(g.top,h),c=Math.max(g.bottom,c),b=0),(r<0||(b-a||m-l)<0)&&(r>=0&&a&&l=h+2?a=0:(r=u,l=m,a=b,o=g))}};if(t.isText()){for(let u=0;u(o.left+o.right)/2==(Qi(n,r+e)==R.LTR)?new Q(e+at(t.text,r),-1):new Q(e+r,1)}else{if(!t.length)return new Q(e,1);for(let g=0;g(o.left+o.right)/2==(Qi(n,r+e)==R.LTR)?new Q(u+d.length,-1):new Q(u,1)}}function Qi(n,t){let e=n.state.doc.lineAt(t);return n.bidiSpans(e)[J.find(n.bidiSpans(e),t-e.from,-1,1)].dir}const Nt="￿";class _r{constructor(t,e){this.points=t,this.view=e,this.text="",this.lineSeparator=e.state.facet(It.lineSeparator)}append(t){this.text+=t}lineBreak(){this.text+=Nt}readRange(t,e){if(!t)return this;let i=t.parentNode;for(let s=t;;){this.findPointBefore(i,s);let r=this.text.length;this.readNode(s);let o=B.get(s),l=s.nextSibling;if(l==e){o?.breakAfter&&!l&&i!=this.view.contentDOM&&this.lineBreak();break}let a=B.get(l);(o&&a?o.breakAfter:(o?o.breakAfter:Ce(s))||Ce(l)&&(s.nodeName!="BR"||o?.isWidget())&&this.text.length>r)&&!Yr(l,e)&&this.lineBreak(),s=l}return this.findPointBefore(i,e),this}readTextNode(t){let e=t.nodeValue;for(let i of this.points)i.node==t&&(i.pos=this.text.length+Math.min(i.offset,e.length));for(let i=0,s=this.lineSeparator?null:/\r\n?|\n/g;;){let r=-1,o=1,l;if(this.lineSeparator?(r=e.indexOf(this.lineSeparator,i),o=this.lineSeparator.length):(l=s.exec(e))&&(r=l.index,o=l[0].length),this.append(e.slice(i,r<0?e.length:r)),r<0)break;if(this.lineBreak(),o>1)for(let a of this.points)a.node==t&&a.pos>this.text.length&&(a.pos-=o-1);i=r+o}}readNode(t){let e=B.get(t),i=e&&e.overrideDOMText;if(i!=null){this.findPointInside(t,i.length);for(let s=i.iter();!s.next().done;)s.lineBreak?this.lineBreak():this.append(s.value)}else t.nodeType==3?this.readTextNode(t):t.nodeName=="BR"?t.nextSibling&&this.lineBreak():t.nodeType==1&&this.readRange(t.firstChild,null)}findPointBefore(t,e){for(let i of this.points)i.node==t&&t.childNodes[i.offset]==e&&(i.pos=this.text.length)}findPointInside(t,e){for(let i of this.points)(t.nodeType==3?i.node==t:t.contains(i.node))&&(i.pos=this.text.length+(jr(t,i.node,i.offset)?e:0))}}function jr(n,t,e){for(;;){if(!t||e-1;let{impreciseHead:r,impreciseAnchor:o}=t.docView;if(t.state.readOnly&&e>-1)this.newSel=null;else if(e>-1&&(this.bounds=fn(t.docView.tile,e,i,0))){let l=r||o?[]:$r(t),a=new _r(l,t);a.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=a.text,this.newSel=Ur(l,this.bounds.from)}else{let l=t.observer.selectionRange,a=r&&r.node==l.focusNode&&r.offset==l.focusOffset||!ii(t.contentDOM,l.focusNode)?t.state.selection.main.head:t.docView.posFromDOM(l.focusNode,l.focusOffset),h=o&&o.node==l.anchorNode&&o.offset==l.anchorOffset||!ii(t.contentDOM,l.anchorNode)?t.state.selection.main.anchor:t.docView.posFromDOM(l.anchorNode,l.anchorOffset),c=t.viewport;if((y.ios||y.chrome)&&t.state.selection.main.empty&&a!=h&&(c.from>0||c.to-1&&t.state.selection.ranges.length>1?this.newSel=t.state.selection.replaceRange(v.range(h,a)):this.newSel=v.single(h,a)}}}function fn(n,t,e,i){if(n.isComposite()){let s=-1,r=-1,o=-1,l=-1;for(let a=0,h=i,c=i;ae)return fn(f,t,e,h);if(d>=t&&s==-1&&(s=a,r=h),h>e&&f.dom.parentNode==n.dom){o=a,l=c;break}c=d,h=d+f.breakAfter}return{from:r,to:l<0?i+n.length:l,startDOM:(s?n.children[s-1].dom.nextSibling:null)||n.dom.firstChild,endDOM:o=0?n.children[o].dom:null}}else return n.isText()?{from:i,to:i+n.length,startDOM:n.dom,endDOM:n.dom.nextSibling}:null}function dn(n,t){let e,{newSel:i}=t,s=n.state.selection.main,r=n.inputState.lastKeyTime>Date.now()-100?n.inputState.lastKeyCode:-1;if(t.bounds){let{from:o,to:l}=t.bounds,a=s.from,h=null;(r===8||y.android&&t.text.length=s.from&&e.to<=s.to&&(e.from!=s.from||e.to!=s.to)&&s.to-s.from-(e.to-e.from)<=4?e={from:s.from,to:s.to,insert:n.state.doc.slice(s.from,e.from).append(e.insert).append(n.state.doc.slice(e.to,s.to))}:n.state.doc.lineAt(s.from).toDate.now()-50?e={from:s.from,to:s.to,insert:n.state.toText(n.inputState.insertingText)}:y.chrome&&e&&e.from==e.to&&e.from==s.head&&e.insert.toString()==` + `&&n.lineWrapping&&(i&&(i=v.single(i.main.anchor-1,i.main.head-1)),e={from:s.from,to:s.to,insert:X.of([" "])}),e)return Ri(n,e,i,r);if(i&&!i.main.eq(s)){let o=!1,l="select";return n.inputState.lastSelectionTime>Date.now()-50&&(n.inputState.lastSelectionOrigin=="select"&&(o=!0),l=n.inputState.lastSelectionOrigin,l=="select.pointer"&&(i=hn(n.state.facet(ee).map(a=>a(n)),i))),n.dispatch({selection:i,scrollIntoView:o,userEvent:l}),!0}else return!1}function Ri(n,t,e,i=-1){if(y.ios&&n.inputState.flushIOSKey(t))return!0;let s=n.state.selection.main;if(y.android&&(t.to==s.to&&(t.from==s.from||t.from==s.from-1&&n.state.sliceDoc(t.from,s.from)==" ")&&t.insert.length==1&&t.insert.lines==2&&At(n.contentDOM,"Enter",13)||(t.from==s.from-1&&t.to==s.to&&t.insert.length==0||i==8&&t.insert.lengths.head)&&At(n.contentDOM,"Backspace",8)||t.from==s.from&&t.to==s.to+1&&t.insert.length==0&&At(n.contentDOM,"Delete",46)))return!0;let r=t.insert.toString();n.inputState.composing>=0&&n.inputState.composing++;let o,l=()=>o||(o=Xr(n,t,e));return n.state.facet($s).some(a=>a(n,t.from,t.to,r,l))||n.dispatch(l()),!0}function Xr(n,t,e){let i,s=n.state,r=s.selection.main,o=-1;if(t.from==t.to&&t.fromr.to){let a=t.fromf(n)),h,a);t.from==c&&(o=c)}if(o>-1)i={changes:t,selection:v.cursor(t.from+t.insert.length,-1)};else if(t.from>=r.from&&t.to<=r.to&&t.to-t.from>=(r.to-r.from)/3&&(!e||e.main.empty&&e.main.from==t.from+t.insert.length)&&n.inputState.composing<0){let a=r.fromt.to?s.sliceDoc(t.to,r.to):"";i=s.replaceSelection(n.state.toText(a+t.insert.sliceString(0,void 0,n.state.lineBreak)+h))}else{let a=s.changes(t),h=e&&e.main.to<=a.newLength?e.main:void 0;if(s.selection.ranges.length>1&&(n.inputState.composing>=0||n.inputState.compositionPendingChange)&&t.to<=r.to+10&&t.to>=r.to-10){let c=n.state.sliceDoc(t.from,t.to),f,d=e&&an(n,e.main.head);if(d){let p=t.insert.length-(t.to-t.from);f={from:d.from,to:d.to-p}}else f=n.state.doc.lineAt(r.head);let u=r.to-t.to;i=s.changeByRange(p=>{if(p.from==r.from&&p.to==r.to)return{changes:a,range:h||p.map(a)};let g=p.to-u,m=g-c.length;if(n.state.sliceDoc(m,g)!=c||g>=f.from&&m<=f.to)return{range:p};let b=s.changes({from:m,to:g,insert:t.insert}),w=p.to-r.to;return{changes:b,range:h?v.range(Math.max(0,h.anchor+w),Math.max(0,h.head+w)):p.map(b)}})}else i={changes:a,selection:h&&s.selection.replaceRange(h)}}let l="input.type";return(n.composing||n.inputState.compositionPendingChange&&n.inputState.compositionEndedAt>Date.now()-50)&&(n.inputState.compositionPendingChange=!1,l+=".compose",n.inputState.compositionFirstChange&&(l+=".start",n.inputState.compositionFirstChange=!1)),s.update(i,{userEvent:l,scrollIntoView:!0})}function un(n,t,e,i){let s=Math.min(n.length,t.length),r=0;for(;r0&&l>0&&n.charCodeAt(o-1)==t.charCodeAt(l-1);)o--,l--;if(i=="end"){let a=Math.max(0,r-Math.min(o,l));e-=o+a-r}if(o=o?r-e:0;r-=a,l=r+(l-o),o=r}else if(l=l?r-e:0;r-=a,o=r+(o-l),l=r}return{from:r,toA:o,toB:l}}function $r(n){let t=[];if(n.root.activeElement!=n.contentDOM)return t;let{anchorNode:e,anchorOffset:i,focusNode:s,focusOffset:r}=n.observer.selectionRange;return e&&(t.push(new Ji(e,i)),(s!=e||r!=i)&&t.push(new Ji(s,r))),t}function Ur(n,t){if(n.length==0)return null;let e=n[0].pos,i=n.length==2?n[1].pos:e;return e>-1&&i>-1?v.single(e+t,i+t):null}class Qr{setSelectionOrigin(t){this.lastSelectionOrigin=t,this.lastSelectionTime=Date.now()}constructor(t){this.view=t,this.lastKeyCode=0,this.lastKeyTime=0,this.lastTouchTime=0,this.lastFocusTime=0,this.lastScrollTop=0,this.lastScrollLeft=0,this.pendingIOSKey=void 0,this.tabFocusMode=-1,this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastContextMenu=0,this.scrollHandlers=[],this.handlers=Object.create(null),this.composing=-1,this.compositionFirstChange=null,this.compositionEndedAt=0,this.compositionPendingKey=!1,this.compositionPendingChange=!1,this.insertingText="",this.insertingTextAt=0,this.mouseSelection=null,this.draggedContent=null,this.handleEvent=this.handleEvent.bind(this),this.notifiedFocused=t.hasFocus,y.safari&&t.contentDOM.addEventListener("input",()=>null),y.gecko&&uo(t.contentDOM.ownerDocument)}handleEvent(t){!ro(this.view,t)||this.ignoreDuringComposition(t)||t.type=="keydown"&&this.keydown(t)||(this.view.updateState!=0?Promise.resolve().then(()=>this.runHandlers(t.type,t)):this.runHandlers(t.type,t))}runHandlers(t,e){let i=this.handlers[t];if(i){for(let s of i.observers)s(this.view,e);for(let s of i.handlers){if(e.defaultPrevented)break;if(s(this.view,e)){e.preventDefault();break}}}}ensureHandlers(t){let e=Jr(t),i=this.handlers,s=this.view.contentDOM;for(let r in e)if(r!="scroll"){let o=!e[r].handlers.length,l=i[r];l&&o!=!l.handlers.length&&(s.removeEventListener(r,this.handleEvent),l=null),l||s.addEventListener(r,this.handleEvent,{passive:o})}for(let r in i)r!="scroll"&&!e[r]&&s.removeEventListener(r,this.handleEvent);this.handlers=e}keydown(t){if(this.lastKeyCode=t.keyCode,this.lastKeyTime=Date.now(),t.keyCode==9&&this.tabFocusMode>-1&&(!this.tabFocusMode||Date.now()<=this.tabFocusMode))return!0;if(this.tabFocusMode>0&&t.keyCode!=27&&gn.indexOf(t.keyCode)<0&&(this.tabFocusMode=-1),y.android&&y.chrome&&!t.synthetic&&(t.keyCode==13||t.keyCode==8))return this.view.observer.delayAndroidKey(t.key,t.keyCode),!0;let e;return y.ios&&!t.synthetic&&!t.altKey&&!t.metaKey&&((e=pn.find(i=>i.keyCode==t.keyCode))&&!t.ctrlKey||Zr.indexOf(t.key)>-1&&t.ctrlKey&&!t.shiftKey)?(this.pendingIOSKey=e||t,setTimeout(()=>this.flushIOSKey(),250),!0):(t.keyCode!=229&&this.view.observer.forceFlush(),!1)}flushIOSKey(t){let e=this.pendingIOSKey;return!e||e.key=="Enter"&&t&&t.from0?!0:y.safari&&!y.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100?(this.compositionPendingKey=!1,!0):!1}startMouseSelection(t){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=t}update(t){this.view.observer.update(t),this.mouseSelection&&this.mouseSelection.update(t),this.draggedContent&&t.docChanged&&(this.draggedContent=this.draggedContent.map(t.changes)),t.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}}function Zi(n,t){return(e,i)=>{try{return t.call(n,i,e)}catch(s){G(e.state,s)}}}function Jr(n){let t=Object.create(null);function e(i){return t[i]||(t[i]={observers:[],handlers:[]})}for(let i of n){let s=i.spec,r=s&&s.plugin.domEventHandlers,o=s&&s.plugin.domEventObservers;if(r)for(let l in r){let a=r[l];a&&e(l).handlers.push(Zi(i.value,a))}if(o)for(let l in o){let a=o[l];a&&e(l).observers.push(Zi(i.value,a))}}for(let i in $)e(i).handlers.push($[i]);for(let i in j)e(i).observers.push(j[i]);return t}const pn=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],Zr="dthko",gn=[16,17,18,20,91,92,224,225],oe=6;function le(n){return Math.max(0,n)*.7+8}function to(n,t){return Math.max(Math.abs(n.clientX-t.clientX),Math.abs(n.clientY-t.clientY))}class eo{constructor(t,e,i,s){this.view=t,this.startEvent=e,this.style=i,this.mustSelect=s,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=e,this.scrollParents=or(t.contentDOM),this.atoms=t.state.facet(ee).map(o=>o(t));let r=t.contentDOM.ownerDocument;r.addEventListener("mousemove",this.move=this.move.bind(this)),r.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=e.shiftKey,this.multiple=t.state.facet(It.allowMultipleSelections)&&io(t,e),this.dragging=no(t,e)&&yn(e)==1?null:!1}start(t){this.dragging===!1&&this.select(t)}move(t){if(t.buttons==0)return this.destroy();if(this.dragging||this.dragging==null&&to(this.startEvent,t)<10)return;this.select(this.lastEvent=t);let e=0,i=0,s=0,r=0,o=this.view.win.innerWidth,l=this.view.win.innerHeight;this.scrollParents.x&&({left:s,right:o}=this.scrollParents.x.getBoundingClientRect()),this.scrollParents.y&&({top:r,bottom:l}=this.scrollParents.y.getBoundingClientRect());let a=Li(this.view);t.clientX-a.left<=s+oe?e=-le(s-t.clientX):t.clientX+a.right>=o-oe&&(e=le(t.clientX-o)),t.clientY-a.top<=r+oe?i=-le(r-t.clientY):t.clientY+a.bottom>=l-oe&&(i=le(t.clientY-l)),this.setScrollSpeed(e,i)}up(t){this.dragging==null&&this.select(this.lastEvent),this.dragging||t.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let t=this.view.contentDOM.ownerDocument;t.removeEventListener("mousemove",this.move),t.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(t,e){this.scrollSpeed={x:t,y:e},t||e?this.scrolling<0&&(this.scrolling=setInterval(()=>this.scroll(),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){let{x:t,y:e}=this.scrollSpeed;t&&this.scrollParents.x&&(this.scrollParents.x.scrollLeft+=t,t=0),e&&this.scrollParents.y&&(this.scrollParents.y.scrollTop+=e,e=0),(t||e)&&this.view.win.scrollBy(t,e),this.dragging===!1&&this.select(this.lastEvent)}select(t){let{view:e}=this,i=hn(this.atoms,this.style.get(t,this.extend,this.multiple));(this.mustSelect||!i.eq(e.state.selection,this.dragging===!1))&&this.view.dispatch({selection:i,userEvent:"select.pointer"}),this.mustSelect=!1}update(t){t.transactions.some(e=>e.isUserEvent("input.type"))?this.destroy():this.style.update(t)&&setTimeout(()=>this.select(this.lastEvent),20)}}function io(n,t){let e=n.state.facet(js);return e.length?e[0](t):y.mac?t.metaKey:t.ctrlKey}function so(n,t){let e=n.state.facet(Ys);return e.length?e[0](t):y.mac?!t.altKey:!t.ctrlKey}function no(n,t){let{main:e}=n.state.selection;if(e.empty)return!1;let i=Gt(n.root);if(!i||i.rangeCount==0)return!0;let s=i.getRangeAt(0).getClientRects();for(let r=0;r=t.clientX&&o.top<=t.clientY&&o.bottom>=t.clientY)return!0}return!1}function ro(n,t){if(!t.bubbles)return!0;if(t.defaultPrevented)return!1;for(let e=t.target,i;e!=n.contentDOM;e=e.parentNode)if(!e||e.nodeType==11||(i=B.get(e))&&i.isWidget()&&!i.isHidden&&i.widget.ignoreEvent(t))return!1;return!0}const $=Object.create(null),j=Object.create(null),mn=y.ie&&y.ie_version<15||y.ios&&y.webkit_version<604;function oo(n){let t=n.dom.parentNode;if(!t)return;let e=t.appendChild(document.createElement("textarea"));e.style.cssText="position: fixed; left: -10000px; top: 10px",e.focus(),setTimeout(()=>{n.focus(),e.remove(),bn(n,e.value)},50)}function Ee(n,t,e){for(let i of n.facet(t))e=i(e,n);return e}function bn(n,t){t=Ee(n.state,Di,t);let{state:e}=n,i,s=1,r=e.toText(t),o=r.lines==e.selection.ranges.length;if(ci!=null&&e.selection.ranges.every(a=>a.empty)&&ci==r.toString()){let a=-1;i=e.changeByRange(h=>{let c=e.doc.lineAt(h.from);if(c.from==a)return{range:h};a=c.from;let f=e.toText((o?r.line(s++).text:t)+e.lineBreak);return{changes:{from:c.from,insert:f},range:v.cursor(h.from+f.length)}})}else o?i=e.changeByRange(a=>{let h=r.line(s++);return{changes:{from:a.from,to:a.to,insert:h.text},range:v.cursor(a.from+h.length)}}):i=e.replaceSelection(r);n.dispatch(i,{userEvent:"input.paste",scrollIntoView:!0})}j.scroll=n=>{n.inputState.lastScrollTop=n.scrollDOM.scrollTop,n.inputState.lastScrollLeft=n.scrollDOM.scrollLeft};$.keydown=(n,t)=>(n.inputState.setSelectionOrigin("select"),t.keyCode==27&&n.inputState.tabFocusMode!=0&&(n.inputState.tabFocusMode=Date.now()+2e3),!1);j.touchstart=(n,t)=>{n.inputState.lastTouchTime=Date.now(),n.inputState.setSelectionOrigin("select.pointer")};j.touchmove=n=>{n.inputState.setSelectionOrigin("select.pointer")};$.mousedown=(n,t)=>{if(n.observer.flush(),n.inputState.lastTouchTime>Date.now()-2e3)return!1;let e=null;for(let i of n.state.facet(Gs))if(e=i(n,t),e)break;if(!e&&t.button==0&&(e=ao(n,t)),e){let i=!n.hasFocus;n.inputState.startMouseSelection(new eo(n,t,e,i)),i&&n.observer.ignore(()=>{Hs(n.contentDOM);let r=n.root.activeElement;r&&!r.contains(n.contentDOM)&&r.blur()});let s=n.inputState.mouseSelection;if(s)return s.start(t),s.dragging===!1}else n.inputState.setSelectionOrigin("select.pointer");return!1};function ts(n,t,e,i){if(i==1)return v.cursor(t,e);if(i==2)return Fr(n.state,t,e);{let s=n.docView.lineAt(t,e),r=n.state.doc.lineAt(s?s.posAtEnd:t),o=s?s.posAtStart:r.from,l=s?s.posAtEnd:r.to;return lDate.now()-400&&Math.abs(t.clientX-n.clientX)<2&&Math.abs(t.clientY-n.clientY)<2?(is+1)%3:1}function ao(n,t){let e=n.posAndSideAtCoords({x:t.clientX,y:t.clientY},!1),i=yn(t),s=n.state.selection;return{update(r){r.docChanged&&(e.pos=r.changes.mapPos(e.pos),s=s.map(r.changes))},get(r,o,l){let a=n.posAndSideAtCoords({x:r.clientX,y:r.clientY},!1),h,c=ts(n,a.pos,a.assoc,i);if(e.pos!=a.pos&&!o){let f=ts(n,e.pos,e.assoc,i),d=Math.min(f.from,c.from),u=Math.max(f.to,c.to);c=d1&&(h=ho(s,a.pos))?h:l?s.addRange(c):v.create([c])}}}function ho(n,t){for(let e=0;e=t)return v.create(n.ranges.slice(0,e).concat(n.ranges.slice(e+1)),n.mainIndex==e?0:n.mainIndex-(n.mainIndex>e?1:0))}return null}$.dragstart=(n,t)=>{let{selection:{main:e}}=n.state;if(t.target.draggable){let s=n.docView.tile.nearest(t.target);if(s&&s.isWidget()){let r=s.posAtStart,o=r+s.length;(r>=e.to||o<=e.from)&&(e=v.range(r,o))}}let{inputState:i}=n;return i.mouseSelection&&(i.mouseSelection.dragging=!0),i.draggedContent=e,t.dataTransfer&&(t.dataTransfer.setData("Text",Ee(n.state,Oi,n.state.sliceDoc(e.from,e.to))),t.dataTransfer.effectAllowed="copyMove"),!1};$.dragend=n=>(n.inputState.draggedContent=null,!1);function ns(n,t,e,i){if(e=Ee(n.state,Di,e),!e)return;let s=n.posAtCoords({x:t.clientX,y:t.clientY},!1),{draggedContent:r}=n.inputState,o=i&&r&&so(n,t)?{from:r.from,to:r.to}:null,l={from:s,insert:e},a=n.state.changes(o?[o,l]:l);n.focus(),n.dispatch({changes:a,selection:{anchor:a.mapPos(s,-1),head:a.mapPos(s,1)},userEvent:o?"move.drop":"input.drop"}),n.inputState.draggedContent=null}$.drop=(n,t)=>{if(!t.dataTransfer)return!1;if(n.state.readOnly)return!0;let e=t.dataTransfer.files;if(e&&e.length){let i=Array(e.length),s=0,r=()=>{++s==e.length&&ns(n,t,i.filter(o=>o!=null).join(n.state.lineBreak),!1)};for(let o=0;o{/[\x00-\x08\x0e-\x1f]{2}/.test(l.result)||(i[o]=l.result),r()},l.readAsText(e[o])}return!0}else{let i=t.dataTransfer.getData("Text");if(i)return ns(n,t,i,!0),!0}return!1};$.paste=(n,t)=>{if(n.state.readOnly)return!0;n.observer.flush();let e=mn?null:t.clipboardData;return e?(bn(n,e.getData("text/plain")||e.getData("text/uri-list")),!0):(oo(n),!1)};function co(n,t){let e=n.dom.parentNode;if(!e)return;let i=e.appendChild(document.createElement("textarea"));i.style.cssText="position: fixed; left: -10000px; top: 10px",i.value=t,i.focus(),i.selectionEnd=t.length,i.selectionStart=0,setTimeout(()=>{i.remove(),n.focus()},50)}function fo(n){let t=[],e=[],i=!1;for(let s of n.selection.ranges)s.empty||(t.push(n.sliceDoc(s.from,s.to)),e.push(s));if(!t.length){let s=-1;for(let{from:r}of n.selection.ranges){let o=n.doc.lineAt(r);o.number>s&&(t.push(o.text),e.push({from:o.from,to:Math.min(n.doc.length,o.to+1)})),s=o.number}i=!0}return{text:Ee(n,Oi,t.join(n.lineBreak)),ranges:e,linewise:i}}let ci=null;$.copy=$.cut=(n,t)=>{let{text:e,ranges:i,linewise:s}=fo(n.state);if(!e&&!s)return!1;ci=s?e:null,t.type=="cut"&&!n.state.readOnly&&n.dispatch({changes:i,scrollIntoView:!0,userEvent:"delete.cut"});let r=mn?null:t.clipboardData;return r?(r.clearData(),r.setData("text/plain",e),!0):(co(n,e),!1)};const wn=Yn.define();function xn(n,t){let e=[];for(let i of n.facet(Us)){let s=i(n,t);s&&e.push(s)}return e.length?n.update({effects:e,annotations:wn.of(!0)}):null}function Sn(n){setTimeout(()=>{let t=n.hasFocus;if(t!=n.inputState.notifiedFocused){let e=xn(n.state,t);e?n.dispatch(e):n.update([])}},10)}j.focus=n=>{n.inputState.lastFocusTime=Date.now(),!n.scrollDOM.scrollTop&&(n.inputState.lastScrollTop||n.inputState.lastScrollLeft)&&(n.scrollDOM.scrollTop=n.inputState.lastScrollTop,n.scrollDOM.scrollLeft=n.inputState.lastScrollLeft),Sn(n)};j.blur=n=>{n.observer.clearSelectionRange(),Sn(n)};j.compositionstart=j.compositionupdate=n=>{n.observer.editContext||(n.inputState.compositionFirstChange==null&&(n.inputState.compositionFirstChange=!0),n.inputState.composing<0&&(n.inputState.composing=0))};j.compositionend=n=>{n.observer.editContext||(n.inputState.composing=-1,n.inputState.compositionEndedAt=Date.now(),n.inputState.compositionPendingKey=!0,n.inputState.compositionPendingChange=n.observer.pendingRecords().length>0,n.inputState.compositionFirstChange=null,y.chrome&&y.android?n.observer.flushSoon():n.inputState.compositionPendingChange?Promise.resolve().then(()=>n.observer.flush()):setTimeout(()=>{n.inputState.composing<0&&n.docView.hasComposition&&n.update([])},50))};j.contextmenu=n=>{n.inputState.lastContextMenu=Date.now()};$.beforeinput=(n,t)=>{var e,i;if((t.inputType=="insertText"||t.inputType=="insertCompositionText")&&(n.inputState.insertingText=t.data,n.inputState.insertingTextAt=Date.now()),t.inputType=="insertReplacementText"&&n.observer.editContext){let r=(e=t.dataTransfer)===null||e===void 0?void 0:e.getData("text/plain"),o=t.getTargetRanges();if(r&&o.length){let l=o[0],a=n.posAtDOM(l.startContainer,l.startOffset),h=n.posAtDOM(l.endContainer,l.endOffset);return Ri(n,{from:a,to:h,insert:n.state.toText(r)},null),!0}}let s;if(y.chrome&&y.android&&(s=pn.find(r=>r.inputType==t.inputType))&&(n.observer.delayAndroidKey(s.key,s.keyCode),s.key=="Backspace"||s.key=="Delete")){let r=((i=window.visualViewport)===null||i===void 0?void 0:i.height)||0;setTimeout(()=>{var o;(((o=window.visualViewport)===null||o===void 0?void 0:o.height)||0)>r+10&&n.hasFocus&&(n.contentDOM.blur(),n.focus())},100)}return y.ios&&t.inputType=="deleteContentForward"&&n.observer.flushSoon(),y.safari&&t.inputType=="insertText"&&n.inputState.composing>=0&&setTimeout(()=>j.compositionend(n,t),20),!1};const rs=new Set;function uo(n){rs.has(n)||(rs.add(n),n.addEventListener("copy",()=>{}),n.addEventListener("cut",()=>{}))}const os=["pre-wrap","normal","pre-line","break-spaces"];let wt=!1;function fi(){wt=!1}class vn{constructor(t){this.lineWrapping=t,this.doc=X.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30}heightForGap(t,e){let i=this.doc.lineAt(e).number-this.doc.lineAt(t).number+1;return this.lineWrapping&&(i+=Math.max(0,Math.ceil((e-t-i*this.lineLength*.5)/this.lineLength))),this.lineHeight*i}heightForLine(t){return this.lineWrapping?(1+Math.max(0,Math.ceil((t-this.lineLength)/Math.max(1,this.lineLength-5))))*this.lineHeight:this.lineHeight}setDoc(t){return this.doc=t,this}mustRefreshForWrapping(t){return os.indexOf(t)>-1!=this.lineWrapping}mustRefreshForHeights(t){let e=!1;for(let i=0;i-1,a=Math.round(e)!=Math.round(this.lineHeight)||this.lineWrapping!=l;if(this.lineWrapping=l,this.lineHeight=e,this.charWidth=i,this.textHeight=s,this.lineLength=r,a){this.heightSamples={};for(let h=0;h0}set outdated(t){this.flags=(t?2:0)|this.flags&-3}setHeight(t){this.height!=t&&(Math.abs(this.height-t)>be&&(wt=!0),this.height=t)}replace(t,e,i){return F.of(i)}decomposeLeft(t,e){e.push(this)}decomposeRight(t,e){e.push(this)}applyChanges(t,e,i,s){let r=this,o=i.doc;for(let l=s.length-1;l>=0;l--){let{fromA:a,toA:h,fromB:c,toB:f}=s[l],d=r.lineAt(a,T.ByPosNoHeight,i.setDoc(e),0,0),u=d.to>=h?d:r.lineAt(h,T.ByPosNoHeight,i,0,0);for(f+=u.to-h,h=u.to;l>0&&d.from<=s[l-1].toA;)a=s[l-1].fromA,c=s[l-1].fromB,l--,ar*2){let l=t[e-1];l.break?t.splice(--e,1,l.left,null,l.right):t.splice(--e,1,l.left,l.right),i+=1+l.break,s-=l.size}else if(r>s*2){let l=t[i];l.break?t.splice(i,1,l.left,null,l.right):t.splice(i,1,l.left,l.right),i+=2+l.break,r-=l.size}else break;else if(s=r&&o(this.lineAt(0,T.ByPos,i,s,r))}setMeasuredHeight(t){let e=t.heights[t.index++];e<0?(this.spaceAbove=-e,e=t.heights[t.index++]):this.spaceAbove=0,this.setHeight(e)}updateHeight(t,e=0,i=!1,s){return s&&s.from<=e&&s.more&&this.setMeasuredHeight(s),this.outdated=!1,this}toString(){return`block(${this.length})`}}class K extends Mn{constructor(t,e,i){super(t,e,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0,this.spaceAbove=i}mainBlock(t,e){return new _(e,this.length,t+this.spaceAbove,this.height-this.spaceAbove,this.breaks)}replace(t,e,i){let s=i[0];return i.length==1&&(s instanceof K||s instanceof N&&s.flags&4)&&Math.abs(this.length-s.length)<10?(s instanceof N?s=new K(s.length,this.height,this.spaceAbove):s.height=this.height,this.outdated||(s.outdated=!1),s):F.of(i)}updateHeight(t,e=0,i=!1,s){return s&&s.from<=e&&s.more?this.setMeasuredHeight(s):(i||this.outdated)&&(this.spaceAbove=0,this.setHeight(Math.max(this.widgetHeight,t.heightForLine(this.length-this.collapsed))+this.breaks*t.lineHeight)),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}}class N extends F{constructor(t){super(t,0)}heightMetrics(t,e){let i=t.doc.lineAt(e).number,s=t.doc.lineAt(e+this.length).number,r=s-i+1,o,l=0;if(t.lineWrapping){let a=Math.min(this.height,t.lineHeight*r);o=a/r,this.length>r+1&&(l=(this.height-a)/(this.length-r-1))}else o=this.height/r;return{firstLine:i,lastLine:s,perLine:o,perChar:l}}blockAt(t,e,i,s){let{firstLine:r,lastLine:o,perLine:l,perChar:a}=this.heightMetrics(e,s);if(e.lineWrapping){let h=s+(t0){let r=i[i.length-1];r instanceof N?i[i.length-1]=new N(r.length+s):i.push(null,new N(s-1))}if(t>0){let r=i[0];r instanceof N?i[0]=new N(t+r.length):i.unshift(new N(t-1),null)}return F.of(i)}decomposeLeft(t,e){e.push(new N(t-1),null)}decomposeRight(t,e){e.push(null,new N(this.length-t-1))}updateHeight(t,e=0,i=!1,s){let r=e+this.length;if(s&&s.from<=e+this.length&&s.more){let o=[],l=Math.max(e,s.from),a=-1;for(s.from>e&&o.push(new N(s.from-e-1).updateHeight(t,e));l<=r&&s.more;){let c=t.doc.lineAt(l).length;o.length&&o.push(null);let f=s.heights[s.index++],d=0;f<0&&(d=-f,f=s.heights[s.index++]),a==-1?a=f:Math.abs(f-a)>=be&&(a=-2);let u=new K(c,f,d);u.outdated=!1,o.push(u),l+=c+1}l<=r&&o.push(null,new N(r-l).updateHeight(t,l));let h=F.of(o);return(a<0||Math.abs(h.height-this.height)>=be||Math.abs(a-this.heightMetrics(t,e).perLine)>=be)&&(wt=!0),Ae(this,h)}else(i||this.outdated)&&(this.setHeight(t.heightForGap(e,e+this.length)),this.outdated=!1);return this}toString(){return`gap(${this.length})`}}class go extends F{constructor(t,e,i){super(t.length+e+i.length,t.height+i.height,e|(t.outdated||i.outdated?2:0)),this.left=t,this.right=i,this.size=t.size+i.size}get break(){return this.flags&1}blockAt(t,e,i,s){let r=i+this.left.height;return tl))return h;let c=e==T.ByPosNoHeight?T.ByPosNoHeight:T.ByPos;return a?h.join(this.right.lineAt(l,c,i,o,l)):this.left.lineAt(l,c,i,s,r).join(h)}forEachLine(t,e,i,s,r,o){let l=s+this.left.height,a=r+this.left.length+this.break;if(this.break)t=a&&this.right.forEachLine(t,e,i,l,a,o);else{let h=this.lineAt(a,T.ByPos,i,s,r);t=t&&h.from<=e&&o(h),e>h.to&&this.right.forEachLine(h.to+1,e,i,l,a,o)}}replace(t,e,i){let s=this.left.length+this.break;if(ethis.left.length)return this.balanced(this.left,this.right.replace(t-s,e-s,i));let r=[];t>0&&this.decomposeLeft(t,r);let o=r.length;for(let l of i)r.push(l);if(t>0&&ls(r,o-1),e=i&&e.push(null)),t>i&&this.right.decomposeLeft(t-i,e)}decomposeRight(t,e){let i=this.left.length,s=i+this.break;if(t>=s)return this.right.decomposeRight(t-s,e);t2*e.size||e.size>2*t.size?F.of(this.break?[t,null,e]:[t,e]):(this.left=Ae(this.left,t),this.right=Ae(this.right,e),this.setHeight(t.height+e.height),this.outdated=t.outdated||e.outdated,this.size=t.size+e.size,this.length=t.length+this.break+e.length,this)}updateHeight(t,e=0,i=!1,s){let{left:r,right:o}=this,l=e+r.length+this.break,a=null;return s&&s.from<=e+r.length&&s.more?a=r=r.updateHeight(t,e,i,s):r.updateHeight(t,e,i),s&&s.from<=l+o.length&&s.more?a=o=o.updateHeight(t,l,i,s):o.updateHeight(t,l,i),a?this.balanced(r,o):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}}function ls(n,t){let e,i;n[t]==null&&(e=n[t-1])instanceof N&&(i=n[t+1])instanceof N&&n.splice(t-1,3,new N(e.length+1+i.length))}const mo=5;class Bi{constructor(t,e){this.pos=t,this.oracle=e,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=t}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(t,e){if(this.lineStart>-1){let i=Math.min(e,this.lineEnd),s=this.nodes[this.nodes.length-1];s instanceof K?s.length+=i-this.pos:(i>this.pos||!this.isCovered)&&this.nodes.push(new K(i-this.pos,-1,0)),this.writtenTo=i,e>i&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=e}point(t,e,i){if(t=mo)&&this.addLineDeco(s,r,o)}else e>t&&this.span(t,e);this.lineEnd>-1&&this.lineEnd-1)return;let{from:t,to:e}=this.oracle.doc.lineAt(this.pos);this.lineStart=t,this.lineEnd=e,this.writtenTot&&this.nodes.push(new K(this.pos-t,-1,0)),this.writtenTo=this.pos}blankContent(t,e){let i=new N(e-t);return this.oracle.doc.lineAt(t).to==e&&(i.flags|=4),i}ensureLine(){this.enterLine();let t=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(t instanceof K)return t;let e=new K(0,-1,0);return this.nodes.push(e),e}addBlock(t){this.enterLine();let e=t.deco;e&&e.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(t),this.writtenTo=this.pos=this.pos+t.length,e&&e.endSide>0&&(this.covering=t)}addLineDeco(t,e,i){let s=this.ensureLine();s.length+=i,s.collapsed+=i,s.widgetHeight=Math.max(s.widgetHeight,t),s.breaks+=e,this.writtenTo=this.pos=this.pos+i}finish(t){let e=this.nodes.length==0?null:this.nodes[this.nodes.length-1];this.lineStart>-1&&!(e instanceof K)&&!this.isCovered?this.nodes.push(new K(0,-1,0)):(this.writtenToc.clientHeight||c.scrollWidth>c.clientWidth)&&f.overflow!="visible"){let d=c.getBoundingClientRect();r=Math.max(r,d.left),o=Math.min(o,d.right),l=Math.max(l,d.top),a=Math.min(h==n.parentNode?s.innerHeight:a,d.bottom)}h=f.position=="absolute"||f.position=="fixed"?c.offsetParent:c.parentNode}else if(h.nodeType==11)h=h.host;else break;return{left:r-e.left,right:Math.max(r,o)-e.left,top:l-(e.top+t),bottom:Math.max(l,a)-(e.top+t)}}function xo(n){let t=n.getBoundingClientRect(),e=n.ownerDocument.defaultView||window;return t.left0&&t.top0}function So(n,t){let e=n.getBoundingClientRect();return{left:0,right:e.right-e.left,top:t,bottom:e.bottom-(e.top+t)}}class _e{constructor(t,e,i,s){this.from=t,this.to=e,this.size=i,this.displaySize=s}static same(t,e){if(t.length!=e.length)return!1;for(let i=0;itypeof i!="function"&&i.class=="cm-lineWrapping");this.heightOracle=new vn(e),this.stateDeco=t.facet(Ut).filter(i=>typeof i!="function"),this.heightMap=F.empty().applyChanges(this.stateDeco,X.empty,this.heightOracle.setDoc(t.doc),[new q(0,0,0,t.doc.length)]);for(let i=0;i<2&&(this.viewport=this.getViewport(0,null),!!this.updateForViewport());i++);this.updateViewportLines(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=O.set(this.lineGaps.map(i=>i.draw(this,!1))),this.computeVisibleRanges()}updateForViewport(){let t=[this.viewport],{main:e}=this.state.selection;for(let i=0;i<=1;i++){let s=i?e.head:e.anchor;if(!t.some(({from:r,to:o})=>s>=r&&s<=o)){let{from:r,to:o}=this.lineBlockAt(s);t.push(new ae(r,o))}}return this.viewports=t.sort((i,s)=>i.from-s.from),this.updateScaler()}updateScaler(){let t=this.scaler;return this.scaler=this.heightMap.height<=7e6?hs:new Ei(this.heightOracle,this.heightMap,this.viewports),t.eq(this.scaler)?0:2}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,t=>{this.viewportLines.push(Vt(t,this.scaler))})}update(t,e=null){this.state=t.state;let i=this.stateDeco;this.stateDeco=this.state.facet(Ut).filter(c=>typeof c!="function");let s=t.changedRanges,r=q.extendWithRanges(s,bo(i,this.stateDeco,t?t.changes:Ts.empty(this.state.doc.length))),o=this.heightMap.height,l=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollTop);fi(),this.heightMap=this.heightMap.applyChanges(this.stateDeco,t.startState.doc,this.heightOracle.setDoc(this.state.doc),r),(this.heightMap.height!=o||wt)&&(t.flags|=2),l?(this.scrollAnchorPos=t.changes.mapPos(l.from,-1),this.scrollAnchorHeight=l.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=o);let a=r.length?this.mapViewport(this.viewport,t.changes):this.viewport;(e&&(e.range.heada.to)||!this.viewportIsAppropriate(a))&&(a=this.getViewport(0,e));let h=a.from!=this.viewport.from||a.to!=this.viewport.to;this.viewport=a,t.flags|=this.updateForViewport(),(h||!t.changes.empty||t.flags&2)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,t.changes))),t.flags|=this.computeVisibleRanges(t.changes),e&&(this.scrollTarget=e),!this.mustEnforceCursorAssoc&&t.selectionSet&&t.view.lineWrapping&&t.state.selection.main.empty&&t.state.selection.main.assoc&&!t.state.facet(Js)&&(this.mustEnforceCursorAssoc=!0)}measure(t){let e=t.contentDOM,i=window.getComputedStyle(e),s=this.heightOracle,r=i.whiteSpace;this.defaultTextDirection=i.direction=="rtl"?R.RTL:R.LTR;let o=this.heightOracle.mustRefreshForWrapping(r),l=e.getBoundingClientRect(),a=o||this.mustMeasureContent||this.contentDOMHeight!=l.height;this.contentDOMHeight=l.height,this.mustMeasureContent=!1;let h=0,c=0;if(l.width&&l.height){let{scaleX:A,scaleY:S}=Es(e,l);(A>.005&&Math.abs(this.scaleX-A)>.005||S>.005&&Math.abs(this.scaleY-S)>.005)&&(this.scaleX=A,this.scaleY=S,h|=16,o=a=!0)}let f=(parseInt(i.paddingTop)||0)*this.scaleY,d=(parseInt(i.paddingBottom)||0)*this.scaleY;(this.paddingTop!=f||this.paddingBottom!=d)&&(this.paddingTop=f,this.paddingBottom=d,h|=18),this.editorWidth!=t.scrollDOM.clientWidth&&(s.lineWrapping&&(a=!0),this.editorWidth=t.scrollDOM.clientWidth,h|=16);let u=t.scrollDOM.scrollTop*this.scaleY;this.scrollTop!=u&&(this.scrollAnchorHeight=-1,this.scrollTop=u),this.scrolledToBottom=Ps(t.scrollDOM);let p=(this.printing?So:wo)(e,this.paddingTop),g=p.top-this.pixelViewport.top,m=p.bottom-this.pixelViewport.bottom;this.pixelViewport=p;let b=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(b!=this.inView&&(this.inView=b,b&&(a=!0)),!this.inView&&!this.scrollTarget&&!xo(t.dom))return 0;let w=l.width;if((this.contentDOMWidth!=w||this.editorHeight!=t.scrollDOM.clientHeight)&&(this.contentDOMWidth=l.width,this.editorHeight=t.scrollDOM.clientHeight,h|=16),a){let A=t.docView.measureVisibleLineHeights(this.viewport);if(s.mustRefreshForHeights(A)&&(o=!0),o||s.lineWrapping&&Math.abs(w-this.contentDOMWidth)>s.charWidth){let{lineHeight:S,charWidth:x,textHeight:L}=t.docView.measureTextSize();o=S>0&&s.refresh(r,S,x,L,Math.max(5,w/x),A),o&&(t.docView.minWidth=0,h|=16)}g>0&&m>0?c=Math.max(g,m):g<0&&m<0&&(c=Math.min(g,m)),fi();for(let S of this.viewports){let x=S.from==this.viewport.from?A:t.docView.measureVisibleLineHeights(S);this.heightMap=(o?F.empty().applyChanges(this.stateDeco,X.empty,this.heightOracle,[new q(0,0,0,t.state.doc.length)]):this.heightMap).updateHeight(s,0,o,new Cn(S.from,x))}wt&&(h|=2)}let M=!this.viewportIsAppropriate(this.viewport,c)||this.scrollTarget&&(this.scrollTarget.range.headthis.viewport.to);return M&&(h&2&&(h|=this.updateScaler()),this.viewport=this.getViewport(c,this.scrollTarget),h|=this.updateForViewport()),(h&2||M)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(o?[]:this.lineGaps,t)),h|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,t.docView.enforceCursorAssoc()),h}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(t,e){let i=.5-Math.max(-.5,Math.min(.5,t/1e3/2)),s=this.heightMap,r=this.heightOracle,{visibleTop:o,visibleBottom:l}=this,a=new ae(s.lineAt(o-i*1e3,T.ByHeight,r,0,0).from,s.lineAt(l+(1-i)*1e3,T.ByHeight,r,0,0).to);if(e){let{head:h}=e.range;if(ha.to){let c=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),f=s.lineAt(h,T.ByPos,r,0,0),d;e.y=="center"?d=(f.top+f.bottom)/2-c/2:e.y=="start"||e.y=="nearest"&&h=l+Math.max(10,Math.min(i,250)))&&s>o-2*1e3&&r>1,o=s<<1;if(this.defaultTextDirection!=R.LTR&&!i)return[];let l=[],a=(c,f,d,u)=>{if(f-cc&&bb.from>=d.from&&b.to<=d.to&&Math.abs(b.from-c)b.fromw));if(!m){if(fM.from<=f&&M.to>=f)){let M=e.moveToLineBoundary(v.cursor(f),!1,!0).head;M>c&&(f=M)}let b=this.gapSize(d,c,f,u),w=i||b<2e6?b:2e6;m=new _e(c,f,b,w)}l.push(m)},h=c=>{if(c.length2e6)for(let x of t)x.from>=c.from&&x.fromc.from&&a(c.from,u,c,f),pe.draw(this,this.heightOracle.lineWrapping))))}computeVisibleRanges(t){let e=this.stateDeco;this.lineGaps.length&&(e=e.concat(this.lineGapDeco));let i=[];E.spans(e,this.viewport.from,this.viewport.to,{span(r,o){i.push({from:r,to:o})},point(){}},20);let s=0;if(i.length!=this.visibleRanges.length)s=12;else for(let r=0;r=this.viewport.from&&t<=this.viewport.to&&this.viewportLines.find(e=>e.from<=t&&e.to>=t)||Vt(this.heightMap.lineAt(t,T.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(t){return t>=this.viewportLines[0].top&&t<=this.viewportLines[this.viewportLines.length-1].bottom&&this.viewportLines.find(e=>e.top<=t&&e.bottom>=t)||Vt(this.heightMap.lineAt(this.scaler.fromDOM(t),T.ByHeight,this.heightOracle,0,0),this.scaler)}scrollAnchorAt(t){let e=this.lineBlockAtHeight(t+8);return e.from>=this.viewport.from||this.viewportLines[0].top-t>200?e:this.viewportLines[0]}elementAtHeight(t){return Vt(this.heightMap.blockAt(this.scaler.fromDOM(t),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}}class ae{constructor(t,e){this.from=t,this.to=e}}function Co(n,t,e){let i=[],s=n,r=0;return E.spans(e,n,t,{span(){},point(o,l){o>s&&(i.push({from:s,to:o}),r+=o-s),s=l}},20),s=1)return t[t.length-1].to;let i=Math.floor(n*e);for(let s=0;;s++){let{from:r,to:o}=t[s],l=o-r;if(i<=l)return r+i;i-=l}}function ce(n,t){let e=0;for(let{from:i,to:s}of n.ranges){if(t<=s){e+=t-i;break}e+=s-i}return e/n.total}function Mo(n,t){for(let e of n)if(t(e))return e}const hs={toDOM(n){return n},fromDOM(n){return n},scale:1,eq(n){return n==this}};class Ei{constructor(t,e,i){let s=0,r=0,o=0;this.viewports=i.map(({from:l,to:a})=>{let h=e.lineAt(l,T.ByPos,t,0,0).top,c=e.lineAt(a,T.ByPos,t,0,0).bottom;return s+=c-h,{from:l,to:a,top:h,bottom:c,domTop:0,domBottom:0}}),this.scale=(7e6-s)/(e.height-s);for(let l of this.viewports)l.domTop=o+(l.top-r)*this.scale,o=l.domBottom=l.domTop+(l.bottom-l.top),r=l.bottom}toDOM(t){for(let e=0,i=0,s=0;;e++){let r=ee.from==t.viewports[i].from&&e.to==t.viewports[i].to):!1}}function Vt(n,t){if(t.scale==1)return n;let e=t.toDOM(n.top),i=t.toDOM(n.bottom);return new _(n.from,n.length,e,i-e,Array.isArray(n._content)?n._content.map(s=>Vt(s,t)):n._content)}const fe=C.define({combine:n=>n.join(" ")}),di=C.define({combine:n=>n.indexOf(!0)>-1}),ui=Dt.newName(),kn=Dt.newName(),An=Dt.newName(),Tn={"&light":"."+kn,"&dark":"."+An};function pi(n,t,e){return new Dt(t,{finish(i){return/&/.test(i)?i.replace(/&\w*/,s=>{if(s=="&")return n;if(!e||!e[s])throw new RangeError(`Unsupported selector: ${s}`);return e[s]}):n+" "+i}})}const ko=pi("."+ui,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0,overflowAnchor:"none"},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#ddd"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",zIndex:200},".cm-gutters-before":{insetInlineStart:0},".cm-gutters-after":{insetInlineEnd:0},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",border:"0px solid #ddd","&.cm-gutters-before":{borderRightWidth:"1px"},"&.cm-gutters-after":{borderLeftWidth:"1px"}},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0,zIndex:300},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-dialog":{padding:"2px 19px 4px 6px",position:"relative","& label":{fontSize:"80%"}},".cm-dialog-close":{position:"absolute",top:"3px",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",fontSize:"14px",padding:"0"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"text-top",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top",userSelect:"none"},".cm-highlightSpace":{backgroundImage:"radial-gradient(circle at 50% 55%, #aaa 20%, transparent 5%)",backgroundPosition:"center"},".cm-highlightTab":{backgroundImage:`url('data:image/svg+xml,')`,backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},Tn),Ao={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},je=y.ie&&y.ie_version<=11;class To{constructor(t){this.view=t,this.active=!1,this.editContext=null,this.selectionRange=new lr,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.printQuery=null,this.parentCheck=-1,this.dom=t.contentDOM,this.observer=new MutationObserver(e=>{for(let i of e)this.queue.push(i);(y.ie&&y.ie_version<=11||y.ios&&t.composing)&&e.some(i=>i.type=="childList"&&i.removedNodes.length||i.type=="characterData"&&i.oldValue.length>i.target.nodeValue.length)?this.flushSoon():this.flush()}),window.EditContext&&y.android&&t.constructor.EDIT_CONTEXT!==!1&&!(y.chrome&&y.chrome_version<126)&&(this.editContext=new Oo(t),t.state.facet(et)&&(t.contentDOM.editContext=this.editContext.editContext)),je&&(this.onCharData=e=>{this.queue.push({target:e.target,type:"characterData",oldValue:e.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),window.matchMedia&&(this.printQuery=window.matchMedia("print")),typeof ResizeObserver=="function"&&(this.resizeScroll=new ResizeObserver(()=>{var e;((e=this.view.docView)===null||e===void 0?void 0:e.lastUpdate){this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),e.length>0&&e[e.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))},{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver(e=>{e.length>0&&e[e.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))},{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(t){this.view.inputState.runHandlers("scroll",t),this.intersecting&&this.view.measure()}onScroll(t){this.intersecting&&this.flush(!1),this.editContext&&this.view.requestMeasure(this.editContext.measureReq),this.onScrollChanged(t)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout(()=>{this.resizeTimeout=-1,this.view.requestMeasure()},50))}onPrint(t){(t.type=="change"||!t.type)&&!t.matches||(this.view.viewState.printing=!0,this.view.measure(),setTimeout(()=>{this.view.viewState.printing=!1,this.view.requestMeasure()},500))}updateGaps(t){if(this.gapIntersection&&(t.length!=this.gaps.length||this.gaps.some((e,i)=>e!=t[i]))){this.gapIntersection.disconnect();for(let e of t)this.gapIntersection.observe(e);this.gaps=t}}onSelectionChange(t){let e=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:i}=this,s=this.selectionRange;if(i.state.facet(et)?i.root.activeElement!=this.dom:!me(this.dom,s))return;let r=s.anchorNode&&i.docView.tile.nearest(s.anchorNode);if(r&&r.isWidget()&&r.widget.ignoreEvent(t)){e||(this.selectionChanged=!1);return}(y.ie&&y.ie_version<=11||y.android&&y.chrome)&&!i.state.selection.main.empty&&s.focusNode&&Kt(s.focusNode,s.focusOffset,s.anchorNode,s.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:t}=this,e=Gt(t.root);if(!e)return!1;let i=y.safari&&t.root.nodeType==11&&t.root.activeElement==this.dom&&Do(this.view,e)||e;if(!i||this.selectionRange.eq(i))return!1;let s=me(this.dom,i);return s&&!this.selectionChanged&&t.inputState.lastFocusTime>Date.now()-200&&t.inputState.lastTouchTime{let r=this.delayedAndroidKey;r&&(this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=r.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&r.force&&At(this.dom,r.key,r.keyCode))};this.flushingAndroidKey=this.view.win.requestAnimationFrame(s)}(!this.delayedAndroidKey||t=="Enter")&&(this.delayedAndroidKey={key:t,keyCode:e,force:this.lastChange{this.delayedFlush=-1,this.flush()}))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let t of this.observer.takeRecords())this.queue.push(t);return this.queue}processRecords(){let t=this.pendingRecords();t.length&&(this.queue=[]);let e=-1,i=-1,s=!1;for(let r of t){let o=this.readMutation(r);o&&(o.typeOver&&(s=!0),e==-1?{from:e,to:i}=o:(e=Math.min(o.from,e),i=Math.max(o.to,i)))}return{from:e,to:i,typeOver:s}}readChange(){let{from:t,to:e,typeOver:i}=this.processRecords(),s=this.selectionChanged&&me(this.dom,this.selectionRange);if(t<0&&!s)return null;t>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let r=new Gr(this.view,t,e,i);return this.view.docView.domChanged={newSel:r.newSel?r.newSel.main:null},r}flush(t=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;t&&this.readSelectionRange();let e=this.readChange();if(!e)return this.view.requestMeasure(),!1;let i=this.view.state,s=dn(this.view,e);return this.view.state==i&&(e.domChanged||e.newSel&&!e.newSel.main.eq(this.view.state.selection.main))&&this.view.update([]),s}readMutation(t){let e=this.view.docView.tile.nearest(t.target);if(!e||e.isWidget())return null;if(e.markDirty(t.type=="attributes"),t.type=="childList"){let i=cs(e,t.previousSibling||t.target.previousSibling,-1),s=cs(e,t.nextSibling||t.target.nextSibling,1);return{from:i?e.posAfter(i):e.posAtStart,to:s?e.posBefore(s):e.posAtEnd,typeOver:!1}}else return t.type=="characterData"?{from:e.posAtStart,to:e.posAtEnd,typeOver:t.target.nodeValue==t.oldValue}:null}setWindow(t){t!=this.win&&(this.removeWindowListeners(this.win),this.win=t,this.addWindowListeners(this.win))}addWindowListeners(t){t.addEventListener("resize",this.onResize),this.printQuery?this.printQuery.addEventListener?this.printQuery.addEventListener("change",this.onPrint):this.printQuery.addListener(this.onPrint):t.addEventListener("beforeprint",this.onPrint),t.addEventListener("scroll",this.onScroll),t.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(t){t.removeEventListener("scroll",this.onScroll),t.removeEventListener("resize",this.onResize),this.printQuery?this.printQuery.removeEventListener?this.printQuery.removeEventListener("change",this.onPrint):this.printQuery.removeListener(this.onPrint):t.removeEventListener("beforeprint",this.onPrint),t.document.removeEventListener("selectionchange",this.onSelectionChange)}update(t){this.editContext&&(this.editContext.update(t),t.startState.facet(et)!=t.state.facet(et)&&(t.view.contentDOM.editContext=t.state.facet(et)?this.editContext.editContext:null))}destroy(){var t,e,i;this.stop(),(t=this.intersection)===null||t===void 0||t.disconnect(),(e=this.gapIntersection)===null||e===void 0||e.disconnect(),(i=this.resizeScroll)===null||i===void 0||i.disconnect();for(let s of this.scrollTargets)s.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey),this.editContext&&(this.view.contentDOM.editContext=null,this.editContext.destroy())}}function cs(n,t,e){for(;t;){let i=B.get(t);if(i&&i.parent==n)return i;let s=t.parentNode;t=s!=n.dom?s:e>0?t.nextSibling:t.previousSibling}return null}function fs(n,t){let e=t.startContainer,i=t.startOffset,s=t.endContainer,r=t.endOffset,o=n.docView.domAtPos(n.state.selection.main.anchor,1);return Kt(o.node,o.offset,s,r)&&([e,i,s,r]=[s,r,e,i]),{anchorNode:e,anchorOffset:i,focusNode:s,focusOffset:r}}function Do(n,t){if(t.getComposedRanges){let s=t.getComposedRanges(n.root)[0];if(s)return fs(n,s)}let e=null;function i(s){s.preventDefault(),s.stopImmediatePropagation(),e=s.getTargetRanges()[0]}return n.contentDOM.addEventListener("beforeinput",i,!0),n.dom.ownerDocument.execCommand("indent"),n.contentDOM.removeEventListener("beforeinput",i,!0),e?fs(n,e):null}class Oo{constructor(t){this.from=0,this.to=0,this.pendingContextChange=null,this.handlers=Object.create(null),this.composing=null,this.resetRange(t.state);let e=this.editContext=new window.EditContext({text:t.state.doc.sliceString(this.from,this.to),selectionStart:this.toContextPos(Math.max(this.from,Math.min(this.to,t.state.selection.main.anchor))),selectionEnd:this.toContextPos(t.state.selection.main.head)});this.handlers.textupdate=i=>{let s=t.state.selection.main,{anchor:r,head:o}=s,l=this.toEditorPos(i.updateRangeStart),a=this.toEditorPos(i.updateRangeEnd);t.inputState.composing>=0&&!this.composing&&(this.composing={contextBase:i.updateRangeStart,editorBase:l,drifted:!1});let h=a-l>i.text.length;l==this.from&&rthis.to&&(a=r);let c=un(t.state.sliceDoc(l,a),i.text,(h?s.from:s.to)-l,h?"end":null);if(!c){let d=v.single(this.toEditorPos(i.selectionStart),this.toEditorPos(i.selectionEnd));d.main.eq(s)||t.dispatch({selection:d,userEvent:"select"});return}let f={from:c.from+l,to:c.toA+l,insert:X.of(i.text.slice(c.from,c.toB).split(` +`))};if((y.mac||y.android)&&f.from==o-1&&/^\. ?$/.test(i.text)&&t.contentDOM.getAttribute("autocorrect")=="off"&&(f={from:l,to:a,insert:X.of([i.text.replace("."," ")])}),this.pendingContextChange=f,!t.state.readOnly){let d=this.to-this.from+(f.to-f.from+f.insert.length);Ri(t,f,v.single(this.toEditorPos(i.selectionStart,d),this.toEditorPos(i.selectionEnd,d)))}this.pendingContextChange&&(this.revertPending(t.state),this.setSelection(t.state)),f.from=0&&!/[\\p{Alphabetic}\\p{Number}_]/.test(e.text.slice(Math.max(0,i.updateRangeStart-1),Math.min(e.text.length,i.updateRangeStart+1)))&&this.handlers.compositionend(i)},this.handlers.characterboundsupdate=i=>{let s=[],r=null;for(let o=this.toEditorPos(i.rangeStart),l=this.toEditorPos(i.rangeEnd);o{let s=[];for(let r of i.getTextFormats()){let o=r.underlineStyle,l=r.underlineThickness;if(!/none/i.test(o)&&!/none/i.test(l)){let a=this.toEditorPos(r.rangeStart),h=this.toEditorPos(r.rangeEnd);if(a{t.inputState.composing<0&&(t.inputState.composing=0,t.inputState.compositionFirstChange=!0)},this.handlers.compositionend=()=>{if(t.inputState.composing=-1,t.inputState.compositionFirstChange=null,this.composing){let{drifted:i}=this.composing;this.composing=null,i&&this.reset(t.state)}};for(let i in this.handlers)e.addEventListener(i,this.handlers[i]);this.measureReq={read:i=>{this.editContext.updateControlBounds(i.contentDOM.getBoundingClientRect());let s=Gt(i.root);s&&s.rangeCount&&this.editContext.updateSelectionBounds(s.getRangeAt(0).getBoundingClientRect())}}}applyEdits(t){let e=0,i=!1,s=this.pendingContextChange;return t.changes.iterChanges((r,o,l,a,h)=>{if(i)return;let c=h.length-(o-r);if(s&&o>=s.to)if(s.from==r&&s.to==o&&s.insert.eq(h)){s=this.pendingContextChange=null,e+=c,this.to+=c;return}else s=null,this.revertPending(t.state);if(r+=e,o+=e,o<=this.from)this.from+=c,this.to+=c;else if(rthis.to||this.to-this.from+h.length>3e4){i=!0;return}this.editContext.updateText(this.toContextPos(r),this.toContextPos(o),h.toString()),this.to+=c}e+=c}),s&&!i&&this.revertPending(t.state),!i}update(t){let e=this.pendingContextChange,i=t.startState.selection.main;this.composing&&(this.composing.drifted||!t.changes.touchesRange(i.from,i.to)&&t.transactions.some(s=>!s.isUserEvent("input.type")&&s.changes.touchesRange(this.from,this.to)))?(this.composing.drifted=!0,this.composing.editorBase=t.changes.mapPos(this.composing.editorBase)):!this.applyEdits(t)||!this.rangeIsValid(t.state)?(this.pendingContextChange=null,this.reset(t.state)):(t.docChanged||t.selectionSet||e)&&this.setSelection(t.state),(t.geometryChanged||t.docChanged||t.selectionSet)&&t.view.requestMeasure(this.measureReq)}resetRange(t){let{head:e}=t.selection.main;this.from=Math.max(0,e-1e4),this.to=Math.min(t.doc.length,e+1e4)}reset(t){this.resetRange(t),this.editContext.updateText(0,this.editContext.text.length,t.doc.sliceString(this.from,this.to)),this.setSelection(t)}revertPending(t){let e=this.pendingContextChange;this.pendingContextChange=null,this.editContext.updateText(this.toContextPos(e.from),this.toContextPos(e.from+e.insert.length),t.doc.sliceString(e.from,e.to))}setSelection(t){let{main:e}=t.selection,i=this.toContextPos(Math.max(this.from,Math.min(this.to,e.anchor))),s=this.toContextPos(e.head);(this.editContext.selectionStart!=i||this.editContext.selectionEnd!=s)&&this.editContext.updateSelection(i,s)}rangeIsValid(t){let{head:e}=t.selection.main;return!(this.from>0&&e-this.from<500||this.to1e4*3)}toEditorPos(t,e=this.to-this.from){t=Math.min(t,e);let i=this.composing;return i&&i.drifted?i.editorBase+(t-i.contextBase):t+this.from}toContextPos(t){let e=this.composing;return e&&e.drifted?e.contextBase+(t-e.editorBase):t-this.from}destroy(){for(let t in this.handlers)this.editContext.removeEventListener(t,this.handlers[t])}}class k{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return!!this.inputState&&this.inputState.composing>0}get compositionStarted(){return!!this.inputState&&this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(t={}){var e;this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),t.parent&&t.parent.appendChild(this.dom);let{dispatch:i}=t;this.dispatchTransactions=t.dispatchTransactions||i&&(s=>s.forEach(r=>i(r,this)))||(s=>this.update(s)),this.dispatch=this.dispatch.bind(this),this._root=t.root||ar(t.parent)||document,this.viewState=new as(t.state||It.create(t)),t.scrollTo&&t.scrollTo.is(re)&&(this.viewState.scrollTarget=t.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(vt).map(s=>new Fe(s));for(let s of this.plugins)s.update(this);this.observer=new To(this),this.inputState=new Qr(this),this.inputState.ensureHandlers(this.plugins),this.docView=new $i(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure(),!((e=document.fonts)===null||e===void 0)&&e.ready&&document.fonts.ready.then(()=>this.requestMeasure())}dispatch(...t){let e=t.length==1&&t[0]instanceof jn?t:t.length==1&&Array.isArray(t[0])?t[0]:[this.state.update(...t)];this.dispatchTransactions(e,this)}update(t){if(this.updateState!=0)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let e=!1,i=!1,s,r=this.state;for(let d of t){if(d.startState!=r)throw new RangeError("Trying to update state with a transaction that doesn't start from the previous state.");r=d.state}if(this.destroyed){this.viewState.state=r;return}let o=this.hasFocus,l=0,a=null;t.some(d=>d.annotation(wn))?(this.inputState.notifiedFocused=o,l=1):o!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=o,a=xn(r,o),a||(l=1));let h=this.observer.delayedAndroidKey,c=null;if(h?(this.observer.clearDelayedAndroidKey(),c=this.observer.readChange(),(c&&!this.state.doc.eq(r.doc)||!this.state.selection.eq(r.selection))&&(c=null)):this.observer.clear(),r.facet(It.phrases)!=this.state.facet(It.phrases))return this.setState(r);s=Qt.create(this,r,t),s.flags|=l;let f=this.viewState.scrollTarget;try{this.updateState=2;for(let d of t){if(f&&(f=f.map(d.changes)),d.scrollIntoView){let{main:u}=d.state.selection;f=new Tt(u.empty?u:v.cursor(u.head,u.head>u.anchor?-1:1))}for(let u of d.effects)u.is(re)&&(f=u.value.clip(this.state))}this.viewState.update(s,f),this.bidiCache=Te.update(this.bidiCache,s.changes),s.empty||(this.updatePlugins(s),this.inputState.update(s)),e=this.docView.update(s),this.state.facet(Wt)!=this.styleModules&&this.mountStyles(),i=this.updateAttrs(),this.showAnnouncements(t),this.docView.updateSelection(e,t.some(d=>d.isUserEvent("select.pointer")))}finally{this.updateState=0}if(s.startState.facet(fe)!=s.state.facet(fe)&&(this.viewState.mustMeasureContent=!0),(e||i||f||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),e&&this.docViewUpdate(),!s.empty)for(let d of this.state.facet(oi))try{d(s)}catch(u){G(this.state,u,"update listener")}(a||c)&&Promise.resolve().then(()=>{a&&this.state==a.startState&&this.dispatch(a),c&&!dn(this,c)&&h.force&&At(this.contentDOM,h.key,h.keyCode)})}setState(t){if(this.updateState!=0)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed){this.viewState.state=t;return}this.updateState=2;let e=this.hasFocus;try{for(let i of this.plugins)i.destroy(this);this.viewState=new as(t),this.plugins=t.facet(vt).map(i=>new Fe(i)),this.pluginMap.clear();for(let i of this.plugins)i.update(this);this.docView.destroy(),this.docView=new $i(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}e&&this.focus(),this.requestMeasure()}updatePlugins(t){let e=t.startState.facet(vt),i=t.state.facet(vt);if(e!=i){let s=[];for(let r of i){let o=e.indexOf(r);if(o<0)s.push(new Fe(r));else{let l=this.plugins[o];l.mustUpdate=t,s.push(l)}}for(let r of this.plugins)r.mustUpdate!=t&&r.destroy(this);this.plugins=s,this.pluginMap.clear()}else for(let s of this.plugins)s.mustUpdate=t;for(let s=0;s-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey){this.measureScheduled=-1,this.requestMeasure();return}this.measureScheduled=0,t&&this.observer.forceFlush();let e=null,i=this.scrollDOM,s=i.scrollTop*this.scaleY,{scrollAnchorPos:r,scrollAnchorHeight:o}=this.viewState;Math.abs(s-this.viewState.scrollTop)>1&&(o=-1),this.viewState.scrollAnchorHeight=-1;try{for(let l=0;;l++){if(o<0)if(Ps(i))r=-1,o=this.viewState.heightMap.height;else{let u=this.viewState.scrollAnchorAt(s);r=u.from,o=u.top}this.updateState=1;let a=this.viewState.measure(this);if(!a&&!this.measureRequests.length&&this.viewState.scrollTarget==null)break;if(l>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let h=[];a&4||([this.measureRequests,h]=[h,this.measureRequests]);let c=h.map(u=>{try{return u.read(this)}catch(p){return G(this.state,p),ds}}),f=Qt.create(this,this.state,[]),d=!1;f.flags|=a,e?e.flags|=a:e=f,this.updateState=2,f.empty||(this.updatePlugins(f),this.inputState.update(f),this.updateAttrs(),d=this.docView.update(f),d&&this.docViewUpdate());for(let u=0;u1||p<-1){s=s+p,i.scrollTop=s/this.scaleY,o=-1;continue}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(e&&!e.empty)for(let l of this.state.facet(oi))l(e)}get themeClasses(){return ui+" "+(this.state.facet(di)?An:kn)+" "+this.state.facet(fe)}updateAttrs(){let t=us(this,en,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),e={spellcheck:"false",autocorrect:"off",autocapitalize:"off",writingsuggestions:"false",translate:"no",contenteditable:this.state.facet(et)?"true":"false",class:"cm-content",style:`${y.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(e["aria-readonly"]="true"),us(this,Le,e);let i=this.observer.ignore(()=>{let s=qi(this.contentDOM,this.contentAttrs,e),r=qi(this.dom,this.editorAttrs,t);return s||r});return this.editorAttrs=t,this.contentAttrs=e,i}showAnnouncements(t){let e=!0;for(let i of t)for(let s of i.effects)if(s.is(k.announce)){e&&(this.announceDOM.textContent=""),e=!1;let r=this.announceDOM.appendChild(document.createElement("div"));r.textContent=s.value}}mountStyles(){this.styleModules=this.state.facet(Wt);let t=this.state.facet(k.cspNonce);Dt.mount(this.root,this.styleModules.concat(ko).reverse(),t?{nonce:t}:void 0)}readMeasured(){if(this.updateState==2)throw new Error("Reading the editor layout isn't allowed during an update");this.updateState==0&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(t){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame(()=>this.measure())),t){if(this.measureRequests.indexOf(t)>-1)return;if(t.key!=null){for(let e=0;ei.plugin==t)||null),e&&e.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(t){return this.readMeasured(),this.viewState.elementAtHeight(t)}lineBlockAtHeight(t){return this.readMeasured(),this.viewState.lineBlockAtHeight(t)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(t){return this.viewState.lineBlockAt(t)}get contentHeight(){return this.viewState.contentHeight}moveByChar(t,e,i){return qe(this,t,Ui(this,t,e,i))}moveByGroup(t,e){return qe(this,t,Ui(this,t,e,i=>Kr(this,t.head,i)))}visualLineSide(t,e){let i=this.bidiSpans(t),s=this.textDirectionAt(t.from),r=i[e?i.length-1:0];return v.cursor(r.side(e,s)+t.from,r.forward(!e,s)?1:-1)}moveToLineBoundary(t,e,i=!0){return zr(this,t,e,i)}moveVertically(t,e,i){return qe(this,t,qr(this,t,e,i))}domAtPos(t,e=1){return this.docView.domAtPos(t,e)}posAtDOM(t,e=0){return this.docView.posFromDOM(t,e)}posAtCoords(t,e=!0){this.readMeasured();let i=hi(this,t,e);return i&&i.pos}posAndSideAtCoords(t,e=!0){return this.readMeasured(),hi(this,t,e)}coordsAtPos(t,e=1){this.readMeasured();let i=this.docView.coordsAt(t,e);if(!i||i.left==i.right)return i;let s=this.state.doc.lineAt(t),r=this.bidiSpans(s),o=r[J.find(r,t-s.from,-1,e)];return Xt(i,o.dir==R.LTR==e>0)}coordsForChar(t){return this.readMeasured(),this.docView.coordsForChar(t)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(t){return!this.state.facet(Qs)||tthis.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(t))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(t){if(t.length>Lo)return Ks(t.length);let e=this.textDirectionAt(t.from),i;for(let r of this.bidiCache)if(r.from==t.from&&r.dir==e&&(r.fresh||Is(r.isolates,i=Yi(this,t))))return r.order;i||(i=Yi(this,t));let s=zs(t.text,e,i);return this.bidiCache.push(new Te(t.from,t.to,e,i,!0,s)),s}get hasFocus(){var t;return(this.dom.ownerDocument.hasFocus()||y.safari&&((t=this.inputState)===null||t===void 0?void 0:t.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore(()=>{Hs(this.contentDOM),this.docView.updateSelection()})}setRoot(t){this._root!=t&&(this._root=t,this.observer.setWindow((t.nodeType==9?t:t.ownerDocument).defaultView||window),this.mountStyles())}destroy(){this.root.activeElement==this.contentDOM&&this.contentDOM.blur();for(let t of this.plugins)t.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(t,e={}){return re.of(new Tt(typeof t=="number"?v.cursor(t):t,e.y,e.x,e.yMargin,e.xMargin))}scrollSnapshot(){let{scrollTop:t,scrollLeft:e}=this.scrollDOM,i=this.viewState.scrollAnchorAt(t);return re.of(new Tt(v.cursor(i.from),"start","start",i.top-t,e,!0))}setTabFocusMode(t){t==null?this.inputState.tabFocusMode=this.inputState.tabFocusMode<0?0:-1:typeof t=="boolean"?this.inputState.tabFocusMode=t?0:-1:this.inputState.tabFocusMode!=0&&(this.inputState.tabFocusMode=Date.now()+t)}static domEventHandlers(t){return P.define(()=>({}),{eventHandlers:t})}static domEventObservers(t){return P.define(()=>({}),{eventObservers:t})}static theme(t,e){let i=Dt.newName(),s=[fe.of(i),Wt.of(pi(`.${i}`,t))];return e&&e.dark&&s.push(di.of(!0)),s}static baseTheme(t){return Si.lowest(Wt.of(pi("."+ui,t,Tn)))}static findFromDOM(t){var e;let i=t.querySelector(".cm-content"),s=i&&B.get(i)||B.get(t);return((e=s?.root)===null||e===void 0?void 0:e.view)||null}}k.styleModule=Wt;k.inputHandler=$s;k.clipboardInputFilter=Di;k.clipboardOutputFilter=Oi;k.scrollHandler=Zs;k.focusChangeEffect=Us;k.perLineTextDirection=Qs;k.exceptionSink=Xs;k.updateListener=oi;k.editable=et;k.mouseSelectionStyle=Gs;k.dragMovesSelection=Ys;k.clickAddsSelectionRange=js;k.decorations=Ut;k.blockWrappers=sn;k.outerDecorations=nn;k.atomicRanges=ee;k.bidiIsolatedRanges=rn;k.scrollMargins=on;k.darkTheme=di;k.cspNonce=C.define({combine:n=>n.length?n[0]:""});k.contentAttributes=Le;k.editorAttributes=en;k.lineWrapping=k.contentAttributes.of({class:"cm-lineWrapping"});k.announce=nt.define();const Lo=4096,ds={};class Te{constructor(t,e,i,s,r,o){this.from=t,this.to=e,this.dir=i,this.isolates=s,this.fresh=r,this.order=o}static update(t,e){if(e.empty&&!t.some(r=>r.fresh))return t;let i=[],s=t.length?t[t.length-1].dir:R.LTR;for(let r=Math.max(0,t.length-10);r=0;s--){let r=i[s],o=typeof r=="function"?r(n):r;o&&ki(o,e)}return e}const Ro=y.mac?"mac":y.windows?"win":y.linux?"linux":"key";function Bo(n,t){const e=n.split(/-(?!$)/);let i=e[e.length-1];i=="Space"&&(i=" ");let s,r,o,l;for(let a=0;ai.concat(s),[]))),e}function Ho(n,t,e){return Ln(On(n.state),t,n,e)}let lt=null;const Po=4e3;function Wo(n,t=Ro){let e=Object.create(null),i=Object.create(null),s=(o,l)=>{let a=i[o];if(a==null)i[o]=l;else if(a!=l)throw new Error("Key binding "+o+" is used both as a regular binding and as a multi-stroke prefix")},r=(o,l,a,h,c)=>{var f,d;let u=e[o]||(e[o]=Object.create(null)),p=l.split(/ (?!$)/).map(b=>Bo(b,t));for(let b=1;b{let A=lt={view:M,prefix:w,scope:o};return setTimeout(()=>{lt==A&&(lt=null)},Po),!0}]})}let g=p.join(" ");s(g,!1);let m=u[g]||(u[g]={preventDefault:!1,stopPropagation:!1,run:((d=(f=u._any)===null||f===void 0?void 0:f.run)===null||d===void 0?void 0:d.slice())||[]});a&&m.run.push(a),h&&(m.preventDefault=!0),c&&(m.stopPropagation=!0)};for(let o of n){let l=o.scope?o.scope.split(" "):["editor"];if(o.any)for(let h of l){let c=e[h]||(e[h]=Object.create(null));c._any||(c._any={preventDefault:!1,stopPropagation:!1,run:[]});let{any:f}=o;for(let d in c)c[d].run.push(u=>f(u,gi))}let a=o[t]||o.key;if(a)for(let h of l)r(h,a,o.run,o.preventDefault,o.stopPropagation),o.shift&&r(h,"Shift-"+a,o.shift,o.preventDefault,o.stopPropagation)}return e}let gi=null;function Ln(n,t,e,i){gi=t;let s=Zn(t),r=Ds(s,0),o=Xn(r)==s.length&&s!=" ",l="",a=!1,h=!1,c=!1;lt&<.view==e&<.scope==i&&(l=lt.prefix+" ",gn.indexOf(t.keyCode)<0&&(h=!0,lt=null));let f=new Set,d=m=>{if(m){for(let b of m.run)if(!f.has(b)&&(f.add(b),b(e)))return m.stopPropagation&&(c=!0),!0;m.preventDefault&&(m.stopPropagation&&(c=!0),h=!0)}return!1},u=n[i],p,g;return u&&(d(u[l+de(s,t,!o)])?a=!0:o&&(t.altKey||t.metaKey||t.ctrlKey)&&!(y.windows&&t.ctrlKey&&t.altKey)&&!(y.mac&&t.altKey&&!(t.ctrlKey||t.metaKey))&&(p=ct[t.keyCode])&&p!=s?(d(u[l+de(p,t,!0)])||t.shiftKey&&(g=Yt[t.keyCode])!=s&&g!=p&&d(u[l+de(g,t,!1)]))&&(a=!0):o&&t.shiftKey&&d(u[l+de(s,t,!0)])&&(a=!0),!a&&d(u._any)&&(a=!0)),h&&(a=!0),a&&c&&t.stopPropagation(),gi=null,a}class Ht{constructor(t,e,i,s,r){this.className=t,this.left=e,this.top=i,this.width=s,this.height=r}draw(){let t=document.createElement("div");return t.className=this.className,this.adjust(t),t}update(t,e){return e.className!=this.className?!1:(this.adjust(t),!0)}adjust(t){t.style.left=this.left+"px",t.style.top=this.top+"px",this.width!=null&&(t.style.width=this.width+"px"),t.style.height=this.height+"px"}eq(t){return this.left==t.left&&this.top==t.top&&this.width==t.width&&this.height==t.height&&this.className==t.className}static forRange(t,e,i){if(i.empty){let s=t.coordsAtPos(i.head,i.assoc||1);if(!s)return[];let r=Rn(t);return[new Ht(e,s.left-r.left,s.top-r.top,null,s.bottom-s.top)]}else return No(t,e,i)}}function Rn(n){let t=n.scrollDOM.getBoundingClientRect();return{left:(n.textDirection==R.LTR?t.left:t.right-n.scrollDOM.clientWidth*n.scaleX)-n.scrollDOM.scrollLeft*n.scaleX,top:t.top-n.scrollDOM.scrollTop*n.scaleY}}function gs(n,t,e,i){let s=n.coordsAtPos(t,e*2);if(!s)return i;let r=n.dom.getBoundingClientRect(),o=(s.top+s.bottom)/2,l=n.posAtCoords({x:r.left+1,y:o}),a=n.posAtCoords({x:r.right-1,y:o});return l==null||a==null?i:{from:Math.max(i.from,Math.min(l,a)),to:Math.min(i.to,Math.max(l,a))}}function No(n,t,e){if(e.to<=n.viewport.from||e.from>=n.viewport.to)return[];let i=Math.max(e.from,n.viewport.from),s=Math.min(e.to,n.viewport.to),r=n.textDirection==R.LTR,o=n.contentDOM,l=o.getBoundingClientRect(),a=Rn(n),h=o.querySelector(".cm-line"),c=h&&window.getComputedStyle(h),f=l.left+(c?parseInt(c.paddingLeft)+Math.min(0,parseInt(c.textIndent)):0),d=l.right-(c?parseInt(c.paddingRight):0),u=ai(n,i,1),p=ai(n,s,-1),g=u.type==H.Text?u:null,m=p.type==H.Text?p:null;if(g&&(n.lineWrapping||u.widgetLineBreaks)&&(g=gs(n,i,1,g)),m&&(n.lineWrapping||p.widgetLineBreaks)&&(m=gs(n,s,-1,m)),g&&m&&g.from==m.from&&g.to==m.to)return w(M(e.from,e.to,g));{let S=g?M(e.from,null,g):A(u,!1),x=m?M(null,e.to,m):A(p,!0),L=[];return(g||u).to<(m||p).from-(g&&m?1:0)||u.widgetLineBreaks>1&&S.bottom+n.defaultLineHeight/2se&&ut.from=xt)break;tt>ot&&Ni(Math.max(Z,ot),S==null&&Z<=se,Math.min(tt,xt),x==null&&tt>=ne,Pt.dir)}if(ot=pt.to+1,ot>=xt)break}return ie.length==0&&Ni(se,S==null,ne,x==null,n.textDirection),{top:W,bottom:rt,horizontal:ie}}function A(S,x){let L=l.top+(x?S.top:S.bottom);return{top:L,bottom:L,horizontal:[]}}}function Vo(n,t){return n.constructor==t.constructor&&n.eq(t)}class Fo{constructor(t,e){this.view=t,this.layer=e,this.drawn=[],this.scaleX=1,this.scaleY=1,this.measureReq={read:this.measure.bind(this),write:this.draw.bind(this)},this.dom=t.scrollDOM.appendChild(document.createElement("div")),this.dom.classList.add("cm-layer"),e.above&&this.dom.classList.add("cm-layer-above"),e.class&&this.dom.classList.add(e.class),this.scale(),this.dom.setAttribute("aria-hidden","true"),this.setOrder(t.state),t.requestMeasure(this.measureReq),e.mount&&e.mount(this.dom,t)}update(t){t.startState.facet(ye)!=t.state.facet(ye)&&this.setOrder(t.state),(this.layer.update(t,this.dom)||t.geometryChanged)&&(this.scale(),t.view.requestMeasure(this.measureReq))}docViewUpdate(t){this.layer.updateOnDocViewUpdate!==!1&&t.requestMeasure(this.measureReq)}setOrder(t){let e=0,i=t.facet(ye);for(;e!Vo(e,this.drawn[i]))){let e=this.dom.firstChild,i=0;for(let s of t)s.update&&e&&s.constructor&&this.drawn[i].constructor&&s.update(e,this.drawn[i])?(e=e.nextSibling,i++):this.dom.insertBefore(s.draw(),e);for(;e;){let s=e.nextSibling;e.remove(),e=s}this.drawn=t,y.safari&&y.safari_version>=26&&(this.dom.style.display=this.dom.firstChild?"":"none")}}destroy(){this.layer.destroy&&this.layer.destroy(this.dom,this.view),this.dom.remove()}}const ye=C.define();function Hi(n){return[P.define(t=>new Fo(t,n)),ye.of(n)]}const Et=C.define({combine(n){return Mi(n,{cursorBlinkRate:1200,drawRangeCursor:!0},{cursorBlinkRate:(t,e)=>Math.min(t,e),drawRangeCursor:(t,e)=>t||e})}});function Io(n={}){return[Et.of(n),Ko,qo,_o,Js.of(!0)]}function zo(n){return n.facet(Et)}function Bn(n){return n.startState.facet(Et)!=n.state.facet(Et)}const Ko=Hi({above:!0,markers(n){let{state:t}=n,e=t.facet(Et),i=[];for(let s of t.selection.ranges){let r=s==t.selection.main;if(s.empty||e.drawRangeCursor){let o=r?"cm-cursor cm-cursor-primary":"cm-cursor cm-cursor-secondary",l=s.empty?s:v.cursor(s.head,s.head>s.anchor?-1:1);for(let a of Ht.forRange(n,o,l))i.push(a)}}return i},update(n,t){n.transactions.some(i=>i.selection)&&(t.style.animationName=t.style.animationName=="cm-blink"?"cm-blink2":"cm-blink");let e=Bn(n);return e&&ms(n.state,t),n.docChanged||n.selectionSet||e},mount(n,t){ms(t.state,n)},class:"cm-cursorLayer"});function ms(n,t){t.style.animationDuration=n.facet(Et).cursorBlinkRate+"ms"}const qo=Hi({above:!1,markers(n){return n.state.selection.ranges.map(t=>t.empty?[]:Ht.forRange(n,"cm-selectionBackground",t)).reduce((t,e)=>t.concat(e))},update(n,t){return n.docChanged||n.selectionSet||n.viewportChanged||Bn(n)},class:"cm-selectionLayer"}),_o=Si.highest(k.theme({".cm-line":{"& ::selection, &::selection":{backgroundColor:"transparent !important"},caretColor:"transparent !important"},".cm-content":{caretColor:"transparent !important","& :focus":{caretColor:"initial !important","&::selection, & ::selection":{backgroundColor:"Highlight !important"}}}})),En=nt.define({map(n,t){return n==null?null:t.mapPos(n)}}),Ft=vi.define({create(){return null},update(n,t){return n!=null&&(n=t.changes.mapPos(n)),t.effects.reduce((e,i)=>i.is(En)?i.value:e,n)}}),jo=P.fromClass(class{constructor(n){this.view=n,this.cursor=null,this.measureReq={read:this.readPos.bind(this),write:this.drawCursor.bind(this)}}update(n){var t;let e=n.state.field(Ft);e==null?this.cursor!=null&&((t=this.cursor)===null||t===void 0||t.remove(),this.cursor=null):(this.cursor||(this.cursor=this.view.scrollDOM.appendChild(document.createElement("div")),this.cursor.className="cm-dropCursor"),(n.startState.field(Ft)!=e||n.docChanged||n.geometryChanged)&&this.view.requestMeasure(this.measureReq))}readPos(){let{view:n}=this,t=n.state.field(Ft),e=t!=null&&n.coordsAtPos(t);if(!e)return null;let i=n.scrollDOM.getBoundingClientRect();return{left:e.left-i.left+n.scrollDOM.scrollLeft*n.scaleX,top:e.top-i.top+n.scrollDOM.scrollTop*n.scaleY,height:e.bottom-e.top}}drawCursor(n){if(this.cursor){let{scaleX:t,scaleY:e}=this.view;n?(this.cursor.style.left=n.left/t+"px",this.cursor.style.top=n.top/e+"px",this.cursor.style.height=n.height/e+"px"):this.cursor.style.left="-100000px"}}destroy(){this.cursor&&this.cursor.remove()}setDropPos(n){this.view.state.field(Ft)!=n&&this.view.dispatch({effects:En.of(n)})}},{eventObservers:{dragover(n){this.setDropPos(this.view.posAtCoords({x:n.clientX,y:n.clientY}))},dragleave(n){(n.target==this.view.contentDOM||!this.view.contentDOM.contains(n.relatedTarget))&&this.setDropPos(null)},dragend(){this.setDropPos(null)},drop(){this.setDropPos(null)}}});function Yo(){return[Ft,jo]}function bs(n,t,e,i,s){t.lastIndex=0;for(let r=n.iterRange(e,i),o=e,l;!r.next().done;o+=r.value.length)if(!r.lineBreak)for(;l=t.exec(r.value);)s(o+l.index,l)}function Go(n,t){let e=n.visibleRanges;if(e.length==1&&e[0].from==n.viewport.from&&e[0].to==n.viewport.to)return e;let i=[];for(let{from:s,to:r}of e)s=Math.max(n.state.doc.lineAt(s).from,s-t),r=Math.min(n.state.doc.lineAt(r).to,r+t),i.length&&i[i.length-1].to>=s?i[i.length-1].to=r:i.push({from:s,to:r});return i}class He{constructor(t){const{regexp:e,decoration:i,decorate:s,boundary:r,maxLength:o=1e3}=t;if(!e.global)throw new RangeError("The regular expression given to MatchDecorator should have its 'g' flag set");if(this.regexp=e,s)this.addMatch=(l,a,h,c)=>s(c,h,h+l[0].length,l,a);else if(typeof i=="function")this.addMatch=(l,a,h,c)=>{let f=i(l,a,h);f&&c(h,h+l[0].length,f)};else if(i)this.addMatch=(l,a,h,c)=>c(h,h+l[0].length,i);else throw new RangeError("Either 'decorate' or 'decoration' should be provided to MatchDecorator");this.boundary=r,this.maxLength=o}createDeco(t){let e=new Gn,i=e.add.bind(e);for(let{from:s,to:r}of Go(t,this.maxLength))bs(t.state.doc,this.regexp,s,r,(o,l)=>this.addMatch(l,t,o,i));return e.finish()}updateDeco(t,e){let i=1e9,s=-1;return t.docChanged&&t.changes.iterChanges((r,o,l,a)=>{a>=t.view.viewport.from&&l<=t.view.viewport.to&&(i=Math.min(l,i),s=Math.max(a,s))}),t.viewportMoved||s-i>1e3?this.createDeco(t.view):s>-1?this.updateRange(t.view,e.map(t.changes),i,s):e}updateRange(t,e,i,s){for(let r of t.visibleRanges){let o=Math.max(r.from,i),l=Math.min(r.to,s);if(l>=o){let a=t.state.doc.lineAt(o),h=a.toa.from;o--)if(this.boundary.test(a.text[o-1-a.from])){c=o;break}for(;ld.push(b.range(g,m));if(a==h)for(this.regexp.lastIndex=c-a.from;(u=this.regexp.exec(a.text))&&u.indexthis.addMatch(m,t,g,p));e=e.update({filterFrom:c,filterTo:f,filter:(g,m)=>gf,add:d})}}return e}}const mi=/x/.unicode!=null?"gu":"g",Xo=new RegExp(`[\0-\b +--Ÿ­؜​‎‏\u2028\u2029‭‮⁦⁧⁩\uFEFF-]`,mi),$o={0:"null",7:"bell",8:"backspace",10:"newline",11:"vertical tab",13:"carriage return",27:"escape",8203:"zero width space",8204:"zero width non-joiner",8205:"zero width joiner",8206:"left-to-right mark",8207:"right-to-left mark",8232:"line separator",8237:"left-to-right override",8238:"right-to-left override",8294:"left-to-right isolate",8295:"right-to-left isolate",8297:"pop directional isolate",8233:"paragraph separator",65279:"zero width no-break space",65532:"object replacement"};let Ye=null;function Uo(){var n;if(Ye==null&&typeof document<"u"&&document.body){let t=document.body.style;Ye=((n=t.tabSize)!==null&&n!==void 0?n:t.MozTabSize)!=null}return Ye||!1}const we=C.define({combine(n){let t=Mi(n,{render:null,specialChars:Xo,addSpecialChars:null});return(t.replaceTabs=!Uo())&&(t.specialChars=new RegExp(" |"+t.specialChars.source,mi)),t.addSpecialChars&&(t.specialChars=new RegExp(t.specialChars.source+"|"+t.addSpecialChars.source,mi)),t}});function Qo(n={}){return[we.of(n),Jo()]}let ys=null;function Jo(){return ys||(ys=P.fromClass(class{constructor(n){this.view=n,this.decorations=O.none,this.decorationCache=Object.create(null),this.decorator=this.makeDecorator(n.state.facet(we)),this.decorations=this.decorator.createDeco(n)}makeDecorator(n){return new He({regexp:n.specialChars,decoration:(t,e,i)=>{let{doc:s}=e.state,r=Ds(t[0],0);if(r==9){let o=s.lineAt(i),l=e.state.tabSize,a=Os(o.text,l,i-o.from);return O.replace({widget:new il((l-a%l)*this.view.defaultCharacterWidth/this.view.scaleX)})}return this.decorationCache[r]||(this.decorationCache[r]=O.replace({widget:new el(n,r)}))},boundary:n.replaceTabs?void 0:/[^]/})}update(n){let t=n.state.facet(we);n.startState.facet(we)!=t?(this.decorator=this.makeDecorator(t),this.decorations=this.decorator.createDeco(n.view)):this.decorations=this.decorator.updateDeco(n,this.decorations)}},{decorations:n=>n.decorations}))}const Zo="•";function tl(n){return n>=32?Zo:n==10?"␤":String.fromCharCode(9216+n)}class el extends dt{constructor(t,e){super(),this.options=t,this.code=e}eq(t){return t.code==this.code}toDOM(t){let e=tl(this.code),i=t.state.phrase("Control character")+" "+($o[this.code]||"0x"+this.code.toString(16)),s=this.options.render&&this.options.render(this.code,i,e);if(s)return s;let r=document.createElement("span");return r.textContent=e,r.title=i,r.setAttribute("aria-label",i),r.className="cm-specialChar",r}ignoreEvent(){return!1}}class il extends dt{constructor(t){super(),this.width=t}eq(t){return t.width==this.width}toDOM(){let t=document.createElement("span");return t.textContent=" ",t.className="cm-tab",t.style.width=this.width+"px",t}ignoreEvent(){return!1}}const ws=P.fromClass(class{constructor(){this.height=1e3,this.attrs={style:"padding-bottom: 1000px"}}update(n){let{view:t}=n,e=t.viewState.editorHeight-t.defaultLineHeight-t.documentPadding.top-.5;e>=0&&e!=this.height&&(this.height=e,this.attrs={style:`padding-bottom: ${e}px`})}});function sl(){return[ws,Le.of(n=>{var t;return((t=n.plugin(ws))===null||t===void 0?void 0:t.attrs)||null})]}function nl(){return ol}const rl=O.line({class:"cm-activeLine"}),ol=P.fromClass(class{constructor(n){this.decorations=this.getDeco(n)}update(n){(n.docChanged||n.selectionSet)&&(this.decorations=this.getDeco(n.view))}getDeco(n){let t=-1,e=[];for(let i of n.state.selection.ranges){let s=n.lineBlockAt(i.head);s.from>t&&(e.push(rl.range(s.from)),t=s.from)}return O.set(e)}},{decorations:n=>n.decorations});class ll extends dt{constructor(t){super(),this.content=t}toDOM(t){let e=document.createElement("span");return e.className="cm-placeholder",e.style.pointerEvents="none",e.appendChild(typeof this.content=="string"?document.createTextNode(this.content):typeof this.content=="function"?this.content(t):this.content.cloneNode(!0)),e.setAttribute("aria-hidden","true"),e}coordsAt(t){let e=t.firstChild?zt(t.firstChild):[];if(!e.length)return null;let i=window.getComputedStyle(t.parentNode),s=Xt(e[0],i.direction!="rtl"),r=parseInt(i.lineHeight);return s.bottom-s.top>r*1.5?{left:s.left,right:s.right,top:s.top,bottom:s.top+r}:s}ignoreEvent(){return!1}}function al(n){let t=P.fromClass(class{constructor(e){this.view=e,this.placeholder=n?O.set([O.widget({widget:new ll(n),side:1}).range(0)]):O.none}get decorations(){return this.view.state.doc.length?O.none:this.placeholder}},{decorations:e=>e.decorations});return typeof n=="string"?[t,k.contentAttributes.of({"aria-placeholder":n})]:t}const bi=2e3;function hl(n,t,e){let i=Math.min(t.line,e.line),s=Math.max(t.line,e.line),r=[];if(t.off>bi||e.off>bi||t.col<0||e.col<0){let o=Math.min(t.off,e.off),l=Math.max(t.off,e.off);for(let a=i;a<=s;a++){let h=n.doc.line(a);h.length<=l&&r.push(v.range(h.from+o,h.to+l))}}else{let o=Math.min(t.col,e.col),l=Math.max(t.col,e.col);for(let a=i;a<=s;a++){let h=n.doc.line(a),c=$e(h.text,o,n.tabSize,!0);if(c<0)r.push(v.cursor(h.to));else{let f=$e(h.text,l,n.tabSize);r.push(v.range(h.from+c,h.from+f))}}}return r}function cl(n,t){let e=n.coordsAtPos(n.viewport.from);return e?Math.round(Math.abs((e.left-t)/n.defaultCharacterWidth)):-1}function xs(n,t){let e=n.posAtCoords({x:t.clientX,y:t.clientY},!1),i=n.state.doc.lineAt(e),s=e-i.from,r=s>bi?-1:s==i.length?cl(n,t.clientX):Os(i.text,n.state.tabSize,e-i.from);return{line:i.number,col:r,off:s}}function fl(n,t){let e=xs(n,t),i=n.state.selection;return e?{update(s){if(s.docChanged){let r=s.changes.mapPos(s.startState.doc.line(e.line).from),o=s.state.doc.lineAt(r);e={line:o.number,col:e.col,off:Math.min(e.off,o.length)},i=i.map(s.changes)}},get(s,r,o){let l=xs(n,s);if(!l)return i;let a=hl(n.state,e,l);return a.length?o?v.create(a.concat(i.ranges)):v.create(a):i}}:null}function dl(n){let t=n?.eventFilter||(e=>e.altKey&&e.button==0);return k.mouseSelectionStyle.of((e,i)=>t(i)?fl(e,i):null)}const ul={Alt:[18,n=>!!n.altKey],Control:[17,n=>!!n.ctrlKey],Shift:[16,n=>!!n.shiftKey],Meta:[91,n=>!!n.metaKey]},pl={style:"cursor: crosshair"};function gl(n={}){let[t,e]=ul[n.key||"Alt"],i=P.fromClass(class{constructor(s){this.view=s,this.isDown=!1}set(s){this.isDown!=s&&(this.isDown=s,this.view.update([]))}},{eventObservers:{keydown(s){this.set(s.keyCode==t||e(s))},keyup(s){(s.keyCode==t||!e(s))&&this.set(!1)},mousemove(s){this.set(e(s))}}});return[i,k.contentAttributes.of(s=>{var r;return!((r=s.plugin(i))===null||r===void 0)&&r.isDown?pl:null})]}const ue="-10000px";class Hn{constructor(t,e,i,s){this.facet=e,this.createTooltipView=i,this.removeTooltipView=s,this.input=t.state.facet(e),this.tooltips=this.input.filter(o=>o);let r=null;this.tooltipViews=this.tooltips.map(o=>r=i(o,r))}update(t,e){var i;let s=t.state.facet(this.facet),r=s.filter(a=>a);if(s===this.input){for(let a of this.tooltipViews)a.update&&a.update(t);return!1}let o=[],l=e?[]:null;for(let a=0;ae[h]=a),e.length=l.length),this.input=s,this.tooltips=r,this.tooltipViews=o,!0}}function ml(n={}){return xe.of(n)}function bl(n){let t=n.dom.ownerDocument.documentElement;return{top:0,left:0,bottom:t.clientHeight,right:t.clientWidth}}const xe=C.define({combine:n=>{var t,e,i;return{position:y.ios?"absolute":((t=n.find(s=>s.position))===null||t===void 0?void 0:t.position)||"fixed",parent:((e=n.find(s=>s.parent))===null||e===void 0?void 0:e.parent)||null,tooltipSpace:((i=n.find(s=>s.tooltipSpace))===null||i===void 0?void 0:i.tooltipSpace)||bl}}}),Ss=new WeakMap,Pe=P.fromClass(class{constructor(n){this.view=n,this.above=[],this.inView=!0,this.madeAbsolute=!1,this.lastTransaction=0,this.measureTimeout=-1;let t=n.state.facet(xe);this.position=t.position,this.parent=t.parent,this.classes=n.themeClasses,this.createContainer(),this.measureReq={read:this.readMeasure.bind(this),write:this.writeMeasure.bind(this),key:this},this.resizeObserver=typeof ResizeObserver=="function"?new ResizeObserver(()=>this.measureSoon()):null,this.manager=new Hn(n,Pi,(e,i)=>this.createTooltip(e,i),e=>{this.resizeObserver&&this.resizeObserver.unobserve(e.dom),e.dom.remove()}),this.above=this.manager.tooltips.map(e=>!!e.above),this.intersectionObserver=typeof IntersectionObserver=="function"?new IntersectionObserver(e=>{Date.now()>this.lastTransaction-50&&e.length>0&&e[e.length-1].intersectionRatio<1&&this.measureSoon()},{threshold:[1]}):null,this.observeIntersection(),n.win.addEventListener("resize",this.measureSoon=this.measureSoon.bind(this)),this.maybeMeasure()}createContainer(){this.parent?(this.container=document.createElement("div"),this.container.style.position="relative",this.container.className=this.view.themeClasses,this.parent.appendChild(this.container)):this.container=this.view.dom}observeIntersection(){if(this.intersectionObserver){this.intersectionObserver.disconnect();for(let n of this.manager.tooltipViews)this.intersectionObserver.observe(n.dom)}}measureSoon(){this.measureTimeout<0&&(this.measureTimeout=setTimeout(()=>{this.measureTimeout=-1,this.maybeMeasure()},50))}update(n){n.transactions.length&&(this.lastTransaction=Date.now());let t=this.manager.update(n,this.above);t&&this.observeIntersection();let e=t||n.geometryChanged,i=n.state.facet(xe);if(i.position!=this.position&&!this.madeAbsolute){this.position=i.position;for(let s of this.manager.tooltipViews)s.dom.style.position=this.position;e=!0}if(i.parent!=this.parent){this.parent&&this.container.remove(),this.parent=i.parent,this.createContainer();for(let s of this.manager.tooltipViews)this.container.appendChild(s.dom);e=!0}else this.parent&&this.view.themeClasses!=this.classes&&(this.classes=this.container.className=this.view.themeClasses);e&&this.maybeMeasure()}createTooltip(n,t){let e=n.create(this.view),i=t?t.dom:null;if(e.dom.classList.add("cm-tooltip"),n.arrow&&!e.dom.querySelector(".cm-tooltip > .cm-tooltip-arrow")){let s=document.createElement("div");s.className="cm-tooltip-arrow",e.dom.appendChild(s)}return e.dom.style.position=this.position,e.dom.style.top=ue,e.dom.style.left="0px",this.container.insertBefore(e.dom,i),e.mount&&e.mount(this.view),this.resizeObserver&&this.resizeObserver.observe(e.dom),e}destroy(){var n,t,e;this.view.win.removeEventListener("resize",this.measureSoon);for(let i of this.manager.tooltipViews)i.dom.remove(),(n=i.destroy)===null||n===void 0||n.call(i);this.parent&&this.container.remove(),(t=this.resizeObserver)===null||t===void 0||t.disconnect(),(e=this.intersectionObserver)===null||e===void 0||e.disconnect(),clearTimeout(this.measureTimeout)}readMeasure(){let n=1,t=1,e=!1;if(this.position=="fixed"&&this.manager.tooltipViews.length){let{dom:r}=this.manager.tooltipViews[0];if(y.safari){let o=r.getBoundingClientRect();e=Math.abs(o.top+1e4)>1||Math.abs(o.left)>1}else e=!!r.offsetParent&&r.offsetParent!=this.container.ownerDocument.body}if(e||this.position=="absolute")if(this.parent){let r=this.parent.getBoundingClientRect();r.width&&r.height&&(n=r.width/this.parent.offsetWidth,t=r.height/this.parent.offsetHeight)}else({scaleX:n,scaleY:t}=this.view.viewState);let i=this.view.scrollDOM.getBoundingClientRect(),s=Li(this.view);return{visible:{left:i.left+s.left,top:i.top+s.top,right:i.right-s.right,bottom:i.bottom-s.bottom},parent:this.parent?this.container.getBoundingClientRect():this.view.dom.getBoundingClientRect(),pos:this.manager.tooltips.map((r,o)=>{let l=this.manager.tooltipViews[o];return l.getCoords?l.getCoords(r.pos):this.view.coordsAtPos(r.pos)}),size:this.manager.tooltipViews.map(({dom:r})=>r.getBoundingClientRect()),space:this.view.state.facet(xe).tooltipSpace(this.view),scaleX:n,scaleY:t,makeAbsolute:e}}writeMeasure(n){var t;if(n.makeAbsolute){this.madeAbsolute=!0,this.position="absolute";for(let l of this.manager.tooltipViews)l.dom.style.position="absolute"}let{visible:e,space:i,scaleX:s,scaleY:r}=n,o=[];for(let l=0;l=Math.min(e.bottom,i.bottom)||f.rightMath.min(e.right,i.right)+.1)){c.style.top=ue;continue}let u=a.arrow?h.dom.querySelector(".cm-tooltip-arrow"):null,p=u?7:0,g=d.right-d.left,m=(t=Ss.get(h))!==null&&t!==void 0?t:d.bottom-d.top,b=h.offset||wl,w=this.view.textDirection==R.LTR,M=d.width>i.right-i.left?w?i.left:i.right-d.width:w?Math.max(i.left,Math.min(f.left-(u?14:0)+b.x,i.right-g)):Math.min(Math.max(i.left,f.left-g+(u?14:0)-b.x),i.right-g),A=this.above[l];!a.strictSide&&(A?f.top-m-p-b.yi.bottom)&&A==i.bottom-f.bottom>f.top-i.top&&(A=this.above[l]=!A);let S=(A?f.top-i.top:i.bottom-f.bottom)-p;if(SM&&W.topx&&(x=A?W.top-m-2-p:W.bottom+p+2);if(this.position=="absolute"?(c.style.top=(x-n.parent.top)/r+"px",vs(c,(M-n.parent.left)/s)):(c.style.top=x/r+"px",vs(c,M/s)),u){let W=f.left+(w?b.x:-b.x)-(M+14-7);u.style.left=W/s+"px"}h.overlap!==!0&&o.push({left:M,top:x,right:L,bottom:x+m}),c.classList.toggle("cm-tooltip-above",A),c.classList.toggle("cm-tooltip-below",!A),h.positioned&&h.positioned(n.space)}}maybeMeasure(){if(this.manager.tooltips.length&&(this.view.inView&&this.view.requestMeasure(this.measureReq),this.inView!=this.view.inView&&(this.inView=this.view.inView,!this.inView)))for(let n of this.manager.tooltipViews)n.dom.style.top=ue}},{eventObservers:{scroll(){this.maybeMeasure()}}});function vs(n,t){let e=parseInt(n.style.left,10);(isNaN(e)||Math.abs(t-e)>1)&&(n.style.left=t+"px")}const yl=k.baseTheme({".cm-tooltip":{zIndex:500,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:"14px",position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"''",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}}),wl={x:0,y:0},Pi=C.define({enables:[Pe,yl]}),Jt=C.define({combine:n=>n.reduce((t,e)=>t.concat(e),[])});class We{static create(t){return new We(t)}constructor(t){this.view=t,this.mounted=!1,this.dom=document.createElement("div"),this.dom.classList.add("cm-tooltip-hover"),this.manager=new Hn(t,Jt,(e,i)=>this.createHostedView(e,i),e=>e.dom.remove())}createHostedView(t,e){let i=t.create(this.view);return i.dom.classList.add("cm-tooltip-section"),this.dom.insertBefore(i.dom,e?e.dom.nextSibling:this.dom.firstChild),this.mounted&&i.mount&&i.mount(this.view),i}mount(t){for(let e of this.manager.tooltipViews)e.mount&&e.mount(t);this.mounted=!0}positioned(t){for(let e of this.manager.tooltipViews)e.positioned&&e.positioned(t)}update(t){this.manager.update(t)}destroy(){var t;for(let e of this.manager.tooltipViews)(t=e.destroy)===null||t===void 0||t.call(e)}passProp(t){let e;for(let i of this.manager.tooltipViews){let s=i[t];if(s!==void 0){if(e===void 0)e=s;else if(e!==s)return}}return e}get offset(){return this.passProp("offset")}get getCoords(){return this.passProp("getCoords")}get overlap(){return this.passProp("overlap")}get resize(){return this.passProp("resize")}}const xl=Pi.compute([Jt],n=>{let t=n.facet(Jt);return t.length===0?null:{pos:Math.min(...t.map(e=>e.pos)),end:Math.max(...t.map(e=>{var i;return(i=e.end)!==null&&i!==void 0?i:e.pos})),create:We.create,above:t[0].above,arrow:t.some(e=>e.arrow)}});class Sl{constructor(t,e,i,s,r){this.view=t,this.source=e,this.field=i,this.setHover=s,this.hoverTime=r,this.hoverTimeout=-1,this.restartTimeout=-1,this.pending=null,this.lastMove={x:0,y:0,target:t.dom,time:0},this.checkHover=this.checkHover.bind(this),t.dom.addEventListener("mouseleave",this.mouseleave=this.mouseleave.bind(this)),t.dom.addEventListener("mousemove",this.mousemove=this.mousemove.bind(this))}update(){this.pending&&(this.pending=null,clearTimeout(this.restartTimeout),this.restartTimeout=setTimeout(()=>this.startHover(),20))}get active(){return this.view.state.field(this.field)}checkHover(){if(this.hoverTimeout=-1,this.active.length)return;let t=Date.now()-this.lastMove.time;tl.bottom||e.xl.right+t.defaultCharacterWidth)return;let a=t.bidiSpans(t.state.doc.lineAt(s)).find(c=>c.from<=s&&c.to>=s),h=a&&a.dir==R.RTL?-1:1;r=e.x{this.pending==l&&(this.pending=null,a&&!(Array.isArray(a)&&!a.length)&&t.dispatch({effects:this.setHover.of(Array.isArray(a)?a:[a])}))},a=>G(t.state,a,"hover tooltip"))}else o&&!(Array.isArray(o)&&!o.length)&&t.dispatch({effects:this.setHover.of(Array.isArray(o)?o:[o])})}get tooltip(){let t=this.view.plugin(Pe),e=t?t.manager.tooltips.findIndex(i=>i.create==We.create):-1;return e>-1?t.manager.tooltipViews[e]:null}mousemove(t){var e,i;this.lastMove={x:t.clientX,y:t.clientY,target:t.target,time:Date.now()},this.hoverTimeout<0&&(this.hoverTimeout=setTimeout(this.checkHover,this.hoverTime));let{active:s,tooltip:r}=this;if(s.length&&r&&!vl(r.dom,t)||this.pending){let{pos:o}=s[0]||this.pending,l=(i=(e=s[0])===null||e===void 0?void 0:e.end)!==null&&i!==void 0?i:o;(o==l?this.view.posAtCoords(this.lastMove)!=o:!Cl(this.view,o,l,t.clientX,t.clientY))&&(this.view.dispatch({effects:this.setHover.of([])}),this.pending=null)}}mouseleave(t){clearTimeout(this.hoverTimeout),this.hoverTimeout=-1;let{active:e}=this;if(e.length){let{tooltip:i}=this;i&&i.dom.contains(t.relatedTarget)?this.watchTooltipLeave(i.dom):this.view.dispatch({effects:this.setHover.of([])})}}watchTooltipLeave(t){let e=i=>{t.removeEventListener("mouseleave",e),this.active.length&&!this.view.dom.contains(i.relatedTarget)&&this.view.dispatch({effects:this.setHover.of([])})};t.addEventListener("mouseleave",e)}destroy(){clearTimeout(this.hoverTimeout),this.view.dom.removeEventListener("mouseleave",this.mouseleave),this.view.dom.removeEventListener("mousemove",this.mousemove)}}const pe=4;function vl(n,t){let{left:e,right:i,top:s,bottom:r}=n.getBoundingClientRect(),o;if(o=n.querySelector(".cm-tooltip-arrow")){let l=o.getBoundingClientRect();s=Math.min(l.top,s),r=Math.max(l.bottom,r)}return t.clientX>=e-pe&&t.clientX<=i+pe&&t.clientY>=s-pe&&t.clientY<=r+pe}function Cl(n,t,e,i,s,r){let o=n.scrollDOM.getBoundingClientRect(),l=n.documentTop+n.documentPadding.top+n.contentHeight;if(o.left>i||o.rights||Math.min(o.bottom,l)=t&&a<=e}function Ml(n,t={}){let e=nt.define(),i=vi.define({create(){return[]},update(s,r){if(s.length&&(t.hideOnChange&&(r.docChanged||r.selection)?s=[]:t.hideOn&&(s=s.filter(o=>!t.hideOn(r,o))),r.docChanged)){let o=[];for(let l of s){let a=r.changes.mapPos(l.pos,-1,Mt.TrackDel);if(a!=null){let h=Object.assign(Object.create(null),l);h.pos=a,h.end!=null&&(h.end=r.changes.mapPos(h.end)),o.push(h)}}s=o}for(let o of r.effects)o.is(e)&&(s=o.value),o.is(Pn)&&(s=[]);return s},provide:s=>Jt.from(s)});return{active:i,extension:[i,P.define(s=>new Sl(s,n,i,e,t.hoverTime||300)),xl]}}function kl(n,t){let e=n.plugin(Pe);if(!e)return null;let i=e.manager.tooltips.indexOf(t);return i<0?null:e.manager.tooltipViews[i]}function Al(n){return n.facet(Jt).some(t=>t)}const Pn=nt.define(),Tl=Pn.of(null);function Dl(n){let t=n.plugin(Pe);t&&t.maybeMeasure()}const yi=C.define({combine(n){let t,e;for(let i of n)t=t||i.topContainer,e=e||i.bottomContainer;return{topContainer:t,bottomContainer:e}}});function Ol(n){return n?[yi.of(n)]:[]}function Wn(n,t){let e=n.plugin(Nn),i=e?e.specs.indexOf(t):-1;return i>-1?e.panels[i]:null}const Nn=P.fromClass(class{constructor(n){this.input=n.state.facet(De),this.specs=this.input.filter(e=>e),this.panels=this.specs.map(e=>e(n));let t=n.state.facet(yi);this.top=new ge(n,!0,t.topContainer),this.bottom=new ge(n,!1,t.bottomContainer),this.top.sync(this.panels.filter(e=>e.top)),this.bottom.sync(this.panels.filter(e=>!e.top));for(let e of this.panels)e.dom.classList.add("cm-panel"),e.mount&&e.mount()}update(n){let t=n.state.facet(yi);this.top.container!=t.topContainer&&(this.top.sync([]),this.top=new ge(n.view,!0,t.topContainer)),this.bottom.container!=t.bottomContainer&&(this.bottom.sync([]),this.bottom=new ge(n.view,!1,t.bottomContainer)),this.top.syncClasses(),this.bottom.syncClasses();let e=n.state.facet(De);if(e!=this.input){let i=e.filter(a=>a),s=[],r=[],o=[],l=[];for(let a of i){let h=this.specs.indexOf(a),c;h<0?(c=a(n.view),l.push(c)):(c=this.panels[h],c.update&&c.update(n)),s.push(c),(c.top?r:o).push(c)}this.specs=i,this.panels=s,this.top.sync(r),this.bottom.sync(o);for(let a of l)a.dom.classList.add("cm-panel"),a.mount&&a.mount()}else for(let i of this.panels)i.update&&i.update(n)}destroy(){this.top.sync([]),this.bottom.sync([])}},{provide:n=>k.scrollMargins.of(t=>{let e=t.plugin(n);return e&&{top:e.top.scrollMargin(),bottom:e.bottom.scrollMargin()}})});class ge{constructor(t,e,i){this.view=t,this.top=e,this.container=i,this.dom=void 0,this.classes="",this.panels=[],this.syncClasses()}sync(t){for(let e of this.panels)e.destroy&&t.indexOf(e)<0&&e.destroy();this.panels=t,this.syncDOM()}syncDOM(){if(this.panels.length==0){this.dom&&(this.dom.remove(),this.dom=void 0);return}if(!this.dom){this.dom=document.createElement("div"),this.dom.className=this.top?"cm-panels cm-panels-top":"cm-panels cm-panels-bottom",this.dom.style[this.top?"top":"bottom"]="0";let e=this.container||this.view.dom;e.insertBefore(this.dom,this.top?e.firstChild:null)}let t=this.dom.firstChild;for(let e of this.panels)if(e.dom.parentNode==this.dom){for(;t!=e.dom;)t=Cs(t);t=t.nextSibling}else this.dom.insertBefore(e.dom,t);for(;t;)t=Cs(t)}scrollMargin(){return!this.dom||this.container?0:Math.max(0,this.top?this.dom.getBoundingClientRect().bottom-Math.max(0,this.view.scrollDOM.getBoundingClientRect().top):Math.min(innerHeight,this.view.scrollDOM.getBoundingClientRect().bottom)-this.dom.getBoundingClientRect().top)}syncClasses(){if(!(!this.container||this.classes==this.view.themeClasses)){for(let t of this.classes.split(" "))t&&this.container.classList.remove(t);for(let t of(this.classes=this.view.themeClasses).split(" "))t&&this.container.classList.add(t)}}}function Cs(n){let t=n.nextSibling;return n.remove(),t}const De=C.define({enables:Nn});function Ll(n,t){let e,i=new Promise(o=>e=o),s=o=>Bl(o,t,e);n.state.field(Se,!1)?n.dispatch({effects:Vn.of(s)}):n.dispatch({effects:nt.appendConfig.of(Se.init(()=>[s]))});let r=Fn.of(s);return{close:r,result:i.then(o=>((n.win.queueMicrotask||(a=>n.win.setTimeout(a,10)))(()=>{n.state.field(Se).indexOf(s)>-1&&n.dispatch({effects:r})}),o))}}function Rl(n,t){let e=n.state.field(Se,!1)||[];for(let i of e){let s=Wn(n,i);if(s&&s.dom.classList.contains(t))return s}return null}const Se=vi.define({create(){return[]},update(n,t){for(let e of t.effects)e.is(Vn)?n=[e.value].concat(n):e.is(Fn)&&(n=n.filter(i=>i!=e.value));return n},provide:n=>De.computeN([n],t=>t.field(n))}),Vn=nt.define(),Fn=nt.define();function Bl(n,t,e){let i=t.content?t.content(n,()=>o(null)):null;if(!i){if(i=St("form"),t.input){let l=St("input",t.input);/^(text|password|number|email|tel|url)$/.test(l.type)&&l.classList.add("cm-textfield"),l.name||(l.name="input"),i.appendChild(St("label",(t.label||"")+": ",l))}else i.appendChild(document.createTextNode(t.label||""));i.appendChild(document.createTextNode(" ")),i.appendChild(St("button",{class:"cm-button",type:"submit"},t.submitLabel||"OK"))}let s=i.nodeName=="FORM"?[i]:i.querySelectorAll("form");for(let l=0;l{h.keyCode==27?(h.preventDefault(),o(null)):h.keyCode==13&&(h.preventDefault(),o(a))}),a.addEventListener("submit",h=>{h.preventDefault(),o(a)})}let r=St("div",i,St("button",{onclick:()=>o(null),"aria-label":n.state.phrase("close"),class:"cm-dialog-close",type:"button"},["×"]));t.class&&(r.className=t.class),r.classList.add("cm-dialog");function o(l){r.contains(r.ownerDocument.activeElement)&&n.focus(),e(l)}return{dom:r,top:t.top,mount:()=>{if(t.focus){let l;typeof t.focus=="string"?l=i.querySelector(t.focus):l=i.querySelector("input")||i.querySelector("button"),l&&"select"in l?l.select():l&&"focus"in l&&l.focus()}}}}class st extends Ci{compare(t){return this==t||this.constructor==t.constructor&&this.eq(t)}eq(t){return!1}destroy(t){}}st.prototype.elementClass="";st.prototype.toDOM=void 0;st.prototype.mapMode=Mt.TrackBefore;st.prototype.startSide=st.prototype.endSide=-1;st.prototype.point=!0;const _t=C.define(),In=C.define(),El={class:"",renderEmptyElements:!1,elementStyle:"",markers:()=>E.empty,lineMarker:()=>null,widgetMarker:()=>null,lineMarkerChange:null,initialSpacer:null,updateSpacer:null,domEventHandlers:{},side:"before"},jt=C.define();function Hl(n){return[Wi(),jt.of({...El,...n})]}const wi=C.define({combine:n=>n.some(t=>t)});function Wi(n){let t=[Pl];return n&&n.fixed===!1&&t.push(wi.of(!0)),t}const Pl=P.fromClass(class{constructor(n){this.view=n,this.domAfter=null,this.prevViewport=n.viewport,this.dom=document.createElement("div"),this.dom.className="cm-gutters cm-gutters-before",this.dom.setAttribute("aria-hidden","true"),this.dom.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.gutters=n.state.facet(jt).map(t=>new ks(n,t)),this.fixed=!n.state.facet(wi);for(let t of this.gutters)t.config.side=="after"?this.getDOMAfter().appendChild(t.dom):this.dom.appendChild(t.dom);this.fixed&&(this.dom.style.position="sticky"),this.syncGutters(!1),n.scrollDOM.insertBefore(this.dom,n.contentDOM)}getDOMAfter(){return this.domAfter||(this.domAfter=document.createElement("div"),this.domAfter.className="cm-gutters cm-gutters-after",this.domAfter.setAttribute("aria-hidden","true"),this.domAfter.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.domAfter.style.position=this.fixed?"sticky":"",this.view.scrollDOM.appendChild(this.domAfter)),this.domAfter}update(n){if(this.updateGutters(n)){let t=this.prevViewport,e=n.view.viewport,i=Math.min(t.to,e.to)-Math.max(t.from,e.from);this.syncGutters(i<(e.to-e.from)*.8)}if(n.geometryChanged){let t=this.view.contentHeight/this.view.scaleY+"px";this.dom.style.minHeight=t,this.domAfter&&(this.domAfter.style.minHeight=t)}this.view.state.facet(wi)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?"sticky":"",this.domAfter&&(this.domAfter.style.position=this.fixed?"sticky":"")),this.prevViewport=n.view.viewport}syncGutters(n){let t=this.dom.nextSibling;n&&(this.dom.remove(),this.domAfter&&this.domAfter.remove());let e=E.iter(this.view.state.facet(_t),this.view.viewport.from),i=[],s=this.gutters.map(r=>new Wl(r,this.view.viewport,-this.view.documentPadding.top));for(let r of this.view.viewportLineBlocks)if(i.length&&(i=[]),Array.isArray(r.type)){let o=!0;for(let l of r.type)if(l.type==H.Text&&o){xi(e,i,l.from);for(let a of s)a.line(this.view,l,i);o=!1}else if(l.widget)for(let a of s)a.widget(this.view,l)}else if(r.type==H.Text){xi(e,i,r.from);for(let o of s)o.line(this.view,r,i)}else if(r.widget)for(let o of s)o.widget(this.view,r);for(let r of s)r.finish();n&&(this.view.scrollDOM.insertBefore(this.dom,t),this.domAfter&&this.view.scrollDOM.appendChild(this.domAfter))}updateGutters(n){let t=n.startState.facet(jt),e=n.state.facet(jt),i=n.docChanged||n.heightChanged||n.viewportChanged||!E.eq(n.startState.facet(_t),n.state.facet(_t),n.view.viewport.from,n.view.viewport.to);if(t==e)for(let s of this.gutters)s.update(n)&&(i=!0);else{i=!0;let s=[];for(let r of e){let o=t.indexOf(r);o<0?s.push(new ks(this.view,r)):(this.gutters[o].update(n),s.push(this.gutters[o]))}for(let r of this.gutters)r.dom.remove(),s.indexOf(r)<0&&r.destroy();for(let r of s)r.config.side=="after"?this.getDOMAfter().appendChild(r.dom):this.dom.appendChild(r.dom);this.gutters=s}return i}destroy(){for(let n of this.gutters)n.destroy();this.dom.remove(),this.domAfter&&this.domAfter.remove()}},{provide:n=>k.scrollMargins.of(t=>{let e=t.plugin(n);if(!e||e.gutters.length==0||!e.fixed)return null;let i=e.dom.offsetWidth*t.scaleX,s=e.domAfter?e.domAfter.offsetWidth*t.scaleX:0;return t.textDirection==R.LTR?{left:i,right:s}:{right:i,left:s}})});function Ms(n){return Array.isArray(n)?n:[n]}function xi(n,t,e){for(;n.value&&n.from<=e;)n.from==e&&t.push(n.value),n.next()}class Wl{constructor(t,e,i){this.gutter=t,this.height=i,this.i=0,this.cursor=E.iter(t.markers,e.from)}addElement(t,e,i){let{gutter:s}=this,r=(e.top-this.height)/t.scaleY,o=e.height/t.scaleY;if(this.i==s.elements.length){let l=new zn(t,o,r,i);s.elements.push(l),s.dom.appendChild(l.dom)}else s.elements[this.i].update(t,o,r,i);this.height=e.bottom,this.i++}line(t,e,i){let s=[];xi(this.cursor,s,e.from),i.length&&(s=s.concat(i));let r=this.gutter.config.lineMarker(t,e,s);r&&s.unshift(r);let o=this.gutter;s.length==0&&!o.config.renderEmptyElements||this.addElement(t,e,s)}widget(t,e){let i=this.gutter.config.widgetMarker(t,e.widget,e),s=i?[i]:null;for(let r of t.state.facet(In)){let o=r(t,e.widget,e);o&&(s||(s=[])).push(o)}s&&this.addElement(t,e,s)}finish(){let t=this.gutter;for(;t.elements.length>this.i;){let e=t.elements.pop();t.dom.removeChild(e.dom),e.destroy()}}}class ks{constructor(t,e){this.view=t,this.config=e,this.elements=[],this.spacer=null,this.dom=document.createElement("div"),this.dom.className="cm-gutter"+(this.config.class?" "+this.config.class:"");for(let i in e.domEventHandlers)this.dom.addEventListener(i,s=>{let r=s.target,o;if(r!=this.dom&&this.dom.contains(r)){for(;r.parentNode!=this.dom;)r=r.parentNode;let a=r.getBoundingClientRect();o=(a.top+a.bottom)/2}else o=s.clientY;let l=t.lineBlockAtHeight(o-t.documentTop);e.domEventHandlers[i](t,l,s)&&s.preventDefault()});this.markers=Ms(e.markers(t)),e.initialSpacer&&(this.spacer=new zn(t,0,0,[e.initialSpacer(t)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+="visibility: hidden; pointer-events: none")}update(t){let e=this.markers;if(this.markers=Ms(this.config.markers(t.view)),this.spacer&&this.config.updateSpacer){let s=this.config.updateSpacer(this.spacer.markers[0],t);s!=this.spacer.markers[0]&&this.spacer.update(t.view,0,0,[s])}let i=t.view.viewport;return!E.eq(this.markers,e,i.from,i.to)||(this.config.lineMarkerChange?this.config.lineMarkerChange(t):!1)}destroy(){for(let t of this.elements)t.destroy()}}class zn{constructor(t,e,i,s){this.height=-1,this.above=0,this.markers=[],this.dom=document.createElement("div"),this.dom.className="cm-gutterElement",this.update(t,e,i,s)}update(t,e,i,s){this.height!=e&&(this.height=e,this.dom.style.height=e+"px"),this.above!=i&&(this.dom.style.marginTop=(this.above=i)?i+"px":""),Nl(this.markers,s)||this.setMarkers(t,s)}setMarkers(t,e){let i="cm-gutterElement",s=this.dom.firstChild;for(let r=0,o=0;;){let l=o,a=rr(l,a,h)||o(l,a,h):o}return i}})}});class Ge extends st{constructor(t){super(),this.number=t}eq(t){return this.number==t.number}toDOM(){return document.createTextNode(this.number)}}function Xe(n,t){return n.state.facet(Ct).formatNumber(t,n.state)}const Vl=jt.compute([Ct],n=>({class:"cm-lineNumbers",renderEmptyElements:!1,markers(t){return t.state.facet(Kn)},lineMarker(t,e,i){return i.some(s=>s.toDOM)?null:new Ge(Xe(t,t.state.doc.lineAt(e.from).number))},widgetMarker:(t,e,i)=>{for(let s of t.state.facet(qn)){let r=s(t,e,i);if(r)return r}return null},lineMarkerChange:t=>t.startState.facet(Ct)!=t.state.facet(Ct),initialSpacer(t){return new Ge(Xe(t,As(t.state.doc.lines)))},updateSpacer(t,e){let i=Xe(e.view,As(e.view.state.doc.lines));return i==t.number?t:new Ge(i)},domEventHandlers:n.facet(Ct).domEventHandlers,side:"before"}));function Fl(n={}){return[Ct.of(n),Wi(),Vl]}function As(n){let t=9;for(;t{let t=[],e=-1;for(let i of n.selection.ranges){let s=n.doc.lineAt(i.head).from;s>e&&(e=s,t.push(Il.range(s)))}return E.of(t)});function Kl(){return zl}function _n(n){return P.define(t=>({decorations:n.createDeco(t),update(e){this.decorations=n.updateDeco(e,this.decorations)}}),{decorations:t=>t.decorations})}const ql=O.mark({class:"cm-highlightTab"}),_l=O.mark({class:"cm-highlightSpace"}),jl=_n(new He({regexp:/\t| /g,decoration:n=>n[0]==" "?ql:_l,boundary:/\S/}));function Yl(){return jl}const Gl=_n(new He({regexp:/\s+$/g,decoration:O.mark({class:"cm-trailingSpace"})}));function Xl(){return Gl}const $l={HeightMap:F,HeightOracle:vn,MeasuredHeights:Cn,QueryType:T,ChangedRange:q,computeOrder:zs,moveVisually:_s,clearHeightChangeFlag:fi,getHeightChangeFlag:()=>wt},Jl=Object.freeze(Object.defineProperty({__proto__:null,BidiSpan:J,BlockInfo:_,get BlockType(){return H},BlockWrapper:Ot,Decoration:O,get Direction(){return R},EditorView:k,GutterMarker:st,MatchDecorator:He,RectangleMarker:Ht,ViewPlugin:P,ViewUpdate:Qt,WidgetType:dt,__test:$l,closeHoverTooltips:Tl,crosshairCursor:gl,drawSelection:Io,dropCursor:Yo,getDialog:Rl,getDrawSelectionConfig:zo,getPanel:Wn,getTooltip:kl,gutter:Hl,gutterLineClass:_t,gutterWidgetClass:In,gutters:Wi,hasHoverTooltips:Al,highlightActiveLine:nl,highlightActiveLineGutter:Kl,highlightSpecialChars:Qo,highlightTrailingWhitespace:Xl,highlightWhitespace:Yl,hoverTooltip:Ml,keymap:Dn,layer:Hi,lineNumberMarkers:Kn,lineNumberWidgetMarker:qn,lineNumbers:Fl,logException:G,panels:Ol,placeholder:al,rectangularSelection:dl,repositionTooltips:Dl,runScopeHandlers:Ho,scrollPastEnd:sl,showDialog:Ll,showPanel:De,showTooltip:Pi,tooltips:ml},Symbol.toStringTag,{value:"Module"}));export{R as D,k as E,st as G,Dt as S,P as V,dt as W,O as a,kl as b,St as c,Pi as d,Fl as e,Kl as f,Wn as g,Ml as h,Qo as i,Io as j,Dn as k,G as l,Yo as m,dl as n,gl as o,nl as p,Hl as q,Ho as r,De as s,Jl as t}; diff --git a/ui/assets/web/index.html b/ui/assets/web/index.html index 94fc247..6ff9272 100644 --- a/ui/assets/web/index.html +++ b/ui/assets/web/index.html @@ -1,62 +1,25 @@ - - - - - - ProtoFlow Web UI - - - -
-
-

ProtoFlow Web UI Boot

-

2

-

WebEngine host is running

-
-
- - + + + + + + + ProtoFlow + + + + + + + + + +
+ + diff --git a/ui/assets/web/logo.svg b/ui/assets/web/logo.svg new file mode 100644 index 0000000..b7fd356 --- /dev/null +++ b/ui/assets/web/logo.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ui/assets/web/vite.svg b/ui/assets/web/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/ui/assets/web/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ui/desktop/web_bridge.py b/ui/desktop/web_bridge.py index ccb5627..d7e3b1f 100644 --- a/ui/desktop/web_bridge.py +++ b/ui/desktop/web_bridge.py @@ -13,10 +13,12 @@ import yaml try: - from PySide6.QtCore import QObject, Q_ARG, QMetaObject, QTimer, Qt, Signal, Slot + from PySide6.QtCore import QObject, Q_ARG, QMetaObject, QTimer, Qt, Signal, Slot, QUrl + from PySide6.QtGui import QDesktopServices from PySide6.QtWidgets import QFileDialog except ImportError: # pragma: no cover - from PyQt6.QtCore import QObject, Q_ARG, QMetaObject, QTimer, Qt, pyqtSignal as Signal, pyqtSlot as Slot # type: ignore + from PyQt6.QtCore import QObject, Q_ARG, QMetaObject, QTimer, Qt, QUrl, pyqtSignal as Signal, pyqtSlot as Slot # type: ignore + from PyQt6.QtGui import QDesktopServices # type: ignore from PyQt6.QtWidgets import QFileDialog # type: ignore from dsl_runtime.protocol_package import ProtocolPackageGateway, load_protocol_packages @@ -62,6 +64,7 @@ def __init__( self, bus=None, comm=None, + plugin_manager=None, window=None, proxy_manager=None, proxy_monitor_enabled: bool = True, @@ -70,6 +73,7 @@ def __init__( self._logger = logging.getLogger("web_bridge") self._bus = bus self._comm = comm + self._plugin_manager = plugin_manager self._window = window self._proxy_manager = proxy_manager self._proxy_monitor_enabled = bool(proxy_monitor_enabled) @@ -195,6 +199,33 @@ def list_protocols(self) -> List[Dict[str, Any]]: ) return items + @Slot(result="QVariant") + def list_plugins(self) -> Dict[str, Any]: + manager = self._plugin_manager + if manager is None: + return {"directory": "", "items": []} + plugin_dir = str(getattr(manager, "plugin_dir", "") or "") + if hasattr(manager, "list_plugin_items"): + items = manager.list_plugin_items() or [] + else: + names = manager.list_plugins() if hasattr(manager, "list_plugins") else [] + items = [{"id": name, "name": name, "status": "enabled"} for name in names] + return {"directory": plugin_dir, "items": items} + + @Slot(result="QVariant") + def refresh_plugins(self) -> Dict[str, Any]: + manager = self._plugin_manager + if manager is None: + return {"directory": "", "items": []} + try: + if hasattr(manager, "refresh_all"): + manager.refresh_all() + elif hasattr(manager, "load_all"): + manager.load_all() + except Exception as exc: + self.log.emit(f"[WARN] refresh plugins failed: {exc}") + return self.list_plugins() + @Slot("QVariant", result="QVariant") def call_protocol(self, payload: Dict[str, Any]) -> Dict[str, Any]: if not isinstance(payload, dict): @@ -562,6 +593,43 @@ def save_yaml(self, yaml_text: str, suggested_name: str = "workflow.yaml") -> Di return {} return {"path": path, "name": Path(path).name} + @Slot(str, result=bool) + def open_external_url(self, url: str) -> bool: + target = str(url or "").strip() + if not target: + return False + try: + return bool(QDesktopServices.openUrl(QUrl(target))) + except Exception: + return False + + @Slot(result=bool) + def open_manual_docs(self) -> bool: + candidates: List[Path] = [ + Path.cwd() / "README.zh-CN.md", + Path.cwd() / "README.md", + Path.cwd() / "docs" / "USER_GUIDE.zh-CN.md", + Path(__file__).resolve().parents[2] / "README.zh-CN.md", + Path(__file__).resolve().parents[2] / "README.md", + ] + if getattr(sys, "frozen", False): + exe_dir = Path(sys.executable).resolve().parent + candidates.extend( + [ + exe_dir / "README.zh-CN.md", + exe_dir / "README.md", + exe_dir / "_internal" / "README.zh-CN.md", + exe_dir / "_internal" / "README.md", + ] + ) + for path in candidates: + try: + if path.is_file() and QDesktopServices.openUrl(QUrl.fromLocalFile(str(path.resolve()))): + return True + except Exception: + continue + return self.open_external_url("https://github.com/11cookies11/ProtoFlow/blob/main/README.zh-CN.md") + @Slot() def window_minimize(self) -> None: if self._window: @@ -863,7 +931,7 @@ def _settings_defaults(self) -> Dict[str, Any]: base_path = (self._settings_root / "workflows").resolve() return { "uiLanguage": "Simplified Chinese", - "uiTheme": "Dark", + "uiTheme": "light", "autoConnectOnStart": True, "dslWorkspacePath": str(base_path), "serial": { diff --git a/ui/desktop/web_window.py b/ui/desktop/web_window.py index e574b3d..6a5607f 100644 --- a/ui/desktop/web_window.py +++ b/ui/desktop/web_window.py @@ -5,6 +5,7 @@ import logging import os import sys +import time try: from PySide6.QtCore import QEvent, QPoint, QTimer, Qt, QUrl @@ -60,7 +61,14 @@ def javaScriptConsoleMessage(self, level, message, line_number, source_id): # t class WebWindow(QMainWindow): """Minimal WebEngine host window for the new web UI.""" - def __init__(self, bus=None, comm=None, proxy_manager=None, proxy_monitor_enabled: bool = True) -> None: + def __init__( + self, + bus=None, + comm=None, + plugin_manager=None, + proxy_manager=None, + proxy_monitor_enabled: bool = True, + ) -> None: super().__init__() self.setWindowTitle("ProtoFlow Web UI") self._apply_initial_geometry() @@ -82,12 +90,14 @@ def __init__(self, bus=None, comm=None, proxy_manager=None, proxy_monitor_enable view.setPage(page) self._view = view self._stabilize_pending = False + self._state_transition_until = 0.0 self.setCentralWidget(view) channel = QWebChannel(view) self.bridge = WebBridge( bus=bus, comm=comm, + plugin_manager=plugin_manager, window=self, proxy_manager=proxy_manager, proxy_monitor_enabled=proxy_monitor_enabled, @@ -96,15 +106,27 @@ def __init__(self, bus=None, comm=None, proxy_manager=None, proxy_monitor_enable view.page().setWebChannel(channel) resource_root = self._resolve_resource_root() + icon_ico = self._find_existing_path( + resource_root.parent / "installer" / "ProtoFlow.ico", + resource_root / "installer" / "ProtoFlow.ico", + resource_root / "assets" / "icons" / "ProtoFlow.ico", + resource_root / "ui" / "assets" / "icons" / "ProtoFlow.ico", + ) icon_svg = self._find_existing_path( + resource_root / "assets" / "icons" / "logo_mark.svg", + resource_root / "ui" / "assets" / "icons" / "logo_mark.svg", resource_root / "assets" / "icons" / "logo.svg", resource_root / "ui" / "assets" / "icons" / "logo.svg", ) icon_png = self._find_existing_path( + resource_root / "assets" / "icons" / "logo_mark.png", + resource_root / "ui" / "assets" / "icons" / "logo_mark.png", resource_root / "assets" / "icons" / "logo.png", resource_root / "ui" / "assets" / "icons" / "logo.png", ) - icon = QIcon(str(icon_svg)) + icon = QIcon(str(icon_ico)) + if icon.isNull(): + icon = QIcon(str(icon_svg)) if icon.isNull(): icon = QIcon(str(icon_png)) if not icon.isNull(): @@ -350,6 +372,11 @@ def _toggle_max_restore(self) -> None: self._stabilize_webview_after_resize() def _stabilize_webview_after_resize(self) -> None: + now = time.monotonic() + if now < self._state_transition_until: + delay_ms = max(16, int((self._state_transition_until - now) * 1000)) + QTimer.singleShot(delay_ms, self._stabilize_webview_after_resize) + return if self._stabilize_pending: return self._stabilize_pending = True @@ -359,18 +386,17 @@ def _refresh(): view = getattr(self, "_view", None) if view is None: return - view.setUpdatesEnabled(False) - view.resize(self.size()) - view.setUpdatesEnabled(True) + # Keep refresh lightweight to avoid black-frame flashes during maximize transitions. view.update() - view.repaint() QTimer.singleShot(0, _refresh) - QTimer.singleShot(80, _refresh) def changeEvent(self, event): # type: ignore[override] super().changeEvent(event) if event.type() == QEvent.WindowStateChange: + # Maximize/restore on Windows may briefly recompose WebEngine surface. + # Delay stabilization to avoid refreshing in the unstable transition window. + self._state_transition_until = time.monotonic() + 0.22 self._stabilize_webview_after_resize() def _mouse_pos(self, event) -> QPoint: diff --git a/ui/frontend/index.html b/ui/frontend/index.html index b02e265..50f2a11 100644 --- a/ui/frontend/index.html +++ b/ui/frontend/index.html @@ -2,7 +2,7 @@ - + ProtoFlow diff --git a/ui/frontend/public/logo.svg b/ui/frontend/public/logo.svg new file mode 100644 index 0000000..b7fd356 --- /dev/null +++ b/ui/frontend/public/logo.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ui/frontend/src/App.vue b/ui/frontend/src/App.vue index 984c561..b73079f 100644 --- a/ui/frontend/src/App.vue +++ b/ui/frontend/src/App.vue @@ -1,4 +1,4 @@ -